@spectrum-web-components/textfield 0.39.3 → 0.40.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.
@@ -82,6 +82,16 @@
82
82
  "default": "''",
83
83
  "attribute": "label"
84
84
  },
85
+ {
86
+ "kind": "field",
87
+ "name": "name",
88
+ "type": {
89
+ "text": "string | undefined"
90
+ },
91
+ "privacy": "public",
92
+ "attribute": "name",
93
+ "reflects": true
94
+ },
85
95
  {
86
96
  "kind": "field",
87
97
  "name": "placeholder",
@@ -451,6 +461,13 @@
451
461
  "default": "''",
452
462
  "fieldName": "label"
453
463
  },
464
+ {
465
+ "name": "name",
466
+ "type": {
467
+ "text": "string | undefined"
468
+ },
469
+ "fieldName": "name"
470
+ },
454
471
  {
455
472
  "name": "placeholder",
456
473
  "type": {
@@ -697,6 +714,20 @@
697
714
  "module": "src/Textfield.js"
698
715
  }
699
716
  },
717
+ {
718
+ "kind": "field",
719
+ "name": "name",
720
+ "type": {
721
+ "text": "string | undefined"
722
+ },
723
+ "privacy": "public",
724
+ "attribute": "name",
725
+ "reflects": true,
726
+ "inheritedFrom": {
727
+ "name": "TextfieldBase",
728
+ "module": "src/Textfield.js"
729
+ }
730
+ },
700
731
  {
701
732
  "kind": "field",
702
733
  "name": "placeholder",
@@ -1170,6 +1201,17 @@
1170
1201
  "module": "src/Textfield.ts"
1171
1202
  }
1172
1203
  },
1204
+ {
1205
+ "name": "name",
1206
+ "type": {
1207
+ "text": "string | undefined"
1208
+ },
1209
+ "fieldName": "name",
1210
+ "inheritedFrom": {
1211
+ "name": "TextfieldBase",
1212
+ "module": "src/Textfield.ts"
1213
+ }
1214
+ },
1173
1215
  {
1174
1216
  "name": "placeholder",
1175
1217
  "type": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spectrum-web-components/textfield",
3
- "version": "0.39.3",
3
+ "version": "0.40.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -57,12 +57,12 @@
57
57
  "lit-html"
58
58
  ],
59
59
  "dependencies": {
60
- "@spectrum-web-components/base": "^0.39.3",
61
- "@spectrum-web-components/help-text": "^0.39.3",
62
- "@spectrum-web-components/icon": "^0.39.3",
63
- "@spectrum-web-components/icons-ui": "^0.39.3",
64
- "@spectrum-web-components/icons-workflow": "^0.39.3",
65
- "@spectrum-web-components/shared": "^0.39.3"
60
+ "@spectrum-web-components/base": "^0.40.0",
61
+ "@spectrum-web-components/help-text": "^0.40.0",
62
+ "@spectrum-web-components/icon": "^0.40.0",
63
+ "@spectrum-web-components/icons-ui": "^0.40.0",
64
+ "@spectrum-web-components/icons-workflow": "^0.40.0",
65
+ "@spectrum-web-components/shared": "^0.40.0"
66
66
  },
67
67
  "devDependencies": {
68
68
  "@spectrum-css/textfield": "^6.0.20"
@@ -73,5 +73,5 @@
73
73
  "./sp-*.js",
74
74
  "./**/*.dev.js"
75
75
  ],
76
- "gitHead": "d7840b3a9b99db4de62c44e3fb91b69dec7319af"
76
+ "gitHead": "24d5569a839da94892ecfd125428779587ffb1f5"
77
77
  }
