@adobe/spectrum-wc-core 2.0.0-beta.3 → 2.0.0-next.20260901142816

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.
@@ -21,9 +21,9 @@ declare const DropzoneBase_base: typeof SpectrumElement & {
21
21
  * payload and set the cursor to `none`.
22
22
  * @fires swc-dropzone-dragover - Fired once when dragged files enter the zone and are
23
23
  * accepted; does not repeat on subsequent `dragover` ticks while still hovering.
24
- * @fires swc-dropzone-dragleave - Fired when an accepted drag leaves the zone after a
25
- * 100 ms debounce, or immediately when it becomes rejected. Detail is a plain snapshot
26
- * `{ clientX, clientY, relatedTarget }` captured synchronously from the native event.
24
+ * @fires swc-dropzone-dragleave - Fired when dragged files leave the zone after a 100 ms
25
+ * debounce. Detail is a plain snapshot `{ clientX, clientY, relatedTarget }` captured
26
+ * synchronously from the native event before the timer fires.
27
27
  * @fires swc-dropzone-drop - Fired when files are dropped on the zone. `element.dragged`
28
28
  * is still `true` when this event fires; it transitions to `false` after dispatch.
29
29
  */
@@ -65,10 +65,25 @@ export declare abstract class DropzoneBase extends DropzoneBase_base {
65
65
  set dropEffect(value: DropEffect | null);
66
66
  /** @internal */
67
67
  private _dropEffect;
68
- protected constructor();
69
68
  /** @internal */
70
69
  private readonly _sizePropagation;
71
70
  /** @internal */
72
71
  protected handleDefaultSlotChange(): void;
72
+ /**
73
+ * @internal
74
+ *
75
+ * Timer ID for debounced dragleave; prevents flickering on child drag events.
76
+ */
77
+ private _dragLeaveTimer;
78
+ connectedCallback(): void;
79
+ disconnectedCallback(): void;
80
+ /** @internal */
81
+ private readonly _onDragOver;
82
+ /** @internal */
83
+ private readonly _onDragLeave;
84
+ /** @internal */
85
+ private readonly _onDrop;
86
+ /** @internal */
87
+ private _clearDragLeaveTimer;
73
88
  }
74
89
  export {};
@@ -1,82 +1,98 @@
1
1
  import { __decorate as e } from "../../_virtual/_@oxc-project_runtime@0.124.0/helpers/decorate.js";
2
2
  import { SlotAttributePropagationController as t } from "../../controllers/slot-attribute-propagation-controller/src/slot-attribute-propagation-controller.js";
3
- import { DragAndDropController as n } from "../../controllers/drag-and-drop-controller/src/drag-and-drop-controller.js";
4
- import { DROPZONE_DEFAULT_DROP_EFFECT as r, DROPZONE_VALID_SIZES as i, DROP_EFFECTS as a, SWC_DROPZONE_DRAGLEAVE_EVENT as o, SWC_DROPZONE_DRAGOVER_EVENT as s, SWC_DROPZONE_DROP_EVENT as c, SWC_DROPZONE_SHOULD_ACCEPT_EVENT as l } from "./Dropzone.types.js";
5
- import { property as u } from "lit/decorators.js";
6
- import { SpectrumElement as d } from "@adobe/spectrum-wc-core/element/index.js";
7
- import { SizedMixin as f } from "@adobe/spectrum-wc-core/mixins/index.js";
8
- import { validateEnum as p } from "@adobe/spectrum-wc-core/utils/index.js";
3
+ import { DROPZONE_DEFAULT_DROP_EFFECT as n, DROPZONE_VALID_SIZES as r, DROP_EFFECTS as i, SWC_DROPZONE_DRAGLEAVE_EVENT as a, SWC_DROPZONE_DRAGOVER_EVENT as o, SWC_DROPZONE_DROP_EVENT as s, SWC_DROPZONE_SHOULD_ACCEPT_EVENT as c } from "./Dropzone.types.js";
4
+ import { property as l } from "lit/decorators.js";
5
+ import { SpectrumElement as u } from "@adobe/spectrum-wc-core/element/index.js";
6
+ import { SizedMixin as d } from "@adobe/spectrum-wc-core/mixins/index.js";
7
+ import { validateEnum as f } from "@adobe/spectrum-wc-core/utils/index.js";
9
8
  //#region components/dropzone/Dropzone.base.ts
10
- var m = class extends f(d, { validSizes: i }) {
9
+ var p = class extends d(u, { validSizes: r }) {
10
+ constructor(...e) {
11
+ super(...e), this.dragged = !1, this.filled = !1, this._dropEffect = n, this._sizePropagation = new t(this, {
12
+ attribute: "size",
13
+ getValue: () => this.size,
14
+ selector: "swc-illustrated-message"
15
+ }), this._dragLeaveTimer = null, this._onDragOver = (e) => {
16
+ if (e.preventDefault(), !e.dataTransfer) return;
17
+ let t = new CustomEvent(c, {
18
+ bubbles: !0,
19
+ cancelable: !0,
20
+ composed: !0,
21
+ detail: e
22
+ });
23
+ if (!this.dispatchEvent(t)) {
24
+ e.dataTransfer.dropEffect = "none";
25
+ return;
26
+ }
27
+ this._clearDragLeaveTimer(), e.dataTransfer.dropEffect = this._dropEffect, this.dragged || (this.dragged = !0, this.dispatchEvent(new CustomEvent(o, {
28
+ bubbles: !0,
29
+ composed: !0,
30
+ detail: e
31
+ })));
32
+ }, this._onDragLeave = (e) => {
33
+ if (e.relatedTarget && this.contains(e.relatedTarget)) return;
34
+ this._clearDragLeaveTimer();
35
+ let { clientX: t, clientY: n, relatedTarget: r } = e;
36
+ this._dragLeaveTimer = setTimeout(() => {
37
+ this._dragLeaveTimer = null, this.dragged = !1, this.dispatchEvent(new CustomEvent(a, {
38
+ bubbles: !0,
39
+ composed: !0,
40
+ detail: {
41
+ clientX: t,
42
+ clientY: n,
43
+ relatedTarget: r
44
+ }
45
+ }));
46
+ }, 100);
47
+ }, this._onDrop = (e) => {
48
+ e.preventDefault(), this.dragged && (this._clearDragLeaveTimer(), this.dispatchEvent(new CustomEvent(s, {
49
+ bubbles: !0,
50
+ composed: !0,
51
+ detail: e
52
+ })), this.dragged = !1);
53
+ };
54
+ }
11
55
  get dropEffect() {
12
56
  return this._dropEffect;
13
57
  }
14
58
  set dropEffect(e) {
15
59
  if (e === null) {
16
60
  let e = this._dropEffect;
17
- this._dropEffect = r, this.requestUpdate("dropEffect", e);
18
- } else if (a.includes(e)) {
61
+ this._dropEffect = n, this.requestUpdate("dropEffect", e);
62
+ } else if (i.includes(e)) {
19
63
  let t = this._dropEffect;
20
64
  this._dropEffect = e, this.requestUpdate("dropEffect", t);
21
- } else p(this, {
65
+ } else f(this, {
22
66
  prop: "drop-effect",
23
67
  value: e,
24
- valid: a,
68
+ valid: i,
25
69
  url: "https://spectrum-web-components.adobe.com/?path=/docs/components-dropzone--docs"
26
70
  });
27
71
  }
28
- constructor() {
29
- super(), this.dragged = !1, this.filled = !1, this._dropEffect = r, this._sizePropagation = new t(this, {
30
- attribute: "size",
31
- getValue: () => this.size,
32
- selector: "swc-illustrated-message"
33
- }), new n(this, {
34
- isDragged: () => this.dragged,
35
- shouldAccept: (e) => this.dispatchEvent(new CustomEvent(l, {
36
- bubbles: !0,
37
- cancelable: !0,
38
- composed: !0,
39
- detail: e
40
- })),
41
- dropEffect: () => this._dropEffect,
42
- onDragEnter: (e) => {
43
- this.dragged = !0, this.dispatchEvent(new CustomEvent(s, {
44
- bubbles: !0,
45
- composed: !0,
46
- detail: e
47
- }));
48
- },
49
- onDragLeave: (e) => {
50
- this.dragged = !1, this.dispatchEvent(new CustomEvent(o, {
51
- bubbles: !0,
52
- composed: !0,
53
- detail: e
54
- }));
55
- },
56
- onDrop: (e) => {
57
- this.dispatchEvent(new CustomEvent(c, {
58
- bubbles: !0,
59
- composed: !0,
60
- detail: e
61
- })), this.dragged = !1;
62
- }
63
- });
64
- }
65
72
  handleDefaultSlotChange() {
66
73
  this._sizePropagation.propagate();
67
74
  }
75
+ connectedCallback() {
76
+ super.connectedCallback(), this.addEventListener("drop", this._onDrop), this.addEventListener("dragover", this._onDragOver), this.addEventListener("dragleave", this._onDragLeave);
77
+ }
78
+ disconnectedCallback() {
79
+ super.disconnectedCallback(), this.removeEventListener("drop", this._onDrop), this.removeEventListener("dragover", this._onDragOver), this.removeEventListener("dragleave", this._onDragLeave), this._clearDragLeaveTimer();
80
+ }
81
+ _clearDragLeaveTimer() {
82
+ this._dragLeaveTimer !== null && (clearTimeout(this._dragLeaveTimer), this._dragLeaveTimer = null);
83
+ }
68
84
  };
69
- e([u({
85
+ e([l({
70
86
  type: Boolean,
71
87
  reflect: !0
72
- })], m.prototype, "dragged", void 0), e([u({
88
+ })], p.prototype, "dragged", void 0), e([l({
73
89
  type: Boolean,
74
90
  reflect: !0
75
- })], m.prototype, "filled", void 0), e([u({
91
+ })], p.prototype, "filled", void 0), e([l({
76
92
  type: String,
77
93
  attribute: "drop-effect"
78
- })], m.prototype, "dropEffect", null);
94
+ })], p.prototype, "dropEffect", null);
79
95
  //#endregion
80
- export { m as DropzoneBase };
96
+ export { p as DropzoneBase };
81
97
 
82
98
  //# sourceMappingURL=Dropzone.base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dropzone.base.js","names":[],"sources":["../../../components/dropzone/Dropzone.base.ts"],"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 { property } from 'lit/decorators.js';\n\nimport { SpectrumElement } from '@adobe/spectrum-wc-core/element/index.js';\nimport { SizedMixin } from '@adobe/spectrum-wc-core/mixins/index.js';\nimport { validateEnum } from '@adobe/spectrum-wc-core/utils/index.js';\n\nimport { DragAndDropController } from '../../controllers/drag-and-drop-controller/index.js';\nimport { SlotAttributePropagationController } from '../../controllers/slot-attribute-propagation-controller/index.js';\nimport {\n DROP_EFFECTS,\n type DropEffect,\n DROPZONE_DEFAULT_DROP_EFFECT,\n DROPZONE_VALID_SIZES,\n type DropzoneDragLeaveDetail,\n type DropzoneSize,\n SWC_DROPZONE_DRAGLEAVE_EVENT,\n SWC_DROPZONE_DRAGOVER_EVENT,\n SWC_DROPZONE_DROP_EVENT,\n SWC_DROPZONE_SHOULD_ACCEPT_EVENT,\n} from './Dropzone.types.js';\n\n/**\n * Base class for the `<swc-dropzone>` drop zone component.\n *\n * Encapsulates all drag-and-drop event handling, state management, and\n * validation logic. Rendering, ARIA, and CSS are provided by the concrete\n * SWC subclass.\n *\n * @attribute {DropzoneSize} size - Controls the illustrated icon scale and container dimensions.\n *\n * @slot - Slot for the illustrated message and browse control. Hidden automatically when `filled` is true.\n * @slot filled-content - Slot for the uploaded-state content (e.g. an image preview). Shown automatically when `filled` is true; hidden otherwise.\n *\n * @fires swc-dropzone-should-accept - Cancelable event fired on every native `dragover`\n * tick while a drag is over the zone, not just on entry. Cancel to reject the dragged\n * payload and set the cursor to `none`.\n * @fires swc-dropzone-dragover - Fired once when dragged files enter the zone and are\n * accepted; does not repeat on subsequent `dragover` ticks while still hovering.\n * @fires swc-dropzone-dragleave - Fired when an accepted drag leaves the zone after a\n * 100 ms debounce, or immediately when it becomes rejected. Detail is a plain snapshot\n * `{ clientX, clientY, relatedTarget }` captured synchronously from the native event.\n * @fires swc-dropzone-drop - Fired when files are dropped on the zone. `element.dragged`\n * is still `true` when this event fires; it transitions to `false` after dispatch.\n */\nexport abstract class DropzoneBase extends SizedMixin(SpectrumElement, {\n validSizes: DROPZONE_VALID_SIZES,\n}) {\n /**\n * The size of the drop zone.\n *\n * @default m\n */\n declare public size: DropzoneSize;\n\n // ──────────────────────────\n // SHARED API\n // ──────────────────────────\n\n /**\n * Whether files are currently being dragged over the drop zone.\n * Set automatically by the component; also settable to reflect programmatic state.\n *\n * @attr dragged\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n public dragged = false;\n\n /**\n * Whether the drop zone has received a file and is in the filled state.\n * Set by consuming code after a successful drop or browse-file selection to\n * switch the zone to its filled visual.\n *\n * @attr filled\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n public filled = false;\n\n /**\n * The OS drag-cursor feedback shown while a file is held over the zone.\n * Maps directly to `DataTransfer.dropEffect`. Settable via the `drop-effect`\n * attribute, but property changes do not reflect back to the attribute\n * because it controls browser chrome, not component state.\n *\n * @attr drop-effect\n * @type {'copy' | 'move' | 'link' | 'none'}\n * @default 'copy'\n */\n @property({ type: String, attribute: 'drop-effect' })\n public get dropEffect(): DropEffect {\n return this._dropEffect;\n }\n\n public set dropEffect(value: DropEffect | null) {\n // Lit passes `null` here when the `drop-effect` attribute is removed;\n // treat that as \"reset to the default\" rather than an invalid value.\n if (value === null) {\n const oldValue = this._dropEffect;\n this._dropEffect = DROPZONE_DEFAULT_DROP_EFFECT;\n this.requestUpdate('dropEffect', oldValue);\n } else if ((DROP_EFFECTS as readonly string[]).includes(value)) {\n const oldValue = this._dropEffect;\n this._dropEffect = value;\n this.requestUpdate('dropEffect', oldValue);\n } else {\n validateEnum(this, {\n prop: 'drop-effect',\n value,\n valid: DROP_EFFECTS,\n url: 'https://spectrum-web-components.adobe.com/?path=/docs/components-dropzone--docs',\n });\n }\n }\n\n /** @internal */\n private _dropEffect: DropEffect = DROPZONE_DEFAULT_DROP_EFFECT;\n\n // ──────────────────────────\n // IMPLEMENTATION\n // ──────────────────────────\n\n protected constructor() {\n super();\n new DragAndDropController(this, {\n isDragged: () => this.dragged,\n shouldAccept: (event) =>\n this.dispatchEvent(\n new CustomEvent<DragEvent>(SWC_DROPZONE_SHOULD_ACCEPT_EVENT, {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: event,\n })\n ),\n dropEffect: () => this._dropEffect,\n onDragEnter: (event) => {\n this.dragged = true;\n this.dispatchEvent(\n new CustomEvent<DragEvent>(SWC_DROPZONE_DRAGOVER_EVENT, {\n bubbles: true,\n composed: true,\n detail: event,\n })\n );\n },\n onDragLeave: (snapshot) => {\n this.dragged = false;\n this.dispatchEvent(\n new CustomEvent<DropzoneDragLeaveDetail>(\n SWC_DROPZONE_DRAGLEAVE_EVENT,\n {\n bubbles: true,\n composed: true,\n detail: snapshot,\n }\n )\n );\n },\n onDrop: (event) => {\n // Dispatch before clearing `dragged`; `updated()` handles the status region after `filled` settles.\n this.dispatchEvent(\n new CustomEvent<DragEvent>(SWC_DROPZONE_DROP_EVENT, {\n bubbles: true,\n composed: true,\n detail: event,\n })\n );\n this.dragged = false;\n },\n });\n }\n\n /** @internal */\n private readonly _sizePropagation = new SlotAttributePropagationController(\n this,\n {\n attribute: 'size',\n getValue: () => this.size,\n selector: 'swc-illustrated-message',\n }\n );\n\n /** @internal */\n protected handleDefaultSlotChange(): void {\n this._sizePropagation.propagate();\n }\n}\n"],"mappings":";;;;;;;;;AAwDA,IAAsB,IAAtB,cAA2C,EAAW,GAAiB,EACrE,YAAY,GACb,CAAC,CAAC;CA2CD,IACW,aAAyB;AAClC,SAAO,KAAK;;CAGd,IAAW,WAAW,GAA0B;AAG9C,MAAI,MAAU,MAAM;GAClB,IAAM,IAAW,KAAK;AAEtB,GADA,KAAK,cAAc,GACnB,KAAK,cAAc,cAAc,EAAS;aAChC,EAAmC,SAAS,EAAM,EAAE;GAC9D,IAAM,IAAW,KAAK;AAEtB,GADA,KAAK,cAAc,GACnB,KAAK,cAAc,cAAc,EAAS;QAE1C,GAAa,MAAM;GACjB,MAAM;GACN;GACA,OAAO;GACP,KAAK;GACN,CAAC;;CAWN,cAAwB;AAEtB,EADA,OAAO,iBAzDQ,kBAWD,uBAuCkB,2BA0DE,IAAI,EACtC,MACA;GACE,WAAW;GACX,gBAAgB,KAAK;GACrB,UAAU;GACX,CACF,EAzDC,IAAI,EAAsB,MAAM;GAC9B,iBAAiB,KAAK;GACtB,eAAe,MACb,KAAK,cACH,IAAI,YAAuB,GAAkC;IAC3D,SAAS;IACT,YAAY;IACZ,UAAU;IACV,QAAQ;IACT,CAAC,CACH;GACH,kBAAkB,KAAK;GACvB,cAAc,MAAU;AAEtB,IADA,KAAK,UAAU,IACf,KAAK,cACH,IAAI,YAAuB,GAA6B;KACtD,SAAS;KACT,UAAU;KACV,QAAQ;KACT,CAAC,CACH;;GAEH,cAAc,MAAa;AAEzB,IADA,KAAK,UAAU,IACf,KAAK,cACH,IAAI,YACF,GACA;KACE,SAAS;KACT,UAAU;KACV,QAAQ;KACT,CACF,CACF;;GAEH,SAAS,MAAU;AASjB,IAPA,KAAK,cACH,IAAI,YAAuB,GAAyB;KAClD,SAAS;KACT,UAAU;KACV,QAAQ;KACT,CAAC,CACH,EACD,KAAK,UAAU;;GAElB,CAAC;;CAcJ,0BAA0C;AACxC,OAAK,iBAAiB,WAAW;;;GAxHlC,EAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,EAAA,WAAA,WAAA,KAAA,EAAA,KAW1C,EAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,EAAA,WAAA,UAAA,KAAA,EAAA,KAa1C,EAAS;CAAE,MAAM;CAAQ,WAAW;CAAe,CAAC,CAAA,EAAA,EAAA,WAAA,cAAA,KAAA"}
1
+ {"version":3,"file":"Dropzone.base.js","names":[],"sources":["../../../components/dropzone/Dropzone.base.ts"],"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 { property } from 'lit/decorators.js';\n\nimport { SpectrumElement } from '@adobe/spectrum-wc-core/element/index.js';\nimport { SizedMixin } from '@adobe/spectrum-wc-core/mixins/index.js';\nimport { validateEnum } from '@adobe/spectrum-wc-core/utils/index.js';\n\nimport { SlotAttributePropagationController } from '../../controllers/slot-attribute-propagation-controller/index.js';\nimport {\n DROP_EFFECTS,\n type DropEffect,\n DROPZONE_DEFAULT_DROP_EFFECT,\n DROPZONE_VALID_SIZES,\n type DropzoneDragLeaveDetail,\n type DropzoneSize,\n SWC_DROPZONE_DRAGLEAVE_EVENT,\n SWC_DROPZONE_DRAGOVER_EVENT,\n SWC_DROPZONE_DROP_EVENT,\n SWC_DROPZONE_SHOULD_ACCEPT_EVENT,\n} from './Dropzone.types.js';\n\n/**\n * Base class for the `<swc-dropzone>` drop zone component.\n *\n * Encapsulates all drag-and-drop event handling, state management, and\n * validation logic. Rendering, ARIA, and CSS are provided by the concrete\n * SWC subclass.\n *\n * @attribute {DropzoneSize} size - Controls the illustrated icon scale and container dimensions.\n *\n * @slot - Slot for the illustrated message and browse control. Hidden automatically when `filled` is true.\n * @slot filled-content - Slot for the uploaded-state content (e.g. an image preview). Shown automatically when `filled` is true; hidden otherwise.\n *\n * @fires swc-dropzone-should-accept - Cancelable event fired on every native `dragover`\n * tick while a drag is over the zone, not just on entry. Cancel to reject the dragged\n * payload and set the cursor to `none`.\n * @fires swc-dropzone-dragover - Fired once when dragged files enter the zone and are\n * accepted; does not repeat on subsequent `dragover` ticks while still hovering.\n * @fires swc-dropzone-dragleave - Fired when dragged files leave the zone after a 100 ms\n * debounce. Detail is a plain snapshot `{ clientX, clientY, relatedTarget }` captured\n * synchronously from the native event before the timer fires.\n * @fires swc-dropzone-drop - Fired when files are dropped on the zone. `element.dragged`\n * is still `true` when this event fires; it transitions to `false` after dispatch.\n */\nexport abstract class DropzoneBase extends SizedMixin(SpectrumElement, {\n validSizes: DROPZONE_VALID_SIZES,\n}) {\n /**\n * The size of the drop zone.\n *\n * @default m\n */\n declare public size: DropzoneSize;\n\n // ──────────────────────────\n // SHARED API\n // ──────────────────────────\n\n /**\n * Whether files are currently being dragged over the drop zone.\n * Set automatically by the component; also settable to reflect programmatic state.\n *\n * @attr dragged\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n public dragged = false;\n\n /**\n * Whether the drop zone has received a file and is in the filled state.\n * Set by consuming code after a successful drop or browse-file selection to\n * switch the zone to its filled visual.\n *\n * @attr filled\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n public filled = false;\n\n /**\n * The OS drag-cursor feedback shown while a file is held over the zone.\n * Maps directly to `DataTransfer.dropEffect`. Settable via the `drop-effect`\n * attribute, but property changes do not reflect back to the attribute\n * because it controls browser chrome, not component state.\n *\n * @attr drop-effect\n * @type {'copy' | 'move' | 'link' | 'none'}\n * @default 'copy'\n */\n @property({ type: String, attribute: 'drop-effect' })\n public get dropEffect(): DropEffect {\n return this._dropEffect;\n }\n\n public set dropEffect(value: DropEffect | null) {\n // Lit passes `null` here when the `drop-effect` attribute is removed;\n // treat that as \"reset to the default\" rather than an invalid value.\n if (value === null) {\n const oldValue = this._dropEffect;\n this._dropEffect = DROPZONE_DEFAULT_DROP_EFFECT;\n this.requestUpdate('dropEffect', oldValue);\n } else if ((DROP_EFFECTS as readonly string[]).includes(value)) {\n const oldValue = this._dropEffect;\n this._dropEffect = value;\n this.requestUpdate('dropEffect', oldValue);\n } else {\n validateEnum(this, {\n prop: 'drop-effect',\n value,\n valid: DROP_EFFECTS,\n url: 'https://spectrum-web-components.adobe.com/?path=/docs/components-dropzone--docs',\n });\n }\n }\n\n /** @internal */\n private _dropEffect: DropEffect = DROPZONE_DEFAULT_DROP_EFFECT;\n\n // ──────────────────────────\n // IMPLEMENTATION\n // ──────────────────────────\n\n /** @internal */\n private readonly _sizePropagation = new SlotAttributePropagationController(\n this,\n {\n attribute: 'size',\n getValue: () => this.size,\n selector: 'swc-illustrated-message',\n }\n );\n\n /** @internal */\n protected handleDefaultSlotChange(): void {\n this._sizePropagation.propagate();\n }\n\n /**\n * @internal\n *\n * Timer ID for debounced dragleave; prevents flickering on child drag events.\n */\n private _dragLeaveTimer: ReturnType<typeof setTimeout> | null = null;\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('drop', this._onDrop);\n this.addEventListener('dragover', this._onDragOver);\n this.addEventListener('dragleave', this._onDragLeave);\n }\n\n public override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('drop', this._onDrop);\n this.removeEventListener('dragover', this._onDragOver);\n this.removeEventListener('dragleave', this._onDragLeave);\n this._clearDragLeaveTimer();\n }\n\n /** @internal */\n private readonly _onDragOver = (event: DragEvent): void => {\n event.preventDefault();\n\n if (!event.dataTransfer) {\n return;\n }\n\n const shouldAcceptEvent = new CustomEvent<DragEvent>(\n SWC_DROPZONE_SHOULD_ACCEPT_EVENT,\n {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: event,\n }\n );\n\n const accepted = this.dispatchEvent(shouldAcceptEvent);\n\n if (!accepted) {\n event.dataTransfer.dropEffect = 'none';\n return;\n }\n\n this._clearDragLeaveTimer();\n event.dataTransfer.dropEffect = this._dropEffect;\n\n // `should-accept` above re-fires on every native `dragover` tick (a\n // browser requirement: `dropEffect` must be reasserted on each one), but\n // `dragged` only actually changes once per hover session, so this\n // informational event fires on entry only, not on every tick.\n if (!this.dragged) {\n this.dragged = true;\n\n this.dispatchEvent(\n new CustomEvent<DragEvent>(SWC_DROPZONE_DRAGOVER_EVENT, {\n bubbles: true,\n composed: true,\n detail: event,\n })\n );\n }\n };\n\n /** @internal */\n private readonly _onDragLeave = (event: DragEvent): void => {\n if (event.relatedTarget && this.contains(event.relatedTarget as Node)) {\n return;\n }\n\n this._clearDragLeaveTimer();\n\n // Capture values synchronously; browsers recycle DragEvent objects after\n // the synchronous handler returns, so reading them inside setTimeout is unsafe.\n const { clientX, clientY, relatedTarget } = event;\n\n this._dragLeaveTimer = setTimeout(() => {\n this._dragLeaveTimer = null;\n this.dragged = false;\n\n this.dispatchEvent(\n new CustomEvent<DropzoneDragLeaveDetail>(SWC_DROPZONE_DRAGLEAVE_EVENT, {\n bubbles: true,\n composed: true,\n detail: { clientX, clientY, relatedTarget },\n })\n );\n }, 100);\n };\n\n /** @internal */\n private readonly _onDrop = (event: DragEvent): void => {\n event.preventDefault();\n\n if (!this.dragged) {\n return;\n }\n\n this._clearDragLeaveTimer();\n // Dispatch before clearing `dragged`; `updated()` handles the status region after `filled` settles.\n this.dispatchEvent(\n new CustomEvent<DragEvent>(SWC_DROPZONE_DROP_EVENT, {\n bubbles: true,\n composed: true,\n detail: event,\n })\n );\n this.dragged = false;\n };\n\n /** @internal */\n private _clearDragLeaveTimer(): void {\n if (this._dragLeaveTimer !== null) {\n clearTimeout(this._dragLeaveTimer);\n this._dragLeaveTimer = null;\n }\n }\n}\n"],"mappings":";;;;;;;;AAuDA,IAAsB,IAAtB,cAA2C,EAAW,GAAiB,EACrE,YAAY,GACb,CAAC,CAAC;;8BAoBgB,kBAWD,uBAuCkB,2BAOE,IAAI,EACtC,MACA;GACE,WAAW;GACX,gBAAgB,KAAK;GACrB,UAAU;GACX,CACF,yBAY+D,0BAkBhC,MAA2B;AAGzD,OAFA,EAAM,gBAAgB,EAElB,CAAC,EAAM,aACT;GAGF,IAAM,IAAoB,IAAI,YAC5B,GACA;IACE,SAAS;IACT,YAAY;IACZ,UAAU;IACV,QAAQ;IACT,CACF;AAID,OAAI,CAFa,KAAK,cAAc,EAAkB,EAEvC;AACb,MAAM,aAAa,aAAa;AAChC;;AAUF,GAPA,KAAK,sBAAsB,EAC3B,EAAM,aAAa,aAAa,KAAK,aAMhC,KAAK,YACR,KAAK,UAAU,IAEf,KAAK,cACH,IAAI,YAAuB,GAA6B;IACtD,SAAS;IACT,UAAU;IACV,QAAQ;IACT,CAAC,CACH;0BAK4B,MAA2B;AAC1D,OAAI,EAAM,iBAAiB,KAAK,SAAS,EAAM,cAAsB,CACnE;AAGF,QAAK,sBAAsB;GAI3B,IAAM,EAAE,YAAS,YAAS,qBAAkB;AAE5C,QAAK,kBAAkB,iBAAiB;AAItC,IAHA,KAAK,kBAAkB,MACvB,KAAK,UAAU,IAEf,KAAK,cACH,IAAI,YAAqC,GAA8B;KACrE,SAAS;KACT,UAAU;KACV,QAAQ;MAAE;MAAS;MAAS;MAAe;KAC5C,CAAC,CACH;MACA,IAAI;qBAImB,MAA2B;AACrD,KAAM,gBAAgB,EAEjB,KAAK,YAIV,KAAK,sBAAsB,EAE3B,KAAK,cACH,IAAI,YAAuB,GAAyB;IAClD,SAAS;IACT,UAAU;IACV,QAAQ;IACT,CAAC,CACH,EACD,KAAK,UAAU;;;CA9JjB,IACW,aAAyB;AAClC,SAAO,KAAK;;CAGd,IAAW,WAAW,GAA0B;AAG9C,MAAI,MAAU,MAAM;GAClB,IAAM,IAAW,KAAK;AAEtB,GADA,KAAK,cAAc,GACnB,KAAK,cAAc,cAAc,EAAS;aAChC,EAAmC,SAAS,EAAM,EAAE;GAC9D,IAAM,IAAW,KAAK;AAEtB,GADA,KAAK,cAAc,GACnB,KAAK,cAAc,cAAc,EAAS;QAE1C,GAAa,MAAM;GACjB,MAAM;GACN;GACA,OAAO;GACP,KAAK;GACN,CAAC;;CAsBN,0BAA0C;AACxC,OAAK,iBAAiB,WAAW;;CAUnC,oBAA0C;AAIxC,EAHA,MAAM,mBAAmB,EACzB,KAAK,iBAAiB,QAAQ,KAAK,QAAQ,EAC3C,KAAK,iBAAiB,YAAY,KAAK,YAAY,EACnD,KAAK,iBAAiB,aAAa,KAAK,aAAa;;CAGvD,uBAA6C;AAK3C,EAJA,MAAM,sBAAsB,EAC5B,KAAK,oBAAoB,QAAQ,KAAK,QAAQ,EAC9C,KAAK,oBAAoB,YAAY,KAAK,YAAY,EACtD,KAAK,oBAAoB,aAAa,KAAK,aAAa,EACxD,KAAK,sBAAsB;;CA+F7B,uBAAqC;AACnC,EAAI,KAAK,oBAAoB,SAC3B,aAAa,KAAK,gBAAgB,EAClC,KAAK,kBAAkB;;;GA7L1B,EAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,EAAA,WAAA,WAAA,KAAA,EAAA,KAW1C,EAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,EAAA,WAAA,UAAA,KAAA,EAAA,KAa1C,EAAS;CAAE,MAAM;CAAQ,WAAW;CAAe,CAAC,CAAA,EAAA,EAAA,WAAA,cAAA,KAAA"}
@@ -19,7 +19,7 @@ export declare const DROPZONE_DEFAULT_DROP_EFFECT: "copy";
19
19
  export declare const SWC_DROPZONE_SHOULD_ACCEPT_EVENT = "swc-dropzone-should-accept";
20
20
  /** Fired when files are dragged over the drop zone and accepted. */
21
21
  export declare const SWC_DROPZONE_DRAGOVER_EVENT = "swc-dropzone-dragover";
22
- /** Fired when an accepted drag leaves the drop zone or becomes rejected. */
22
+ /** Fired when dragged files leave the drop zone without being dropped. */
23
23
  export declare const SWC_DROPZONE_DRAGLEAVE_EVENT = "swc-dropzone-dragleave";
24
24
  /** Fired when files are dropped on the drop zone. */
25
25
  export declare const SWC_DROPZONE_DROP_EVENT = "swc-dropzone-drop";
@@ -1 +1 @@
1
- {"version":3,"file":"Dropzone.types.js","names":[],"sources":["../../../components/dropzone/Dropzone.types.ts"],"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\n// ──────────────────\n// SIZES\n// ──────────────────\n\nexport type DropzoneSize = 's' | 'm' | 'l';\n\nexport const DROPZONE_VALID_SIZES = [\n 's',\n 'm',\n 'l',\n] as const satisfies readonly DropzoneSize[];\n\n// ──────────────────\n// DROP EFFECT\n// ──────────────────\n\n/** Valid OS drag-cursor feedback values for the drop zone. */\nexport type DropEffect = 'copy' | 'move' | 'link' | 'none';\n\nexport const DROP_EFFECTS = [\n 'copy',\n 'move',\n 'link',\n 'none',\n] as const satisfies readonly DropEffect[];\n\nexport const DROPZONE_DEFAULT_DROP_EFFECT =\n 'copy' as const satisfies DropEffect;\n\n// ──────────────────\n// EVENTS\n// ──────────────────\n\n/** Fired when files are dragged over the drop zone; cancelable to reject. */\nexport const SWC_DROPZONE_SHOULD_ACCEPT_EVENT = 'swc-dropzone-should-accept';\n\n/** Fired when files are dragged over the drop zone and accepted. */\nexport const SWC_DROPZONE_DRAGOVER_EVENT = 'swc-dropzone-dragover';\n\n/** Fired when an accepted drag leaves the drop zone or becomes rejected. */\nexport const SWC_DROPZONE_DRAGLEAVE_EVENT = 'swc-dropzone-dragleave';\n\n/** Fired when files are dropped on the drop zone. */\nexport const SWC_DROPZONE_DROP_EVENT = 'swc-dropzone-drop';\n\n/**\n * Detail emitted with `swc-dropzone-dragleave`. Values are captured synchronously\n * from the native `DragEvent` before the 100 ms debounce timer fires, preventing\n * stale reads from a recycled event object.\n */\nexport interface DropzoneDragLeaveDetail {\n clientX: number;\n clientY: number;\n relatedTarget: EventTarget | null;\n}\n\ndeclare global {\n interface GlobalEventHandlersEventMap {\n [SWC_DROPZONE_SHOULD_ACCEPT_EVENT]: CustomEvent<DragEvent>;\n [SWC_DROPZONE_DRAGOVER_EVENT]: CustomEvent<DragEvent>;\n [SWC_DROPZONE_DRAGLEAVE_EVENT]: CustomEvent<DropzoneDragLeaveDetail>;\n [SWC_DROPZONE_DROP_EVENT]: CustomEvent<DragEvent>;\n }\n}\n"],"mappings":";AAkBA,IAAa,IAAuB;CAClC;CACA;CACA;CACD,EASY,IAAe;CAC1B;CACA;CACA;CACA;CACD,EAEY,IACX,QAOW,IAAmC,8BAGnC,IAA8B,yBAG9B,IAA+B,0BAG/B,IAA0B"}
1
+ {"version":3,"file":"Dropzone.types.js","names":[],"sources":["../../../components/dropzone/Dropzone.types.ts"],"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\n// ──────────────────\n// SIZES\n// ──────────────────\n\nexport type DropzoneSize = 's' | 'm' | 'l';\n\nexport const DROPZONE_VALID_SIZES = [\n 's',\n 'm',\n 'l',\n] as const satisfies readonly DropzoneSize[];\n\n// ──────────────────\n// DROP EFFECT\n// ──────────────────\n\n/** Valid OS drag-cursor feedback values for the drop zone. */\nexport type DropEffect = 'copy' | 'move' | 'link' | 'none';\n\nexport const DROP_EFFECTS = [\n 'copy',\n 'move',\n 'link',\n 'none',\n] as const satisfies readonly DropEffect[];\n\nexport const DROPZONE_DEFAULT_DROP_EFFECT =\n 'copy' as const satisfies DropEffect;\n\n// ──────────────────\n// EVENTS\n// ──────────────────\n\n/** Fired when files are dragged over the drop zone; cancelable to reject. */\nexport const SWC_DROPZONE_SHOULD_ACCEPT_EVENT = 'swc-dropzone-should-accept';\n\n/** Fired when files are dragged over the drop zone and accepted. */\nexport const SWC_DROPZONE_DRAGOVER_EVENT = 'swc-dropzone-dragover';\n\n/** Fired when dragged files leave the drop zone without being dropped. */\nexport const SWC_DROPZONE_DRAGLEAVE_EVENT = 'swc-dropzone-dragleave';\n\n/** Fired when files are dropped on the drop zone. */\nexport const SWC_DROPZONE_DROP_EVENT = 'swc-dropzone-drop';\n\n/**\n * Detail emitted with `swc-dropzone-dragleave`. Values are captured synchronously\n * from the native `DragEvent` before the 100 ms debounce timer fires, preventing\n * stale reads from a recycled event object.\n */\nexport interface DropzoneDragLeaveDetail {\n clientX: number;\n clientY: number;\n relatedTarget: EventTarget | null;\n}\n\ndeclare global {\n interface GlobalEventHandlersEventMap {\n [SWC_DROPZONE_SHOULD_ACCEPT_EVENT]: CustomEvent<DragEvent>;\n [SWC_DROPZONE_DRAGOVER_EVENT]: CustomEvent<DragEvent>;\n [SWC_DROPZONE_DRAGLEAVE_EVENT]: CustomEvent<DropzoneDragLeaveDetail>;\n [SWC_DROPZONE_DROP_EVENT]: CustomEvent<DragEvent>;\n }\n}\n"],"mappings":";AAkBA,IAAa,IAAuB;CAClC;CACA;CACA;CACD,EASY,IAAe;CAC1B;CACA;CACA;CACA;CACD,EAEY,IACX,QAOW,IAAmC,8BAGnC,IAA8B,yBAG9B,IAA+B,0BAG/B,IAA0B"}
@@ -13,7 +13,6 @@
13
13
  * Public exports for Lit reactive controllers shared across 2nd-gen packages.
