@spectrum-web-components/textfield 1.12.0-testing.20260223092154 → 1.12.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.
package/README.md CHANGED
@@ -215,6 +215,24 @@ Use the `required` attribute to indicate a textfield value is required. Dictate
215
215
  ></sp-textfield>
216
216
  ```
217
217
 
218
+ ### Behaviors
219
+
220
+ #### Truncated value tooltip
221
+
222
+ When a single-line textfield value is visually truncated, a tooltip appears on hover/focus to expose the full value. This helps users review long input content when the control is too narrow to display all characters. This supports accessibility when users adjust text spacing (WCAG 1.4.12).
223
+
224
+ This behavior applies to single-line inputs and does not apply to multiline textfields. The full value is available on hover and keyboard focus so screen reader users can access it via the control's value. See also the same behavior on [number-field](../number-field).
225
+
226
+ By default the tooltip uses placement `bottom`. To change where the tooltip appears relative to the field, set the `tooltip-placement` attribute to a valid placement value: `top`, `top-start`, `top-end`, `right`, `right-start`, `right-end`, `bottom`, `bottom-start`, `bottom-end`, `left`, `left-start`, `left-end`. Placement is preferred but may flip (e.g. to the opposite side) when there is insufficient space so the tooltip stays in view.
227
+
228
+ ```html
229
+ <sp-field-label for="truncated-text">Email</sp-field-label>
230
+ <sp-textfield
231
+ id="truncated-text"
232
+ value="very.long.email.address@subdomain.example.com"
233
+ ></sp-textfield>
234
+ ```
235
+
218
236
  ### Accessibility
219
237
 
220
238
  #### Include a label
@@ -26,6 +26,12 @@
26
26
  "description": "",
27
27
  "name": "TextfieldBase",
28
28
  "members": [
29
+ {
30
+ "kind": "field",
31
+ "name": "truncatedValueTooltipController",
32
+ "privacy": "protected",
33
+ "default": "new TruncatedValueTooltipController( this as unknown as TruncatedValueTooltipHost & typeof this )"
34
+ },
29
35
  {
30
36
  "kind": "field",
31
37
  "name": "appliedLabel",
@@ -194,6 +200,17 @@
194
200
  "attribute": "readonly",
195
201
  "reflects": true
196
202
  },
203
+ {
204
+ "kind": "field",
205
+ "name": "truncatedValueTooltipPlacement",
206
+ "type": {
207
+ "text": "Placement"
208
+ },
209
+ "privacy": "public",
210
+ "default": "'bottom'",
211
+ "description": "Placement of the tooltip shown when the value is truncated (e.g. 'bottom', 'top').\nDefaults to 'bottom' per Spectrum design.",
212
+ "attribute": "tooltip-placement"
213
+ },
197
214
  {
198
215
  "kind": "field",
199
216
  "name": "rows",
@@ -578,6 +595,15 @@
578
595
  "description": "Whether a user can interact with the value of the form control",
579
596
  "fieldName": "readonly"
580
597
  },
598
+ {
599
+ "name": "tooltip-placement",
600
+ "type": {
601
+ "text": "Placement"
602
+ },
603
+ "default": "'bottom'",
604
+ "description": "Placement of the tooltip shown when the value is truncated (e.g. 'bottom', 'top').\nDefaults to 'bottom' per Spectrum design.",
605
+ "fieldName": "truncatedValueTooltipPlacement"
606
+ },
581
607
  {
582
608
  "name": "rows",
583
609
  "type": {
@@ -688,6 +714,16 @@
688
714
  "module": "src/Textfield.js"
689
715
  }
690
716
  },
717
+ {
718
+ "kind": "field",
719
+ "name": "truncatedValueTooltipController",
720
+ "privacy": "protected",
721
+ "default": "new TruncatedValueTooltipController( this as unknown as TruncatedValueTooltipHost & typeof this )",
722
+ "inheritedFrom": {
723
+ "name": "TextfieldBase",
724
+ "module": "src/Textfield.js"
725
+ }
726
+ },
691
727
  {
692
728
  "kind": "field",
693
729
  "name": "appliedLabel",
@@ -920,6 +956,21 @@
920
956
  "module": "src/Textfield.js"
921
957
  }
922
958
  },
959
+ {
960
+ "kind": "field",
961
+ "name": "truncatedValueTooltipPlacement",
962
+ "type": {
963
+ "text": "Placement"
964
+ },
965
+ "privacy": "public",
966
+ "default": "'bottom'",
967
+ "description": "Placement of the tooltip shown when the value is truncated (e.g. 'bottom', 'top').\nDefaults to 'bottom' per Spectrum design.",
968
+ "attribute": "tooltip-placement",
969
+ "inheritedFrom": {
970
+ "name": "TextfieldBase",
971
+ "module": "src/Textfield.js"
972
+ }
973
+ },
923
974
  {
924
975
  "kind": "field",
925
976
  "name": "rows",
@@ -1412,6 +1463,19 @@
1412
1463
  "module": "src/Textfield.ts"
1413
1464
  }
1414
1465
  },
1466
+ {
1467
+ "name": "tooltip-placement",
1468
+ "type": {
1469
+ "text": "Placement"
1470
+ },
1471
+ "default": "'bottom'",
1472
+ "description": "Placement of the tooltip shown when the value is truncated (e.g. 'bottom', 'top').\nDefaults to 'bottom' per Spectrum design.",
1473
+ "fieldName": "truncatedValueTooltipPlacement",
1474
+ "inheritedFrom": {
1475
+ "name": "TextfieldBase",
1476
+ "module": "src/Textfield.ts"
1477
+ }
1478
+ },
1415
1479
  {
1416
1480
  "name": "rows",
1417
1481
  "type": {
@@ -1507,6 +1571,30 @@
1507
1571
  }
1508
1572
  ],
1509
1573
  "exports": [
1574
+ {
1575
+ "kind": "js",
1576
+ "name": "TruncatedValueTooltipHost",
1577
+ "declaration": {
1578
+ "name": "TruncatedValueTooltipHost",
1579
+ "module": "./TruncatedValueTooltipController.js"
1580
+ }
1581
+ },
1582
+ {
1583
+ "kind": "js",
1584
+ "name": "TruncatedValueTooltipController",
1585
+ "declaration": {
1586
+ "name": "TruncatedValueTooltipController",
1587
+ "module": "./TruncatedValueTooltipController.js"
1588
+ }
1589
+ },
1590
+ {
1591
+ "kind": "js",
1592
+ "name": "truncatedValueTooltipUpdatedSymbol",
1593
+ "declaration": {
1594
+ "name": "truncatedValueTooltipUpdatedSymbol",
1595
+ "module": "./TruncatedValueTooltipController.js"
1596
+ }
1597
+ },
1510
1598
  {
1511
1599
  "kind": "js",
1512
1600
  "name": "TextfieldBase",
@@ -1524,6 +1612,174 @@
1524
1612
  }
1525
1613
  }
1526
1614
  ]
1615
+ },
1616
+ {
1617
+ "kind": "javascript-module",
1618
+ "path": "src/TruncatedValueTooltipController.js",
1619
+ "declarations": [
1620
+ {
1621
+ "kind": "variable",
1622
+ "name": "truncatedValueTooltipUpdatedSymbol",
1623
+ "description": "Symbol used to request a host re-render when truncation state or tooltip deps change.\nThe host can use this in its update lifecycle to react if needed; the important part\nis that requestUpdate(symbol, previous) triggers a re-render so controller.render() runs again."
1624
+ },
1625
+ {
1626
+ "kind": "class",
1627
+ "description": "A reactive controller that adds truncated-value tooltip behavior: when the visible\nvalue is clipped, a tooltip with the full value is shown on hover/focus. Overlay\nand tooltip are lazy-loaded only when truncation is first detected.\n\nThe host must implement TruncatedValueTooltipHost (e.g. TextfieldBase). The host\nincludes the controller's render output in its template and may call refresh() when\nvalue or focused changes; NumberField also calls syncTooltipText() from handleInput()\nso the tooltip stays in sync with the live input without re-renders.",
1628
+ "name": "TruncatedValueTooltipController",
1629
+ "members": [
1630
+ {
1631
+ "kind": "field",
1632
+ "name": "host",
1633
+ "type": {
1634
+ "text": "HostElement"
1635
+ },
1636
+ "privacy": "private",
1637
+ "default": "host"
1638
+ },
1639
+ {
1640
+ "kind": "field",
1641
+ "name": "_isTruncated",
1642
+ "type": {
1643
+ "text": "boolean"
1644
+ },
1645
+ "privacy": "private",
1646
+ "default": "false"
1647
+ },
1648
+ {
1649
+ "kind": "field",
1650
+ "name": "_tooltipDepsLoaded",
1651
+ "type": {
1652
+ "text": "boolean"
1653
+ },
1654
+ "privacy": "private",
1655
+ "default": "false"
1656
+ },
1657
+ {
1658
+ "kind": "field",
1659
+ "name": "_resizeObserver",
1660
+ "type": {
1661
+ "text": "ResizeObserver | null"
1662
+ },
1663
+ "privacy": "private",
1664
+ "default": "null"
1665
+ },
1666
+ {
1667
+ "kind": "field",
1668
+ "name": "_observerInitialized",
1669
+ "type": {
1670
+ "text": "boolean"
1671
+ },
1672
+ "privacy": "private",
1673
+ "default": "false"
1674
+ },
1675
+ {
1676
+ "kind": "field",
1677
+ "name": "inputElementIsTruncated",
1678
+ "type": {
1679
+ "text": "boolean"
1680
+ },
1681
+ "privacy": "private",
1682
+ "readonly": true
1683
+ },
1684
+ {
1685
+ "kind": "method",
1686
+ "name": "refreshTruncationState",
1687
+ "privacy": "private",
1688
+ "return": {
1689
+ "type": {
1690
+ "text": "boolean"
1691
+ }
1692
+ },
1693
+ "description": "Updates truncation state. Returns true if we just transitioned to truncated\n(so the host can e.g. schedule syncTooltipText after updateComplete)."
1694
+ },
1695
+ {
1696
+ "kind": "method",
1697
+ "name": "refresh",
1698
+ "privacy": "public",
1699
+ "return": {
1700
+ "type": {
1701
+ "text": "boolean"
1702
+ }
1703
+ },
1704
+ "description": "Public API for hosts (e.g. NumberField) to force a re-check of truncation state.\nCall from handleInput() or when value/focused changes so the tooltip visibility stays in sync.\nReturns true if we just became truncated (host may schedule syncTooltipText after updateComplete)."
1705
+ },
1706
+ {
1707
+ "kind": "method",
1708
+ "name": "ensureTooltipDeps",
1709
+ "privacy": "private",
1710
+ "return": {
1711
+ "type": {
1712
+ "text": "Promise<void>"
1713
+ }
1714
+ }
1715
+ },
1716
+ {
1717
+ "kind": "method",
1718
+ "name": "syncTooltipText",
1719
+ "privacy": "public",
1720
+ "return": {
1721
+ "type": {
1722
+ "text": "void"
1723
+ }
1724
+ },
1725
+ "parameters": [
1726
+ {
1727
+ "name": "text",
1728
+ "type": {
1729
+ "text": "string"
1730
+ }
1731
+ }
1732
+ ],
1733
+ "description": "Updates the tooltip label text without requestUpdate. Used by NumberField from\nhandleInput() so the tooltip shows the current input value while typing without\ntriggering re-renders that would affect formatting or selection.\n\nWe mutate an existing text node under `<sp-tooltip>` instead of assigning\n`tooltip.textContent`. Clearing `textContent` on the host removes all light-DOM\nchildren, which ejects Lit's marker nodes for `${host.displayValue}` in\n`render()` and causes \"ChildPart has no parentNode\" on the next update.\n\nTrade-off: this couples to our own light-DOM shape: `render()` must keep a\ndirect text child of `<sp-tooltip>` (or update this lookup if we wrap the label\nin an element, e.g. a dedicated `<span id=\"…\">`). This does not depend on\n`sp-tooltip`'s internal shadow DOM."
1734
+ },
1735
+ {
1736
+ "kind": "method",
1737
+ "name": "hostConnected",
1738
+ "return": {
1739
+ "type": {
1740
+ "text": "void"
1741
+ }
1742
+ }
1743
+ },
1744
+ {
1745
+ "kind": "method",
1746
+ "name": "hostUpdated",
1747
+ "return": {
1748
+ "type": {
1749
+ "text": "void"
1750
+ }
1751
+ }
1752
+ },
1753
+ {
1754
+ "kind": "method",
1755
+ "name": "hostDisconnected",
1756
+ "return": {
1757
+ "type": {
1758
+ "text": "void"
1759
+ }
1760
+ }
1761
+ }
1762
+ ]
1763
+ }
1764
+ ],
1765
+ "exports": [
1766
+ {
1767
+ "kind": "js",
1768
+ "name": "truncatedValueTooltipUpdatedSymbol",
1769
+ "declaration": {
1770
+ "name": "truncatedValueTooltipUpdatedSymbol",
1771
+ "module": "src/TruncatedValueTooltipController.js"
1772
+ }
1773
+ },
1774
+ {
1775
+ "kind": "js",
1776
+ "name": "TruncatedValueTooltipController",
1777
+ "declaration": {
1778
+ "name": "TruncatedValueTooltipController",
1779
+ "module": "src/TruncatedValueTooltipController.js"
1780
+ }
1781
+ }
1782
+ ]
1527
1783
  }