@@ -23,6 +23,7 @@ export declare class TextfieldBase extends TextfieldBase_base {
23
23
  protected inputElement: HTMLInputElement | HTMLTextAreaElement;
24
24
  invalid: boolean;
25
25
  label: string;
26
+ name: string | undefined;
26
27
  placeholder: string;
27
28
  private _type;
28
29
  get type(): TextfieldType;
@@ -161,6 +161,7 @@ export class TextfieldBase extends ManageHelpText(
161
161
  ` : nothing}
162
162
  <!-- @ts-ignore -->
163
163
  <textarea
164
+ name=${ifDefined(this.name || void 0)}
164
165
  aria-describedby=${this.helpTextId}
165
166
  aria-label=${this.label || this.appliedLabel || this.placeholder}
166
167
  aria-invalid=${ifDefined(this.invalid || void 0)}
@@ -191,6 +192,7 @@ export class TextfieldBase extends ManageHelpText(
191
192
  return html`
192
193
  <!-- @ts-ignore -->
193
194
  <input
195
+ name=${ifDefined(this.name || void 0)}
194
196
  type=${this.type}
195
197
  aria-describedby=${this.helpTextId}
196
198
  aria-label=${this.label || this.appliedLabel || this.placeholder}
@@ -271,6 +273,9 @@ __decorateClass([
271
273
  __decorateClass([
272
274
  property()
273
275
  ], TextfieldBase.prototype, "label", 2);
276
+ __decorateClass([
277
+ property({ type: String, reflect: true })
278
+ ], TextfieldBase.prototype, "name", 2);
274
279
  __decorateClass([
275
280
  property()
276
281
  ], TextfieldBase.prototype, "placeholder", 2);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["Textfield.ts"],
4
- "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n nothing,\n PropertyValues,\n SizedMixin,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n ifDefined,\n live,\n} from '@spectrum-web-components/base/src/directives.js';\nimport {\n property,\n query,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\n\nimport { ManageHelpText } from '@spectrum-web-components/help-text/src/manage-help-text.js';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\nimport '@spectrum-web-components/icons-ui/icons/sp-icon-checkmark100.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js';\n\nimport textfieldStyles from './textfield.css.js';\nimport checkmarkStyles from '@spectrum-web-components/icon/src/spectrum-icon-checkmark.css.js';\n\nconst textfieldTypes = ['text', 'url', 'tel', 'email', 'password'] as const;\nexport type TextfieldType = typeof textfieldTypes[number];\n\n/**\n * @fires input - The value of the element has changed.\n * @fires change - An alteration to the value of the element has been committed by the user.\n */\nexport class TextfieldBase extends ManageHelpText(\n SizedMixin(Focusable, {\n noDefaultSize: true,\n })\n) {\n public static override get styles(): CSSResultArray {\n return [textfieldStyles, checkmarkStyles];\n }\n\n @state()\n appliedLabel?: string;\n\n @property({ attribute: 'allowed-keys' })\n allowedKeys = '';\n\n @property({ type: Boolean, reflect: true })\n public focused = false;\n\n @query('.input:not(#sizer)')\n protected inputElement!: HTMLInputElement | HTMLTextAreaElement;\n\n @property({ type: Boolean, reflect: true })\n public invalid = false;\n\n @property()\n public label = '';\n\n @property()\n public placeholder = '';\n\n @property({ attribute: 'type', reflect: true })\n private _type: TextfieldType = 'text';\n\n @state()\n get type(): TextfieldType {\n return textfieldTypes.find((t) => t === this._type) ?? 'text';\n }\n\n set type(val: TextfieldType) {\n const prev = this._type;\n this._type = val;\n this.requestUpdate('type', prev);\n }\n\n @property()\n public pattern?: string;\n\n @property({ type: Boolean, reflect: true })\n public grows = false;\n\n @property({ type: Number })\n public maxlength = -1;\n\n @property({ type: Number })\n public minlength = -1;\n\n @property({ type: Boolean, reflect: true })\n public multiline = false;\n\n @property({ type: Boolean, reflect: true })\n public readonly = false;\n\n @property({ type: Number })\n public rows = -1;\n\n @property({ type: Boolean, reflect: true })\n public valid = false;\n\n @property({ type: String })\n public set value(value: string | number) {\n if (value === this.value) {\n return;\n }\n const oldValue = this._value;\n this._value = value;\n this.requestUpdate('value', oldValue);\n }\n\n public get value(): string | number {\n return this._value;\n }\n\n protected _value: string | number = '';\n\n @property({ type: Boolean, reflect: true })\n public quiet = false;\n\n @property({ type: Boolean, reflect: true })\n public required = false;\n\n @property({ type: String, reflect: true })\n public autocomplete?:\n | HTMLInputElement['autocomplete']\n | HTMLTextAreaElement['autocomplete'];\n\n public override get focusElement(): HTMLInputElement | HTMLTextAreaElement {\n return this.inputElement;\n }\n\n /**\n * Sets the start and end positions of the current selection.\n *\n * @param selectionStart The 0-based index of the first selected character. An index greater than the length of the\n * element's value is treated as pointing to the end of the value.\n * @param selectionEnd The 0-based index of the character after the last selected character. An index greater than\n * the length of the element's value is treated as pointing to the end of the value.\n * @param [selectionDirection=\"none\"] A string indicating the direction in which the selection is considered to\n * have been performed.\n */\n public setSelectionRange(\n selectionStart: number,\n selectionEnd: number,\n selectionDirection: 'forward' | 'backward' | 'none' = 'none'\n ): void {\n this.inputElement.setSelectionRange(\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n }\n\n /**\n * Selects all the text.\n */\n public select(): void {\n this.inputElement.select();\n }\n\n protected handleInput(_event: Event): void {\n if (this.allowedKeys && this.inputElement.value) {\n const regExp = new RegExp(`^[${this.allowedKeys}]*$`, 'u');\n if (!regExp.test(this.inputElement.value)) {\n const selectionStart = this.inputElement\n .selectionStart as number;\n const nextSelectStart = selectionStart - 1;\n this.inputElement.value = this.value.toString();\n this.inputElement.setSelectionRange(\n nextSelectStart,\n nextSelectStart\n );\n return;\n }\n }\n this.value = this.inputElement.value;\n }\n\n protected handleChange(): void {\n this.dispatchEvent(\n new Event('change', {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n protected onFocus(): void {\n this.focused = !this.readonly && true;\n }\n\n protected onBlur(): void {\n this.focused = !this.readonly && false;\n }\n\n protected renderStateIcons(): TemplateResult | typeof nothing {\n if (this.invalid) {\n return html`\n <sp-icon-alert id=\"invalid\" class=\"icon\"></sp-icon-alert>\n `;\n } else if (this.valid) {\n return html`\n <sp-icon-checkmark100\n id=\"valid\"\n class=\"icon spectrum-UIIcon-Checkmark100\"\n ></sp-icon-checkmark100>\n `;\n }\n return nothing;\n }\n\n protected get displayValue(): string {\n return this.value.toString();\n }\n\n private get renderMultiline(): TemplateResult {\n return html`\n ${this.grows && this.rows === -1\n ? html`\n <div id=\"sizer\" class=\"input\" aria-hidden=\"true\">\n ${this.value}&#8203;\n </div>\n `\n : nothing}\n <!-- @ts-ignore -->\n <textarea\n aria-describedby=${this.helpTextId}\n aria-label=${this.label ||\n this.appliedLabel ||\n this.placeholder}\n aria-invalid=${ifDefined(this.invalid || undefined)}\n class=\"input\"\n maxlength=${ifDefined(\n this.maxlength > -1 ? this.maxlength : undefined\n )}\n minlength=${ifDefined(\n this.minlength > -1 ? this.minlength : undefined\n )}\n title=${this.invalid ? '' : nothing}\n pattern=${ifDefined(this.pattern)}\n placeholder=${this.placeholder}\n .value=${this.displayValue}\n @change=${this.handleChange}\n @input=${this.handleInput}\n @focus=${this.onFocus}\n @blur=${this.onBlur}\n ?disabled=${this.disabled}\n ?required=${this.required}\n ?readonly=${this.readonly}\n rows=${ifDefined(this.rows > -1 ? this.rows : undefined)}\n autocomplete=${ifDefined(this.autocomplete)}\n ></textarea>\n `;\n }\n\n private get renderInput(): TemplateResult {\n return html`\n <!-- @ts-ignore -->\n <input\n type=${this.type}\n aria-describedby=${this.helpTextId}\n aria-label=${this.label ||\n this.appliedLabel ||\n this.placeholder}\n aria-invalid=${ifDefined(this.invalid || undefined)}\n class=\"input\"\n title=${this.invalid ? '' : nothing}\n maxlength=${ifDefined(\n this.maxlength > -1 ? this.maxlength : undefined\n )}\n minlength=${ifDefined(\n this.minlength > -1 ? this.minlength : undefined\n )}\n pattern=${ifDefined(this.pattern)}\n placeholder=${this.placeholder}\n .value=${live(this.displayValue)}\n @change=${this.handleChange}\n @input=${this.handleInput}\n @focus=${this.onFocus}\n @blur=${this.onBlur}\n ?disabled=${this.disabled}\n ?required=${this.required}\n ?readonly=${this.readonly}\n autocomplete=${ifDefined(this.autocomplete)}\n />\n `;\n }\n\n protected renderField(): TemplateResult {\n return html`\n ${this.renderStateIcons()}\n ${this.multiline ? this.renderMultiline : this.renderInput}\n `;\n }\n\n protected override render(): TemplateResult {\n return html`\n <div id=\"textfield\">${this.renderField()}</div>\n ${this.renderHelpText(this.invalid)}\n `;\n }\n\n protected override update(changedProperties: PropertyValues): void {\n if (\n changedProperties.has('value') ||\n (changedProperties.has('required') && this.required)\n ) {\n this.updateComplete.then(() => {\n this.checkValidity();\n });\n }\n super.update(changedProperties);\n }\n\n public checkValidity(): boolean {\n let validity = this.inputElement.checkValidity();\n if (this.required || (this.value && this.pattern)) {\n if ((this.disabled || this.multiline) && this.pattern) {\n const regex = new RegExp(`^${this.pattern}$`, 'u');\n validity = regex.test(this.value.toString());\n }\n if (typeof this.minlength !== 'undefined') {\n validity =\n validity && this.value.toString().length >= this.minlength;\n }\n this.valid = validity;\n this.invalid = !validity;\n }\n return validity;\n }\n}\n\n/**\n * @element sp-textfield\n * @slot help-text - default or non-negative help text to associate to your form element\n * @slot negative-help-text - negative help text to associate to your form element when `invalid`\n */\nexport class Textfield extends TextfieldBase {\n @property({ type: String })\n public override set value(value: string) {\n if (value === this.value) {\n return;\n }\n const oldValue = this._value;\n this._value = value;\n this.requestUpdate('value', oldValue);\n }\n\n public override get value(): string {\n return this._value;\n }\n\n protected override _value = '';\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n nothing,\n PropertyValues,\n SizedMixin,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n ifDefined,\n live,\n} from '@spectrum-web-components/base/src/directives.js';\nimport {\n property,\n query,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\n\nimport { ManageHelpText } from '@spectrum-web-components/help-text/src/manage-help-text.js';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\nimport '@spectrum-web-components/icons-ui/icons/sp-icon-checkmark100.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js';\n\nimport textfieldStyles from './textfield.css.js';\nimport checkmarkStyles from '@spectrum-web-components/icon/src/spectrum-icon-checkmark.css.js';\n\nconst textfieldTypes = ['text', 'url', 'tel', 'email', 'password'] as const;\nexport type TextfieldType = typeof textfieldTypes[number];\n\n/**\n * @fires input - The value of the element has changed.\n * @fires change - An alteration to the value of the element has been committed by the user.\n */\nexport class TextfieldBase extends ManageHelpText(\n SizedMixin(Focusable, {\n noDefaultSize: true,\n })\n) {\n public static override get styles(): CSSResultArray {\n return [textfieldStyles, checkmarkStyles];\n }\n\n @state()\n appliedLabel?: string;\n\n @property({ attribute: 'allowed-keys' })\n allowedKeys = '';\n\n @property({ type: Boolean, reflect: true })\n public focused = false;\n\n @query('.input:not(#sizer)')\n protected inputElement!: HTMLInputElement | HTMLTextAreaElement;\n\n @property({ type: Boolean, reflect: true })\n public invalid = false;\n\n @property()\n public label = '';\n\n @property({ type: String, reflect: true })\n public name: string | undefined;\n\n @property()\n public placeholder = '';\n\n @property({ attribute: 'type', reflect: true })\n private _type: TextfieldType = 'text';\n\n @state()\n get type(): TextfieldType {\n return textfieldTypes.find((t) => t === this._type) ?? 'text';\n }\n\n set type(val: TextfieldType) {\n const prev = this._type;\n this._type = val;\n this.requestUpdate('type', prev);\n }\n\n @property()\n public pattern?: string;\n\n @property({ type: Boolean, reflect: true })\n public grows = false;\n\n @property({ type: Number })\n public maxlength = -1;\n\n @property({ type: Number })\n public minlength = -1;\n\n @property({ type: Boolean, reflect: true })\n public multiline = false;\n\n @property({ type: Boolean, reflect: true })\n public readonly = false;\n\n @property({ type: Number })\n public rows = -1;\n\n @property({ type: Boolean, reflect: true })\n public valid = false;\n\n @property({ type: String })\n public set value(value: string | number) {\n if (value === this.value) {\n return;\n }\n const oldValue = this._value;\n this._value = value;\n this.requestUpdate('value', oldValue);\n }\n\n public get value(): string | number {\n return this._value;\n }\n\n protected _value: string | number = '';\n\n @property({ type: Boolean, reflect: true })\n public quiet = false;\n\n @property({ type: Boolean, reflect: true })\n public required = false;\n\n @property({ type: String, reflect: true })\n public autocomplete?:\n | HTMLInputElement['autocomplete']\n | HTMLTextAreaElement['autocomplete'];\n\n public override get focusElement(): HTMLInputElement | HTMLTextAreaElement {\n return this.inputElement;\n }\n\n /**\n * Sets the start and end positions of the current selection.\n *\n * @param selectionStart The 0-based index of the first selected character. An index greater than the length of the\n * element's value is treated as pointing to the end of the value.\n * @param selectionEnd The 0-based index of the character after the last selected character. An index greater than\n * the length of the element's value is treated as pointing to the end of the value.\n * @param [selectionDirection=\"none\"] A string indicating the direction in which the selection is considered to\n * have been performed.\n */\n public setSelectionRange(\n selectionStart: number,\n selectionEnd: number,\n selectionDirection: 'forward' | 'backward' | 'none' = 'none'\n ): void {\n this.inputElement.setSelectionRange(\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n }\n\n /**\n * Selects all the text.\n */\n public select(): void {\n this.inputElement.select();\n }\n\n protected handleInput(_event: Event): void {\n if (this.allowedKeys && this.inputElement.value) {\n const regExp = new RegExp(`^[${this.allowedKeys}]*$`, 'u');\n if (!regExp.test(this.inputElement.value)) {\n const selectionStart = this.inputElement\n .selectionStart as number;\n const nextSelectStart = selectionStart - 1;\n this.inputElement.value = this.value.toString();\n this.inputElement.setSelectionRange(\n nextSelectStart,\n nextSelectStart\n );\n return;\n }\n }\n this.value = this.inputElement.value;\n }\n\n protected handleChange(): void {\n this.dispatchEvent(\n new Event('change', {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n protected onFocus(): void {\n this.focused = !this.readonly && true;\n }\n\n protected onBlur(): void {\n this.focused = !this.readonly && false;\n }\n\n protected renderStateIcons(): TemplateResult | typeof nothing {\n if (this.invalid) {\n return html`\n <sp-icon-alert id=\"invalid\" class=\"icon\"></sp-icon-alert>\n `;\n } else if (this.valid) {\n return html`\n <sp-icon-checkmark100\n id=\"valid\"\n class=\"icon spectrum-UIIcon-Checkmark100\"\n ></sp-icon-checkmark100>\n `;\n }\n return nothing;\n }\n\n protected get displayValue(): string {\n return this.value.toString();\n }\n\n private get renderMultiline(): TemplateResult {\n return html`\n ${this.grows && this.rows === -1\n ? html`\n <div id=\"sizer\" class=\"input\" aria-hidden=\"true\">\n ${this.value}&#8203;\n </div>\n `\n : nothing}\n <!-- @ts-ignore -->\n <textarea\n name=${ifDefined(this.name || undefined)}\n aria-describedby=${this.helpTextId}\n aria-label=${this.label ||\n this.appliedLabel ||\n this.placeholder}\n aria-invalid=${ifDefined(this.invalid || undefined)}\n class=\"input\"\n maxlength=${ifDefined(\n this.maxlength > -1 ? this.maxlength : undefined\n )}\n minlength=${ifDefined(\n this.minlength > -1 ? this.minlength : undefined\n )}\n title=${this.invalid ? '' : nothing}\n pattern=${ifDefined(this.pattern)}\n placeholder=${this.placeholder}\n .value=${this.displayValue}\n @change=${this.handleChange}\n @input=${this.handleInput}\n @focus=${this.onFocus}\n @blur=${this.onBlur}\n ?disabled=${this.disabled}\n ?required=${this.required}\n ?readonly=${this.readonly}\n rows=${ifDefined(this.rows > -1 ? this.rows : undefined)}\n autocomplete=${ifDefined(this.autocomplete)}\n ></textarea>\n `;\n }\n\n private get renderInput(): TemplateResult {\n return html`\n <!-- @ts-ignore -->\n <input\n name=${ifDefined(this.name || undefined)}\n type=${this.type}\n aria-describedby=${this.helpTextId}\n aria-label=${this.label ||\n this.appliedLabel ||\n this.placeholder}\n aria-invalid=${ifDefined(this.invalid || undefined)}\n class=\"input\"\n title=${this.invalid ? '' : nothing}\n maxlength=${ifDefined(\n this.maxlength > -1 ? this.maxlength : undefined\n )}\n minlength=${ifDefined(\n this.minlength > -1 ? this.minlength : undefined\n )}\n pattern=${ifDefined(this.pattern)}\n placeholder=${this.placeholder}\n .value=${live(this.displayValue)}\n @change=${this.handleChange}\n @input=${this.handleInput}\n @focus=${this.onFocus}\n @blur=${this.onBlur}\n ?disabled=${this.disabled}\n ?required=${this.required}\n ?readonly=${this.readonly}\n autocomplete=${ifDefined(this.autocomplete)}\n />\n `;\n }\n\n protected renderField(): TemplateResult {\n return html`\n ${this.renderStateIcons()}\n ${this.multiline ? this.renderMultiline : this.renderInput}\n `;\n }\n\n protected override render(): TemplateResult {\n return html`\n <div id=\"textfield\">${this.renderField()}</div>\n ${this.renderHelpText(this.invalid)}\n `;\n }\n\n protected override update(changedProperties: PropertyValues): void {\n if (\n changedProperties.has('value') ||\n (changedProperties.has('required') && this.required)\n ) {\n this.updateComplete.then(() => {\n this.checkValidity();\n });\n }\n super.update(changedProperties);\n }\n\n public checkValidity(): boolean {\n let validity = this.inputElement.checkValidity();\n if (this.required || (this.value && this.pattern)) {\n if ((this.disabled || this.multiline) && this.pattern) {\n const regex = new RegExp(`^${this.pattern}$`, 'u');\n validity = regex.test(this.value.toString());\n }\n if (typeof this.minlength !== 'undefined') {\n validity =\n validity && this.value.toString().length >= this.minlength;\n }\n this.valid = validity;\n this.invalid = !validity;\n }\n return validity;\n }\n}\n\n/**\n * @element sp-textfield\n * @slot help-text - default or non-negative help text to associate to your form element\n * @slot negative-help-text - negative help text to associate to your form element when `invalid`\n */\nexport class Textfield extends TextfieldBase {\n @property({ type: String })\n public override set value(value: string) {\n if (value === this.value) {\n return;\n }\n const oldValue = this._value;\n this._value = value;\n this.requestUpdate('value', oldValue);\n }\n\n public override get value(): string {\n return this._value;\n }\n\n protected override _value = '';\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/src/Textfield.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var c=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var t=(p,a,e,l)=>{for(var n=l>1?void 0:l?m(a,e):a,u=p.length-1,h;u>=0;u--)(h=p[u])&&(n=(l?h(a,e,n):h(n))||n);return l&&n&&c(a,e,n),n};import{html as s,nothing as o,SizedMixin as v}from"@spectrum-web-components/base";import{ifDefined as r,live as y}from"@spectrum-web-components/base/src/directives.js";import{property as i,query as b,state as d}from"@spectrum-web-components/base/src/decorators.js";import{ManageHelpText as g}from"@spectrum-web-components/help-text/src/manage-help-text.js";import{Focusable as f}from"@spectrum-web-components/shared/src/focusable.js";import"@spectrum-web-components/icons-ui/icons/sp-icon-checkmark100.js";import"@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js";import $ from"./textfield.css.js";import E from"@spectrum-web-components/icon/src/spectrum-icon-checkmark.css.js";const S=["text","url","tel","email","password"];export class TextfieldBase extends g(v(f,{noDefaultSize:!0})){constructor(){super(...arguments);this.allowedKeys="";this.focused=!1;this.invalid=!1;this.label="";this.placeholder="";this._type="text";this.grows=!1;this.maxlength=-1;this.minlength=-1;this.multiline=!1;this.readonly=!1;this.rows=-1;this.valid=!1;this._value="";this.quiet=!1;this.required=!1}static get styles(){return[$,E]}get type(){var e;return(e=S.find(l=>l===this._type))!=null?e:"text"}set type(e){const l=this._type;this._type=e,this.requestUpdate("type",l)}set value(e){if(e===this.value)return;const l=this._value;this._value=e,this.requestUpdate("value",l)}get value(){return this._value}get focusElement(){return this.inputElement}setSelectionRange(e,l,n="none"){this.inputElement.setSelectionRange(e,l,n)}select(){this.inputElement.select()}handleInput(e){if(this.allowedKeys&&this.inputElement.value&&!new RegExp(`^[${this.allowedKeys}]*$`,"u").test(this.inputElement.value)){const u=this.inputElement.selectionStart-1;this.inputElement.value=this.value.toString(),this.inputElement.setSelectionRange(u,u);return}this.value=this.inputElement.value}handleChange(){this.dispatchEvent(new Event("change",{bubbles:!0,composed:!0}))}onFocus(){this.focused=!this.readonly&&!0}onBlur(){this.focused=!this.readonly&&!1}renderStateIcons(){return this.invalid?s`
1
+ "use strict";var c=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var t=(p,a,e,l)=>{for(var r=l>1?void 0:l?m(a,e):a,u=p.length-1,h;u>=0;u--)(h=p[u])&&(r=(l?h(a,e,r):h(r))||r);return l&&r&&c(a,e,r),r};import{html as s,nothing as o,SizedMixin as v}from"@spectrum-web-components/base";import{ifDefined as n,live as y}from"@spectrum-web-components/base/src/directives.js";import{property as i,query as b,state as d}from"@spectrum-web-components/base/src/decorators.js";import{ManageHelpText as g}from"@spectrum-web-components/help-text/src/manage-help-text.js";import{Focusable as f}from"@spectrum-web-components/shared/src/focusable.js";import"@spectrum-web-components/icons-ui/icons/sp-icon-checkmark100.js";import"@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js";import $ from"./textfield.css.js";import S from"@spectrum-web-components/icon/src/spectrum-icon-checkmark.css.js";const E=["text","url","tel","email","password"];export class TextfieldBase extends g(v(f,{noDefaultSize:!0})){constructor(){super(...arguments);this.allowedKeys="";this.focused=!1;this.invalid=!1;this.label="";this.placeholder="";this._type="text";this.grows=!1;this.maxlength=-1;this.minlength=-1;this.multiline=!1;this.readonly=!1;this.rows=-1;this.valid=!1;this._value="";this.quiet=!1;this.required=!1}static get styles(){return[$,S]}get type(){var e;return(e=E.find(l=>l===this._type))!=null?e:"text"}set type(e){const l=this._type;this._type=e,this.requestUpdate("type",l)}set value(e){if(e===this.value)return;const l=this._value;this._value=e,this.requestUpdate("value",l)}get value(){return this._value}get focusElement(){return this.inputElement}setSelectionRange(e,l,r="none"){this.inputElement.setSelectionRange(e,l,r)}select(){this.inputElement.select()}handleInput(e){if(this.allowedKeys&&this.inputElement.value&&!new RegExp(`^[${this.allowedKeys}]*$`,"u").test(this.inputElement.value)){const u=this.inputElement.selectionStart-1;this.inputElement.value=this.value.toString(),this.inputElement.setSelectionRange(u,u);return}this.value=this.inputElement.value}handleChange(){this.dispatchEvent(new Event("change",{bubbles:!0,composed:!0}))}onFocus(){this.focused=!this.readonly&&!0}onBlur(){this.focused=!this.readonly&&!1}renderStateIcons(){return this.invalid?s`
2
2
  <sp-icon-alert id="invalid" class="icon"></sp-icon-alert>
3
3
  `:this.valid?s`
4
4
  <sp-icon-checkmark100
@@ -13,14 +13,15 @@
13
13
  `:o}
14
14
  <!-- @ts-ignore -->
15
15
  <textarea
16
+ name=${n(this.name||void 0)}
16
17
  aria-describedby=${this.helpTextId}
17
18
  aria-label=${this.label||this.appliedLabel||this.placeholder}
18
- aria-invalid=${r(this.invalid||void 0)}
19
+ aria-invalid=${n(this.invalid||void 0)}
19
20
  class="input"
20
- maxlength=${r(this.maxlength>-1?this.maxlength:void 0)}
21
- minlength=${r(this.minlength>-1?this.minlength:void 0)}
21
+ maxlength=${n(this.maxlength>-1?this.maxlength:void 0)}
22
+ minlength=${n(this.minlength>-1?this.minlength:void 0)}
22
23
  title=${this.invalid?"":o}
23
- pattern=${r(this.pattern)}
24
+ pattern=${n(this.pattern)}
24
25
  placeholder=${this.placeholder}
25
26
  .value=${this.displayValue}
26
27
  @change=${this.handleChange}
@@ -30,21 +31,22 @@
30
31
  ?disabled=${this.disabled}
31
32
  ?required=${this.required}
32
33
  ?readonly=${this.readonly}
33
- rows=${r(this.rows>-1?this.rows:void 0)}
34
- autocomplete=${r(this.autocomplete)}
34
+ rows=${n(this.rows>-1?this.rows:void 0)}
35
+ autocomplete=${n(this.autocomplete)}
35
36
  ></textarea>
36
37
  `}get renderInput(){return s`
37
38
  <!-- @ts-ignore -->
38
39
  <input
40
+ name=${n(this.name||void 0)}
39
41
  type=${this.type}
40
42
  aria-describedby=${this.helpTextId}
41
43
  aria-label=${this.label||this.appliedLabel||this.placeholder}
42
- aria-invalid=${r(this.invalid||void 0)}
44
+ aria-invalid=${n(this.invalid||void 0)}
43
45
  class="input"
44
46
  title=${this.invalid?"":o}
45
- maxlength=${r(this.maxlength>-1?this.maxlength:void 0)}
46
- minlength=${r(this.minlength>-1?this.minlength:void 0)}
47
- pattern=${r(this.pattern)}
47
+ maxlength=${n(this.maxlength>-1?this.maxlength:void 0)}
48
+ minlength=${n(this.minlength>-1?this.minlength:void 0)}
49
+ pattern=${n(this.pattern)}
48
50
  placeholder=${this.placeholder}
49
51
  .value=${y(this.displayValue)}
50
52
  @change=${this.handleChange}
@@ -54,7 +56,7 @@
54
56
  ?disabled=${this.disabled}
55
57
  ?required=${this.required}
56
58
  ?readonly=${this.readonly}
57
- autocomplete=${r(this.autocomplete)}
59
+ autocomplete=${n(this.autocomplete)}
58
60
  />
59
61
  `}renderField(){return s`
60
62
  ${this.renderStateIcons()}
@@ -62,5 +64,5 @@
62
64
  `}render(){return s`
63
65
  <div id="textfield">${this.renderField()}</div>
64
66
  ${this.renderHelpText(this.invalid)}
65
- `}update(e){(e.has("value")||e.has("required")&&this.required)&&this.updateComplete.then(()=>{this.checkValidity()}),super.update(e)}checkValidity(){let e=this.inputElement.checkValidity();return(this.required||this.value&&this.pattern)&&((this.disabled||this.multiline)&&this.pattern&&(e=new RegExp(`^${this.pattern}$`,"u").test(this.value.toString())),typeof this.minlength!="undefined"&&(e=e&&this.value.toString().length>=this.minlength),this.valid=e,this.invalid=!e),e}}t([d()],TextfieldBase.prototype,"appliedLabel",2),t([i({attribute:"allowed-keys"})],TextfieldBase.prototype,"allowedKeys",2),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"focused",2),t([b(".input:not(#sizer)")],TextfieldBase.prototype,"inputElement",2),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"invalid",2),t([i()],TextfieldBase.prototype,"label",2),t([i()],TextfieldBase.prototype,"placeholder",2),t([i({attribute:"type",reflect:!0})],TextfieldBase.prototype,"_type",2),t([d()],TextfieldBase.prototype,"type",1),t([i()],TextfieldBase.prototype,"pattern",2),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"grows",2),t([i({type:Number})],TextfieldBase.prototype,"maxlength",2),t([i({type:Number})],TextfieldBase.prototype,"minlength",2),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"multiline",2),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"readonly",2),t([i({type:Number})],TextfieldBase.prototype,"rows",2),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"valid",2),t([i({type:String})],TextfieldBase.prototype,"value",1),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"quiet",2),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"required",2),t([i({type:String,reflect:!0})],TextfieldBase.prototype,"autocomplete",2);export class Textfield extends TextfieldBase{constructor(){super(...arguments);this._value=""}set value(e){if(e===this.value)return;const l=this._value;this._value=e,this.requestUpdate("value",l)}get value(){return this._value}}t([i({type:String})],Textfield.prototype,"value",1);
67
+ `}update(e){(e.has("value")||e.has("required")&&this.required)&&this.updateComplete.then(()=>{this.checkValidity()}),super.update(e)}checkValidity(){let e=this.inputElement.checkValidity();return(this.required||this.value&&this.pattern)&&((this.disabled||this.multiline)&&this.pattern&&(e=new RegExp(`^${this.pattern}$`,"u").test(this.value.toString())),typeof this.minlength!="undefined"&&(e=e&&this.value.toString().length>=this.minlength),this.valid=e,this.invalid=!e),e}}t([d()],TextfieldBase.prototype,"appliedLabel",2),t([i({attribute:"allowed-keys"})],TextfieldBase.prototype,"allowedKeys",2),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"focused",2),t([b(".input:not(#sizer)")],TextfieldBase.prototype,"inputElement",2),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"invalid",2),t([i()],TextfieldBase.prototype,"label",2),t([i({type:String,reflect:!0})],TextfieldBase.prototype,"name",2),t([i()],TextfieldBase.prototype,"placeholder",2),t([i({attribute:"type",reflect:!0})],TextfieldBase.prototype,"_type",2),t([d()],TextfieldBase.prototype,"type",1),t([i()],TextfieldBase.prototype,"pattern",2),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"grows",2),t([i({type:Number})],TextfieldBase.prototype,"maxlength",2),t([i({type:Number})],TextfieldBase.prototype,"minlength",2),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"multiline",2),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"readonly",2),t([i({type:Number})],TextfieldBase.prototype,"rows",2),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"valid",2),t([i({type:String})],TextfieldBase.prototype,"value",1),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"quiet",2),t([i({type:Boolean,reflect:!0})],TextfieldBase.prototype,"required",2),t([i({type:String,reflect:!0})],TextfieldBase.prototype,"autocomplete",2);export class Textfield extends TextfieldBase{constructor(){super(...arguments);this._value=""}set value(e){if(e===this.value)return;const l=this._value;this._value=e,this.requestUpdate("value",l)}get value(){return this._value}}t([i({type:String})],Textfield.prototype,"value",1);
66
68
  //# sourceMappingURL=Textfield.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["Textfield.ts"],