14
14
  */
15
15
  export { ColorController, type Color, type ColorTypes, } from './color-controller/index.js';
16
- export { DragAndDropController, type DragAndDropControllerOptions, type DragLeaveSnapshot, } from './drag-and-drop-controller/index.js';
17
16
  export { focusgroupNavigationActiveChange, FocusgroupNavigationController, type FocusgroupActiveChangeSource, type FocusgroupDirection, type FocusgroupNavigationActiveChangeDetail, type FocusgroupNavigationOptions, } from './focusgroup-navigation-controller/index.js';
18
17
  export { LiveSelectionController, type LiveSelectionMode, type LiveSelectionOptions, } from './live-selection-controller/index.js';
19
18
  export { HoverController, type HoverControllerHost, type HoverControllerOptions, } from './hover-controller/index.js';
@@ -1,18 +1,17 @@
1
1
  import { SlotAttributePropagationController as e } from "./slot-attribute-propagation-controller/src/slot-attribute-propagation-controller.js";
2
2
  import { SlotTextController as t } from "./slot-text-controller/src/slot-text-controller.js";
3
- import { DragAndDropController as n } from "./drag-and-drop-controller/src/drag-and-drop-controller.js";
4
- import { HoverController as r } from "./hover-controller/src/hover-controller.js";
5
- import { fromFloatingPlacement as i, toFloatingPlacement as a } from "./placement-controller/src/placement-conversion.js";
6
- import { ALL_PLACEMENTS as o } from "./placement-controller/src/types.js";
7
- import { PlacementController as s } from "./placement-controller/src/placement-controller.js";
3
+ import { HoverController as n } from "./hover-controller/src/hover-controller.js";
4
+ import { fromFloatingPlacement as r, toFloatingPlacement as i } from "./placement-controller/src/placement-conversion.js";
5
+ import { ALL_PLACEMENTS as a } from "./placement-controller/src/types.js";
6
+ import { PlacementController as o } from "./placement-controller/src/placement-controller.js";
8
7
  import "./placement-controller/index.js";