1528
1784
  ]
1529
1785
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spectrum-web-components/textfield",
3
- "version": "1.12.0-testing.20260223092154",
3
+ "version": "1.12.0",
4
4
  "description": "",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Adobe",
@@ -54,12 +54,14 @@
54
54
  ],
55
55
  "types": "./src/index.d.ts",
56
56
  "dependencies": {
57
- "@spectrum-web-components/base": "1.12.0-testing.20260223092154",
58
- "@spectrum-web-components/help-text": "1.12.0-testing.20260223092154",
59
- "@spectrum-web-components/icon": "1.12.0-testing.20260223092154",
60
- "@spectrum-web-components/icons-ui": "1.12.0-testing.20260223092154",
61
- "@spectrum-web-components/icons-workflow": "1.12.0-testing.20260223092154",
62
- "@spectrum-web-components/shared": "1.12.0-testing.20260223092154"
57
+ "@spectrum-web-components/base": "1.12.0",
58
+ "@spectrum-web-components/help-text": "1.12.0",
59
+ "@spectrum-web-components/icon": "1.12.0",
60
+ "@spectrum-web-components/icons-ui": "1.12.0",
61
+ "@spectrum-web-components/icons-workflow": "1.12.0",
62
+ "@spectrum-web-components/overlay": "1.12.0",
63
+ "@spectrum-web-components/shared": "1.12.0",
64
+ "@spectrum-web-components/tooltip": "1.12.0"
63
65
  },