4
- "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n nothing,\n PropertyValues,\n SizedMixin,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n ifDefined,\n live,\n} from '@spectrum-web-components/base/src/directives.js';\nimport {\n property,\n query,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\n\nimport { ManageHelpText } from '@spectrum-web-components/help-text/src/manage-help-text.js';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\nimport '@spectrum-web-components/icons-ui/icons/sp-icon-checkmark100.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js';\n\nimport textfieldStyles from './textfield.css.js';\nimport checkmarkStyles from '@spectrum-web-components/icon/src/spectrum-icon-checkmark.css.js';\n\nconst textfieldTypes = ['text', 'url', 'tel', 'email', 'password'] as const;\nexport type TextfieldType = typeof textfieldTypes[number];\n\n/**\n * @fires input - The value of the element has changed.\n * @fires change - An alteration to the value of the element has been committed by the user.\n */\nexport class TextfieldBase extends ManageHelpText(\n SizedMixin(Focusable, {\n noDefaultSize: true,\n })\n) {\n public static override get styles(): CSSResultArray {\n return [textfieldStyles, checkmarkStyles];\n }\n\n @state()\n appliedLabel?: string;\n\n @property({ attribute: 'allowed-keys' })\n allowedKeys = '';\n\n @property({ type: Boolean, reflect: true })\n public focused = false;\n\n @query('.input:not(#sizer)')\n protected inputElement!: HTMLInputElement | HTMLTextAreaElement;\n\n @property({ type: Boolean, reflect: true })\n public invalid = false;\n\n @property()\n public label = '';\n\n @property()\n public placeholder = '';\n\n @property({ attribute: 'type', reflect: true })\n private _type: TextfieldType = 'text';\n\n @state()\n get type(): TextfieldType {\n return textfieldTypes.find((t) => t === this._type) ?? 'text';\n }\n\n set type(val: TextfieldType) {\n const prev = this._type;\n this._type = val;\n this.requestUpdate('type', prev);\n }\n\n @property()\n public pattern?: string;\n\n @property({ type: Boolean, reflect: true })\n public grows = false;\n\n @property({ type: Number })\n public maxlength = -1;\n\n @property({ type: Number })\n public minlength = -1;\n\n @property({ type: Boolean, reflect: true })\n public multiline = false;\n\n @property({ type: Boolean, reflect: true })\n public readonly = false;\n\n @property({ type: Number })\n public rows = -1;\n\n @property({ type: Boolean, reflect: true })\n public valid = false;\n\n @property({ type: String })\n public set value(value: string | number) {\n if (value === this.value) {\n return;\n }\n const oldValue = this._value;\n this._value = value;\n this.requestUpdate('value', oldValue);\n }\n\n public get value(): string | number {\n return this._value;\n }\n\n protected _value: string | number = '';\n\n @property({ type: Boolean, reflect: true })\n public quiet = false;\n\n @property({ type: Boolean, reflect: true })\n public required = false;\n\n @property({ type: String, reflect: true })\n public autocomplete?:\n | HTMLInputElement['autocomplete']\n | HTMLTextAreaElement['autocomplete'];\n\n public override get focusElement(): HTMLInputElement | HTMLTextAreaElement {\n return this.inputElement;\n }\n\n /**\n * Sets the start and end positions of the current selection.\n *\n * @param selectionStart The 0-based index of the first selected character. An index greater than the length of the\n * element's value is treated as pointing to the end of the value.\n * @param selectionEnd The 0-based index of the character after the last selected character. An index greater than\n * the length of the element's value is treated as pointing to the end of the value.\n * @param [selectionDirection=\"none\"] A string indicating the direction in which the selection is considered to\n * have been performed.\n */\n public setSelectionRange(\n selectionStart: number,\n selectionEnd: number,\n selectionDirection: 'forward' | 'backward' | 'none' = 'none'\n ): void {\n this.inputElement.setSelectionRange(\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n }\n\n /**\n * Selects all the text.\n */\n public select(): void {\n this.inputElement.select();\n }\n\n protected handleInput(_event: Event): void {\n if (this.allowedKeys && this.inputElement.value) {\n const regExp = new RegExp(`^[${this.allowedKeys}]*$`, 'u');\n if (!regExp.test(this.inputElement.value)) {\n const selectionStart = this.inputElement\n .selectionStart as number;\n const nextSelectStart = selectionStart - 1;\n this.inputElement.value = this.value.toString();\n this.inputElement.setSelectionRange(\n nextSelectStart,\n nextSelectStart\n );\n return;\n }\n }\n this.value = this.inputElement.value;\n }\n\n protected handleChange(): void {\n this.dispatchEvent(\n new Event('change', {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n protected onFocus(): void {\n this.focused = !this.readonly && true;\n }\n\n protected onBlur(): void {\n this.focused = !this.readonly && false;\n }\n\n protected renderStateIcons(): TemplateResult | typeof nothing {\n if (this.invalid) {\n return html`\n <sp-icon-alert id=\"invalid\" class=\"icon\"></sp-icon-alert>\n `;\n } else if (this.valid) {\n return html`\n <sp-icon-checkmark100\n id=\"valid\"\n class=\"icon spectrum-UIIcon-Checkmark100\"\n ></sp-icon-checkmark100>\n `;\n }\n return nothing;\n }\n\n protected get displayValue(): string {\n return this.value.toString();\n }\n\n private get renderMultiline(): TemplateResult {\n return html`\n ${this.grows && this.rows === -1\n ? html`\n <div id=\"sizer\" class=\"input\" aria-hidden=\"true\">\n ${this.value}&#8203;\n </div>\n `\n : nothing}\n <!-- @ts-ignore -->\n <textarea\n aria-describedby=${this.helpTextId}\n aria-label=${this.label ||\n this.appliedLabel ||\n this.placeholder}\n aria-invalid=${ifDefined(this.invalid || undefined)}\n class=\"input\"\n maxlength=${ifDefined(\n this.maxlength > -1 ? this.maxlength : undefined\n )}\n minlength=${ifDefined(\n this.minlength > -1 ? this.minlength : undefined\n )}\n title=${this.invalid ? '' : nothing}\n pattern=${ifDefined(this.pattern)}\n placeholder=${this.placeholder}\n .value=${this.displayValue}\n @change=${this.handleChange}\n @input=${this.handleInput}\n @focus=${this.onFocus}\n @blur=${this.onBlur}\n ?disabled=${this.disabled}\n ?required=${this.required}\n ?readonly=${this.readonly}\n rows=${ifDefined(this.rows > -1 ? this.rows : undefined)}\n autocomplete=${ifDefined(this.autocomplete)}\n ></textarea>\n `;\n }\n\n private get renderInput(): TemplateResult {\n return html`\n <!-- @ts-ignore -->\n <input\n type=${this.type}\n aria-describedby=${this.helpTextId}\n aria-label=${this.label ||\n this.appliedLabel ||\n this.placeholder}\n aria-invalid=${ifDefined(this.invalid || undefined)}\n class=\"input\"\n title=${this.invalid ? '' : nothing}\n maxlength=${ifDefined(\n this.maxlength > -1 ? this.maxlength : undefined\n )}\n minlength=${ifDefined(\n this.minlength > -1 ? this.minlength : undefined\n )}\n pattern=${ifDefined(this.pattern)}\n placeholder=${this.placeholder}\n .value=${live(this.displayValue)}\n @change=${this.handleChange}\n @input=${this.handleInput}\n @focus=${this.onFocus}\n @blur=${this.onBlur}\n ?disabled=${this.disabled}\n ?required=${this.required}\n ?readonly=${this.readonly}\n autocomplete=${ifDefined(this.autocomplete)}\n />\n `;\n }\n\n protected renderField(): TemplateResult {\n return html`\n ${this.renderStateIcons()}\n ${this.multiline ? this.renderMultiline : this.renderInput}\n `;\n }\n\n protected override render(): TemplateResult {\n return html`\n <div id=\"textfield\">${this.renderField()}</div>\n ${this.renderHelpText(this.invalid)}\n `;\n }\n\n protected override update(changedProperties: PropertyValues): void {\n if (\n changedProperties.has('value') ||\n (changedProperties.has('required') && this.required)\n ) {\n this.updateComplete.then(() => {\n this.checkValidity();\n });\n }\n super.update(changedProperties);\n }\n\n public checkValidity(): boolean {\n let validity = this.inputElement.checkValidity();\n if (this.required || (this.value && this.pattern)) {\n if ((this.disabled || this.multiline) && this.pattern) {\n const regex = new RegExp(`^${this.pattern}$`, 'u');\n validity = regex.test(this.value.toString());\n }\n if (typeof this.minlength !== 'undefined') {\n validity =\n validity && this.value.toString().length >= this.minlength;\n }\n this.valid = validity;\n this.invalid = !validity;\n }\n return validity;\n }\n}\n\n/**\n * @element sp-textfield\n * @slot help-text - default or non-negative help text to associate to your form element\n * @slot negative-help-text - negative help text to associate to your form element when `invalid`\n */\nexport class Textfield extends TextfieldBase {\n @property({ type: String })\n public override set value(value: string) {\n if (value === this.value) {\n return;\n }\n const oldValue = this._value;\n this._value = value;\n this.requestUpdate('value', oldValue);\n }\n\n public override get value(): string {\n return this._value;\n }\n\n protected override _value = '';\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n nothing,\n PropertyValues,\n SizedMixin,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n ifDefined,\n live,\n} from '@spectrum-web-components/base/src/directives.js';\nimport {\n property,\n query,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\n\nimport { ManageHelpText } from '@spectrum-web-components/help-text/src/manage-help-text.js';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\nimport '@spectrum-web-components/icons-ui/icons/sp-icon-checkmark100.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js';\n\nimport textfieldStyles from './textfield.css.js';\nimport checkmarkStyles from '@spectrum-web-components/icon/src/spectrum-icon-checkmark.css.js';\n\nconst textfieldTypes = ['text', 'url', 'tel', 'email', 'password'] as const;\nexport type TextfieldType = typeof textfieldTypes[number];\n\n/**\n * @fires input - The value of the element has changed.\n * @fires change - An alteration to the value of the element has been committed by the user.\n */\nexport class TextfieldBase extends ManageHelpText(\n SizedMixin(Focusable, {\n noDefaultSize: true,\n })\n) {\n public static override get styles(): CSSResultArray {\n return [textfieldStyles, checkmarkStyles];\n }\n\n @state()\n appliedLabel?: string;\n\n @property({ attribute: 'allowed-keys' })\n allowedKeys = '';\n\n @property({ type: Boolean, reflect: true })\n public focused = false;\n\n @query('.input:not(#sizer)')\n protected inputElement!: HTMLInputElement | HTMLTextAreaElement;\n\n @property({ type: Boolean, reflect: true })\n public invalid = false;\n\n @property()\n public label = '';\n\n @property({ type: String, reflect: true })\n public name: string | undefined;\n\n @property()\n public placeholder = '';\n\n @property({ attribute: 'type', reflect: true })\n private _type: TextfieldType = 'text';\n\n @state()\n get type(): TextfieldType {\n return textfieldTypes.find((t) => t === this._type) ?? 'text';\n }\n\n set type(val: TextfieldType) {\n const prev = this._type;\n this._type = val;\n this.requestUpdate('type', prev);\n }\n\n @property()\n public pattern?: string;\n\n @property({ type: Boolean, reflect: true })\n public grows = false;\n\n @property({ type: Number })\n public maxlength = -1;\n\n @property({ type: Number })\n public minlength = -1;\n\n @property({ type: Boolean, reflect: true })\n public multiline = false;\n\n @property({ type: Boolean, reflect: true })\n public readonly = false;\n\n @property({ type: Number })\n public rows = -1;\n\n @property({ type: Boolean, reflect: true })\n public valid = false;\n\n @property({ type: String })\n public set value(value: string | number) {\n if (value === this.value) {\n return;\n }\n const oldValue = this._value;\n this._value = value;\n this.requestUpdate('value', oldValue);\n }\n\n public get value(): string | number {\n return this._value;\n }\n\n protected _value: string | number = '';\n\n @property({ type: Boolean, reflect: true })\n public quiet = false;\n\n @property({ type: Boolean, reflect: true })\n public required = false;\n\n @property({ type: String, reflect: true })\n public autocomplete?:\n | HTMLInputElement['autocomplete']\n | HTMLTextAreaElement['autocomplete'];\n\n public override get focusElement(): HTMLInputElement | HTMLTextAreaElement {\n return this.inputElement;\n }\n\n /**\n * Sets the start and end positions of the current selection.\n *\n * @param selectionStart The 0-based index of the first selected character. An index greater than the length of the\n * element's value is treated as pointing to the end of the value.\n * @param selectionEnd The 0-based index of the character after the last selected character. An index greater than\n * the length of the element's value is treated as pointing to the end of the value.\n * @param [selectionDirection=\"none\"] A string indicating the direction in which the selection is considered to\n * have been performed.\n */\n public setSelectionRange(\n selectionStart: number,\n selectionEnd: number,\n selectionDirection: 'forward' | 'backward' | 'none' = 'none'\n ): void {\n this.inputElement.setSelectionRange(\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n }\n\n /**\n * Selects all the text.\n */\n public select(): void {\n this.inputElement.select();\n }\n\n protected handleInput(_event: Event): void {\n if (this.allowedKeys && this.inputElement.value) {\n const regExp = new RegExp(`^[${this.allowedKeys}]*$`, 'u');\n if (!regExp.test(this.inputElement.value)) {\n const selectionStart = this.inputElement\n .selectionStart as number;\n const nextSelectStart = selectionStart - 1;\n this.inputElement.value = this.value.toString();\n this.inputElement.setSelectionRange(\n nextSelectStart,\n nextSelectStart\n );\n return;\n }\n }\n this.value = this.inputElement.value;\n }\n\n protected handleChange(): void {\n this.dispatchEvent(\n new Event('change', {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n protected onFocus(): void {\n this.focused = !this.readonly && true;\n }\n\n protected onBlur(): void {\n this.focused = !this.readonly && false;\n }\n\n protected renderStateIcons(): TemplateResult | typeof nothing {\n if (this.invalid) {\n return html`\n <sp-icon-alert id=\"invalid\" class=\"icon\"></sp-icon-alert>\n `;\n } else if (this.valid) {\n return html`\n <sp-icon-checkmark100\n id=\"valid\"\n class=\"icon spectrum-UIIcon-Checkmark100\"\n ></sp-icon-checkmark100>\n `;\n }\n return nothing;\n }\n\n protected get displayValue(): string {\n return this.value.toString();\n }\n\n private get renderMultiline(): TemplateResult {\n return html`\n ${this.grows && this.rows === -1\n ? html`\n <div id=\"sizer\" class=\"input\" aria-hidden=\"true\">\n ${this.value}&#8203;\n </div>\n `\n : nothing}\n <!-- @ts-ignore -->\n <textarea\n name=${ifDefined(this.name || undefined)}\n aria-describedby=${this.helpTextId}\n aria-label=${this.label ||\n this.appliedLabel ||\n this.placeholder}\n aria-invalid=${ifDefined(this.invalid || undefined)}\n class=\"input\"\n maxlength=${ifDefined(\n this.maxlength > -1 ? this.maxlength : undefined\n )}\n minlength=${ifDefined(\n this.minlength > -1 ? this.minlength : undefined\n )}\n title=${this.invalid ? '' : nothing}\n pattern=${ifDefined(this.pattern)}\n placeholder=${this.placeholder}\n .value=${this.displayValue}\n @change=${this.handleChange}\n @input=${this.handleInput}\n @focus=${this.onFocus}\n @blur=${this.onBlur}\n ?disabled=${this.disabled}\n ?required=${this.required}\n ?readonly=${this.readonly}\n rows=${ifDefined(this.rows > -1 ? this.rows : undefined)}\n autocomplete=${ifDefined(this.autocomplete)}\n ></textarea>\n `;\n }\n\n private get renderInput(): TemplateResult {\n return html`\n <!-- @ts-ignore -->\n <input\n name=${ifDefined(this.name || undefined)}\n type=${this.type}\n aria-describedby=${this.helpTextId}\n aria-label=${this.label ||\n this.appliedLabel ||\n this.placeholder}\n aria-invalid=${ifDefined(this.invalid || undefined)}\n class=\"input\"\n title=${this.invalid ? '' : nothing}\n maxlength=${ifDefined(\n this.maxlength > -1 ? this.maxlength : undefined\n )}\n minlength=${ifDefined(\n this.minlength > -1 ? this.minlength : undefined\n )}\n pattern=${ifDefined(this.pattern)}\n placeholder=${this.placeholder}\n .value=${live(this.displayValue)}\n @change=${this.handleChange}\n @input=${this.handleInput}\n @focus=${this.onFocus}\n @blur=${this.onBlur}\n ?disabled=${this.disabled}\n ?required=${this.required}\n ?readonly=${this.readonly}\n autocomplete=${ifDefined(this.autocomplete)}\n />\n `;\n }\n\n protected renderField(): TemplateResult {\n return html`\n ${this.renderStateIcons()}\n ${this.multiline ? this.renderMultiline : this.renderInput}\n `;\n }\n\n protected override render(): TemplateResult {\n return html`\n <div id=\"textfield\">${this.renderField()}</div>\n ${this.renderHelpText(this.invalid)}\n `;\n }\n\n protected override update(changedProperties: PropertyValues): void {\n if (\n changedProperties.has('value') ||\n (changedProperties.has('required') && this.required)\n ) {\n this.updateComplete.then(() => {\n this.checkValidity();\n });\n }\n super.update(changedProperties);\n }\n\n public checkValidity(): boolean {\n let validity = this.inputElement.checkValidity();\n if (this.required || (this.value && this.pattern)) {\n if ((this.disabled || this.multiline) && this.pattern) {\n const regex = new RegExp(`^${this.pattern}$`, 'u');\n validity = regex.test(this.value.toString());\n }\n if (typeof this.minlength !== 'undefined') {\n validity =\n validity && this.value.toString().length >= this.minlength;\n }\n this.valid = validity;\n this.invalid = !validity;\n }\n return validity;\n }\n}\n\n/**\n * @element sp-textfield\n * @slot help-text - default or non-negative help text to associate to your form element\n * @slot negative-help-text - negative help text to associate to your form element when `invalid`\n */\nexport class Textfield extends TextfieldBase {\n @property({ type: String })\n public override set value(value: string) {\n if (value === this.value) {\n return;\n }\n const oldValue = this._value;\n this._value = value;\n this.requestUpdate('value', oldValue);\n }\n\n public override get value(): string {\n return this._value;\n }\n\n protected override _value = '';\n}\n"],
5
+ "mappings": "qNAYA,OAEI,QAAAA,EACA,WAAAC,EAEA,cAAAC,MAEG,gCACP,OACI,aAAAC,EACA,QAAAC,MACG,kDACP,OACI,YAAAC,EACA,SAAAC,EACA,SAAAC,MACG,kDAEP,OAAS,kBAAAC,MAAsB,6DAC/B,OAAS,aAAAC,MAAiB,mDAC1B,MAAO,kEACP,MAAO,iEAEP,OAAOC,MAAqB,qBAC5B,OAAOC,MAAqB,mEAE5B,MAAMC,EAAiB,CAAC,OAAQ,MAAO,MAAO,QAAS,UAAU,EAO1D,aAAM,sBAAsBJ,EAC/BN,EAAWO,EAAW,CAClB,cAAe,EACnB,CAAC,CACL,CAAE,CAJK,kCAaH,iBAAc,GAGd,KAAO,QAAU,GAMjB,KAAO,QAAU,GAGjB,KAAO,MAAQ,GAMf,KAAO,YAAc,GAGrB,KAAQ,MAAuB,OAiB/B,KAAO,MAAQ,GAGf,KAAO,UAAY,GAGnB,KAAO,UAAY,GAGnB,KAAO,UAAY,GAGnB,KAAO,SAAW,GAGlB,KAAO,KAAO,GAGd,KAAO,MAAQ,GAgBf,KAAU,OAA0B,GAGpC,KAAO,MAAQ,GAGf,KAAO,SAAW,GAtFlB,WAA2B,QAAyB,CAChD,MAAO,CAACC,EAAiBC,CAAe,CAC5C,CA8BA,IAAI,MAAsB,CAlF9B,IAAAE,EAmFQ,OAAOA,EAAAD,EAAe,KAAME,GAAMA,IAAM,KAAK,KAAK,IAA3C,KAAAD,EAAgD,MAC3D,CAEA,IAAI,KAAKE,EAAoB,CACzB,MAAMC,EAAO,KAAK,MAClB,KAAK,MAAQD,EACb,KAAK,cAAc,OAAQC,CAAI,CACnC,CA2BA,IAAW,MAAMC,EAAwB,CACrC,GAAIA,IAAU,KAAK,MACf,OAEJ,MAAMC,EAAW,KAAK,OACtB,KAAK,OAASD,EACd,KAAK,cAAc,QAASC,CAAQ,CACxC,CAEA,IAAW,OAAyB,CAChC,OAAO,KAAK,MAChB,CAeA,IAAoB,cAAuD,CACvE,OAAO,KAAK,YAChB,CAYO,kBACHC,EACAC,EACAC,EAAsD,OAClD,CACJ,KAAK,aAAa,kBACdF,EACAC,EACAC,CACJ,CACJ,CAKO,QAAe,CAClB,KAAK,aAAa,OAAO,CAC7B,CAEU,YAAYC,EAAqB,CACvC,GAAI,KAAK,aAAe,KAAK,aAAa,OAElC,CADW,IAAI,OAAO,KAAK,KAAK,WAAW,MAAO,GAAG,EAC7C,KAAK,KAAK,aAAa,KAAK,EAAG,CAGvC,MAAMC,EAFiB,KAAK,aACvB,eACoC,EACzC,KAAK,aAAa,MAAQ,KAAK,MAAM,SAAS,EAC9C,KAAK,aAAa,kBACdA,EACAA,CACJ,EACA,MACJ,CAEJ,KAAK,MAAQ,KAAK,aAAa,KACnC,CAEU,cAAqB,CAC3B,KAAK,cACD,IAAI,MAAM,SAAU,CAChB,QAAS,GACT,SAAU,EACd,CAAC,CACL,CACJ,CAEU,SAAgB,CACtB,KAAK,QAAU,CAAC,KAAK,UAAY,EACrC,CAEU,QAAe,CACrB,KAAK,QAAU,CAAC,KAAK,UAAY,EACrC,CAEU,kBAAoD,CAC1D,OAAI,KAAK,QACEvB;AAAA;AAAA,cAGA,KAAK,MACLA;AAAA;AAAA;AAAA;AAAA;AAAA,cAOJC,CACX,CAEA,IAAc,cAAuB,CACjC,OAAO,KAAK,MAAM,SAAS,CAC/B,CAEA,IAAY,iBAAkC,CAC1C,OAAOD;AAAA,cACD,KAAK,OAAS,KAAK,OAAS,GACxBA;AAAA;AAAA,4BAEU,KAAK,KAAK;AAAA;AAAA,oBAGpBC,CAAO;AAAA;AAAA;AAAA,uBAGFE,EAAU,KAAK,MAAQ,MAAS,CAAC;AAAA,mCACrB,KAAK,UAAU;AAAA,6BACrB,KAAK,OAClB,KAAK,cACL,KAAK,WAAW;AAAA,+BACDA,EAAU,KAAK,SAAW,MAAS,CAAC;AAAA;AAAA,4BAEvCA,EACR,KAAK,UAAY,GAAK,KAAK,UAAY,MAC3C,CAAC;AAAA,4BACWA,EACR,KAAK,UAAY,GAAK,KAAK,UAAY,MAC3C,CAAC;AAAA,wBACO,KAAK,QAAU,GAAKF,CAAO;AAAA,0BACzBE,EAAU,KAAK,OAAO,CAAC;AAAA,8BACnB,KAAK,WAAW;AAAA,yBACrB,KAAK,YAAY;AAAA,0BAChB,KAAK,YAAY;AAAA,yBAClB,KAAK,WAAW;AAAA,yBAChB,KAAK,OAAO;AAAA,wBACb,KAAK,MAAM;AAAA,4BACP,KAAK,QAAQ;AAAA,4BACb,KAAK,QAAQ;AAAA,4BACb,KAAK,QAAQ;AAAA,uBAClBA,EAAU,KAAK,KAAO,GAAK,KAAK,KAAO,MAAS,CAAC;AAAA,+BACzCA,EAAU,KAAK,YAAY,CAAC;AAAA;AAAA,SAGvD,CAEA,IAAY,aAA8B,CACtC,OAAOH;AAAA;AAAA;AAAA,uBAGQG,EAAU,KAAK,MAAQ,MAAS,CAAC;AAAA,uBACjC,KAAK,IAAI;AAAA,mCACG,KAAK,UAAU;AAAA,6BACrB,KAAK,OAClB,KAAK,cACL,KAAK,WAAW;AAAA,+BACDA,EAAU,KAAK,SAAW,MAAS,CAAC;AAAA;AAAA,wBAE3C,KAAK,QAAU,GAAKF,CAAO;AAAA,4BACvBE,EACR,KAAK,UAAY,GAAK,KAAK,UAAY,MAC3C,CAAC;AAAA,4BACWA,EACR,KAAK,UAAY,GAAK,KAAK,UAAY,MAC3C,CAAC;AAAA,0BACSA,EAAU,KAAK,OAAO,CAAC;AAAA,8BACnB,KAAK,WAAW;AAAA,yBACrBC,EAAK,KAAK,YAAY,CAAC;AAAA,0BACtB,KAAK,YAAY;AAAA,yBAClB,KAAK,WAAW;AAAA,yBAChB,KAAK,OAAO;AAAA,wBACb,KAAK,MAAM;AAAA,4BACP,KAAK,QAAQ;AAAA,4BACb,KAAK,QAAQ;AAAA,4BACb,KAAK,QAAQ;AAAA,+BACVD,EAAU,KAAK,YAAY,CAAC;AAAA;AAAA,SAGvD,CAEU,aAA8B,CACpC,OAAOH;AAAA,cACD,KAAK,iBAAiB,CAAC;AAAA,cACvB,KAAK,UAAY,KAAK,gBAAkB,KAAK,WAAW;AAAA,SAElE,CAEmB,QAAyB,CACxC,OAAOA;AAAA,kCACmB,KAAK,YAAY,CAAC;AAAA,cACtC,KAAK,eAAe,KAAK,OAAO,CAAC;AAAA,SAE3C,CAEmB,OAAOwB,EAAyC,EAE3DA,EAAkB,IAAI,OAAO,GAC5BA,EAAkB,IAAI,UAAU,GAAK,KAAK,WAE3C,KAAK,eAAe,KAAK,IAAM,CAC3B,KAAK,cAAc,CACvB,CAAC,EAEL,MAAM,OAAOA,CAAiB,CAClC,CAEO,eAAyB,CAC5B,IAAIC,EAAW,KAAK,aAAa,cAAc,EAC/C,OAAI,KAAK,UAAa,KAAK,OAAS,KAAK,YAChC,KAAK,UAAY,KAAK,YAAc,KAAK,UAE1CA,EADc,IAAI,OAAO,IAAI,KAAK,OAAO,IAAK,GAAG,EAChC,KAAK,KAAK,MAAM,SAAS,CAAC,GAE3C,OAAO,KAAK,WAAc,cAC1BA,EACIA,GAAY,KAAK,MAAM,SAAS,EAAE,QAAU,KAAK,WAEzD,KAAK,MAAQA,EACb,KAAK,QAAU,CAACA,GAEbA,CACX,CACJ,CArSIC,EAAA,CADCnB,EAAM,GATE,cAUT,4BAGAmB,EAAA,CADCrB,EAAS,CAAE,UAAW,cAAe,CAAC,GAZ9B,cAaT,2BAGOqB,EAAA,CADNrB,EAAS,CAAE,KAAM,QAAS,QAAS,EAAK,CAAC,GAfjC,cAgBF,uBAGGqB,EAAA,CADTpB,EAAM,oBAAoB,GAlBlB,cAmBC,4BAGHoB,EAAA,CADNrB,EAAS,CAAE,KAAM,QAAS,QAAS,EAAK,CAAC,GArBjC,cAsBF,uBAGAqB,EAAA,CADNrB,EAAS,GAxBD,cAyBF,qBAGAqB,EAAA,CADNrB,EAAS,CAAE,KAAM,OAAQ,QAAS,EAAK,CAAC,GA3BhC,cA4BF,oBAGAqB,EAAA,CADNrB,EAAS,GA9BD,cA+BF,2BAGCqB,EAAA,CADPrB,EAAS,CAAE,UAAW,OAAQ,QAAS,EAAK,CAAC,GAjCrC,cAkCD,qBAGJqB,EAAA,CADHnB,EAAM,GApCE,cAqCL,oBAWGmB,EAAA,CADNrB,EAAS,GA/CD,cAgDF,uBAGAqB,EAAA,CADNrB,EAAS,CAAE,KAAM,QAAS,QAAS,EAAK,CAAC,GAlDjC,cAmDF,qBAGAqB,EAAA,CADNrB,EAAS,CAAE,KAAM,MAAO,CAAC,GArDjB,cAsDF,yBAGAqB,EAAA,CADNrB,EAAS,CAAE,KAAM,MAAO,CAAC,GAxDjB,cAyDF,yBAGAqB,EAAA,CADNrB,EAAS,CAAE,KAAM,QAAS,QAAS,EAAK,CAAC,GA3DjC,cA4DF,yBAGAqB,EAAA,CADNrB,EAAS,CAAE,KAAM,QAAS,QAAS,EAAK,CAAC,GA9DjC,cA+DF,wBAGAqB,EAAA,CADNrB,EAAS,CAAE,KAAM,MAAO,CAAC,GAjEjB,cAkEF,oBAGAqB,EAAA,CADNrB,EAAS,CAAE,KAAM,QAAS,QAAS,EAAK,CAAC,GApEjC,cAqEF,qBAGIqB,EAAA,CADVrB,EAAS,CAAE,KAAM,MAAO,CAAC,GAvEjB,cAwEE,qBAgBJqB,EAAA,CADNrB,EAAS,CAAE,KAAM,QAAS,QAAS,EAAK,CAAC,GAvFjC,cAwFF,qBAGAqB,EAAA,CADNrB,EAAS,CAAE,KAAM,QAAS,QAAS,EAAK,CAAC,GA1FjC,cA2FF,wBAGAqB,EAAA,CADNrB,EAAS,CAAE,KAAM,OAAQ,QAAS,EAAK,CAAC,GA7FhC,cA8FF,4BAwNJ,aAAM,kBAAkB,aAAc,CAAtC,kCAeH,KAAmB,OAAS,GAb5B,IAAoB,MAAMY,EAAe,CACrC,GAAIA,IAAU,KAAK,MACf,OAEJ,MAAMC,EAAW,KAAK,OACtB,KAAK,OAASD,EACd,KAAK,cAAc,QAASC,CAAQ,CACxC,CAEA,IAAoB,OAAgB,CAChC,OAAO,KAAK,MAChB,CAGJ,CAdwBQ,EAAA,CADnBrB,EAAS,CAAE,KAAM,MAAO,CAAC,GADjB,UAEW",
6
6
  "names": ["html", "nothing", "SizedMixin", "ifDefined", "live", "property", "query", "state", "ManageHelpText", "Focusable", "textfieldStyles", "checkmarkStyles", "textfieldTypes", "_a", "t", "val", "prev", "value", "oldValue", "selectionStart", "selectionEnd", "selectionDirection", "_event", "nextSelectStart", "changedProperties", "validity", "__decorateClass"]