9
- import { LanguageResolutionController as c, languageResolverUpdatedSymbol as l } from "./language-resolution.js";
10
- import { SlotPresenceController as u } from "./slot-presence-controller/src/slot-presence-controller.js";
11
- import { PendingController as d } from "./pending-controller/src/pending-controller.js";
8
+ import { LanguageResolutionController as s, languageResolverUpdatedSymbol as c } from "./language-resolution.js";
9
+ import { SlotPresenceController as l } from "./slot-presence-controller/src/slot-presence-controller.js";
10
+ import { PendingController as u } from "./pending-controller/src/pending-controller.js";
12
11
  import "./pending-controller/index.js";
13
- import { ColorController as f } from "./color-controller/src/color-controller.js";
12
+ import { ColorController as d } from "./color-controller/src/color-controller.js";
14
13
  import "./color-controller/index.js";
15
- import { FocusgroupNavigationController as p, focusgroupNavigationActiveChange as m } from "./focusgroup-navigation-controller/src/focusgroup-navigation-controller.js";
16
- import { LiveSelectionController as h } from "./live-selection-controller/src/live-selection-controller.js";
17
- import { PageScrollLockController as g } from "./page-scroll-lock-controller/src/page-scroll-lock.js";
18
- export { o as ALL_PLACEMENTS, f as ColorController, n as DragAndDropController, p as FocusgroupNavigationController, r as HoverController, c as LanguageResolutionController, h as LiveSelectionController, g as PageScrollLockController, d as PendingController, s as PlacementController, e as SlotAttributePropagationController, u as SlotPresenceController, t as SlotTextController, m as focusgroupNavigationActiveChange, i as fromFloatingPlacement, l as languageResolverUpdatedSymbol, a as toFloatingPlacement };
14
+ import { FocusgroupNavigationController as f, focusgroupNavigationActiveChange as p } from "./focusgroup-navigation-controller/src/focusgroup-navigation-controller.js";
15
+ import { LiveSelectionController as m } from "./live-selection-controller/src/live-selection-controller.js";
16
+ import { PageScrollLockController as h } from "./page-scroll-lock-controller/src/page-scroll-lock.js";
17
+ export { a as ALL_PLACEMENTS, d as ColorController, f as FocusgroupNavigationController, n as HoverController, s as LanguageResolutionController, m as LiveSelectionController, h as PageScrollLockController, u as PendingController, o as PlacementController, e as SlotAttributePropagationController, l as SlotPresenceController, t as SlotTextController, p as focusgroupNavigationActiveChange, r as fromFloatingPlacement, c as languageResolverUpdatedSymbol, i as toFloatingPlacement };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adobe/spectrum-wc-core",
3
- "version": "2.0.0-beta.3",
3
+ "version": "2.0.0-next.20260901142816",
4
4
  "description": "Abstract base classes for Spectrum Web Components",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Adobe",
@@ -147,10 +147,6 @@
147
147
  "types": "./dist/controllers/color-controller/index.d.ts",
148
148
  "import": "./dist/controllers/color-controller/index.js"
149
149
  },
150
- "./controllers/drag-and-drop-controller.js": {
151
- "types": "./dist/controllers/drag-and-drop-controller/index.d.ts",
152
- "import": "./dist/controllers/drag-and-drop-controller/index.js"
153
- },
154
150
  "./controllers/focus-group-navigation-controller.js": {
155
151
  "types": "./dist/controllers/focus-group-navigation-controller/focus-group-navigation-controller.d.ts",
156
152
  "import": "./dist/controllers/focus-group-navigation-controller/focus-group-navigation-controller.js"
@@ -387,9 +383,6 @@
387
383
  "controllers/color-controller.js": [
388
384
  "dist/controllers/color-controller/index.d.ts"
389
385
  ],
390
- "controllers/drag-and-drop-controller.js": [
391
- "dist/controllers/drag-and-drop-controller/index.d.ts"
392
- ],
393
386
  "controllers/focus-group-navigation-controller/focus-group-navigation-controller.js": [
394
387
  "dist/controllers/focus-group-navigation-controller/focus-group-navigation-controller.d.ts"
395
388
  ],
@@ -513,4 +506,4 @@
513
506
  "publishConfig": {
514
507
  "access": "public"
515
508
  }
516
- }
509
+ }
package/CHANGELOG.md DELETED
@@ -1,191 +0,0 @@
1
- # @spectrum-web-components/core
2
-
3
- ## 2.0.0-beta.3
4
-
5
- ### Minor Changes
6
-
7
- - [#6444](https://github.com/adobe/spectrum-web-components/pull/6444) [`2b26e0b`](https://github.com/adobe/spectrum-web-components/commit/2b26e0b3b6e25d4852e9984472737bd3caa2dfae) Thanks [@rise-erpelding](https://github.com/rise-erpelding)! - Add the 2nd-gen `<swc-action-group>` file structure, API, accessibility semantics, and Spectrum 2 styling, migrated from the Spectrum 1 `<sp-action-group>`.
8
- - **API**: `accessible-label`, `disabled`, `orientation` (`horizontal` / `vertical`), `compact`, `quiet`, `justified`, `size`, `static-color`; children are collected via the default slot (`swc-action-button` / `swc-action-menu`).
9
- - **Accessibility**: host always `role="group"` (never `toolbar` or `radiogroup`); `accessible-label` reflects to `aria-label`; no `aria-orientation` on the host in either layout, matching `swc-button-group`; group `disabled` sets `aria-disabled="true"` on the host and propagates `aria-disabled` (not native `disabled`) to all children so they remain keyboard-reachable and discoverable per [APG: Focusability of disabled controls](https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/#focusabilityofdisabledcontrols); `FocusgroupNavigationController` wired with `skipDisabled: false` so `aria-disabled` children stay in the arrow-key sequence. A focused child's focus ring is no longer hidden behind an adjacent child's border in `compact` mode.
10
- - **Styling**: full Spectrum 2 token-based CSS — sizes `xs`–`xl`, `orientation`, `justified` (equal-width children), and `compact` (shared-border join with correct corner rounding at the strip's outer edges only, in both orientations); `compact` has no visual effect when `quiet` is also set. Exposes `--swc-action-group-gap` for overriding the spacing between children. `vertical` orientation groups shrink-to-fit the longest child's label by default and stretch to fill an ancestor-imposed width when present (for example, multiple `swc-action-group` elements sharing a toolbar wrapper), so all children and sibling groups end up the same width without an explicit `inline-size`.
11
- - **`ButtonBase` (core)**: click activation is now suppressed for any button whose host carries `aria-disabled="true"`, matching the existing suppression for `disabled` and `pending`. This is shared behavior for every `ButtonBase` subclass, not just `swc-action-button`.
12
- - **`swc-action-button`**: added disabled-appearance CSS for the externally-set `aria-disabled` case (e.g. when disabled via a parent `swc-action-group`), including forced-colors system-color overrides. Exposes four logical corner-radius custom properties (`--swc-action-button-border-start-start-radius`, `-start-end-radius`, `-end-start-radius`, `-end-end-radius`), each falling back to the existing `--swc-action-button-border-radius`, so a parent `swc-action-group` can override individual corners in `compact` mode without affecting standalone usage. The button's `inline-size: 100%` (needed so it fills a stretched vertical `swc-action-group` parent) is excluded from the generated global stylesheet, so consumers using global action-button classes outside a component context are not forced full-width.
13
- - **1st-gen `sp-action-group`**: added `@deprecated` JSDoc to `vertical`, `selects`, `selected`, and `emphasized`, plus a runtime `window.__swc.warn()` deprecation notice on the `selected` setter, ahead of removal in 2nd-gen.
14
-
15
- - [#6644](https://github.com/adobe/spectrum-web-components/pull/6644) [`346746c`](https://github.com/adobe/spectrum-web-components/commit/346746cacd405fa1cd58b7fae3f164457968dec7) Thanks [@TarunAdobe](https://github.com/TarunAdobe)! - **feat(prompt-field):** Accept file drops anywhere over `swc-prompt-field` with a high-intensity solid-fill drop target and blue focus ring. The new `DragAndDropController` is exported for reuse by other components.
16
-
17
- - [#6555](https://github.com/adobe/spectrum-web-components/pull/6555) [`3110850`](https://github.com/adobe/spectrum-web-components/commit/31108509505dcaf485e4d2582074ea5fa8189922) Thanks [@5t3ph](https://github.com/5t3ph)! - Add the 2nd-gen `<swc-card>`, the Spectrum 2 successor to `<sp-card>`.
18
- - **API**: `variant` (`primary`/`secondary`/`tertiary`/`quiet`), `size` (`xs`–`xl`), `density`, and the `title-as-link` and `selectable` attributes. Content is slot-only (`preview`, `collection`, `media`, `title`, `actions`, `description`, default, `footer`); regular, collection, and gallery layouts are driven by slot presence. `selectable` dispatches `swc-card-click`.
19
- - **Accessibility**: whole-card linking uses a consumer `<a>` in the `title` slot (Card takes no `href`); `selectable` makes the card focusable without setting an ARIA role; nested controls keep their own activation.
20
- - **Styling**: shared CSS Grid layout with the `--swc-card-*` custom-property surface.
21
- - **Core**: `CardBase` and the shared `renderCardTemplate` gain the card behavior and the `collection`/`media`/glyph rendering hooks.
22
-
23
- `<swc-user-card>` and `<swc-product-card>` are not part of this release.
24
-
25
- - [#6508](https://github.com/adobe/spectrum-web-components/pull/6508) [`d429a49`](https://github.com/adobe/spectrum-web-components/commit/d429a4991a51339b5325f726bd39d0d3c4ef447e) Thanks [@rubencarvalho](https://github.com/rubencarvalho)! - **feat(dev-validation):** Added reusable dev-mode validation helpers (`validateEnum`, `warnIf`, `validateRequiredSlot`, `validateAllowedChildren`) in `@adobe/spectrum-wc-core/utils`, and fixed `window.__swc.warn`'s dedup key so two distinct warnings on the same component no longer suppress each other.
26
-
27
- Component authors should use these helpers instead of hand-rolled `includes()` + `window.__swc.warn()` checks for union/enum values, required and conditionally required properties, mutually exclusive/no-effect combinations, required slots, and allowed slotted children. See the "Reusable validation helpers" and "Slot validation" sections of the [Debug and validation style guide](https://github.com/adobe/spectrum-web-components/blob/main/CONTRIBUTOR-DOCS/02_style-guide/02_typescript/17_debug-validation.md).
28
-
29
- - [#6437](https://github.com/adobe/spectrum-web-components/pull/6437) [`afe0beb`](https://github.com/adobe/spectrum-web-components/commit/afe0beb9e487d3f2838bb1ec7e98f131f53606af) Thanks [@cdransf](https://github.com/cdransf)! - Add the 2nd-gen `<swc-dropzone>`, migrated from the Spectrum 1 `<sp-dropzone>`.
30
- - **API**: `dropEffect`, `dragged`, `filled`, `size` (new), and localizable `dragged-message`/`filled-message`/`replace-message` status text. Renames `isDragged`/`isFilled` to `dragged`/`filled` and events to the `swc-dropzone-*` prefix; adds a dedicated `filled-content` slot instead of restyling the default slot in place.
31
- - **Accessibility**: fixed `role="group"` host requiring an accessible name, a visually-hidden `role="status"` region announcing drag and drop state changes, and no host `tabindex` (the slotted browse control owns the tab stop).
32
- - **Styling**: SVG stroke border matching Spectrum 2's dashed-corner treatment, three sizes, and a small `--swc-dropzone-*` custom-property surface.
33
- - **Docs and tests**: includes Storybook docs, a consumer migration guide, unit and accessibility tests, and dedicated VRT coverage.
34
-
35
- **fix(illustrated-message):** `<swc-illustrated-message>`'s default slot is now reactive to content added after first render. It previously only re-evaluated on `characterData` mutations, missing element insertions such as a dynamically added illustration.
36
-
37
- 1st-gen `<sp-dropzone>` gains `@deprecated` JSDoc for `isDragged`/`isFilled`, `onDragOver`/`onDragLeave`/`onDrop`, and the removed `DropzoneEventDetail` type, plus matching development-mode console warnings for the upcoming `swc-dropzone-*` event rename and overriding the drag handler methods. `isDragged`/`isFilled` have no runtime warning: both attributes (`dragged`/`filled`) are unchanged and still valid, so Lit's attribute-to-property sync and (for `isDragged`) the component's own internal drag handling route through the same reactive properties a consumer's JS assignment would use, and a warning there would fire for ordinary, unmigrated attribute/template-binding usage the migration plan explicitly promises is unaffected.
38
-
39
- - [#6563](https://github.com/adobe/spectrum-web-components/pull/6563) [`74a0c56`](https://github.com/adobe/spectrum-web-components/commit/74a0c56e25be120309a40c540ad750b7f1081f4b) Thanks [@Rajdeepc](https://github.com/Rajdeepc)! - Add the 2nd-gen `<swc-infield-button>`, the Spectrum 2 net-new icon button for form fields.
40
- - **API**: `accessible-label` (required, maps to `aria-label` on the inner `<button>`), `size` (`s`/`m`/`l`/`xl`), `quiet`, and `disabled`. Does not inherit the 1st-gen link attributes (`href`, `target`, etc.) or position attributes (`block`, `inline`). Accepts icon content via the named `icon` slot.
41
- - **Accessibility**: button is set to `tabindex="-1"` (not in the tab order); the parent field owns keyboard behavior and the visible focus ring. Missing `accessible-label` fires a dev-mode console warning.
42
- - **Styling**: `--swc-infield-button-*` custom-property surface covering background-color and icon-color per interactive state. Quiet treatment removes the background.
43
- - **Docs and tests**: includes Storybook docs, a consumer migration guide, unit and Playwright accessibility tests.
44
-
45
- - [#6522](https://github.com/adobe/spectrum-web-components/pull/6522) [`735a6df`](https://github.com/adobe/spectrum-web-components/commit/735a6dfbd16767af716c5b3fe9a89b09714874a4) Thanks [@caseyisonit](https://github.com/caseyisonit)! - **refactor(core):** Replace the `ObserveSlotPresence` and `ObserveSlotText` mixins with reactive controllers, following the mixin-composition guidance to prefer controllers over deep mixin chains.
46
- - **`@adobe/spectrum-wc-core`**: adds `SlotPresenceController` (`/controllers/slot-presence-controller`), which tracks whether slotted content matching one or more CSS selectors is present in the light DOM, and `SlotTextController` (`/controllers/slot-text-controller`), which tracks whether a slot has meaningful text or element content. Both are documented in the Controllers section of Storybook with stories and tests. The `ObserveSlotPresence` and `ObserveSlotText` mixins and their subpath exports (`/mixins/observe-slot-presence.js`, `/mixins/observe-slot-text.js`) are **removed**; consumers should construct the corresponding controller instead. `SlotTextController` requires binding `handleSlotChange` to the observed slot's `@slotchange` event.
47
- - **`@adobe/spectrum-wc`**: `swc-badge`, `swc-button` (and its subclasses), `swc-accordion-item`, and the linear-progress components (`swc-progress-bar`, `swc-meter`) now derive their icon/label/actions/slot state from these controllers. No public API or behavioral change — the controllers reproduce the mixins' behavior.
48
-
49
- - [#6523](https://github.com/adobe/spectrum-web-components/pull/6523) [`86f40a1`](https://github.com/adobe/spectrum-web-components/commit/86f40a1e0bc46d74c796e712f47d3428e0e4c7e5) Thanks [@caseyisonit](https://github.com/caseyisonit)! - **refactor(core):** Leaned out `SpectrumElement`.
50
- - Removed `hasVisibleFocusInTree()` from `SpectrumMixin` / `SpectrumInterface`. The same behavior is now the standalone `isFocusVisibleInTree(root)` utility exported from `@adobe/spectrum-wc-core/utils`. Call `isFocusVisibleInTree(this.getRootNode() as Document | ShadowRoot)` where a component previously used `this.hasVisibleFocusInTree()`.
51
- - Removed the `get dir()` override from `SpectrumElement`; `element.dir` now resolves to the standard DOM attribute instead of the computed direction. No 2nd-gen component read this property (2nd-gen resolves direction via `getComputedStyle(...).direction` at each call site).
52
- - Removed the `SpectrumMixin` and `SpectrumInterface` exports. With `hasVisibleFocusInTree` gone, the mixin only re-typed `shadowRoot` as non-null, which nothing relied on (all reads use `?.`). `SpectrumElement` now extends `LitElement` directly, and `shadowRoot` is `ShadowRoot | null` again as in Lit.
53
-
54
- - [#6552](https://github.com/adobe/spectrum-web-components/pull/6552) [`bd6c017`](https://github.com/adobe/spectrum-web-components/commit/bd6c017708de0b362c0504ad8b28a7f37a3b17da) Thanks [@caseyisonit](https://github.com/caseyisonit)! - Add the internal 2nd-gen UI icon system: the `<swc-ui-icon>` element plus a build-time generator for the S2 UI icon set.
55
- - **`<swc-ui-icon>`** (internal): `icon` selects the icon-set, `size` selects the matching optical step, and `accessible-label` drives host-owned accessibility; renders generated Lit templates with no `unsafeSVG` in consuming components.
56
- - **Generator** (`yarn generate:ui-icons`): converts downloaded A4U source SVGs into per-logical-icon template bundles under `components/ui-icons/icon-set/`, rewriting fills to `var(--swc-icon-color, currentColor)`.
57
- - **`IconBase`**: refactored to a behavior-only base (`size` + `accessible-label` + host-owned accessibility, with no render or styles); the `<swc-icon>` frame and `<swc-ui-icon>` both extend it and share `stylesheets/_lit-styles/icon-base.css`. The frame uses `accessible-label` for host-owned accessibility (`role="img"` plus `aria-label` when labeled, `aria-hidden` when decorative).
58
-
59
- ### Patch Changes
60
-
61
- - [#6587](https://github.com/adobe/spectrum-web-components/pull/6587) [`4a30997`](https://github.com/adobe/spectrum-web-components/commit/4a309978f86b9d050cb54ed03db7418e40cb464a) Thanks [@rubencarvalho](https://github.com/rubencarvalho)! - **fix(slot-text-controller):** `SlotTextController` no longer counts comment nodes as label content. A `${cond ? nothing : label}` binding leaves a Lit child-part marker (a comment node with non-empty data) in the default slot; its data was previously misread as label text during the controller's initial `host.childNodes` scan.
62
-
63
- For a consumer whose default slot does not bind `@slotchange` (for example an icon-only `<swc-action-button>` with a conditional label), this made `hasContent` stay `true`, so the icon-only presentation was never applied. Only real text nodes now count.
64
-
65
- - [#6594](https://github.com/adobe/spectrum-web-components/pull/6594) [`9b9695a`](https://github.com/adobe/spectrum-web-components/commit/9b9695a1e157ac300234d56882a4923d81dbf724) Thanks [@rubencarvalho](https://github.com/rubencarvalho)! - Fix `swc-popover` scrolling the page when closing a light-dismiss popover whose trigger has been scrolled out of view. On close, focus is restored to the trigger with `preventScroll` so the browser no longer scrolls the off-screen trigger back into view. This surfaced on touch devices (e.g. iPad), where tapping outside on non-interactive content does not blur the popover, so focus is still inside when it closes and restoration runs.
66
-
67
- - [#6595](https://github.com/adobe/spectrum-web-components/pull/6595) [`1f85e54`](https://github.com/adobe/spectrum-web-components/commit/1f85e545d6cf3cff80888995f3184fbaea7fd154) Thanks [@rubencarvalho](https://github.com/rubencarvalho)! - Tooltip now uses `popover="manual"` instead of `popover="auto"`. Opening a tooltip on hover no longer light-dismisses an open `<swc-popover>` (or menu, picker, or select); a hover tooltip and an open popover coexist in both directions. Escape and close-on-leave are handled internally, so no dismissal behavior is lost. Tooltip also joins the shared dismissible stack, so when a tooltip is open on top of a popover, Escape closes only the tooltip first and leaves the popover open; a second Escape closes the popover.
68
-
69
- ## 2.0.0-beta.2
70
-
71
- ### Minor Changes
72
-
73
- - [#6410](https://github.com/adobe/spectrum-web-components/pull/6410) [`b0c6e37`](https://github.com/adobe/spectrum-web-components/commit/b0c6e375760ccc1ec6c1773ed1aa4015aa3b0f03) - Add the 2nd-gen `<swc-close-button>`, migrated from the Spectrum 1 `<sp-close-button>`.
74
- - **API**: `size`, `disabled`, `accessible-label`, and `static-color`; omits the legacy `variant` surface in favor of `static-color`.
75
- - **Accessibility**: renders a real inner `<button type="button">` with delegated focus; requires `accessible-label` for its icon-only name; the cross icon remains decorative.
76
- - **Styling**: ships Spectrum 2 sizing and static-color treatments plus the `--swc-close-button-*` custom-property surface for token-aligned overrides.
77
- - **Docs and tests**: includes Storybook docs, consumer migration guidance, unit coverage, and Playwright accessibility and keyboard tests.
78
-
79
- - [#6480](https://github.com/adobe/spectrum-web-components/pull/6480) [`f27f690`](https://github.com/adobe/spectrum-web-components/commit/f27f6906f142f824dcc28f588e205271a36ec04a) - **feat(color-handle):** Added `<swc-color-handle>`, the Spectrum 2 migration of `sp-color-handle`.
80
-
81
- A non-interactive color-picker primitive exposing `color`, `disabled`, `focused`, `open`, and the new `fill` property, with a built-in `<swc-color-loupe>` and an adaptive white-first dual border that meets WCAG 1.4.11 non-text contrast across the color spectrum. The `--mod-colorhandle-*` custom properties are removed; see the migration guide.
82
-
83
- - [#6439](https://github.com/adobe/spectrum-web-components/pull/6439) [`7f0c3e9`](https://github.com/adobe/spectrum-web-components/commit/7f0c3e937e697e3e1d5d3973ce4f709542f1bbef) - Extract the pending (busy) state into reusable, decoupled 2nd-gen core primitives so any pending-capable component can adopt it.
84
- - **`@adobe/spectrum-wc-core`**: adds `PendingController` (`/controllers/pending-controller`) for the pending state (delayed activation, inline-size freeze, derived busy accessible name), the render-only `renderPendingSpinner` directive (`/directives/pending-spinner`), and `PendingMixin` (`/mixins`) which wires the controller, the `pending` / `pending-label` properties, and click suppression. `ButtonBase` no longer owns pending state.
85
- - **`@adobe/spectrum-wc`**: `swc-button` and `swc-action-button` now consume these primitives via `PendingMixin`. No public API change — `pending` / `pending-label` and the busy behavior are unchanged.
86
-
87
- - [#6494](https://github.com/adobe/spectrum-web-components/pull/6494) [`9e7995a`](https://github.com/adobe/spectrum-web-components/commit/9e7995ad8189970d6788a7872007d611af247663) - **refactor(tabs):** Migrate `<swc-tabs>` keyboard navigation to `FocusgroupNavigationController`.
88
-
89
- Arrow-key, Home, and End navigation is now handled by the controller rather than by manually computed deltas in `handleKeyDown`. The `handleKeyDown` method retains only Enter/Space activation; all roving-tabindex management is delegated to the controller. In automatic activation mode, `focusgroupNavigationActiveChange` events with `source: 'keyboard'` drive selection-follows-focus; events with `source: 'refresh'` or `source: 'programmatic'` are intentionally ignored so that mounting or toggling `disabled` cannot trigger spurious `change` events.
90
-
91
- ### Patch Changes
92
-
93
- - [#6518](https://github.com/adobe/spectrum-web-components/pull/6518) [`36052f3`](https://github.com/adobe/spectrum-web-components/commit/36052f305622ad8f46b44bf5d71e2b02ebd8229c) - Fix inaccurate API reference tables for several 2nd-gen components by documenting CSS custom properties and JSDoc property descriptions that were missing from the generated Custom Elements Manifest.
94
- - Added missing `@cssprop` entries: `swc-tabs`/`swc-tab` (5 props), `swc-action-button` and `swc-button` (down-state transform, button also gets `max-inline-size`), `swc-illustrated-message` (10 props covering illustration sizing/color and heading/description typography).
95
- - Added missing `size`/`variant` property descriptions for `swc-button`, `swc-action-button`, `swc-close-button`, `swc-status-light`, and `swc-badge`.
96
- - Fixed the Tabs docs page rendering only `swc-tabs`'s API table; `swc-tab` and `swc-tab-panel` (the other two elements of the three-element component) now get their own API tables too, matching the pattern already used by Accordion.
97
-
98
- No component runtime changes; documentation and Storybook docs-page rendering only.
99
-
100
- - [#6513](https://github.com/adobe/spectrum-web-components/pull/6513) [`41e0483`](https://github.com/adobe/spectrum-web-components/commit/41e0483f59d3956ce973bbe50b2d54a1d8c73e9f) - **fix(color-loupe):** Added an adaptive white-first inner border to `<swc-color-loupe>` so its chrome meets WCAG 1.4.11 non-text contrast (≥3:1) across the color spectrum.
101
-
102
- The inner border's opacity now escalates above its default floor only when the white outer halo can't itself carry 3:1 contrast against the loupe's color. The outer border, shape, and sizing are unchanged, and there is no public API change. This supersedes the prior practical-limits exception, matching the adaptive dual-border approach already shipped for `<swc-color-handle>`.
103
-
104
- - [#6506](https://github.com/adobe/spectrum-web-components/pull/6506) [`6049706`](https://github.com/adobe/spectrum-web-components/commit/6049706e5d08bb92cd6531cbf7661c282b3ab409) - **fix(popover):** Fixed `swc-popover` staying dismissed on the next unrelated outside click after a trigger press was dragged off and released elsewhere.
105
-
106
- A `pointerdown` on the trigger followed by a drag off the trigger and a release elsewhere never dispatches a `click`, so the internal reopen-guard flag was left stuck `true`, misattributing the next unrelated outside light-dismiss to that stale press and swallowing the following legitimate trigger click.
107
-
108
- - [#6490](https://github.com/adobe/spectrum-web-components/pull/6490) [`1e053fe`](https://github.com/adobe/spectrum-web-components/commit/1e053fe761c20b1df70c842cb3f9dcee94e02d8d) - **fix(slot-attribute-propagation-controller):** Fixed `SlotAttributePropagationController` permanently skipping re-propagation when a repeated value was recorded before its target slot had resolved, and added support for propagating attributes that are only sometimes present on the host.
109
-
110
- `getValue` may now return `null` to remove the propagated attribute from assigned elements instead of setting it to an empty string. The `hostUpdated()` no-op guard now only records a value as applied once the slot actually resolves, so a slot that resolves after an earlier unsuccessful attempt with the same value is no longer skipped forever.
111
-
112
- `SlotAttributePropagationController` is also now a public export of `@adobe/spectrum-wc-core` (`@spectrum-web-components/core/controllers/slot-attribute-propagation-controller.js`), alongside dedicated tests and a Storybook controller docs page. Existing consumers (`<swc-button-group>`, `<swc-illustrated-message>`) are unaffected aside from benefiting from the propagation-guard fix.
113
-
114
- - [#6533](https://github.com/adobe/spectrum-web-components/pull/6533) [`5da5474`](https://github.com/adobe/spectrum-web-components/commit/5da54741eadcf61d60fd37d700ff457419a4d2ca) - **fix(progress-circle):** Replaced the `animation: none` reduced-motion override on `<swc-progress-circle>`'s indeterminate state with a slowed, single-rotation animation driven by custom properties (`--swc-progress-circle-rotate-start`, `--swc-progress-circle-rotate-end`, `--swc-progress-circle-dashoffset-30`), so `prefers-reduced-motion: reduce` still conveys progress without the distracting spin.
115
-
116
- ## 2.0.0-beta.1
117
-
118
- ### Minor Changes
119
-
120
- - [#6340](https://github.com/adobe/spectrum-web-components/pull/6340) [`57a77bc`](https://github.com/adobe/spectrum-web-components/commit/57a77bcee7eeb8f5a7b1084f3ad91543c2f92034) Thanks [@cdransf](https://github.com/cdransf)! - Added `<swc-action-button>` with full Spectrum 2 visual fidelity, migrated from the Spectrum 1 `<sp-action-button>`. See the [component docs](https://spectrum-web-components.adobe.com/?path=/docs/components-action-button--docs) and [migration guide](https://spectrum-web-components.adobe.com/?path=/docs/components-action-button-migration-guide--docs).
121
- - **API**: `accessible-label` replaces `label`; `size` includes `xs` (not on `swc-button`); `quiet` and `static-color` retained as primary visual differentiators; `pending` / `pending-label` added (matching `swc-button`); `aria-haspopup` / `aria-expanded` forwarded to the inner `<button>` for menu-trigger patterns.
122
- - **Breaking changes**: `toggles`, `selected`, `emphasized`, and `aria-pressed` removed (toggle UX moves to `swc-toggle-button` / `swc-toggle-button-group`); `href` and the link API removed (use native `<a>`); `hold-affordance` / `longpress` deferred; `label` renamed to `accessible-label`.
123
- - **Accessibility**: semantics and focus land on the internal native `<button>` (`delegatesFocus: true`); host carries no `role="button"`; `aria-disabled="true"` on the inner `<button>` during pending state; dev-mode warning when icon-only usage is missing `accessible-label`.
124
- - **Styling**: exposes `--swc-action-button-*` custom properties (replaces `--mod-actionbutton-*` / `--spectrum-actionbutton-*`); full Spectrum 2 token coverage across all size × quiet × static-color combinations; Windows High Contrast support.
125
- - **Docs and tests**: per-component Storybook docs page, consumer migration guide, and full unit + accessibility test coverage.
126
-
127
- - [#6395](https://github.com/adobe/spectrum-web-components/pull/6395) [`b4740eb`](https://github.com/adobe/spectrum-web-components/commit/b4740eb58f8a9410dbfae2969ca7a21c07bc63bd) Thanks [@Rajdeepc](https://github.com/Rajdeepc)! - - [#6395](https://github.com/adobe/spectrum-web-components/pull/6395) [`acd555a`](https://github.com/adobe/spectrum-web-components/commit/acd555a975508f9249a1394ac808a62b2d7cbfe3) - `ButtonGroup` — Added `<swc-button-group>` with full Spectrum 2 visual fidelity. See the [component docs](https://spectrum-web-components.adobe.com/?path=/docs/button-group--docs) and [migration guide](https://spectrum-web-components.adobe.com/?path=/docs/button-group-migration-guide--docs).
128
-
129
- - [#6454](https://github.com/adobe/spectrum-web-components/pull/6454) [`591fa65`](https://github.com/adobe/spectrum-web-components/commit/591fa65574f7f8175373683e7495059b8ca27fa4) Thanks [@cdransf](https://github.com/cdransf)! - Added an `actions` slot to `<swc-illustrated-message>` for placing a `<swc-button>` or `<swc-button-group>` below the description. The component automatically propagates its `size` to every slotted element. Also adds `SlotAttributePropagationController`, an internal Lit `ReactiveController` that propagates any host attribute to slotted children; used by `IllustratedMessage` and `ButtonGroup`.
130
-
131
- ## 2.0.0-beta.0
132
-
133
- ### Minor Changes
134
-
135
- - [#6395](https://github.com/adobe/spectrum-web-components/pull/6395) [`b4740eb`](https://github.com/adobe/spectrum-web-components/commit/b4740eb58f8a9410dbfae2969ca7a21c07bc63bd) Thanks [@Rajdeepc](https://github.com/Rajdeepc)! - `Button Group` — Added `<swc-button-group>` with full Spectrum 2 visual fidelity. See the [component docs](https://spectrum-web-components.adobe.com/?path=/docs/button-group--docs) and [migration guide](https://spectrum-web-components.adobe.com/?path=/docs/button-group-migration-guide--docs).
136
-
137
- - [#6358](https://github.com/adobe/spectrum-web-components/pull/6358) [`fe85234`](https://github.com/adobe/spectrum-web-components/commit/fe8523478348419aaeb7dc3f925ef00c4b8b40aa) Thanks [@5t3ph](https://github.com/5t3ph)! - Add `HoverController`, a Lit `ReactiveController` that manages hover and keyboard-focus event wiring for components that use the native Popover API, such as Tooltip.
138
-
139
- - [#6370](https://github.com/adobe/spectrum-web-components/pull/6370) [`7c1d0c5`](https://github.com/adobe/spectrum-web-components/commit/7c1d0c574c918474196fa0f6007b9f905455f772) Thanks [@blunteshwar](https://github.com/blunteshwar)! - Add the 2nd-gen `<swc-meter>`, migrated from the Spectrum 1 `<sp-meter>`.
140
- - **API**: `value` (replaces `progress`) with `min-value` / `max-value` for arbitrary ranges; `variant` (`informative` default, `positive`, `notice`, `negative`) with unknown values normalized to `informative`; `label-position` (`top` / `side`, replaces the `side-label` boolean); `value-label` and `formatOptions` for locale-aware value text; `label` and `description` named slots; `accessible-label` for the no-visible-label case.
141
- - **Accessibility**: the WAI-ARIA `meter` role and all `aria-value*`, `aria-labelledby`, and `aria-describedby` attributes live on the internal bar element, not the host; non-focusable, read-only; honors `prefers-reduced-motion: reduce` (WCAG 2.3.3) on the shared linear-progress base by dropping the fill transition.
142
- - **Styling**: exposes the `--swc-linear-progress-*` custom-property surface (replaces `--mod-progressbar-*` / `--mod-meter-*`); adds `static-color="black"` alongside `white`.
143
- - **Docs and tests**: per-component Storybook docs page, consumer migration guide, and full unit + accessibility test coverage.
144
-
145
- - [#6337](https://github.com/adobe/spectrum-web-components/pull/6337) [`e334d4f`](https://github.com/adobe/spectrum-web-components/commit/e334d4f4d622325984912b9689aae05e5ac179ce) Thanks [@rubencarvalho](https://github.com/rubencarvalho)! - Add `PlacementController`, a Floating UI-backed reactive controller for positioning anchored floating elements relative to a trigger. This adds `@floating-ui/dom` as a runtime dependency of `@spectrum-web-components/core`.
146
-
147
- - [#6387](https://github.com/adobe/spectrum-web-components/pull/6387) [`64a3d50`](https://github.com/adobe/spectrum-web-components/commit/64a3d50a6f4284cc32b8e13f2c8e05489012cef6) Thanks [@5t3ph](https://github.com/5t3ph)! - Add the 2nd-gen `<swc-tooltip>`, migrated from the Spectrum 1 `<sp-tooltip>`.
148
- - **API**: `for` attribute wires the tooltip to a trigger by ID; `trigger-element` property for programmatic or cross-shadow-root wiring; `manual` opts out of automatic wiring; `delay` (default 1500ms) for hover warm-up; `offset`, `cross-offset`, `container-padding`, and `should-flip` for viewport-aware positioning; `labeling` switches ARIA wiring to `ariaLabelledByElements` for icon-only triggers; `variant` accepts `neutral` (default), `informative`, and `negative`.
149
- - **Breaking changes from `<sp-tooltip>`**: `slot="icon"` removed; `variant="positive"` removed; `variant="info"` renamed to `variant="informative"`; `self-managed` attribute removed (automatic wiring is now the default; use `manual` to opt out); events renamed from `sp-opened`/`sp-closed` to `swc-open`/`swc-after-open`/`swc-close`/`swc-after-close`; authoring pattern changed — `<swc-tooltip>` is authored as a sibling of the trigger, not nested inside it.
150
- - **Accessibility**: `role="tooltip"` set on the host; `Element.ariaDescribedByElements` wired on the trigger's inner interactive element on open; `Escape` closes without moving focus via native `popover="auto"`; WCAG 1.4.13 pointer bridge keeps the tooltip open when the pointer moves from the trigger into the bubble; high-contrast border in forced-colors mode.
151
- - **Controllers**: `HoverController` manages hover and keyboard-focus wiring with warm-up/cooldown timing; `PlacementController` handles viewport-aware pixel positioning via Floating UI with automatic flip on viewport collision.
152
- - **Docs and tests**: per-component Storybook docs page, consumer migration guide, and full unit + accessibility test coverage.
153
-
154
- ## 0.1.0
155
-
156
- ### Minor Changes
157
-
158
- - [#6067](https://github.com/adobe/spectrum-web-components/pull/6067) [`ba14a2b`](https://github.com/adobe/spectrum-web-components/commit/ba14a2b6361a0089a9a8c72232f245cde0716d89) - `Core` — Refactored size mixin exports and badge type naming for consistency. Replaced `ElementSizes` record with `ELEMENT_SIZES` const array and `DEFAULT_ELEMENT_SIZES`; `VALID_SIZES` typed as `readonly ElementSize[]`. Badge exports renamed: `BADGE_VARIANTS_S2` → `BADGE_VARIANTS`, `BadgeVariantS2` → `BadgeVariant`, `BadgeColorVariantS2` → `BadgeColorVariant`.
159
-
160
- - [#6122](https://github.com/adobe/spectrum-web-components/pull/6122) [`7b153b5`](https://github.com/adobe/spectrum-web-components/commit/7b153b5433a8f6d47850f8939b058f7bc431c48c) - `Badge` — Migrated to 2nd-gen with `subtle`/`outline` styles, additional color variants, and updated defaults. See the [component docs](https://spectrum-web-components.adobe.com/?path=/docs/components-badge--docs) and [migration guide](https://spectrum-web-components.adobe.com/?path=/docs/components-badge-migration-guide--docs).
161
- `Divider` — Migrated to 2nd-gen. See the [component docs](https://spectrum-web-components.adobe.com/?path=/docs/components-divider--docs) and [migration guide](https://spectrum-web-components.adobe.com/?path=/docs/components-divider-migration-guide--docs).
162
- `Progress Circle` — Migrated to 2nd-gen; removed `indeterminate` attribute. See the [component docs](https://spectrum-web-components.adobe.com/?path=/docs/components-progress-circle--docs) and [migration guide](https://spectrum-web-components.adobe.com/?path=/docs/components-progress-circle-migration-guide--docs).
163
- `Status Light` — Migrated to 2nd-gen; removed `disabled` attribute and `accent` variant. See the [component docs](https://spectrum-web-components.adobe.com/?path=/docs/components-status-light--docs) and [migration guide](https://spectrum-web-components.adobe.com/?path=/docs/components-status-light-migration-guide--docs).
164
-
165
- - [#6183](https://github.com/adobe/spectrum-web-components/pull/6183) [`8aa488e`](https://github.com/adobe/spectrum-web-components/commit/8aa488e3867725b1ed93b2b5c31cba686f116688) - `Tabs` — Added 2nd-gen tabs (`swc-tabs`, `swc-tab`, `swc-tab-panel`) with Spectrum 2 styling, selection indicator, and keyboard navigation. See the [component docs](https://spectrum-web-components.adobe.com/?path=/docs/components-tabs--docs) and [migration guide](https://spectrum-web-components.adobe.com/?path=/docs/components-tabs-migration-guide--docs).
166
-
167
- ### Patch Changes
168
-
169
- - [#5936](https://github.com/adobe/spectrum-web-components/pull/5936) [`f37dec6`](https://github.com/adobe/spectrum-web-components/commit/f37dec6ae39fd89a4c12e084b4a0f4d9092d79b0) - `Core` — Overhauled text direction management. Replaced active `dir` attribute management with passive CSS `:dir()` pseudo-class and `getComputedStyle(this).direction`; removed `MutationObserver`-based direction tracking and converted physical CSS properties to logical equivalents.
170
-
171
- ## 0.0.4
172
-
173
- ### Patch Changes
174
-
175
- - [#5998](https://github.com/adobe/spectrum-web-components/pull/5998) [`6f5419a`](https://github.com/adobe/spectrum-web-components/commit/6f5419a4de29a1ee440a36c1a57d8c2e1476e2f6) - `Core` — Fixed missing export for `alert-banner` which could cause build failures in certain environments.
176
-
177
- ## 0.0.3
178
-
179
- ### Patch Changes
180
-
181
- - [#5993](https://github.com/adobe/spectrum-web-components/pull/5993) [`95e1c25`](https://github.com/adobe/spectrum-web-components/commit/95e1c25672f62f3723dfa66129ae5ecdeabe578a) - `Core` — Replaced wildcard exports with explicit named exports for better bundler compatibility. Changed build target from ES2022 to ES2018. Added `@spectrum-web-components/core` as direct dependency to `@spectrum-web-components/shared`. Added `@lit-labs/observers` as dependency.
182
-
183
- ## 0.0.2
184
-
185
- ### Patch Changes
186
-
187
- - [#5900](https://github.com/adobe/spectrum-web-components/pull/5900) [`283f0fe`](https://github.com/adobe/spectrum-web-components/commit/283f0fe07533c464e9fe1a3e7edebecb9128e11f) - `Core` — Added missing dependencies to package.json files of several components.
188
-
189
- - [#5893](https://github.com/adobe/spectrum-web-components/pull/5893) [`1d76b70`](https://github.com/adobe/spectrum-web-components/commit/1d76b7093d8ff5f9b26f07a69086488341a02650) - `Overlay` — Fixed hover overlays to close with the Esc key when trigger is not focused.
190
-
191
- - [#5866](https://github.com/adobe/spectrum-web-components/pull/5866) [`9cb816b`](https://github.com/adobe/spectrum-web-components/commit/9cb816b5ac80387fdc9bb87381f5149fecb1b595) - `Core` — Added `typesVersions` to improve TypeScript module resolution for users with `moduleResolution: "node"`.
@@ -1,12 +0,0 @@
1
- /**
2
- * Copyright 2026 Adobe. All rights reserved.
3
- * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
- * you may not use this file except in compliance with the License. You may obtain a copy
5
- * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
- *
7
- * Unless required by applicable law or agreed to in writing, software distributed under
8
- * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
- * OF ANY KIND, either express or implied. See the License for the specific language
10
- * governing permissions and limitations under the License.
11
- */
12
- export { DragAndDropController, type DragAndDropControllerOptions, type DragLeaveSnapshot, } from './src/drag-and-drop-controller.js';
@@ -1,2 +0,0 @@
1
- import { DragAndDropController as e } from "./src/drag-and-drop-controller.js";
2
- export { e as DragAndDropController };
@@ -1,68 +0,0 @@
1
- import { ReactiveController, ReactiveElement } from 'lit';
2
- /**
3
- * Snapshot of the fields read from a native `DragEvent` before it's recycled
4
- * by the browser, safe to read after the debounce in {@link DragAndDropControllerOptions.onDragLeave}.
5
- */
6
- export interface DragLeaveSnapshot {
7
- clientX: number;
8
- clientY: number;
9
- relatedTarget: EventTarget | null;
10
- }
11
- /** Configuration options for {@link DragAndDropController}. */
12
- export interface DragAndDropControllerOptions {
13
- /**
14
- * The host's own current "is a drag over me" flag. The controller never
15
- * keeps a copy of this state; it re-reads it on every native event so a
16
- * host that also exposes this flag as a public, externally-settable
17
- * property (as `swc-dropzone` does) can never drift out of sync with it.
18
- */
19
- isDragged: () => boolean;
20
- /**
21
- * Return `false` to reject the current drag payload; sets the OS cursor to
22
- * "not-allowed". Called on every native `dragover` tick. Defaults to
23
- * always-accept.
24
- */
25
- shouldAccept?: (event: DragEvent) => boolean;
26
- /** Called once when an accepted drag enters — not on every `dragover` tick. Set `isDragged`'s backing flag to `true` here. */
27
- onDragEnter?: (event: DragEvent) => void;
28
- /** Called once the accepted drag leaves or becomes rejected. Set `isDragged`'s backing flag to `false` here. */
29
- onDragLeave?: (snapshot: DragLeaveSnapshot) => void;
30
- /** Called on drop, only when `isDragged()` is currently `true`. */
31
- onDrop?: (event: DragEvent) => void;
32
- /** OS cursor feedback while an accepted drag hovers. Defaults to `'copy'`. */
33
- dropEffect?: () => DataTransfer['dropEffect'];
34
- }
35
- /**
36
- * A Lit {@link ReactiveController} that manages native drag-and-drop event
37
- * wiring (`dragover` / `dragleave` / `drop`) for a host element: debounces
38
- * `dragleave` so passing over a child element doesn't flicker the state,
39
- * de-duplicates entry so `onDragEnter` fires once per hover session rather
40
- * than on every `dragover` tick, and lets the host veto payloads it doesn't
41
- * want via `shouldAccept`.
42
- *
43
- * The host owns its own "dragged" state (via `isDragged`/`onDragEnter`/
44
- * `onDragLeave`); this controller only drives the timing.
45
- *
46
- * @example
47
- * ```ts
48
- * const dragAndDrop = new DragAndDropController(this, {
49
- * isDragged: () => this._dragged,
50
- * onDragEnter: () => { this._dragged = true; },
51
- * onDragLeave: () => { this._dragged = false; },
52
- * onDrop: (event) => this._handleFilesDropped(event.dataTransfer?.files),
53
- * });
54
- * ```
55
- */
56
- export declare class DragAndDropController implements ReactiveController {
57
- private readonly _host;
58
- private readonly _options;
59
- private _dragLeaveTimer;
60
- private _abortController;
61
- constructor(host: ReactiveElement, options: DragAndDropControllerOptions);
62
- hostConnected(): void;
63
- hostDisconnected(): void;
64
- private readonly _onDragOver;
65
- private readonly _onDragLeave;
66
- private readonly _onDrop;
67
- private _clearDragLeaveTimer;
68
- }
@@ -1,56 +0,0 @@
1
- //#region controllers/drag-and-drop-controller/src/drag-and-drop-controller.ts
2
- var e = 100, t = class {
3
- constructor(t, n) {
4
- this._dragLeaveTimer = null, this._abortController = null, this._onDragOver = (e) => {
5
- var t, n, r, i, a;
6
- if (e.preventDefault(), e.dataTransfer) {
7
- if (this._clearDragLeaveTimer(), ((t = (n = this._options).shouldAccept) == null ? void 0 : t.call(n, e)) === !1) {
8
- if (e.dataTransfer.dropEffect = "none", this._options.isDragged()) {
9
- var o, s;
10
- (o = (s = this._options).onDragLeave) == null || o.call(s, {
11
- clientX: e.clientX,
12
- clientY: e.clientY,
13
- relatedTarget: e.relatedTarget
14
- });
15
- }
16
- return;
17
- }
18
- if (e.dataTransfer.dropEffect = (r = (i = (a = this._options).dropEffect) == null ? void 0 : i.call(a)) == null ? "copy" : r, !this._options.isDragged()) {
19
- var c, l;
20
- (c = (l = this._options).onDragEnter) == null || c.call(l, e);
21
- }
22
- }
23
- }, this._onDragLeave = (t) => {
24
- if (t.relatedTarget && this._host.contains(t.relatedTarget)) return;
25
- this._clearDragLeaveTimer();
26
- let { clientX: n, clientY: r, relatedTarget: i } = t;
27
- this._dragLeaveTimer = setTimeout(() => {
28
- var e, t;
29
- this._dragLeaveTimer = null, (e = (t = this._options).onDragLeave) == null || e.call(t, {
30
- clientX: n,
31
- clientY: r,
32
- relatedTarget: i
33
- });
34
- }, e);
35
- }, this._onDrop = (e) => {
36
- var t, n;
37
- e.preventDefault(), this._options.isDragged() && (this._clearDragLeaveTimer(), (t = (n = this._options).onDrop) == null || t.call(n, e));
38
- }, this._host = t, this._options = n, t.addController(this);
39
- }
40
- hostConnected() {
41
- this._abortController = new AbortController();
42
- let { signal: e } = this._abortController;
43
- this._host.addEventListener("dragover", this._onDragOver, { signal: e }), this._host.addEventListener("dragleave", this._onDragLeave, { signal: e }), this._host.addEventListener("drop", this._onDrop, { signal: e });
44
- }
45
- hostDisconnected() {
46
- var e;
47
- (e = this._abortController) == null || e.abort(), this._abortController = null, this._clearDragLeaveTimer();
48
- }
49
- _clearDragLeaveTimer() {
50
- this._dragLeaveTimer !== null && (clearTimeout(this._dragLeaveTimer), this._dragLeaveTimer = null);
51
- }
52
- };
53
- //#endregion
54
- export { t as DragAndDropController };
55
-
56
- //# sourceMappingURL=drag-and-drop-controller.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"drag-and-drop-controller.js","names":[],"sources":["../../../../controllers/drag-and-drop-controller/src/drag-and-drop-controller.ts"],"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 type { ReactiveController, ReactiveElement } from 'lit';\n\n// ─────────────────────────\n// TYPES\n// ─────────────────────────\n\n/**\n * Snapshot of the fields read from a native `DragEvent` before it's recycled\n * by the browser, safe to read after the debounce in {@link DragAndDropControllerOptions.onDragLeave}.\n */\nexport interface DragLeaveSnapshot {\n clientX: number;\n clientY: number;\n relatedTarget: EventTarget | null;\n}\n\n/** Configuration options for {@link DragAndDropController}. */\nexport interface DragAndDropControllerOptions {\n /**\n * The host's own current \"is a drag over me\" flag. The controller never\n * keeps a copy of this state; it re-reads it on every native event so a\n * host that also exposes this flag as a public, externally-settable\n * property (as `swc-dropzone` does) can never drift out of sync with it.\n */\n isDragged: () => boolean;\n\n /**\n * Return `false` to reject the current drag payload; sets the OS cursor to\n * \"not-allowed\". Called on every native `dragover` tick. Defaults to\n * always-accept.\n */\n shouldAccept?: (event: DragEvent) => boolean;\n\n /** Called once when an accepted drag enters — not on every `dragover` tick. Set `isDragged`'s backing flag to `true` here. */\n onDragEnter?: (event: DragEvent) => void;\n\n /** Called once the accepted drag leaves or becomes rejected. Set `isDragged`'s backing flag to `false` here. */\n onDragLeave?: (snapshot: DragLeaveSnapshot) => void;\n\n /** Called on drop, only when `isDragged()` is currently `true`. */\n onDrop?: (event: DragEvent) => void;\n\n /** OS cursor feedback while an accepted drag hovers. Defaults to `'copy'`. */\n dropEffect?: () => DataTransfer['dropEffect'];\n}\n\n// Long enough that passing over a child element's own dragleave/dragover pair\n// doesn't flicker the state; short enough that leaving the host still reads\n// as immediate.\nconst DRAG_LEAVE_DEBOUNCE_MS = 100;\n\n// ─────────────────────────\n// CONTROLLER\n// ─────────────────────────\n\n/**\n * A Lit {@link ReactiveController} that manages native drag-and-drop event\n * wiring (`dragover` / `dragleave` / `drop`) for a host element: debounces\n * `dragleave` so passing over a child element doesn't flicker the state,\n * de-duplicates entry so `onDragEnter` fires once per hover session rather\n * than on every `dragover` tick, and lets the host veto payloads it doesn't\n * want via `shouldAccept`.\n *\n * The host owns its own \"dragged\" state (via `isDragged`/`onDragEnter`/\n * `onDragLeave`); this controller only drives the timing.\n *\n * @example\n * ```ts\n * const dragAndDrop = new DragAndDropController(this, {\n * isDragged: () => this._dragged,\n * onDragEnter: () => { this._dragged = true; },\n * onDragLeave: () => { this._dragged = false; },\n * onDrop: (event) => this._handleFilesDropped(event.dataTransfer?.files),\n * });\n * ```\n */\nexport class DragAndDropController implements ReactiveController {\n private readonly _host: ReactiveElement;\n private readonly _options: DragAndDropControllerOptions;\n private _dragLeaveTimer: ReturnType<typeof setTimeout> | null = null;\n private _abortController: AbortController | null = null;\n\n constructor(host: ReactiveElement, options: DragAndDropControllerOptions) {\n this._host = host;\n this._options = options;\n host.addController(this);\n }\n\n public hostConnected(): void {\n this._abortController = new AbortController();\n const { signal } = this._abortController;\n this._host.addEventListener('dragover', this._onDragOver as EventListener, {\n signal,\n });\n this._host.addEventListener(\n 'dragleave',\n this._onDragLeave as EventListener,\n { signal }\n );\n this._host.addEventListener('drop', this._onDrop as EventListener, {\n signal,\n });\n }\n\n public hostDisconnected(): void {\n this._abortController?.abort();\n this._abortController = null;\n this._clearDragLeaveTimer();\n }\n\n private readonly _onDragOver = (event: DragEvent): void => {\n event.preventDefault();\n if (!event.dataTransfer) {\n return;\n }\n\n this._clearDragLeaveTimer();\n if (this._options.shouldAccept?.(event) === false) {\n event.dataTransfer.dropEffect = 'none';\n if (this._options.isDragged()) {\n this._options.onDragLeave?.({\n clientX: event.clientX,\n clientY: event.clientY,\n relatedTarget: event.relatedTarget,\n });\n }\n return;\n }\n\n event.dataTransfer.dropEffect = this._options.dropEffect?.() ?? 'copy';\n\n if (!this._options.isDragged()) {\n this._options.onDragEnter?.(event);\n }\n };\n\n private readonly _onDragLeave = (event: DragEvent): void => {\n if (\n event.relatedTarget &&\n this._host.contains(event.relatedTarget as Node)\n ) {\n return;\n }\n\n this._clearDragLeaveTimer();\n // Capture synchronously; browsers recycle DragEvent objects after the\n // synchronous handler returns, so reading them inside setTimeout is unsafe.\n const { clientX, clientY, relatedTarget } = event;\n this._dragLeaveTimer = setTimeout(() => {\n this._dragLeaveTimer = null;\n this._options.onDragLeave?.({ clientX, clientY, relatedTarget });\n }, DRAG_LEAVE_DEBOUNCE_MS);\n };\n\n private readonly _onDrop = (event: DragEvent): void => {\n event.preventDefault();\n if (!this._options.isDragged()) {\n return;\n }\n\n this._clearDragLeaveTimer();\n this._options.onDrop?.(event);\n };\n\n private _clearDragLeaveTimer(): void {\n if (this._dragLeaveTimer !== null) {\n clearTimeout(this._dragLeaveTimer);\n this._dragLeaveTimer = null;\n }\n }\n}\n"],"mappings":";AA6DA,IAAM,IAAyB,KA2BlB,IAAb,MAAiE;CAM/D,YAAY,GAAuB,GAAuC;AAGxE,yBAN8D,8BACb,0BA8BnB,MAA2B;;AACzD,SAAM,gBAAgB,EACjB,EAAM,cAKX;QADA,KAAK,sBAAsB,IAC3B,KAAA,IAAI,KAAK,UAAS,iBAAA,OAAA,KAAA,IAAA,EAAA,KAAA,GAAe,EAAM,MAAK,IAAO;AAEjD,SADA,EAAM,aAAa,aAAa,QAC5B,KAAK,SAAS,WAAW,EAAE;;AAC7B,OAAA,KAAA,IAAA,KAAK,UAAS,gBAAA,QAAA,EAAA,KAAA,GAAc;OAC1B,SAAS,EAAM;OACf,SAAS,EAAM;OACf,eAAe,EAAM;OACtB,CAAC;;AAEJ;;AAKF,QAFA,EAAM,aAAa,cAAA,KAAA,KAAA,IAAa,KAAK,UAAS,eAAA,OAAA,KAAA,IAAA,EAAA,KAAA,EAAc,KAAA,OAAI,SAAJ,GAExD,CAAC,KAAK,SAAS,WAAW,EAAE;;AAC9B,MAAA,KAAA,IAAA,KAAK,UAAS,gBAAA,QAAA,EAAA,KAAA,GAAc,EAAM;;;0BAIL,MAA2B;AAC1D,OACE,EAAM,iBACN,KAAK,MAAM,SAAS,EAAM,cAAsB,CAEhD;AAGF,QAAK,sBAAsB;GAG3B,IAAM,EAAE,YAAS,YAAS,qBAAkB;AAC5C,QAAK,kBAAkB,iBAAiB;;AAEtC,IADA,KAAK,kBAAkB,OACvB,KAAA,IAAA,KAAK,UAAS,gBAAA,QAAA,EAAA,KAAA,GAAc;KAAE;KAAS;KAAS;KAAe,CAAC;MAC/D,EAAuB;qBAGA,MAA2B;;AACrD,KAAM,gBAAgB,EACjB,KAAK,SAAS,WAAW,KAI9B,KAAK,sBAAsB,GAC3B,KAAA,IAAA,KAAK,UAAS,WAAA,QAAA,EAAA,KAAA,GAAS,EAAM;KA9E7B,KAAK,QAAQ,GACb,KAAK,WAAW,GAChB,EAAK,cAAc,KAAK;;CAG1B,gBAA6B;AAC3B,OAAK,mBAAmB,IAAI,iBAAiB;EAC7C,IAAM,EAAE,cAAW,KAAK;AASxB,EARA,KAAK,MAAM,iBAAiB,YAAY,KAAK,aAA8B,EACzE,WACD,CAAC,EACF,KAAK,MAAM,iBACT,aACA,KAAK,cACL,EAAE,WAAQ,CACX,EACD,KAAK,MAAM,iBAAiB,QAAQ,KAAK,SAA0B,EACjE,WACD,CAAC;;CAGJ,mBAAgC;;AAG9B,GAFA,IAAA,KAAK,qBAAA,QAAA,EAAkB,OAAO,EAC9B,KAAK,mBAAmB,MACxB,KAAK,sBAAsB;;CAyD7B,uBAAqC;AACnC,EAAI,KAAK,oBAAoB,SAC3B,aAAa,KAAK,gBAAgB,EAClC,KAAK,kBAAkB"}