64
66
  "keywords": [
65
67
  "design-system",
@@ -10,15 +10,16 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
  import { CSSResultArray, nothing, PropertyValues, TemplateResult } from '@spectrum-web-components/base';
13
+ import type { Placement } from '@spectrum-web-components/overlay';
13
14
  import { Focusable } from '@spectrum-web-components/shared/src/focusable.js';
14
15
  import '@spectrum-web-components/icons-ui/icons/sp-icon-checkmark100.js';
15
16
  import '@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js';
17
+ import { TruncatedValueTooltipController } from './TruncatedValueTooltipController.js';
18
+ export type { TruncatedValueTooltipHost } from './TruncatedValueTooltipController.js';
19
+ export { TruncatedValueTooltipController, truncatedValueTooltipUpdatedSymbol, } from './TruncatedValueTooltipController.js';
16
20
  declare const textfieldTypes: readonly ["text", "url", "tel", "email", "password"];
17
21
  export type TextfieldType = (typeof textfieldTypes)[number];
18
- declare const TextfieldBase_base: typeof Focusable & {
19
- new (...args: any[]): import("@spectrum-web-components/base").SizedElementInterface;
20
- prototype: import("@spectrum-web-components/base").SizedElementInterface;
21
- } & import("@spectrum-web-components/core/mixins/sized-mixin.js").SizedElementConstructor & {
22
+ declare const TextfieldBase_base: typeof Focusable & import("@spectrum-web-components/base").Constructor<import("@spectrum-web-components/base").SizedElementInterface> & import("@spectrum-web-components/base").SizedElementConstructor & {
22
23
  new (...args: any[]): import("@spectrum-web-components/help-text/src/manage-help-text.js").HelpTextElementInterface;
23
24
  prototype: import("@spectrum-web-components/help-text/src/manage-help-text.js").HelpTextElementInterface;
24
25
  };
@@ -27,6 +28,7 @@ declare const TextfieldBase_base: typeof Focusable & {
27
28
  * @fires change - An alteration to the value of the element has been committed by the user.
28
29
  */
29
30
  export declare class TextfieldBase extends TextfieldBase_base {
31
+ protected truncatedValueTooltipController: TruncatedValueTooltipController;
30
32
  static get styles(): CSSResultArray;
31
33
  protected appliedLabel?: string;
32
34
  /**
@@ -86,6 +88,11 @@ export declare class TextfieldBase extends TextfieldBase_base {
86
88
  * Whether a user can interact with the value of the form control
87
89
  */
88
90
  readonly: boolean;
91
+ /**
92
+ * Placement of the tooltip shown when the value is truncated (e.g. 'bottom', 'top').
93
+ * Defaults to 'bottom' per Spectrum design.
94
+ */
95
+ truncatedValueTooltipPlacement: Placement;
89
96
  /**
90
97
  * The specific number of rows the form control should provide in the user interface
91
98
  */
@@ -156,4 +163,3 @@ export declare class Textfield extends TextfieldBase {
156
163
  get value(): string;
157
164
  protected _value: string;
158
165
  }
159
- export {};
@@ -29,6 +29,13 @@ import { Focusable } from "@spectrum-web-components/shared/src/focusable.js";
29
29
  import "@spectrum-web-components/icons-ui/icons/sp-icon-checkmark100.js";
30
30
  import "@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js";
31
31
  import textfieldStyles from "./textfield.css.js";
32
+ import {
33
+ TruncatedValueTooltipController
34
+ } from "./TruncatedValueTooltipController.dev.js";
35
+ export {
36
+ TruncatedValueTooltipController,
37
+ truncatedValueTooltipUpdatedSymbol
38
+ } from "./TruncatedValueTooltipController.dev.js";
32
39
  const textfieldTypes = ["text", "url", "tel", "email", "password"];
33
40
  export class TextfieldBase extends ManageHelpText(
34
41
  SizedMixin(Focusable, {
@@ -37,6 +44,9 @@ export class TextfieldBase extends ManageHelpText(
37
44
  ) {
38
45
  constructor() {
39
46
  super(...arguments);
47
+ this.truncatedValueTooltipController = new TruncatedValueTooltipController(
48
+ this
49
+ );
40
50
  this.allowedKeys = "";
41
51
  this.focused = false;
42
52
  this.invalid = false;
@@ -48,6 +58,7 @@ export class TextfieldBase extends ManageHelpText(
48
58
  this.minlength = -1;
49
59
  this.multiline = false;
50
60
  this.readonly = false;
61
+ this.truncatedValueTooltipPlacement = "bottom";
51
62
  this.rows = -1;
52
63
  this.valid = false;
53
64
  this._value = "";
@@ -161,7 +172,9 @@ export class TextfieldBase extends ManageHelpText(
161
172
  <textarea
162
173
  name=${ifDefined(this.name || void 0)}
163
174
  aria-describedby=${this.helpTextId}
164
- aria-label=${this.label || this.appliedLabel || this.placeholder}
175
+ aria-label=${ifDefined(
176
+ this.label || this.appliedLabel || this.placeholder || void 0
177
+ )}
165
178
  aria-invalid=${ifDefined(this.invalid || void 0)}
166
179
  class="input"
167
180
  maxlength=${ifDefined(
@@ -193,7 +206,9 @@ export class TextfieldBase extends ManageHelpText(
193
206
  name=${ifDefined(this.name || void 0)}
194
207
  type=${this.type}
195
208
  aria-describedby=${this.helpTextId}
196
- aria-label=${this.label || this.appliedLabel || this.placeholder}
209
+ aria-label=${ifDefined(
210
+ this.label || this.appliedLabel || this.placeholder || void 0
211
+ )}
197
212
  aria-invalid=${ifDefined(this.invalid || void 0)}
198
213
  class="input"
199
214
  title=${this.invalid ? "" : nothing}
@@ -223,16 +238,24 @@ export class TextfieldBase extends ManageHelpText(
223
238
  render() {
224
239
  return html`
225
240
  <div id="textfield">${this.renderField()}</div>
241
+ ${this.truncatedValueTooltipController.render()}
226
242
  ${this.renderHelpText(this.invalid)}
227
243
  `;
228
244
  }
229
245
  update(changedProperties) {
230
- if (changedProperties.has("value") || changedProperties.has("required") && this.required) {
246
+ const valueOrRequiredChanged = changedProperties.has("value") || changedProperties.has("required") && this.required;
247
+ if (valueOrRequiredChanged) {
231
248
  this.updateComplete.then(() => {
232
249
  this.checkValidity();
250
+ if (changedProperties.has("value")) {
251
+ this.truncatedValueTooltipController.refresh();
252
+ }
233
253
  });
234
254
  }
235
255
  super.update(changedProperties);
256
+ if (changedProperties.has("focused") && !this.focused) {
257
+ this.truncatedValueTooltipController.refresh();
258
+ }
236
259
  }
237
260
  checkValidity() {
238
261
  let validity = this.inputElement.checkValidity();
@@ -298,6 +321,9 @@ __decorateClass([
298
321
  __decorateClass([
299
322
  property({ type: Boolean, reflect: true })
300
323
  ], TextfieldBase.prototype, "readonly", 2);
324
+ __decorateClass([
325
+ property({ attribute: "tooltip-placement" })
326
+ ], TextfieldBase.prototype, "truncatedValueTooltipPlacement", 2);
301
327
  __decorateClass([
302
328
  property({ type: Number })
303
329
  ], TextfieldBase.prototype, "rows", 2);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["Textfield.ts"],
4
- "sourcesContent": ["/**\n * Copyright 2026 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing 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 property,\n query,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport {\n ifDefined,\n live,\n} from '@spectrum-web-components/base/src/directives.js';\nimport { ManageHelpText } from '@spectrum-web-components/help-text/src/manage-help-text.js';\nimport checkmarkStyles from '@spectrum-web-components/icon/src/spectrum-icon-checkmark.css.js';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\n\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';\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 protected appliedLabel?: string;\n\n /**\n * A regular expression outlining the keys that will be allowed to update the value of the form control.\n */\n @property({ attribute: 'allowed-keys' })\n allowedKeys = '';\n\n /**\n * @private\n */\n @property({ type: Boolean, reflect: true })\n public focused = false;\n\n @query('.input:not(#sizer)')\n protected inputElement!: HTMLInputElement | HTMLTextAreaElement;\n\n /**\n * Whether the `value` held by the form control is invalid.\n */\n @property({ type: Boolean, reflect: true })\n public invalid = false;\n\n /**\n * A string applied via `aria-label` to the form control when a user visible label is not provided.\n */\n @property()\n public label = '';\n\n /**\n * Name of the form control.\n */\n @property({ type: String, reflect: true })\n public name: string | undefined;\n\n /**\n * Text that appears in the form control when it has no value set\n */\n @property()\n public placeholder = '';\n\n @state()\n set type(val: TextfieldType) {\n const prev = this._type;\n this._type = val;\n this.requestUpdate('type', prev);\n }\n\n get type(): TextfieldType {\n return textfieldTypes.find((t) => t === this._type) ?? 'text';\n }\n\n /**\n * @private\n * This binding allows for invalid value for `type` to still be reflected to the DOM\n */\n @property({ attribute: 'type', reflect: true })\n private _type: TextfieldType = 'text';\n\n /**\n * Pattern the `value` must match to be valid\n */\n @property()\n public pattern?: string;\n\n /**\n * Whether a form control delivered with the `multiline` attribute will change size\n * vertically to accomodate longer input\n */\n @property({ type: Boolean, reflect: true })\n public grows = false;\n\n /**\n * Defines the maximum string length that the user can enter\n */\n @property({ type: Number })\n public maxlength = -1;\n\n /**\n * Defines the minimum string length that the user can enter\n */\n @property({ type: Number })\n public minlength = -1;\n\n /**\n * Whether the form control should accept a value longer than one line\n */\n @property({ type: Boolean, reflect: true })\n public multiline = false;\n\n /**\n * Whether a user can interact with the value of the form control\n */\n @property({ type: Boolean, reflect: true })\n public readonly = false;\n\n /**\n * The specific number of rows the form control should provide in the user interface\n */\n @property({ type: Number })\n public rows = -1;\n\n /**\n * Whether the `value` held by the form control is valid.\n */\n @property({ type: Boolean, reflect: true })\n public valid = false;\n\n /**\n * The value held by the form control\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 /**\n * Whether to display the form control with no visible background\n */\n @property({ type: Boolean, reflect: true })\n public quiet = false;\n\n /**\n * Whether the form control will be found to be invalid when it holds no `value`\n */\n @property({ type: Boolean, reflect: true })\n public required = false;\n\n /**\n * What form of assistance should be provided when attempting to supply a value to the form control\n *\n * Note: combobox overrides `autocomplete` intentionally with `aria-autocomplete` values, which is\n * why those values (although invalid for native `autocomplete`) are included here to support the\n * combobox accessibility pattern.\n */\n @property({ type: String, reflect: true })\n public autocomplete?:\n | 'list'\n | 'none'\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.selectionStart as number;\n const nextSelectStart = selectionStart - 1;\n this.inputElement.value = this.value.toString();\n this.inputElement.setSelectionRange(nextSelectStart, nextSelectStart);\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(_event: FocusEvent): void {\n this.focused = !this.readonly && false;\n }\n\n protected handleInputElementPointerdown(): void {}\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 // prettier-ignore\n private get renderMultiline(): TemplateResult {\n return html`\n ${this.multiline && this.grows && this.rows === -1\n ? html`\n <div id=\"sizer\" class=\"input\" aria-hidden=\"true\">${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 || this.appliedLabel || this.placeholder}\n aria-invalid=${ifDefined(this.invalid || undefined)}\n class=\"input\"\n title=${this.invalid ? '' : nothing}\n maxlength=${ifDefined(this.maxlength > -1 ? this.maxlength : undefined)}\n minlength=${ifDefined(this.minlength > -1 ? this.minlength : undefined)}\n pattern=${ifDefined(this.pattern)}\n placeholder=${this.placeholder}\n .value=${live(this.displayValue)}\n @change=${this.handleChange}\n @input=${this.handleInput}\n @pointerdown=${this.handleInputElementPointerdown}\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 = 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": ["/**\n * Copyright 2026 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing 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 property,\n query,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport {\n ifDefined,\n live,\n} from '@spectrum-web-components/base/src/directives.js';\nimport { ManageHelpText } from '@spectrum-web-components/help-text/src/manage-help-text.js';\nimport checkmarkStyles from '@spectrum-web-components/icon/src/spectrum-icon-checkmark.css.js';\nimport type { Placement } from '@spectrum-web-components/overlay';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\n\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 {\n TruncatedValueTooltipController,\n type TruncatedValueTooltipHost,\n} from './TruncatedValueTooltipController.dev.js'\n\nexport type { TruncatedValueTooltipHost } from './TruncatedValueTooltipController.dev.js'\nexport {\n TruncatedValueTooltipController,\n truncatedValueTooltipUpdatedSymbol,\n} from './TruncatedValueTooltipController.dev.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 protected truncatedValueTooltipController =\n new TruncatedValueTooltipController(\n this as unknown as TruncatedValueTooltipHost & typeof this\n );\n public static override get styles(): CSSResultArray {\n return [textfieldStyles, checkmarkStyles];\n }\n\n @state()\n protected appliedLabel?: string;\n\n /**\n * A regular expression outlining the keys that will be allowed to update the value of the form control.\n */\n @property({ attribute: 'allowed-keys' })\n allowedKeys = '';\n\n /**\n * @private\n */\n @property({ type: Boolean, reflect: true })\n public focused = false;\n\n @query('.input:not(#sizer)')\n protected inputElement!: HTMLInputElement | HTMLTextAreaElement;\n\n /**\n * Whether the `value` held by the form control is invalid.\n */\n @property({ type: Boolean, reflect: true })\n public invalid = false;\n\n /**\n * A string applied via `aria-label` to the form control when a user visible label is not provided.\n */\n @property()\n public label = '';\n\n /**\n * Name of the form control.\n */\n @property({ type: String, reflect: true })\n public name: string | undefined;\n\n /**\n * Text that appears in the form control when it has no value set\n */\n @property()\n public placeholder = '';\n\n @state()\n set type(val: TextfieldType) {\n const prev = this._type;\n this._type = val;\n this.requestUpdate('type', prev);\n }\n\n get type(): TextfieldType {\n return textfieldTypes.find((t) => t === this._type) ?? 'text';\n }\n\n /**\n * @private\n * This binding allows for invalid value for `type` to still be reflected to the DOM\n */\n @property({ attribute: 'type', reflect: true })\n private _type: TextfieldType = 'text';\n\n /**\n * Pattern the `value` must match to be valid\n */\n @property()\n public pattern?: string;\n\n /**\n * Whether a form control delivered with the `multiline` attribute will change size\n * vertically to accomodate longer input\n */\n @property({ type: Boolean, reflect: true })\n public grows = false;\n\n /**\n * Defines the maximum string length that the user can enter\n */\n @property({ type: Number })\n public maxlength = -1;\n\n /**\n * Defines the minimum string length that the user can enter\n */\n @property({ type: Number })\n public minlength = -1;\n\n /**\n * Whether the form control should accept a value longer than one line\n */\n @property({ type: Boolean, reflect: true })\n public multiline = false;\n\n /**\n * Whether a user can interact with the value of the form control\n */\n @property({ type: Boolean, reflect: true })\n public readonly = false;\n\n /**\n * Placement of the tooltip shown when the value is truncated (e.g. 'bottom', 'top').\n * Defaults to 'bottom' per Spectrum design.\n */\n @property({ attribute: 'tooltip-placement' })\n public truncatedValueTooltipPlacement: Placement = 'bottom';\n\n /**\n * The specific number of rows the form control should provide in the user interface\n */\n @property({ type: Number })\n public rows = -1;\n\n /**\n * Whether the `value` held by the form control is valid.\n */\n @property({ type: Boolean, reflect: true })\n public valid = false;\n\n /**\n * The value held by the form control\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 /**\n * Whether to display the form control with no visible background\n */\n @property({ type: Boolean, reflect: true })\n public quiet = false;\n\n /**\n * Whether the form control will be found to be invalid when it holds no `value`\n */\n @property({ type: Boolean, reflect: true })\n public required = false;\n\n /**\n * What form of assistance should be provided when attempting to supply a value to the form control\n *\n * Note: combobox overrides `autocomplete` intentionally with `aria-autocomplete` values, which is\n * why those values (although invalid for native `autocomplete`) are included here to support the\n * combobox accessibility pattern.\n */\n @property({ type: String, reflect: true })\n public autocomplete?:\n | 'list'\n | 'none'\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.selectionStart as number;\n const nextSelectStart = selectionStart - 1;\n this.inputElement.value = this.value.toString();\n this.inputElement.setSelectionRange(nextSelectStart, nextSelectStart);\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(_event: FocusEvent): void {\n this.focused = !this.readonly && false;\n }\n\n protected handleInputElementPointerdown(): void {}\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 // prettier-ignore\n private get renderMultiline(): TemplateResult {\n return html`\n ${this.multiline && this.grows && this.rows === -1\n ? html`\n <div id=\"sizer\" class=\"input\" aria-hidden=\"true\">${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=${ifDefined(\n this.label || this.appliedLabel || this.placeholder || undefined\n )}\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=${ifDefined(\n this.label || this.appliedLabel || this.placeholder || undefined\n )}\n aria-invalid=${ifDefined(this.invalid || undefined)}\n class=\"input\"\n title=${this.invalid ? '' : nothing}\n maxlength=${ifDefined(this.maxlength > -1 ? this.maxlength : undefined)}\n minlength=${ifDefined(this.minlength > -1 ? this.minlength : undefined)}\n pattern=${ifDefined(this.pattern)}\n placeholder=${this.placeholder}\n .value=${live(this.displayValue)}\n @change=${this.handleChange}\n @input=${this.handleInput}\n @pointerdown=${this.handleInputElementPointerdown}\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.truncatedValueTooltipController.render()}\n ${this.renderHelpText(this.invalid)}\n `;\n }\n\n protected override update(changedProperties: PropertyValues): void {\n const valueOrRequiredChanged =\n changedProperties.has('value') ||\n (changedProperties.has('required') && this.required);\n\n if (valueOrRequiredChanged) {\n this.updateComplete.then(() => {\n this.checkValidity();\n if (changedProperties.has('value')) {\n // Truncation tooltip uses an intentional multi-phase update: (1) first render puts value in\n // DOM, (2) after updateComplete we measure and set truncation state, (3) controller defers\n // requestUpdate to a microtask so a second render shows the tooltip. We cannot show the\n // tooltip in the first render because we must measure after layout. This can cause a brief\n // delay before the tooltip appears; that is expected.\n this.truncatedValueTooltipController.refresh();\n }\n });\n }\n\n super.update(changedProperties);\n\n if (changedProperties.has('focused') && !this.focused) {\n this.truncatedValueTooltipController.refresh();\n }\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 = 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
  }