7
7
  }
@@ -65,6 +65,15 @@ export const allowedKeys = () => {
65
65
  ></sp-textfield>
66
66
  `;
67
67
  };
68
+ export const withNameAttribute = () => {
69
+ return html`
70
+ <sp-textfield
71
+ name="name"
72
+ placeholder="Enter your name"
73
+ allowed-keys="a-z"
74
+ ></sp-textfield>
75
+ `;
76
+ };
68
77
  export const readonly = () => html`
69
78
  <sp-textfield
70
79
  label="Enter your life story"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["textfield.stories.ts"],
4
- "sourcesContent": ["/*\nCopyright 2018 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport { html, TemplateResult } from '@spectrum-web-components/base';\n\nimport '@spectrum-web-components/textfield/sp-textfield.js';\nimport '@spectrum-web-components/field-label/sp-field-label.js';\nimport '@spectrum-web-components/help-text/sp-help-text.js';\n\nexport default {\n component: 'sp-textfield',\n title: 'Textfield',\n};\n\nexport const Default = (): TemplateResult => {\n return html`\n <sp-textfield placeholder=\"Enter your name\"></sp-textfield>\n <sp-textfield placeholder=\"Enter your name\" disabled></sp-textfield>\n <sp-textfield\n placeholder=\"Enter your name\"\n pattern=\"[\\\\w\\\\s]*\"\n required\n value=\"A valid input\"\n ></sp-textfield>\n <sp-textfield\n placeholder=\"Enter your name\"\n pattern=\"[\\\\w\\\\s]*\"\n required\n value=\"A valid input\"\n disabled\n ></sp-textfield>\n <sp-textfield\n placeholder=\"Enter your name\"\n pattern=\"[\\\\d]*\"\n value=\"Not a valid input\"\n ></sp-textfield>\n <sp-textfield\n placeholder=\"Enter your name\"\n pattern=\"^[\\\\d]$\"\n required\n value=\"Not a valid input\"\n disabled\n ></sp-textfield>\n `;\n};\n\nexport const quiet = (): TemplateResult => {\n return html`\n <sp-field-label for=\"name\">Enter your name</sp-field-label>\n <sp-textfield\n autofocus\n id=\"name\"\n placeholder=\"This Text Field doesn't make much noise\"\n quiet\n ></sp-textfield>\n `;\n};\n\nexport const notRequiredWithPattern = (): TemplateResult => {\n return html`\n <sp-textfield\n placeholder=\"Enter z, x, c, or v\"\n pattern=\"[zxcv]+\"\n ></sp-textfield>\n `;\n};\n\nexport const allowedKeys = (): TemplateResult => {\n return html`\n <sp-textfield\n placeholder=\"Enter your name\"\n allowed-keys=\"a-z\"\n ></sp-textfield>\n `;\n};\n\nexport const readonly = (): TemplateResult => html`\n <sp-textfield\n label=\"Enter your life story\"\n value=\"A readonly textfield\"\n readonly\n placeholder=\"Enter your life story\"\n ></sp-textfield>\n`;\n\nexport const types = (): TemplateResult => html`\n <sp-textfield label=\"Default\" placeholder=\"default (text)\"></sp-textfield>\n <sp-textfield label=\"Text\" type=\"text\" placeholder=\"text\"></sp-textfield>\n <sp-textfield label=\"URL\" type=\"url\" placeholder=\"url\"></sp-textfield>\n <sp-textfield label=\"Tel\" type=\"tel\" placeholder=\"tel\"></sp-textfield>\n <sp-textfield\n label=\"E-Mail\"\n type=\"email\"\n placeholder=\"email\"\n ></sp-textfield>\n <sp-textfield\n label=\"Password\"\n type=\"password\"\n placeholder=\"password\"\n ></sp-textfield>\n`;\n\nexport const empty = (): TemplateResult => html`\n <sp-field-label for=\"empty\">\n This textfield hasn't been used yet\n </sp-field-label>\n <sp-textfield id=\"empty\" placeholder=\"You can type here\" autofocus>\n <sp-help-text slot=\"help-text\">\n Even empty Textfield display correctly while waiting for content.\n </sp-help-text>\n </sp-textfield>\n`;\n\nexport const sized = (): TemplateResult => html`\n <sp-field-label for=\"sized\">\n This textfield hasn't been used yet\n </sp-field-label>\n <sp-textfield\n id=\"sized\"\n placeholder=\"You can type here\"\n autofocus\n style=\"width: 400px\"\n >\n <sp-help-text slot=\"help-text\">\n Even empty Textfield display correctly while waiting for content.\n </sp-help-text>\n </sp-textfield>\n`;\n"],
5
- "mappings": ";AAWA,SAAS,YAA4B;AAErC,OAAO;AACP,OAAO;AACP,OAAO;AAEP,eAAe;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AACX;AAEO,aAAM,UAAU,MAAsB;AACzC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BX;AAEO,aAAM,QAAQ,MAAsB;AACvC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASX;AAEO,aAAM,yBAAyB,MAAsB;AACxD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAMX;AAEO,aAAM,cAAc,MAAsB;AAC7C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAMX;AAEO,aAAM,WAAW,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASvC,aAAM,QAAQ,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBpC,aAAM,QAAQ,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWpC,aAAM,QAAQ,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
4
+ "sourcesContent": ["/*\nCopyright 2018 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport { html, TemplateResult } from '@spectrum-web-components/base';\n\nimport '@spectrum-web-components/textfield/sp-textfield.js';\nimport '@spectrum-web-components/field-label/sp-field-label.js';\nimport '@spectrum-web-components/help-text/sp-help-text.js';\n\nexport default {\n component: 'sp-textfield',\n title: 'Textfield',\n};\n\nexport const Default = (): TemplateResult => {\n return html`\n <sp-textfield placeholder=\"Enter your name\"></sp-textfield>\n <sp-textfield placeholder=\"Enter your name\" disabled></sp-textfield>\n <sp-textfield\n placeholder=\"Enter your name\"\n pattern=\"[\\\\w\\\\s]*\"\n required\n value=\"A valid input\"\n ></sp-textfield>\n <sp-textfield\n placeholder=\"Enter your name\"\n pattern=\"[\\\\w\\\\s]*\"\n required\n value=\"A valid input\"\n disabled\n ></sp-textfield>\n <sp-textfield\n placeholder=\"Enter your name\"\n pattern=\"[\\\\d]*\"\n value=\"Not a valid input\"\n ></sp-textfield>\n <sp-textfield\n placeholder=\"Enter your name\"\n pattern=\"^[\\\\d]$\"\n required\n value=\"Not a valid input\"\n disabled\n ></sp-textfield>\n `;\n};\n\nexport const quiet = (): TemplateResult => {\n return html`\n <sp-field-label for=\"name\">Enter your name</sp-field-label>\n <sp-textfield\n autofocus\n id=\"name\"\n placeholder=\"This Text Field doesn't make much noise\"\n quiet\n ></sp-textfield>\n `;\n};\n\nexport const notRequiredWithPattern = (): TemplateResult => {\n return html`\n <sp-textfield\n placeholder=\"Enter z, x, c, or v\"\n pattern=\"[zxcv]+\"\n ></sp-textfield>\n `;\n};\n\nexport const allowedKeys = (): TemplateResult => {\n return html`\n <sp-textfield\n placeholder=\"Enter your name\"\n allowed-keys=\"a-z\"\n ></sp-textfield>\n `;\n};\n\nexport const withNameAttribute = (): TemplateResult => {\n return html`\n <sp-textfield\n name=\"name\"\n placeholder=\"Enter your name\"\n allowed-keys=\"a-z\"\n ></sp-textfield>\n `;\n};\n\nexport const readonly = (): TemplateResult => html`\n <sp-textfield\n label=\"Enter your life story\"\n value=\"A readonly textfield\"\n readonly\n placeholder=\"Enter your life story\"\n ></sp-textfield>\n`;\n\nexport const types = (): TemplateResult => html`\n <sp-textfield label=\"Default\" placeholder=\"default (text)\"></sp-textfield>\n <sp-textfield label=\"Text\" type=\"text\" placeholder=\"text\"></sp-textfield>\n <sp-textfield label=\"URL\" type=\"url\" placeholder=\"url\"></sp-textfield>\n <sp-textfield label=\"Tel\" type=\"tel\" placeholder=\"tel\"></sp-textfield>\n <sp-textfield\n label=\"E-Mail\"\n type=\"email\"\n placeholder=\"email\"\n ></sp-textfield>\n <sp-textfield\n label=\"Password\"\n type=\"password\"\n placeholder=\"password\"\n ></sp-textfield>\n`;\n\nexport const empty = (): TemplateResult => html`\n <sp-field-label for=\"empty\">\n This textfield hasn't been used yet\n </sp-field-label>\n <sp-textfield id=\"empty\" placeholder=\"You can type here\" autofocus>\n <sp-help-text slot=\"help-text\">\n Even empty Textfield display correctly while waiting for content.\n </sp-help-text>\n </sp-textfield>\n`;\n\nexport const sized = (): TemplateResult => html`\n <sp-field-label for=\"sized\">\n This textfield hasn't been used yet\n </sp-field-label>\n <sp-textfield\n id=\"sized\"\n placeholder=\"You can type here\"\n autofocus\n style=\"width: 400px\"\n >\n <sp-help-text slot=\"help-text\">\n Even empty Textfield display correctly while waiting for content.\n </sp-help-text>\n </sp-textfield>\n`;\n"],
5
+ "mappings": ";AAWA,SAAS,YAA4B;AAErC,OAAO;AACP,OAAO;AACP,OAAO;AAEP,eAAe;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AACX;AAEO,aAAM,UAAU,MAAsB;AACzC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BX;AAEO,aAAM,QAAQ,MAAsB;AACvC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASX;AAEO,aAAM,yBAAyB,MAAsB;AACxD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAMX;AAEO,aAAM,cAAc,MAAsB;AAC7C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAMX;AAEO,aAAM,oBAAoB,MAAsB;AACnD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOX;AAEO,aAAM,WAAW,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASvC,aAAM,QAAQ,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBpC,aAAM,QAAQ,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWpC,aAAM,QAAQ,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -6,7 +6,11 @@ import { findDescribedNode } from "../../../test/testing-helpers-a11y.js";
6
6
  import "@spectrum-web-components/help-text/sp-help-text.js";
7
7
  import "@spectrum-web-components/textfield/sp-textfield.js";
8
8
  import { testForLitDevWarnings } from "../../../test/testing-helpers.js";
9
- import { isFirefox } from "@spectrum-web-components/shared/src/platform.js";
9
+ import {
10
+ isFirefox,
11
+ isWebKit
12
+ } from "@spectrum-web-components/shared/src/platform.js";
13
+ import { fixture } from "../../../test/testing-helpers.js";
10
14
  describe("Textfield", () => {
11
15
  testForLitDevWarnings(
12
16
  async () => await litFixture(
@@ -166,8 +170,11 @@ describe("Textfield", () => {
166
170
  expect(endBounds.height).equals(startBounds.height);
167
171
  expect(endBounds.width).equals(startBounds.width);
168
172
  });
169
- it("resizes by default", async () => {
170
- const el = await litFixture(
173
+ it("resizes by default", async function() {
174
+ if (isWebKit()) {
175
+ this.skip();
176
+ }
177
+ const el = await fixture(
171
178
  html`
172
179
  <sp-textfield
173
180
  multiline
@@ -279,6 +286,31 @@ describe("Textfield", () => {
279
286
  const input = el.shadowRoot ? el.shadowRoot.querySelector("#valid") : null;
280
287
  expect(input).to.not.be.null;
281
288
  });
289
+ it("handles `name` attribute", async () => {
290
+ const el = await litFixture(
291
+ html`
292
+ <sp-textfield placeholder="Enter your name"></sp-textfield>
293
+ `
294
+ );
295
+ expect(el).to.not.equal(void 0);
296
+ expect(el.name).to.be.undefined;
297
+ el.setAttribute("name", "test");
298
+ expect(el.name).to.be.equal("test");
299
+ });
300
+ it("handles `name` attribute with multiline", async () => {
301
+ const el = await litFixture(
302
+ html`
303
+ <sp-textfield
304
+ name="name"
305
+ placeholder="Enter your name"
306
+ multiline
307
+ ></sp-textfield>
308
+ `
309
+ );
310
+ expect(el).to.not.equal(void 0);
311
+ const input = el.shadowRoot ? el.shadowRoot.querySelector("textarea") : null;
312
+ expect(input == null ? void 0 : input.name).to.equal("name");
313
+ });
282
314
  it("valid - multiline", async () => {
283
315
  const el = await litFixture(
284
316
  html`
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["textfield.test.ts"],
4
- "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport { Textfield, TextfieldType } from '../';\nimport { elementUpdated, expect, html, litFixture } from '@open-wc/testing';\nimport { sendKeys } from '@web/test-runner-commands';\nimport { sendMouse } from '../../../test/plugins/browser.js';\nimport { findDescribedNode } from '../../../test/testing-helpers-a11y.js';\nimport { HelpText } from '@spectrum-web-components/help-text';\nimport '@spectrum-web-components/help-text/sp-help-text.js';\nimport '@spectrum-web-components/textfield/sp-textfield.js';\nimport { testForLitDevWarnings } from '../../../test/testing-helpers.js';\nimport { isFirefox } from '@spectrum-web-components/shared/src/platform.js';\n\ndescribe('Textfield', () => {\n testForLitDevWarnings(\n async () =>\n await litFixture<Textfield>(\n html`\n <sp-textfield label=\"Enter Your Name\"></sp-textfield>\n `\n )\n );\n it('loads default textfield accessibly', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield label=\"Enter Your Name\"></sp-textfield>\n `\n );\n\n await elementUpdated(el);\n\n await expect(el).to.be.accessible();\n });\n it('loads multiline textfield accessibly', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield label=\"Enter your name\" multiline></sp-textfield>\n `\n );\n\n await elementUpdated(el);\n\n await expect(el).to.be.accessible();\n });\n\n it('manages tabIndex while disabled', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield placeholder=\"Enter Your Name\"></sp-textfield>\n `\n );\n\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(0);\n\n el.disabled = true;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(-1);\n\n el.tabIndex = 2;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(-1);\n\n el.disabled = false;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(2);\n });\n\n it('manages tabIndex before first render', async () => {\n const el = document.createElement('sp-textfield') as Textfield;\n\n expect(el.focusElement).to.be.null;\n expect(el.tabIndex).to.equal(0);\n\n el.remove();\n });\n it('loads', async () => {\n const testPlaceholder = 'Enter your name';\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield placeholder=${testPlaceholder}></sp-textfield>\n `\n );\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('input')\n : null;\n expect(input).to.not.be.null;\n const placeholder = input ? input.placeholder : null;\n expect(placeholder).to.equal(testPlaceholder);\n });\n it('multiline', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n multiline\n ></sp-textfield>\n `\n );\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('textarea')\n : null;\n expect(input).to.not.be.null;\n });\n it('multiline with rows', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n multiline\n rows=\"5\"\n ></sp-textfield>\n `\n );\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('textarea')\n : null;\n expect(input).to.not.be.null;\n expect(input?.getAttribute('rows')).to.equal('5');\n });\n it('multiline with 1 row has smaller height than multiline without explicit rows', async () => {\n const oneRowEl = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n multiline\n rows=\"1\"\n ></sp-textfield>\n `\n );\n expect(oneRowEl).to.not.equal(undefined);\n const oneRowTextarea = oneRowEl.shadowRoot\n ? oneRowEl.shadowRoot.querySelector('textarea')\n : null;\n expect(oneRowTextarea).to.not.be.null;\n expect(oneRowTextarea?.getAttribute('rows')).to.equal('1');\n\n const defaultEL = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n multiline\n ></sp-textfield>\n `\n );\n expect(defaultEL).to.not.equal(undefined);\n const defaultTextarea = oneRowEl.shadowRoot\n ? defaultEL.shadowRoot.querySelector('textarea')\n : null;\n expect(defaultTextarea).to.not.be.null;\n expect(defaultTextarea?.getAttribute('rows')).to.be.null;\n\n const boundsDefaultElement = defaultTextarea?.getBoundingClientRect();\n const boundsOneRowElement = oneRowTextarea?.getBoundingClientRect();\n expect(boundsDefaultElement?.height).to.be.greaterThan(\n boundsOneRowElement?.height ?? 0\n );\n });\n it('multiline with rows does not resize', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n multiline\n rows=\"5\"\n label=\"No resize control\"\n placeholder=\"No resize control\"\n ></sp-textfield>\n `\n );\n // Resizing only effects the block size of the host rect, so measure the `focusElement` when resizing.\n const sizedElement = (el as HTMLElement & { focusElement: HTMLElement })\n .focusElement;\n const startBounds = sizedElement.getBoundingClientRect();\n await sendMouse({\n steps: [\n {\n type: 'move',\n position: [startBounds.right - 6, startBounds.bottom - 6],\n },\n {\n type: 'down',\n },\n {\n type: 'move',\n position: [startBounds.right + 50, startBounds.bottom + 50],\n },\n {\n type: 'up',\n },\n ],\n });\n\n const endBounds = sizedElement.getBoundingClientRect();\n expect(endBounds.height).equals(startBounds.height);\n expect(endBounds.width).equals(startBounds.width);\n });\n it('resizes by default', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n multiline\n label=\"No resize control\"\n placeholder=\"No resize control\"\n ></sp-textfield>\n `\n );\n // Resizing only effects the block size of the host rect, so measure the `focusElement` when resizing.\n const sizedElement = (el as HTMLElement & { focusElement: HTMLElement })\n .focusElement;\n const startBounds = sizedElement.getBoundingClientRect();\n await sendMouse({\n steps: [\n {\n type: 'move',\n position: [startBounds.right - 6, startBounds.bottom - 6],\n },\n {\n type: 'down',\n },\n {\n type: 'move',\n position: [startBounds.right + 50, startBounds.bottom + 50],\n },\n {\n type: 'up',\n },\n ],\n });\n\n const endBounds = sizedElement.getBoundingClientRect();\n expect(endBounds.height).to.be.greaterThan(startBounds.height);\n expect(endBounds.width).to.be.greaterThan(startBounds.width);\n });\n it('accepts resize styling', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n multiline\n style=\"resize: none;\"\n label=\"No resize control\"\n placeholder=\"No resize control\"\n ></sp-textfield>\n `\n );\n const startBounds = el.getBoundingClientRect();\n\n await sendMouse({\n steps: [\n {\n type: 'move',\n position: [startBounds.right - 2, startBounds.bottom - 2],\n },\n {\n type: 'down',\n },\n {\n type: 'move',\n position: [startBounds.right + 50, startBounds.bottom + 50],\n },\n {\n type: 'up',\n },\n ],\n });\n\n const endBounds = el.getBoundingClientRect();\n expect(endBounds.width).equals(startBounds.width);\n expect(endBounds.height).equals(startBounds.height);\n });\n it('grows', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n multiline\n grows\n ></sp-textfield>\n `\n );\n expect(el).to.not.equal(undefined);\n const sizer = el.shadowRoot\n ? el.shadowRoot.querySelector('#sizer')\n : null;\n expect(sizer).to.not.be.null;\n });\n it('multiline with rows and grows does not grow', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n multiline\n grows\n rows=\"5\"\n ></sp-textfield>\n `\n );\n expect(el).to.not.equal(undefined);\n const sizer = el.shadowRoot\n ? el.shadowRoot.querySelector('#sizer')\n : null;\n expect(sizer).to.be.null;\n });\n it('valid', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"[\\\\d]+\"\n value=\"123\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - multiline', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"[\\\\d]+\"\n value=\"123\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - required', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n value=\"123\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - multiline - required', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n value=\"123\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - boundary-type assertions', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"^[\\\\d]+$\"\n value=\"123\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - multiline - boundary-type assertions', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"^[\\\\d]+$\"\n value=\"123\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - boundary-type assertions and title', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"^[\\\\d]+$\"\n value=\"123\"\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot.querySelector('#valid');\n expect(input).to.not.be.null;\n expect(el.focusElement).to.not.have.attribute('title');\n });\n it('valid - multiline - boundary-type assertions and title', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n multiline\n placeholder=\"Enter your number\"\n pattern=\"^[\\\\d]+$\"\n value=\"123\"\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot.querySelector('#valid');\n expect(input).to.not.be.null;\n expect(el.focusElement).to.not.have.attribute('title');\n });\n it('valid - unicode', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n pattern=\"\\\\p{L}{4,8}\"\n value=\"\u4F60\u7684\u540D\u5B57\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - multiline - unicode', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n pattern=\"\\\\p{L}{4,8}\"\n value=\"\u4F60\u7684\u540D\u5B57\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"[\\\\d]+\"\n value=\"123 not valid\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - multiline', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"[\\\\d]+\"\n value=\"123 not valid\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - required', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n value=\"\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - multiline - required', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n value=\"\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - unicode', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"\\\\p{N}+\"\n value=\"123 not valid\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - multiline - unicode', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"\\\\p{N}+\"\n value=\"123 not valid\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - boundary-type assertions', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"^\\\\p{N}+$\"\n value=\"123 not valid\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - boundary-type assertions and title', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n type=\"url\"\n value=\"invalid-email\"\n invalid\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot.querySelector('#invalid');\n expect(input).to.not.be.null;\n expect(el.focusElement).to.have.attribute('title');\n });\n it('invalid - multiline - boundary-type assertions and title', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n multiline\n placeholder=\"Enter your number\"\n type=\"url\"\n value=\"invalid-email\"\n invalid\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot.querySelector('#invalid');\n expect(input).to.not.be.null;\n expect(el.focusElement).to.have.attribute('title');\n });\n it('invalid - multiline - boundary-type assertions', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"^\\\\p{N}+$\"\n value=\"123 not valid\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('receives focus', async () => {\n let activeElement: HTMLInputElement | null = null;\n const onFocusIn = (event: Event): void => {\n const path = event.composedPath();\n activeElement = path[0] as HTMLInputElement;\n };\n document.addEventListener('focusin', onFocusIn);\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield placeholder=\"Enter your name\"></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n el.focus();\n await elementUpdated(el);\n\n expect(activeElement === el.focusElement).to.be.true;\n document.removeEventListener('focusin', onFocusIn);\n });\n it('does not receive focus when disabled', async () => {\n let activeElement: HTMLInputElement | null = null;\n const onFocusIn = (event: Event): void => {\n const path = event.composedPath();\n activeElement = path[0] as HTMLInputElement;\n };\n document.addEventListener('focusin', onFocusIn);\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n disabled\n placeholder=\"Enter your name\"\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n el.focus();\n await elementUpdated(el);\n\n expect(activeElement === el.focusElement).to.be.false;\n expect(document.activeElement === el).to.be.false;\n document.removeEventListener('focusin', onFocusIn);\n\n el.click();\n await elementUpdated(el);\n\n expect(activeElement === el.focusElement).to.be.false;\n expect(document.activeElement === el).to.be.false;\n document.removeEventListener('focusin', onFocusIn);\n });\n it('accepts input', async () => {\n const testValue = 'Test Name';\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield placeholder=\"Enter your name\"></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n el.focusElement.value = testValue;\n el.focusElement.dispatchEvent(new Event('input'));\n\n expect(el.value).to.equal(testValue);\n });\n it('selects', async () => {\n const testValue = 'Test Name';\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield value=${testValue}></sp-textfield>\n `\n );\n await elementUpdated(el);\n expect(el.value).to.equal(testValue);\n\n el.focus();\n el.select();\n await sendKeys({ press: 'Backspace' });\n expect(el.value).to.equal('');\n });\n it('setSelectionRange', async () => {\n const testValue = 'Test Name';\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield value=${testValue}></sp-textfield>\n `\n );\n await elementUpdated(el);\n expect(el.value).to.equal(testValue);\n\n el.focus();\n el.setSelectionRange(0, 'Test '.length);\n await sendKeys({ press: 'Backspace' });\n expect(el.value).to.equal('Name');\n });\n it('handles minlength with required', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield required minlength=\"3\"></sp-textfield>\n `\n );\n el.focus();\n await sendKeys({\n type: 'ab',\n });\n await elementUpdated(el);\n\n expect(el.value).to.equal('ab');\n expect(el.checkValidity()).to.be.false;\n\n await sendKeys({\n type: 'c',\n });\n await elementUpdated(el);\n\n expect(el.value).to.equal('abc');\n expect(el.checkValidity()).to.be.true;\n });\n it('accepts maxlength', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n maxlength=\"3\"\n minlength=\"2\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n el.focus();\n\n await sendKeys({\n type: 'a',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('a');\n expect(el.checkValidity()).to.be.false;\n\n await sendKeys({\n type: 'b',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('ab');\n expect(el.checkValidity());\n\n await sendKeys({\n type: 'c',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('abc');\n expect(el.checkValidity());\n\n await sendKeys({\n type: 'd',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('abc');\n expect(el.checkValidity());\n\n await sendKeys({\n press: 'Backspace',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('ab');\n expect(el.checkValidity());\n\n await sendKeys({\n press: 'Backspace',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('a');\n expect(el.checkValidity()).to.be.false;\n });\n it('dispatches a `change` event', async () => {\n const testValue = 'Test Name';\n let eventSource = null as Textfield | null;\n const onChange = (event: Event): void => {\n eventSource = event.composedPath()[0] as Textfield;\n };\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n @change=${onChange}\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n el.focusElement.value = testValue;\n el.focusElement.dispatchEvent(new Event('input'));\n el.focusElement.dispatchEvent(new Event('change'));\n\n expect(el.value).to.equal(testValue);\n const testSource = eventSource as Textfield;\n expect(testSource).to.equal(el);\n });\n it('passes through `autocomplete` attribute', async () => {\n let el = await litFixture<Textfield>(\n html`\n <sp-textfield autocomplete=\"off\"></sp-textfield>\n `\n );\n await elementUpdated(el);\n let input = el.shadowRoot ? el.shadowRoot.querySelector('input') : null;\n expect(input).to.exist;\n if (input) {\n expect(input.getAttribute('autocomplete')).to.equal('off');\n }\n\n el = await litFixture<Textfield>(\n html`\n <sp-textfield></sp-textfield>\n `\n );\n await elementUpdated(el);\n input = el.shadowRoot ? el.shadowRoot.querySelector('input') : null;\n expect(input).to.exist;\n if (input) {\n expect(input.getAttribute('autocomplete')).to.not.exist;\n }\n });\n it('tests on `required` changes', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield value=\"\"></sp-textfield>\n `\n );\n await elementUpdated(el);\n expect(el.invalid).to.be.false;\n\n el.required = true;\n await elementUpdated(el);\n expect(el.invalid).to.be.true;\n });\n it('manages `allowed-keys`', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield allowed-keys=\"asdf\"></sp-textfield>\n `\n );\n await elementUpdated(el);\n expect(el.value).to.equal('');\n\n const inputElement = el.focusElement;\n\n el.focusElement.value = 'asdf';\n inputElement.dispatchEvent(new InputEvent('input'));\n\n await elementUpdated(el);\n expect(el.value).to.equal('asdf');\n\n inputElement.value = `asdff`;\n inputElement.setSelectionRange(1, 1);\n inputElement.dispatchEvent(new InputEvent('input'));\n\n await elementUpdated(el);\n expect(el.value).to.equal('asdff');\n expect(inputElement.selectionStart).to.equal(1);\n\n inputElement.value = `asdoff`;\n inputElement.setSelectionRange(4, 4);\n inputElement.dispatchEvent(new InputEvent('input'));\n\n await elementUpdated(el);\n expect(el.value).to.equal('asdff');\n expect(inputElement.selectionStart).to.equal(3);\n });\n describe('type attribute', () => {\n // references:\n // https://developer.mozilla.org/en-US/docs/Glossary/IDL#content_versus_idl_attributes\n // https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#reflecting-content-attributes-in-idl-attributes\n // https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#keywords-and-enumerated-attributes\n\n it('assigns valid attributes to the property', async () => {\n const types: TextfieldType[] = [\n 'text',\n 'url',\n 'tel',\n 'email',\n 'password',\n ];\n for await (const t of types) {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield type=${t}></sp-textfield>\n `\n );\n expect(el.type).equals(t);\n\n el.setAttribute('type', 'url');\n expect(el.type).equals('url');\n }\n });\n it('represents invalid and missing attributes as \"text\"', async () => {\n const el1 = await litFixture<Textfield>(\n html`\n <sp-textfield></sp-textfield>\n `\n );\n\n const el2 = await litFixture<Textfield>(\n html`\n <sp-textfield type=\"time\"></sp-textfield>\n `\n );\n expect(el1.type).equals('text');\n expect(el2.type).equals('text');\n\n el1.setAttribute('type', 'submit');\n expect(el1.type).equals('text');\n });\n it('reflects valid property assignments', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield type=\"url\"></sp-textfield>\n `\n );\n\n el.type = 'email';\n await elementUpdated(el);\n\n expect(el.getAttribute('type')).equals('email');\n expect(el.type).equals('email');\n });\n it('reflects invalid assignments but sets state to \"text\"', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield type=\"url\"></sp-textfield>\n `\n );\n\n // eslint-disable-next-line\n // @ts-ignore\n el.type = 'range';\n await elementUpdated(el);\n\n expect(el.getAttribute('type')).equals('range');\n expect(el.type).equals('text');\n });\n });\n describe('help text', () => {\n const name = 'This is a textfield';\n const description = 'This text helps you fill it out';\n const descriptionNegative = 'This text helps you when invalid';\n it('accepts help text in `slot=\"help-text\"`', async () => {\n const el = await litFixture(html`\n <sp-textfield label=${name}>\n <sp-help-text slot=\"help-text\">${description}</sp-help-text>\n </sp-textfield>\n `);\n\n await elementUpdated(el);\n\n await findDescribedNode(name, description);\n });\n it('accepts help text in `slot=\"help-text\"` w/ own ID', async () => {\n const el = await litFixture(html`\n <sp-textfield label=${name}>\n <sp-help-text slot=\"help-text\" id=\"help-text-id-1\">\n ${description}\n </sp-help-text>\n </sp-textfield>\n `);\n\n await elementUpdated(el);\n\n await findDescribedNode(name, description);\n });\n it('manages neutral/negative help text pairs', async () => {\n const el = await litFixture<Textfield>(html`\n <sp-textfield label=${name}>\n <sp-help-text slot=\"help-text\">${description}</sp-help-text>\n <sp-help-text slot=\"negative-help-text\">\n ${descriptionNegative}\n </sp-help-text>\n </sp-textfield>\n `);\n const negativeHelpText = el.querySelector(\n '[slot=\"negative-help-text\"]'\n ) as HelpText;\n\n await elementUpdated(el);\n\n expect(negativeHelpText.variant).to.equal('neutral');\n await findDescribedNode(name, description);\n\n el.invalid = true;\n await elementUpdated(el);\n\n expect(negativeHelpText.variant).to.equal('negative');\n // There's an issue in the way Firefox processes the a11y tree for\n // elements with an `invalid` attribute/property. The following try/catch\n // wrapping preps the code to pass in that context regardless and error\n // when our tooling no longer runs into this error.\n try {\n await findDescribedNode(name, descriptionNegative);\n if (isFirefox()) {\n throw new Error('this does not fail anymore...');\n }\n } catch (error) {\n if (!isFirefox()) {\n throw error;\n }\n }\n });\n it('manages neutral/negative help text pairs w/ own IDs', async () => {\n const el = await litFixture<Textfield>(html`\n <sp-textfield label=${name}>\n <sp-help-text slot=\"help-text\" id=\"help-text-id-2\">\n ${description}\n </sp-help-text>\n <sp-help-text slot=\"negative-help-text\" id=\"help-text-id-3\">\n ${descriptionNegative}\n </sp-help-text>\n </sp-textfield>\n `);\n const negativeHelpText = el.querySelector(\n '[slot=\"negative-help-text\"]'\n ) as HelpText;\n\n await elementUpdated(el);\n\n expect(negativeHelpText.variant).to.equal('neutral');\n await findDescribedNode(name, description);\n\n el.invalid = true;\n await elementUpdated(el);\n\n expect(negativeHelpText.variant).to.equal('negative');\n // There's an issue in the way Firefox processes the a11y tree for\n // elements with an `invalid` attribute/property. The following try/catch\n // wrapping preps the code to pass in that context regardless and error\n // when our tooling no longer runs into this error.\n try {\n await findDescribedNode(name, descriptionNegative);\n if (isFirefox()) {\n throw new Error('this does not fail anymore...');\n }\n } catch (error) {\n if (!isFirefox()) {\n throw error;\n }\n }\n });\n });\n});\n"],
5
- "mappings": ";AAYA,SAAS,gBAAgB,QAAQ,MAAM,kBAAkB;AACzD,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,SAAS,yBAAyB;AAElC,OAAO;AACP,OAAO;AACP,SAAS,6BAA6B;AACtC,SAAS,iBAAiB;AAE1B,SAAS,aAAa,MAAM;AACxB;AAAA,IACI,YACI,MAAM;AAAA,MACF;AAAA;AAAA;AAAA,IAGJ;AAAA,EACR;AACA,KAAG,sCAAsC,YAAY;AACjD,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA,IAGJ;AAEA,UAAM,eAAe,EAAE;AAEvB,UAAM,OAAO,EAAE,EAAE,GAAG,GAAG,WAAW;AAAA,EACtC,CAAC;AACD,KAAG,wCAAwC,YAAY;AACnD,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA,IAGJ;AAEA,UAAM,eAAe,EAAE;AAEvB,UAAM,OAAO,EAAE,EAAE,GAAG,GAAG,WAAW;AAAA,EACtC,CAAC;AAED,KAAG,mCAAmC,YAAY;AAC9C,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA,IAGJ;AAEA,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC;AAE9B,OAAG,WAAW;AACd,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE;AAE/B,OAAG,WAAW;AACd,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE;AAE/B,OAAG,WAAW;AACd,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC;AAAA,EAClC,CAAC;AAED,KAAG,wCAAwC,YAAY;AACnD,UAAM,KAAK,SAAS,cAAc,cAAc;AAEhD,WAAO,GAAG,YAAY,EAAE,GAAG,GAAG;AAC9B,WAAO,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC;AAE9B,OAAG,OAAO;AAAA,EACd,CAAC;AACD,KAAG,SAAS,YAAY;AACpB,UAAM,kBAAkB;AACxB,UAAM,KAAK,MAAM;AAAA,MACb;AAAA,4CACgC,eAAe;AAAA;AAAA,IAEnD;AACA,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,OAAO,IACnC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AACxB,UAAM,cAAc,QAAQ,MAAM,cAAc;AAChD,WAAO,WAAW,EAAE,GAAG,MAAM,eAAe;AAAA,EAChD,CAAC;AACD,KAAG,aAAa,YAAY;AACxB,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMJ;AACA,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,UAAU,IACtC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,uBAAuB,YAAY;AAClC,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOJ;AACA,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,UAAU,IACtC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AACxB,WAAO,+BAAO,aAAa,OAAO,EAAE,GAAG,MAAM,GAAG;AAAA,EACpD,CAAC;AACD,KAAG,gFAAgF,YAAY;AAxInG;AAyIQ,UAAM,WAAW,MAAM;AAAA,MACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOJ;AACA,WAAO,QAAQ,EAAE,GAAG,IAAI,MAAM,MAAS;AACvC,UAAM,iBAAiB,SAAS,aAC1B,SAAS,WAAW,cAAc,UAAU,IAC5C;AACN,WAAO,cAAc,EAAE,GAAG,IAAI,GAAG;AACjC,WAAO,iDAAgB,aAAa,OAAO,EAAE,GAAG,MAAM,GAAG;AAEzD,UAAM,YAAY,MAAM;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMJ;AACA,WAAO,SAAS,EAAE,GAAG,IAAI,MAAM,MAAS;AACxC,UAAM,kBAAkB,SAAS,aAC3B,UAAU,WAAW,cAAc,UAAU,IAC7C;AACN,WAAO,eAAe,EAAE,GAAG,IAAI,GAAG;AAClC,WAAO,mDAAiB,aAAa,OAAO,EAAE,GAAG,GAAG;AAEpD,UAAM,uBAAuB,mDAAiB;AAC9C,UAAM,sBAAsB,iDAAgB;AAC5C,WAAO,6DAAsB,MAAM,EAAE,GAAG,GAAG;AAAA,OACvC,gEAAqB,WAArB,YAA+B;AAAA,IACnC;AAAA,EACJ,CAAC;AACD,KAAG,uCAAuC,YAAY;AAClD,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQJ;AAEA,UAAM,eAAgB,GACjB;AACL,UAAM,cAAc,aAAa,sBAAsB;AACvD,UAAM,UAAU;AAAA,MACZ,OAAO;AAAA,QACH;AAAA,UACI,MAAM;AAAA,UACN,UAAU,CAAC,YAAY,QAAQ,GAAG,YAAY,SAAS,CAAC;AAAA,QAC5D;AAAA,QACA;AAAA,UACI,MAAM;AAAA,QACV;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,UAAU,CAAC,YAAY,QAAQ,IAAI,YAAY,SAAS,EAAE;AAAA,QAC9D;AAAA,QACA;AAAA,UACI,MAAM;AAAA,QACV;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,UAAM,YAAY,aAAa,sBAAsB;AACrD,WAAO,UAAU,MAAM,EAAE,OAAO,YAAY,MAAM;AAClD,WAAO,UAAU,KAAK,EAAE,OAAO,YAAY,KAAK;AAAA,EACpD,CAAC;AACD,KAAG,sBAAsB,YAAY;AACjC,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOJ;AAEA,UAAM,eAAgB,GACjB;AACL,UAAM,cAAc,aAAa,sBAAsB;AACvD,UAAM,UAAU;AAAA,MACZ,OAAO;AAAA,QACH;AAAA,UACI,MAAM;AAAA,UACN,UAAU,CAAC,YAAY,QAAQ,GAAG,YAAY,SAAS,CAAC;AAAA,QAC5D;AAAA,QACA;AAAA,UACI,MAAM;AAAA,QACV;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,UAAU,CAAC,YAAY,QAAQ,IAAI,YAAY,SAAS,EAAE;AAAA,QAC9D;AAAA,QACA;AAAA,UACI,MAAM;AAAA,QACV;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,UAAM,YAAY,aAAa,sBAAsB;AACrD,WAAO,UAAU,MAAM,EAAE,GAAG,GAAG,YAAY,YAAY,MAAM;AAC7D,WAAO,UAAU,KAAK,EAAE,GAAG,GAAG,YAAY,YAAY,KAAK;AAAA,EAC/D,CAAC;AACD,KAAG,0BAA0B,YAAY;AACrC,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQJ;AACA,UAAM,cAAc,GAAG,sBAAsB;AAE7C,UAAM,UAAU;AAAA,MACZ,OAAO;AAAA,QACH;AAAA,UACI,MAAM;AAAA,UACN,UAAU,CAAC,YAAY,QAAQ,GAAG,YAAY,SAAS,CAAC;AAAA,QAC5D;AAAA,QACA;AAAA,UACI,MAAM;AAAA,QACV;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,UAAU,CAAC,YAAY,QAAQ,IAAI,YAAY,SAAS,EAAE;AAAA,QAC9D;AAAA,QACA;AAAA,UACI,MAAM;AAAA,QACV;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,UAAM,YAAY,GAAG,sBAAsB;AAC3C,WAAO,UAAU,KAAK,EAAE,OAAO,YAAY,KAAK;AAChD,WAAO,UAAU,MAAM,EAAE,OAAO,YAAY,MAAM;AAAA,EACtD,CAAC;AACD,KAAG,SAAS,YAAY;AACpB,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOJ;AACA,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,QAAQ,IACpC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,+CAA+C,YAAY;AAC1D,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQJ;AACA,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,QAAQ,IACpC;AACN,WAAO,KAAK,EAAE,GAAG,GAAG;AAAA,EACxB,CAAC;AACD,KAAG,SAAS,YAAY;AACpB,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,QAAQ,IACpC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,qBAAqB,YAAY;AAChC,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,QAAQ,IACpC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,oBAAoB,YAAY;AAC/B,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,QAAQ,IACpC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,gCAAgC,YAAY;AAC3C,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,QAAQ,IACpC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,oCAAoC,YAAY;AAC/C,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,QAAQ,IACpC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,gDAAgD,YAAY;AAC3D,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,QAAQ,IACpC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,8CAA8C,YAAY;AACzD,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,WAAW,cAAc,QAAQ;AAClD,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AACxB,WAAO,GAAG,YAAY,EAAE,GAAG,IAAI,KAAK,UAAU,OAAO;AAAA,EACzD,CAAC;AACD,KAAG,0DAA0D,YAAY;AACrE,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,WAAW,cAAc,QAAQ;AAClD,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AACxB,WAAO,GAAG,YAAY,EAAE,GAAG,IAAI,KAAK,UAAU,OAAO;AAAA,EACzD,CAAC;AACD,KAAG,mBAAmB,YAAY;AAC9B,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,QAAQ,IACpC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,+BAA+B,YAAY;AAC1C,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,QAAQ,IACpC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,WAAW,YAAY;AACtB,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,UAAU,IACtC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,uBAAuB,YAAY;AAClC,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,UAAU,IACtC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,sBAAsB,YAAY;AACjC,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,UAAU,IACtC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,kCAAkC,YAAY;AAC7C,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,UAAU,IACtC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,qBAAqB,YAAY;AAChC,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,UAAU,IACtC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,iCAAiC,YAAY;AAC5C,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,UAAU,IACtC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,sCAAsC,YAAY;AACjD,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,UAAU,IACtC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,gDAAgD,YAAY;AAC3D,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,WAAW,cAAc,UAAU;AACpD,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AACxB,WAAO,GAAG,YAAY,EAAE,GAAG,KAAK,UAAU,OAAO;AAAA,EACrD,CAAC;AACD,KAAG,4DAA4D,YAAY;AACvE,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,WAAW,cAAc,UAAU;AACpD,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AACxB,WAAO,GAAG,YAAY,EAAE,GAAG,KAAK,UAAU,OAAO;AAAA,EACrD,CAAC;AACD,KAAG,kDAAkD,YAAY;AAC7D,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASJ;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,EAAE,EAAE,GAAG,IAAI,MAAM,MAAS;AACjC,UAAM,QAAQ,GAAG,aACX,GAAG,WAAW,cAAc,UAAU,IACtC;AACN,WAAO,KAAK,EAAE,GAAG,IAAI,GAAG;AAAA,EAC5B,CAAC;AACD,KAAG,kBAAkB,YAAY;AAC7B,QAAI,gBAAyC;AAC7C,UAAM,YAAY,CAAC,UAAuB;AACtC,YAAM,OAAO,MAAM,aAAa;AAChC,sBAAgB,KAAK,CAAC;AAAA,IAC1B;AACA,aAAS,iBAAiB,WAAW,SAAS;AAC9C,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA,IAGJ;AACA,UAAM,eAAe,EAAE;AAEvB,OAAG,MAAM;AACT,UAAM,eAAe,EAAE;AAEvB,WAAO,kBAAkB,GAAG,YAAY,EAAE,GAAG,GAAG;AAChD,aAAS,oBAAoB,WAAW,SAAS;AAAA,EACrD,CAAC;AACD,KAAG,wCAAwC,YAAY;AACnD,QAAI,gBAAyC;AAC7C,UAAM,YAAY,CAAC,UAAuB;AACtC,YAAM,OAAO,MAAM,aAAa;AAChC,sBAAgB,KAAK,CAAC;AAAA,IAC1B;AACA,aAAS,iBAAiB,WAAW,SAAS;AAC9C,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMJ;AACA,UAAM,eAAe,EAAE;AAEvB,OAAG,MAAM;AACT,UAAM,eAAe,EAAE;AAEvB,WAAO,kBAAkB,GAAG,YAAY,EAAE,GAAG,GAAG;AAChD,WAAO,SAAS,kBAAkB,EAAE,EAAE,GAAG,GAAG;AAC5C,aAAS,oBAAoB,WAAW,SAAS;AAEjD,OAAG,MAAM;AACT,UAAM,eAAe,EAAE;AAEvB,WAAO,kBAAkB,GAAG,YAAY,EAAE,GAAG,GAAG;AAChD,WAAO,SAAS,kBAAkB,EAAE,EAAE,GAAG,GAAG;AAC5C,aAAS,oBAAoB,WAAW,SAAS;AAAA,EACrD,CAAC;AACD,KAAG,iBAAiB,YAAY;AAC5B,UAAM,YAAY;AAClB,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA,IAGJ;AACA,UAAM,eAAe,EAAE;AAEvB,OAAG,aAAa,QAAQ;AACxB,OAAG,aAAa,cAAc,IAAI,MAAM,OAAO,CAAC;AAEhD,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,SAAS;AAAA,EACvC,CAAC;AACD,KAAG,WAAW,YAAY;AACtB,UAAM,YAAY;AAClB,UAAM,KAAK,MAAM;AAAA,MACb;AAAA,sCAC0B,SAAS;AAAA;AAAA,IAEvC;AACA,UAAM,eAAe,EAAE;AACvB,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,SAAS;AAEnC,OAAG,MAAM;AACT,OAAG,OAAO;AACV,UAAM,SAAS,EAAE,OAAO,YAAY,CAAC;AACrC,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,EAAE;AAAA,EAChC,CAAC;AACD,KAAG,qBAAqB,YAAY;AAChC,UAAM,YAAY;AAClB,UAAM,KAAK,MAAM;AAAA,MACb;AAAA,sCAC0B,SAAS;AAAA;AAAA,IAEvC;AACA,UAAM,eAAe,EAAE;AACvB,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,SAAS;AAEnC,OAAG,MAAM;AACT,OAAG,kBAAkB,GAAG,QAAQ,MAAM;AACtC,UAAM,SAAS,EAAE,OAAO,YAAY,CAAC;AACrC,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,MAAM;AAAA,EACpC,CAAC;AACD,KAAG,mCAAmC,YAAY;AAC9C,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA,IAGJ;AACA,OAAG,MAAM;AACT,UAAM,SAAS;AAAA,MACX,MAAM;AAAA,IACV,CAAC;AACD,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,IAAI;AAC9B,WAAO,GAAG,cAAc,CAAC,EAAE,GAAG,GAAG;AAEjC,UAAM,SAAS;AAAA,MACX,MAAM;AAAA,IACV,CAAC;AACD,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,KAAK;AAC/B,WAAO,GAAG,cAAc,CAAC,EAAE,GAAG,GAAG;AAAA,EACrC,CAAC;AACD,KAAG,qBAAqB,YAAY;AAChC,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQJ;AACA,UAAM,eAAe,EAAE;AACvB,OAAG,MAAM;AAET,UAAM,SAAS;AAAA,MACX,MAAM;AAAA,IACV,CAAC;AACD,UAAM,eAAe,EAAE;AACvB,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,GAAG;AAC7B,WAAO,GAAG,cAAc,CAAC,EAAE,GAAG,GAAG;AAEjC,UAAM,SAAS;AAAA,MACX,MAAM;AAAA,IACV,CAAC;AACD,UAAM,eAAe,EAAE;AACvB,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,IAAI;AAC9B,WAAO,GAAG,cAAc,CAAC;AAEzB,UAAM,SAAS;AAAA,MACX,MAAM;AAAA,IACV,CAAC;AACD,UAAM,eAAe,EAAE;AACvB,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,KAAK;AAC/B,WAAO,GAAG,cAAc,CAAC;AAEzB,UAAM,SAAS;AAAA,MACX,MAAM;AAAA,IACV,CAAC;AACD,UAAM,eAAe,EAAE;AACvB,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,KAAK;AAC/B,WAAO,GAAG,cAAc,CAAC;AAEzB,UAAM,SAAS;AAAA,MACX,OAAO;AAAA,IACX,CAAC;AACD,UAAM,eAAe,EAAE;AACvB,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,IAAI;AAC9B,WAAO,GAAG,cAAc,CAAC;AAEzB,UAAM,SAAS;AAAA,MACX,OAAO;AAAA,IACX,CAAC;AACD,UAAM,eAAe,EAAE;AACvB,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,GAAG;AAC7B,WAAO,GAAG,cAAc,CAAC,EAAE,GAAG,GAAG;AAAA,EACrC,CAAC;AACD,KAAG,+BAA+B,YAAY;AAC1C,UAAM,YAAY;AAClB,QAAI,cAAc;AAClB,UAAM,WAAW,CAAC,UAAuB;AACrC,oBAAc,MAAM,aAAa,EAAE,CAAC;AAAA,IACxC;AACA,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA,8BAGkB,QAAQ;AAAA;AAAA;AAAA,IAG9B;AACA,UAAM,eAAe,EAAE;AAEvB,OAAG,aAAa,QAAQ;AACxB,OAAG,aAAa,cAAc,IAAI,MAAM,OAAO,CAAC;AAChD,OAAG,aAAa,cAAc,IAAI,MAAM,QAAQ,CAAC;AAEjD,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,SAAS;AACnC,UAAM,aAAa;AACnB,WAAO,UAAU,EAAE,GAAG,MAAM,EAAE;AAAA,EAClC,CAAC;AACD,KAAG,2CAA2C,YAAY;AACtD,QAAI,KAAK,MAAM;AAAA,MACX;AAAA;AAAA;AAAA,IAGJ;AACA,UAAM,eAAe,EAAE;AACvB,QAAI,QAAQ,GAAG,aAAa,GAAG,WAAW,cAAc,OAAO,IAAI;AACnE,WAAO,KAAK,EAAE,GAAG;AACjB,QAAI,OAAO;AACP,aAAO,MAAM,aAAa,cAAc,CAAC,EAAE,GAAG,MAAM,KAAK;AAAA,IAC7D;AAEA,SAAK,MAAM;AAAA,MACP;AAAA;AAAA;AAAA,IAGJ;AACA,UAAM,eAAe,EAAE;AACvB,YAAQ,GAAG,aAAa,GAAG,WAAW,cAAc,OAAO,IAAI;AAC/D,WAAO,KAAK,EAAE,GAAG;AACjB,QAAI,OAAO;AACP,aAAO,MAAM,aAAa,cAAc,CAAC,EAAE,GAAG,IAAI;AAAA,IACtD;AAAA,EACJ,CAAC;AACD,KAAG,+BAA+B,YAAY;AAC1C,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA,IAGJ;AACA,UAAM,eAAe,EAAE;AACvB,WAAO,GAAG,OAAO,EAAE,GAAG,GAAG;AAEzB,OAAG,WAAW;AACd,UAAM,eAAe,EAAE;AACvB,WAAO,GAAG,OAAO,EAAE,GAAG,GAAG;AAAA,EAC7B,CAAC;AACD,KAAG,0BAA0B,YAAY;AACrC,UAAM,KAAK,MAAM;AAAA,MACb;AAAA;AAAA;AAAA,IAGJ;AACA,UAAM,eAAe,EAAE;AACvB,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,EAAE;AAE5B,UAAM,eAAe,GAAG;AAExB,OAAG,aAAa,QAAQ;AACxB,iBAAa,cAAc,IAAI,WAAW,OAAO,CAAC;AAElD,UAAM,eAAe,EAAE;AACvB,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,MAAM;AAEhC,iBAAa,QAAQ;AACrB,iBAAa,kBAAkB,GAAG,CAAC;AACnC,iBAAa,cAAc,IAAI,WAAW,OAAO,CAAC;AAElD,UAAM,eAAe,EAAE;AACvB,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,OAAO;AACjC,WAAO,aAAa,cAAc,EAAE,GAAG,MAAM,CAAC;AAE9C,iBAAa,QAAQ;AACrB,iBAAa,kBAAkB,GAAG,CAAC;AACnC,iBAAa,cAAc,IAAI,WAAW,OAAO,CAAC;AAElD,UAAM,eAAe,EAAE;AACvB,WAAO,GAAG,KAAK,EAAE,GAAG,MAAM,OAAO;AACjC,WAAO,aAAa,cAAc,EAAE,GAAG,MAAM,CAAC;AAAA,EAClD,CAAC;AACD,WAAS,kBAAkB,MAAM;AAM7B,OAAG,4CAA4C,YAAY;AACvD,YAAM,QAAyB;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AACA,uBAAiB,KAAK,OAAO;AACzB,cAAM,KAAK,MAAM;AAAA,UACb;AAAA,6CACyB,CAAC;AAAA;AAAA,QAE9B;AACA,eAAO,GAAG,IAAI,EAAE,OAAO,CAAC;AAExB,WAAG,aAAa,QAAQ,KAAK;AAC7B,eAAO,GAAG,IAAI,EAAE,OAAO,KAAK;AAAA,MAChC;AAAA,IACJ,CAAC;AACD,OAAG,uDAAuD,YAAY;AAClE,YAAM,MAAM,MAAM;AAAA,QACd;AAAA;AAAA;AAAA,MAGJ;AAEA,YAAM,MAAM,MAAM;AAAA,QACd;AAAA;AAAA;AAAA,MAGJ;AACA,aAAO,IAAI,IAAI,EAAE,OAAO,MAAM;AAC9B,aAAO,IAAI,IAAI,EAAE,OAAO,MAAM;AAE9B,UAAI,aAAa,QAAQ,QAAQ;AACjC,aAAO,IAAI,IAAI,EAAE,OAAO,MAAM;AAAA,IAClC,CAAC;AACD,OAAG,uCAAuC,YAAY;AAClD,YAAM,KAAK,MAAM;AAAA,QACb;AAAA;AAAA;AAAA,MAGJ;AAEA,SAAG,OAAO;AACV,YAAM,eAAe,EAAE;AAEvB,aAAO,GAAG,aAAa,MAAM,CAAC,EAAE,OAAO,OAAO;AAC9C,aAAO,GAAG,IAAI,EAAE,OAAO,OAAO;AAAA,IAClC,CAAC;AACD,OAAG,yDAAyD,YAAY;AACpE,YAAM,KAAK,MAAM;AAAA,QACb;AAAA;AAAA;AAAA,MAGJ;AAIA,SAAG,OAAO;AACV,YAAM,eAAe,EAAE;AAEvB,aAAO,GAAG,aAAa,MAAM,CAAC,EAAE,OAAO,OAAO;AAC9C,aAAO,GAAG,IAAI,EAAE,OAAO,MAAM;AAAA,IACjC,CAAC;AAAA,EACL,CAAC;AACD,WAAS,aAAa,MAAM;AACxB,UAAM,OAAO;AACb,UAAM,cAAc;AACpB,UAAM,sBAAsB;AAC5B,OAAG,2CAA2C,YAAY;AACtD,YAAM,KAAK,MAAM,WAAW;AAAA,sCACF,IAAI;AAAA,qDACW,WAAW;AAAA;AAAA,aAEnD;AAED,YAAM,eAAe,EAAE;AAEvB,YAAM,kBAAkB,MAAM,WAAW;AAAA,IAC7C,CAAC;AACD,OAAG,qDAAqD,YAAY;AAChE,YAAM,KAAK,MAAM,WAAW;AAAA,sCACF,IAAI;AAAA;AAAA,0BAEhB,WAAW;AAAA;AAAA;AAAA,aAGxB;AAED,YAAM,eAAe,EAAE;AAEvB,YAAM,kBAAkB,MAAM,WAAW;AAAA,IAC7C,CAAC;AACD,OAAG,4CAA4C,YAAY;AACvD,YAAM,KAAK,MAAM,WAAsB;AAAA,sCACb,IAAI;AAAA,qDACW,WAAW;AAAA;AAAA,0BAEtC,mBAAmB;AAAA;AAAA;AAAA,aAGhC;AACD,YAAM,mBAAmB,GAAG;AAAA,QACxB;AAAA,MACJ;AAEA,YAAM,eAAe,EAAE;AAEvB,aAAO,iBAAiB,OAAO,EAAE,GAAG,MAAM,SAAS;AACnD,YAAM,kBAAkB,MAAM,WAAW;AAEzC,SAAG,UAAU;AACb,YAAM,eAAe,EAAE;AAEvB,aAAO,iBAAiB,OAAO,EAAE,GAAG,MAAM,UAAU;AAKpD,UAAI;AACA,cAAM,kBAAkB,MAAM,mBAAmB;AACjD,YAAI,UAAU,GAAG;AACb,gBAAM,IAAI,MAAM,+BAA+B;AAAA,QACnD;AAAA,MACJ,SAAS,OAAO;AACZ,YAAI,CAAC,UAAU,GAAG;AACd,gBAAM;AAAA,QACV;AAAA,MACJ;AAAA,IACJ,CAAC;AACD,OAAG,uDAAuD,YAAY;AAClE,YAAM,KAAK,MAAM,WAAsB;AAAA,sCACb,IAAI;AAAA;AAAA,0BAEhB,WAAW;AAAA;AAAA;AAAA,0BAGX,mBAAmB;AAAA;AAAA;AAAA,aAGhC;AACD,YAAM,mBAAmB,GAAG;AAAA,QACxB;AAAA,MACJ;AAEA,YAAM,eAAe,EAAE;AAEvB,aAAO,iBAAiB,OAAO,EAAE,GAAG,MAAM,SAAS;AACnD,YAAM,kBAAkB,MAAM,WAAW;AAEzC,SAAG,UAAU;AACb,YAAM,eAAe,EAAE;AAEvB,aAAO,iBAAiB,OAAO,EAAE,GAAG,MAAM,UAAU;AAKpD,UAAI;AACA,cAAM,kBAAkB,MAAM,mBAAmB;AACjD,YAAI,UAAU,GAAG;AACb,gBAAM,IAAI,MAAM,+BAA+B;AAAA,QACnD;AAAA,MACJ,SAAS,OAAO;AACZ,YAAI,CAAC,UAAU,GAAG;AACd,gBAAM;AAAA,QACV;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACL,CAAC;AACL,CAAC;",
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport { Textfield, TextfieldType } from '../';\nimport { elementUpdated, expect, html, litFixture } from '@open-wc/testing';\nimport { sendKeys } from '@web/test-runner-commands';\nimport { sendMouse } from '../../../test/plugins/browser.js';\nimport { findDescribedNode } from '../../../test/testing-helpers-a11y.js';\nimport { HelpText } from '@spectrum-web-components/help-text';\nimport '@spectrum-web-components/help-text/sp-help-text.js';\nimport '@spectrum-web-components/textfield/sp-textfield.js';\nimport { testForLitDevWarnings } from '../../../test/testing-helpers.js';\nimport {\n isFirefox,\n isWebKit,\n} from '@spectrum-web-components/shared/src/platform.js';\nimport { fixture } from '../../../test/testing-helpers.js';\n\ndescribe('Textfield', () => {\n testForLitDevWarnings(\n async () =>\n await litFixture<Textfield>(\n html`\n <sp-textfield label=\"Enter Your Name\"></sp-textfield>\n `\n )\n );\n it('loads default textfield accessibly', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield label=\"Enter Your Name\"></sp-textfield>\n `\n );\n\n await elementUpdated(el);\n\n await expect(el).to.be.accessible();\n });\n it('loads multiline textfield accessibly', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield label=\"Enter your name\" multiline></sp-textfield>\n `\n );\n\n await elementUpdated(el);\n\n await expect(el).to.be.accessible();\n });\n\n it('manages tabIndex while disabled', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield placeholder=\"Enter Your Name\"></sp-textfield>\n `\n );\n\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(0);\n\n el.disabled = true;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(-1);\n\n el.tabIndex = 2;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(-1);\n\n el.disabled = false;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(2);\n });\n\n it('manages tabIndex before first render', async () => {\n const el = document.createElement('sp-textfield') as Textfield;\n\n expect(el.focusElement).to.be.null;\n expect(el.tabIndex).to.equal(0);\n\n el.remove();\n });\n it('loads', async () => {\n const testPlaceholder = 'Enter your name';\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield placeholder=${testPlaceholder}></sp-textfield>\n `\n );\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('input')\n : null;\n expect(input).to.not.be.null;\n const placeholder = input ? input.placeholder : null;\n expect(placeholder).to.equal(testPlaceholder);\n });\n it('multiline', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n multiline\n ></sp-textfield>\n `\n );\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('textarea')\n : null;\n expect(input).to.not.be.null;\n });\n it('multiline with rows', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n multiline\n rows=\"5\"\n ></sp-textfield>\n `\n );\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('textarea')\n : null;\n expect(input).to.not.be.null;\n expect(input?.getAttribute('rows')).to.equal('5');\n });\n it('multiline with 1 row has smaller height than multiline without explicit rows', async () => {\n const oneRowEl = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n multiline\n rows=\"1\"\n ></sp-textfield>\n `\n );\n expect(oneRowEl).to.not.equal(undefined);\n const oneRowTextarea = oneRowEl.shadowRoot\n ? oneRowEl.shadowRoot.querySelector('textarea')\n : null;\n expect(oneRowTextarea).to.not.be.null;\n expect(oneRowTextarea?.getAttribute('rows')).to.equal('1');\n\n const defaultEL = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n multiline\n ></sp-textfield>\n `\n );\n expect(defaultEL).to.not.equal(undefined);\n const defaultTextarea = oneRowEl.shadowRoot\n ? defaultEL.shadowRoot.querySelector('textarea')\n : null;\n expect(defaultTextarea).to.not.be.null;\n expect(defaultTextarea?.getAttribute('rows')).to.be.null;\n\n const boundsDefaultElement = defaultTextarea?.getBoundingClientRect();\n const boundsOneRowElement = oneRowTextarea?.getBoundingClientRect();\n expect(boundsDefaultElement?.height).to.be.greaterThan(\n boundsOneRowElement?.height ?? 0\n );\n });\n it('multiline with rows does not resize', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n multiline\n rows=\"5\"\n label=\"No resize control\"\n placeholder=\"No resize control\"\n ></sp-textfield>\n `\n );\n // Resizing only effects the block size of the host rect, so measure the `focusElement` when resizing.\n const sizedElement = (el as HTMLElement & { focusElement: HTMLElement })\n .focusElement;\n const startBounds = sizedElement.getBoundingClientRect();\n await sendMouse({\n steps: [\n {\n type: 'move',\n position: [startBounds.right - 6, startBounds.bottom - 6],\n },\n {\n type: 'down',\n },\n {\n type: 'move',\n position: [startBounds.right + 50, startBounds.bottom + 50],\n },\n {\n type: 'up',\n },\n ],\n });\n\n const endBounds = sizedElement.getBoundingClientRect();\n expect(endBounds.height).equals(startBounds.height);\n expect(endBounds.width).equals(startBounds.width);\n });\n it('resizes by default', async function () {\n if (isWebKit()) {\n this.skip();\n }\n const el = await fixture<Textfield>(\n html`\n <sp-textfield\n multiline\n label=\"No resize control\"\n placeholder=\"No resize control\"\n ></sp-textfield>\n `\n );\n // Resizing only effects the block size of the host rect, so measure the `focusElement` when resizing.\n const sizedElement = (el as HTMLElement & { focusElement: HTMLElement })\n .focusElement;\n const startBounds = sizedElement.getBoundingClientRect();\n await sendMouse({\n steps: [\n {\n type: 'move',\n position: [startBounds.right - 6, startBounds.bottom - 6],\n },\n {\n type: 'down',\n },\n {\n type: 'move',\n position: [startBounds.right + 50, startBounds.bottom + 50],\n },\n {\n type: 'up',\n },\n ],\n });\n\n const endBounds = sizedElement.getBoundingClientRect();\n expect(endBounds.height).to.be.greaterThan(startBounds.height);\n expect(endBounds.width).to.be.greaterThan(startBounds.width);\n });\n it('accepts resize styling', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n multiline\n style=\"resize: none;\"\n label=\"No resize control\"\n placeholder=\"No resize control\"\n ></sp-textfield>\n `\n );\n const startBounds = el.getBoundingClientRect();\n\n await sendMouse({\n steps: [\n {\n type: 'move',\n position: [startBounds.right - 2, startBounds.bottom - 2],\n },\n {\n type: 'down',\n },\n {\n type: 'move',\n position: [startBounds.right + 50, startBounds.bottom + 50],\n },\n {\n type: 'up',\n },\n ],\n });\n\n const endBounds = el.getBoundingClientRect();\n expect(endBounds.width).equals(startBounds.width);\n expect(endBounds.height).equals(startBounds.height);\n });\n it('grows', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n multiline\n grows\n ></sp-textfield>\n `\n );\n expect(el).to.not.equal(undefined);\n const sizer = el.shadowRoot\n ? el.shadowRoot.querySelector('#sizer')\n : null;\n expect(sizer).to.not.be.null;\n });\n it('multiline with rows and grows does not grow', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n multiline\n grows\n rows=\"5\"\n ></sp-textfield>\n `\n );\n expect(el).to.not.equal(undefined);\n const sizer = el.shadowRoot\n ? el.shadowRoot.querySelector('#sizer')\n : null;\n expect(sizer).to.be.null;\n });\n it('valid', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"[\\\\d]+\"\n value=\"123\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('handles `name` attribute', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield placeholder=\"Enter your name\"></sp-textfield>\n `\n );\n expect(el).to.not.equal(undefined);\n expect(el.name).to.be.undefined;\n\n el.setAttribute('name', 'test');\n expect(el.name).to.be.equal('test');\n });\n it('handles `name` attribute with multiline', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n name=\"name\"\n placeholder=\"Enter your name\"\n multiline\n ></sp-textfield>\n `\n );\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('textarea')\n : null;\n expect(input?.name).to.equal('name');\n });\n it('valid - multiline', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"[\\\\d]+\"\n value=\"123\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - required', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n value=\"123\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - multiline - required', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n value=\"123\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - boundary-type assertions', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"^[\\\\d]+$\"\n value=\"123\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - multiline - boundary-type assertions', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"^[\\\\d]+$\"\n value=\"123\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - boundary-type assertions and title', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"^[\\\\d]+$\"\n value=\"123\"\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot.querySelector('#valid');\n expect(input).to.not.be.null;\n expect(el.focusElement).to.not.have.attribute('title');\n });\n it('valid - multiline - boundary-type assertions and title', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n multiline\n placeholder=\"Enter your number\"\n pattern=\"^[\\\\d]+$\"\n value=\"123\"\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot.querySelector('#valid');\n expect(input).to.not.be.null;\n expect(el.focusElement).to.not.have.attribute('title');\n });\n it('valid - unicode', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n pattern=\"\\\\p{L}{4,8}\"\n value=\"\u4F60\u7684\u540D\u5B57\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - multiline - unicode', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n pattern=\"\\\\p{L}{4,8}\"\n value=\"\u4F60\u7684\u540D\u5B57\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"[\\\\d]+\"\n value=\"123 not valid\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - multiline', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"[\\\\d]+\"\n value=\"123 not valid\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - required', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n value=\"\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - multiline - required', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n value=\"\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - unicode', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"\\\\p{N}+\"\n value=\"123 not valid\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - multiline - unicode', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"\\\\p{N}+\"\n value=\"123 not valid\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - boundary-type assertions', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"^\\\\p{N}+$\"\n value=\"123 not valid\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - boundary-type assertions and title', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n type=\"url\"\n value=\"invalid-email\"\n invalid\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot.querySelector('#invalid');\n expect(input).to.not.be.null;\n expect(el.focusElement).to.have.attribute('title');\n });\n it('invalid - multiline - boundary-type assertions and title', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n multiline\n placeholder=\"Enter your number\"\n type=\"url\"\n value=\"invalid-email\"\n invalid\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot.querySelector('#invalid');\n expect(input).to.not.be.null;\n expect(el.focusElement).to.have.attribute('title');\n });\n it('invalid - multiline - boundary-type assertions', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"^\\\\p{N}+$\"\n value=\"123 not valid\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('receives focus', async () => {\n let activeElement: HTMLInputElement | null = null;\n const onFocusIn = (event: Event): void => {\n const path = event.composedPath();\n activeElement = path[0] as HTMLInputElement;\n };\n document.addEventListener('focusin', onFocusIn);\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield placeholder=\"Enter your name\"></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n el.focus();\n await elementUpdated(el);\n\n expect(activeElement === el.focusElement).to.be.true;\n document.removeEventListener('focusin', onFocusIn);\n });\n it('does not receive focus when disabled', async () => {\n let activeElement: HTMLInputElement | null = null;\n const onFocusIn = (event: Event): void => {\n const path = event.composedPath();\n activeElement = path[0] as HTMLInputElement;\n };\n document.addEventListener('focusin', onFocusIn);\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n disabled\n placeholder=\"Enter your name\"\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n el.focus();\n await elementUpdated(el);\n\n expect(activeElement === el.focusElement).to.be.false;\n expect(document.activeElement === el).to.be.false;\n document.removeEventListener('focusin', onFocusIn);\n\n el.click();\n await elementUpdated(el);\n\n expect(activeElement === el.focusElement).to.be.false;\n expect(document.activeElement === el).to.be.false;\n document.removeEventListener('focusin', onFocusIn);\n });\n it('accepts input', async () => {\n const testValue = 'Test Name';\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield placeholder=\"Enter your name\"></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n el.focusElement.value = testValue;\n el.focusElement.dispatchEvent(new Event('input'));\n\n expect(el.value).to.equal(testValue);\n });\n it('selects', async () => {\n const testValue = 'Test Name';\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield value=${testValue}></sp-textfield>\n `\n );\n await elementUpdated(el);\n expect(el.value).to.equal(testValue);\n\n el.focus();\n el.select();\n await sendKeys({ press: 'Backspace' });\n expect(el.value).to.equal('');\n });\n it('setSelectionRange', async () => {\n const testValue = 'Test Name';\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield value=${testValue}></sp-textfield>\n `\n );\n await elementUpdated(el);\n expect(el.value).to.equal(testValue);\n\n el.focus();\n el.setSelectionRange(0, 'Test '.length);\n await sendKeys({ press: 'Backspace' });\n expect(el.value).to.equal('Name');\n });\n it('handles minlength with required', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield required minlength=\"3\"></sp-textfield>\n `\n );\n el.focus();\n await sendKeys({\n type: 'ab',\n });\n await elementUpdated(el);\n\n expect(el.value).to.equal('ab');\n expect(el.checkValidity()).to.be.false;\n\n await sendKeys({\n type: 'c',\n });\n await elementUpdated(el);\n\n expect(el.value).to.equal('abc');\n expect(el.checkValidity()).to.be.true;\n });\n it('accepts maxlength', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n maxlength=\"3\"\n minlength=\"2\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n el.focus();\n\n await sendKeys({\n type: 'a',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('a');\n expect(el.checkValidity()).to.be.false;\n\n await sendKeys({\n type: 'b',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('ab');\n expect(el.checkValidity());\n\n await sendKeys({\n type: 'c',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('abc');\n expect(el.checkValidity());\n\n await sendKeys({\n type: 'd',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('abc');\n expect(el.checkValidity());\n\n await sendKeys({\n press: 'Backspace',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('ab');\n expect(el.checkValidity());\n\n await sendKeys({\n press: 'Backspace',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('a');\n expect(el.checkValidity()).to.be.false;\n });\n it('dispatches a `change` event', async () => {\n const testValue = 'Test Name';\n let eventSource = null as Textfield | null;\n const onChange = (event: Event): void => {\n eventSource = event.composedPath()[0] as Textfield;\n };\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n @change=${onChange}\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n el.focusElement.value = testValue;\n el.focusElement.dispatchEvent(new Event('input'));\n el.focusElement.dispatchEvent(new Event('change'));\n\n expect(el.value).to.equal(testValue);\n const testSource = eventSource as Textfield;\n expect(testSource).to.equal(el);\n });\n it('passes through `autocomplete` attribute', async () => {\n let el = await litFixture<Textfield>(\n html`\n <sp-textfield autocomplete=\"off\"></sp-textfield>\n `\n );\n await elementUpdated(el);\n let input = el.shadowRoot ? el.shadowRoot.querySelector('input') : null;\n expect(input).to.exist;\n if (input) {\n expect(input.getAttribute('autocomplete')).to.equal('off');\n }\n\n el = await litFixture<Textfield>(\n html`\n <sp-textfield></sp-textfield>\n `\n );\n await elementUpdated(el);\n input = el.shadowRoot ? el.shadowRoot.querySelector('input') : null;\n expect(input).to.exist;\n if (input) {\n expect(input.getAttribute('autocomplete')).to.not.exist;\n }\n });\n it('tests on `required` changes', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield value=\"\"></sp-textfield>\n `\n );\n await elementUpdated(el);\n expect(el.invalid).to.be.false;\n\n el.required = true;\n await elementUpdated(el);\n expect(el.invalid).to.be.true;\n });\n it('manages `allowed-keys`', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield allowed-keys=\"asdf\"></sp-textfield>\n `\n );\n await elementUpdated(el);\n expect(el.value).to.equal('');\n\n const inputElement = el.focusElement;\n\n el.focusElement.value = 'asdf';\n inputElement.dispatchEvent(new InputEvent('input'));\n\n await elementUpdated(el);\n expect(el.value).to.equal('asdf');\n\n inputElement.value = `asdff`;\n inputElement.setSelectionRange(1, 1);\n inputElement.dispatchEvent(new InputEvent('input'));\n\n await elementUpdated(el);\n expect(el.value).to.equal('asdff');\n expect(inputElement.selectionStart).to.equal(1);\n\n inputElement.value = `asdoff`;\n inputElement.setSelectionRange(4, 4);\n inputElement.dispatchEvent(new InputEvent('input'));\n\n await elementUpdated(el);\n expect(el.value).to.equal('asdff');\n expect(inputElement.selectionStart).to.equal(3);\n });\n describe('type attribute', () => {\n // references:\n // https://developer.mozilla.org/en-US/docs/Glossary/IDL#content_versus_idl_attributes\n // https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#reflecting-content-attributes-in-idl-attributes\n // https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#keywords-and-enumerated-attributes\n\n it('assigns valid attributes to the property', async () => {\n const types: TextfieldType[] = [\n 'text',\n 'url',\n 'tel',\n 'email',\n 'password',\n ];\n for await (const t of types) {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield type=${t}></sp-textfield>\n `\n );\n expect(el.type).equals(t);\n\n el.setAttribute('type', 'url');\n expect(el.type).equals('url');\n }\n });\n it('represents invalid and missing attributes as \"text\"', async () => {\n const el1 = await litFixture<Textfield>(\n html`\n <sp-textfield></sp-textfield>\n `\n );\n\n const el2 = await litFixture<Textfield>(\n html`\n <sp-textfield type=\"time\"></sp-textfield>\n `\n );\n expect(el1.type).equals('text');\n expect(el2.type).equals('text');\n\n el1.setAttribute('type', 'submit');\n expect(el1.type).equals('text');\n });\n it('reflects valid property assignments', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield type=\"url\"></sp-textfield>\n `\n );\n\n el.type = 'email';\n await elementUpdated(el);\n\n expect(el.getAttribute('type')).equals('email');\n expect(el.type).equals('email');\n });\n it('reflects invalid assignments but sets state to \"text\"', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield type=\"url\"></sp-textfield>\n `\n );\n\n // eslint-disable-next-line\n // @ts-ignore\n el.type = 'range';\n await elementUpdated(el);\n\n expect(el.getAttribute('type')).equals('range');\n expect(el.type).equals('text');\n });\n });\n describe('help text', () => {\n const name = 'This is a textfield';\n const description = 'This text helps you fill it out';\n const descriptionNegative = 'This text helps you when invalid';\n it('accepts help text in `slot=\"help-text\"`', async () => {\n const el = await litFixture(html`\n <sp-textfield label=${name}>\n <sp-help-text slot=\"help-text\">${description}</sp-help-text>\n </sp-textfield>\n `);\n\n await elementUpdated(el);\n\n await findDescribedNode(name, description);\n });\n it('accepts help text in `slot=\"help-text\"` w/ own ID', async () => {\n const el = await litFixture(html`\n <sp-textfield label=${name}>\n <sp-help-text slot=\"help-text\" id=\"help-text-id-1\">\n ${description}\n </sp-help-text>\n </sp-textfield>\n `);\n\n await elementUpdated(el);\n\n await findDescribedNode(name, description);\n });\n it('manages neutral/negative help text pairs', async () => {\n const el = await litFixture<Textfield>(html`\n <sp-textfield label=${name}>\n <sp-help-text slot=\"help-text\">${description}</sp-help-text>\n <sp-help-text slot=\"negative-help-text\">\n ${descriptionNegative}\n </sp-help-text>\n </sp-textfield>\n `);\n const negativeHelpText = el.querySelector(\n '[slot=\"negative-help-text\"]'\n ) as HelpText;\n\n await elementUpdated(el);\n\n expect(negativeHelpText.variant).to.equal('neutral');\n await findDescribedNode(name, description);\n\n el.invalid = true;\n await elementUpdated(el);\n\n expect(negativeHelpText.variant).to.equal('negative');\n // There's an issue in the way Firefox processes the a11y tree for\n // elements with an `invalid` attribute/property. The following try/catch\n // wrapping preps the code to pass in that context regardless and error\n // when our tooling no longer runs into this error.\n try {\n await findDescribedNode(name, descriptionNegative);\n if (isFirefox()) {\n throw new Error('this does not fail anymore...');\n }\n } catch (error) {\n if (!isFirefox()) {\n throw error;\n }\n }\n });\n it('manages neutral/negative help text pairs w/ own IDs', async () => {\n const el = await litFixture<Textfield>(html`\n <sp-textfield label=${name}>\n <sp-help-text slot=\"help-text\" id=\"help-text-id-2\">\n ${description}\n </sp-help-text>\n <sp-help-text slot=\"negative-help-text\" id=\"help-text-id-3\">\n ${descriptionNegative}\n </sp-help-text>\n </sp-textfield>\n `);\n const negativeHelpText = el.querySelector(\n '[slot=\"negative-help-text\"]'\n ) as HelpText;\n\n await elementUpdated(el);\n\n expect(negativeHelpText.variant).to.equal('neutral');\n await findDescribedNode(name, description);\n\n el.invalid = true;\n await elementUpdated(el);\n\n expect(negativeHelpText.variant).to.equal('negative');\n // There's an issue in the way Firefox processes the a11y tree for\n // elements with an `invalid` attribute/property. The following try/catch\n // wrapping preps the code to pass in that context regardless and error\n // when our tooling no longer runs into this error.\n try {\n await findDescribedNode(name, descriptionNegative);\n if (isFirefox()) {\n throw new Error('this does not fail anymore...');\n }\n } catch (error) {\n if (!isFirefox()) {\n throw error;\n }\n }\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }