@spectrum-web-components/overlay 0.0.0-20241209155954

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/README.md +465 -0
  2. package/local.d.ts +56 -0
  3. package/overlay-trigger.d.ts +6 -0
  4. package/overlay-trigger.dev.js +5 -0
  5. package/overlay-trigger.dev.js.map +7 -0
  6. package/overlay-trigger.js +2 -0
  7. package/overlay-trigger.js.map +7 -0
  8. package/package.json +179 -0
  9. package/sp-overlay.d.ts +6 -0
  10. package/sp-overlay.dev.js +5 -0
  11. package/sp-overlay.dev.js.map +7 -0
  12. package/sp-overlay.js +2 -0
  13. package/sp-overlay.js.map +7 -0
  14. package/src/AbstractOverlay.d.ts +72 -0
  15. package/src/AbstractOverlay.dev.js +234 -0
  16. package/src/AbstractOverlay.dev.js.map +7 -0
  17. package/src/AbstractOverlay.js +2 -0
  18. package/src/AbstractOverlay.js.map +7 -0
  19. package/src/ClickController.d.ts +14 -0
  20. package/src/ClickController.dev.js +42 -0
  21. package/src/ClickController.dev.js.map +7 -0
  22. package/src/ClickController.js +2 -0
  23. package/src/ClickController.js.map +7 -0
  24. package/src/HoverController.d.ts +20 -0
  25. package/src/HoverController.dev.js +153 -0
  26. package/src/HoverController.dev.js.map +7 -0
  27. package/src/HoverController.js +2 -0
  28. package/src/HoverController.js.map +7 -0
  29. package/src/InteractionController.d.ts +38 -0
  30. package/src/InteractionController.dev.js +90 -0
  31. package/src/InteractionController.dev.js.map +7 -0
  32. package/src/InteractionController.js +2 -0
  33. package/src/InteractionController.js.map +7 -0
  34. package/src/LongpressController.d.ts +21 -0
  35. package/src/LongpressController.dev.js +156 -0
  36. package/src/LongpressController.dev.js.map +7 -0
  37. package/src/LongpressController.js +2 -0
  38. package/src/LongpressController.js.map +7 -0
  39. package/src/Overlay.d.ts +134 -0
  40. package/src/Overlay.dev.js +535 -0
  41. package/src/Overlay.dev.js.map +7 -0
  42. package/src/Overlay.js +33 -0
  43. package/src/Overlay.js.map +7 -0
  44. package/src/OverlayDialog.d.ts +4 -0
  45. package/src/OverlayDialog.dev.js +140 -0
  46. package/src/OverlayDialog.dev.js.map +7 -0
  47. package/src/OverlayDialog.js +2 -0
  48. package/src/OverlayDialog.js.map +7 -0
  49. package/src/OverlayNoPopover.d.ts +4 -0
  50. package/src/OverlayNoPopover.dev.js +117 -0
  51. package/src/OverlayNoPopover.dev.js.map +7 -0
  52. package/src/OverlayNoPopover.js +2 -0
  53. package/src/OverlayNoPopover.js.map +7 -0
  54. package/src/OverlayPopover.d.ts +4 -0
  55. package/src/OverlayPopover.dev.js +199 -0
  56. package/src/OverlayPopover.dev.js.map +7 -0
  57. package/src/OverlayPopover.js +2 -0
  58. package/src/OverlayPopover.js.map +7 -0
  59. package/src/OverlayStack.d.ts +44 -0
  60. package/src/OverlayStack.dev.js +163 -0
  61. package/src/OverlayStack.dev.js.map +7 -0
  62. package/src/OverlayStack.js +2 -0
  63. package/src/OverlayStack.js.map +7 -0
  64. package/src/OverlayTrigger.d.ts +52 -0
  65. package/src/OverlayTrigger.dev.js +243 -0
  66. package/src/OverlayTrigger.dev.js.map +7 -0
  67. package/src/OverlayTrigger.js +57 -0
  68. package/src/OverlayTrigger.js.map +7 -0
  69. package/src/PlacementController.d.ts +40 -0
  70. package/src/PlacementController.dev.js +212 -0
  71. package/src/PlacementController.dev.js.map +7 -0
  72. package/src/PlacementController.js +2 -0
  73. package/src/PlacementController.js.map +7 -0
  74. package/src/VirtualTrigger.d.ts +7 -0
  75. package/src/VirtualTrigger.dev.js +32 -0
  76. package/src/VirtualTrigger.dev.js.map +7 -0
  77. package/src/VirtualTrigger.js +2 -0
  78. package/src/VirtualTrigger.js.map +7 -0
  79. package/src/events.d.ts +23 -0
  80. package/src/events.dev.js +39 -0
  81. package/src/events.dev.js.map +7 -0
  82. package/src/events.js +2 -0
  83. package/src/events.js.map +7 -0
  84. package/src/fullSizePlugin.d.ts +12 -0
  85. package/src/fullSizePlugin.dev.js +39 -0
  86. package/src/fullSizePlugin.dev.js.map +7 -0
  87. package/src/fullSizePlugin.js +2 -0
  88. package/src/fullSizePlugin.js.map +7 -0
  89. package/src/index.d.ts +6 -0
  90. package/src/index.dev.js +8 -0
  91. package/src/index.dev.js.map +7 -0
  92. package/src/index.js +2 -0
  93. package/src/index.js.map +7 -0
  94. package/src/loader.d.ts +4 -0
  95. package/src/loader.dev.js +11 -0
  96. package/src/loader.dev.js.map +7 -0
  97. package/src/loader.js +2 -0
  98. package/src/loader.js.map +7 -0
  99. package/src/overlay-events.d.ts +11 -0
  100. package/src/overlay-events.dev.js +8 -0
  101. package/src/overlay-events.dev.js.map +7 -0
  102. package/src/overlay-events.js +2 -0
  103. package/src/overlay-events.js.map +7 -0
  104. package/src/overlay-timer.d.ts +22 -0
  105. package/src/overlay-timer.dev.js +72 -0
  106. package/src/overlay-timer.dev.js.map +7 -0
  107. package/src/overlay-timer.js +2 -0
  108. package/src/overlay-timer.js.map +7 -0
  109. package/src/overlay-trigger-directive.d.ts +26 -0
  110. package/src/overlay-trigger-directive.dev.js +87 -0
  111. package/src/overlay-trigger-directive.dev.js.map +7 -0
  112. package/src/overlay-trigger-directive.js +2 -0
  113. package/src/overlay-trigger-directive.js.map +7 -0
  114. package/src/overlay-trigger.css.d.ts +2 -0
  115. package/src/overlay-trigger.css.dev.js +7 -0
  116. package/src/overlay-trigger.css.dev.js.map +7 -0
  117. package/src/overlay-trigger.css.js +4 -0
  118. package/src/overlay-trigger.css.js.map +7 -0
  119. package/src/overlay-types.d.ts +50 -0
  120. package/src/overlay-types.dev.js +3 -0
  121. package/src/overlay-types.dev.js.map +7 -0
  122. package/src/overlay-types.js +2 -0
  123. package/src/overlay-types.js.map +7 -0
  124. package/src/overlay.css.d.ts +2 -0
  125. package/src/overlay.css.dev.js +7 -0
  126. package/src/overlay.css.dev.js.map +7 -0
  127. package/src/overlay.css.js +4 -0
  128. package/src/overlay.css.js.map +7 -0
  129. package/src/slottable-request-directive.d.ts +17 -0
  130. package/src/slottable-request-directive.dev.js +66 -0
  131. package/src/slottable-request-directive.dev.js.map +7 -0
  132. package/src/slottable-request-directive.js +2 -0
  133. package/src/slottable-request-directive.js.map +7 -0
  134. package/src/slottable-request-event.d.ts +12 -0
  135. package/src/slottable-request-event.dev.js +28 -0
  136. package/src/slottable-request-event.dev.js.map +7 -0
  137. package/src/slottable-request-event.js +2 -0
  138. package/src/slottable-request-event.js.map +7 -0
  139. package/src/strategies.d.ts +8 -0
  140. package/src/strategies.dev.js +10 -0
  141. package/src/strategies.dev.js.map +7 -0
  142. package/src/strategies.js +2 -0
  143. package/src/strategies.js.map +7 -0
  144. package/sync/overlay-trigger.d.ts +6 -0
  145. package/sync/overlay-trigger.dev.js +6 -0
  146. package/sync/overlay-trigger.dev.js.map +7 -0
  147. package/sync/overlay-trigger.js +2 -0
  148. package/sync/overlay-trigger.js.map +7 -0
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ import {
3
+ InteractionController,
4
+ InteractionTypes
5
+ } from "./InteractionController.dev.js";
6
+ export class ClickController extends InteractionController {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.type = InteractionTypes.click;
10
+ /**
11
+ * An overlay with a `click` interaction should not close on click `triggerElement`.
12
+ * When a click is initiated (`pointerdown`), apply `preventNextToggle` when the
13
+ * overlay is `open` to prevent from toggling the overlay when the click event
14
+ * propagates later in the interaction.
15
+ */
16
+ this.preventNextToggle = false;
17
+ }
18
+ handleClick() {
19
+ if (!this.preventNextToggle) {
20
+ this.open = !this.open;
21
+ }
22
+ this.preventNextToggle = false;
23
+ }
24
+ handlePointerdown() {
25
+ this.preventNextToggle = this.open;
26
+ }
27
+ init() {
28
+ var _a;
29
+ (_a = this.abortController) == null ? void 0 : _a.abort();
30
+ this.abortController = new AbortController();
31
+ const { signal } = this.abortController;
32
+ this.target.addEventListener("click", () => this.handleClick(), {
33
+ signal
34
+ });
35
+ this.target.addEventListener(
36
+ "pointerdown",
37
+ () => this.handlePointerdown(),
38
+ { signal }
39
+ );
40
+ }
41
+ }
42
+ //# sourceMappingURL=ClickController.dev.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["ClickController.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2024 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n InteractionController,\n InteractionTypes,\n} from './InteractionController.dev.js'\n\nexport class ClickController extends InteractionController {\n override type = InteractionTypes.click;\n\n /**\n * An overlay with a `click` interaction should not close on click `triggerElement`.\n * When a click is initiated (`pointerdown`), apply `preventNextToggle` when the\n * overlay is `open` to prevent from toggling the overlay when the click event\n * propagates later in the interaction.\n */\n private preventNextToggle = false;\n\n handleClick(): void {\n if (!this.preventNextToggle) {\n this.open = !this.open;\n }\n this.preventNextToggle = false;\n }\n\n handlePointerdown(): void {\n this.preventNextToggle = this.open;\n }\n\n override init(): void {\n // Clean up listeners if they've already been bound\n this.abortController?.abort();\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n this.target.addEventListener('click', () => this.handleClick(), {\n signal,\n });\n this.target.addEventListener(\n 'pointerdown',\n () => this.handlePointerdown(),\n { signal }\n );\n }\n}\n"],
5
+ "mappings": ";AAYA;AAAA,EACI;AAAA,EACA;AAAA,OACG;AAEA,aAAM,wBAAwB,sBAAsB;AAAA,EAApD;AAAA;AACH,SAAS,OAAO,iBAAiB;AAQjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,oBAAoB;AAAA;AAAA,EAE5B,cAAoB;AAChB,QAAI,CAAC,KAAK,mBAAmB;AACzB,WAAK,OAAO,CAAC,KAAK;AAAA,IACtB;AACA,SAAK,oBAAoB;AAAA,EAC7B;AAAA,EAEA,oBAA0B;AACtB,SAAK,oBAAoB,KAAK;AAAA,EAClC;AAAA,EAES,OAAa;AAvC1B;AAyCQ,eAAK,oBAAL,mBAAsB;AACtB,SAAK,kBAAkB,IAAI,gBAAgB;AAC3C,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,SAAK,OAAO,iBAAiB,SAAS,MAAM,KAAK,YAAY,GAAG;AAAA,MAC5D;AAAA,IACJ,CAAC;AACD,SAAK,OAAO;AAAA,MACR;AAAA,MACA,MAAM,KAAK,kBAAkB;AAAA,MAC7B,EAAE,OAAO;AAAA,IACb;AAAA,EACJ;AACJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";import{InteractionController as o,InteractionTypes as r}from"./InteractionController.js";export class ClickController extends o{constructor(){super(...arguments);this.type=r.click;this.preventNextToggle=!1}handleClick(){this.preventNextToggle||(this.open=!this.open),this.preventNextToggle=!1}handlePointerdown(){this.preventNextToggle=this.open}init(){var t;(t=this.abortController)==null||t.abort(),this.abortController=new AbortController;const{signal:e}=this.abortController;this.target.addEventListener("click",()=>this.handleClick(),{signal:e}),this.target.addEventListener("pointerdown",()=>this.handlePointerdown(),{signal:e})}}
2
+ //# sourceMappingURL=ClickController.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["ClickController.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2024 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n InteractionController,\n InteractionTypes,\n} from './InteractionController.js';\n\nexport class ClickController extends InteractionController {\n override type = InteractionTypes.click;\n\n /**\n * An overlay with a `click` interaction should not close on click `triggerElement`.\n * When a click is initiated (`pointerdown`), apply `preventNextToggle` when the\n * overlay is `open` to prevent from toggling the overlay when the click event\n * propagates later in the interaction.\n */\n private preventNextToggle = false;\n\n handleClick(): void {\n if (!this.preventNextToggle) {\n this.open = !this.open;\n }\n this.preventNextToggle = false;\n }\n\n handlePointerdown(): void {\n this.preventNextToggle = this.open;\n }\n\n override init(): void {\n // Clean up listeners if they've already been bound\n this.abortController?.abort();\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n this.target.addEventListener('click', () => this.handleClick(), {\n signal,\n });\n this.target.addEventListener(\n 'pointerdown',\n () => this.handlePointerdown(),\n { signal }\n );\n }\n}\n"],
5
+ "mappings": "aAYA,OACI,yBAAAA,EACA,oBAAAC,MACG,6BAEA,aAAM,wBAAwBD,CAAsB,CAApD,kCACH,KAAS,KAAOC,EAAiB,MAQjC,KAAQ,kBAAoB,GAE5B,aAAoB,CACX,KAAK,oBACN,KAAK,KAAO,CAAC,KAAK,MAEtB,KAAK,kBAAoB,EAC7B,CAEA,mBAA0B,CACtB,KAAK,kBAAoB,KAAK,IAClC,CAES,MAAa,CAvC1B,IAAAC,GAyCQA,EAAA,KAAK,kBAAL,MAAAA,EAAsB,QACtB,KAAK,gBAAkB,IAAI,gBAC3B,KAAM,CAAE,OAAAC,CAAO,EAAI,KAAK,gBACxB,KAAK,OAAO,iBAAiB,QAAS,IAAM,KAAK,YAAY,EAAG,CAC5D,OAAAA,CACJ,CAAC,EACD,KAAK,OAAO,iBACR,cACA,IAAM,KAAK,kBAAkB,EAC7B,CAAE,OAAAA,CAAO,CACb,CACJ,CACJ",
6
+ "names": ["InteractionController", "InteractionTypes", "_a", "signal"]
7
+ }
@@ -0,0 +1,20 @@
1
+ import { InteractionController, InteractionTypes } from './InteractionController.js';
2
+ export declare class HoverController extends InteractionController {
3
+ type: InteractionTypes;
4
+ private elementIds;
5
+ focusedin: boolean;
6
+ private hoverTimeout?;
7
+ pointerentered: boolean;
8
+ handleTargetFocusin(): void;
9
+ handleTargetFocusout(): void;
10
+ handleTargetPointerenter(): void;
11
+ handleTargetPointerleave(): void;
12
+ handleHostPointerenter(): void;
13
+ handleHostPointerleave(): void;
14
+ prepareDescription(): void;
15
+ private prepareOverlayRelativeDescription;
16
+ private prepareContentRelativeDescription;
17
+ protected doPointerleave(): void;
18
+ init(): void;
19
+ initOverlay(): void;
20
+ }
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ import { conditionAttributeWithId } from "@spectrum-web-components/base/src/condition-attribute-with-id.js";
3
+ import { randomID } from "@spectrum-web-components/shared/src/random-id.js";
4
+ import {
5
+ InteractionController,
6
+ InteractionTypes
7
+ } from "./InteractionController.dev.js";
8
+ import { noop } from "./AbstractOverlay.dev.js";
9
+ const HOVER_DELAY = 300;
10
+ export class HoverController extends InteractionController {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.type = InteractionTypes.hover;
14
+ this.elementIds = [];
15
+ this.focusedin = false;
16
+ this.pointerentered = false;
17
+ }
18
+ handleTargetFocusin() {
19
+ if (!this.target.matches(":focus-visible")) {
20
+ return;
21
+ }
22
+ this.open = true;
23
+ this.focusedin = true;
24
+ }
25
+ handleTargetFocusout() {
26
+ this.focusedin = false;
27
+ if (this.pointerentered) return;
28
+ this.open = false;
29
+ }
30
+ handleTargetPointerenter() {
31
+ var _a;
32
+ if (this.hoverTimeout) {
33
+ clearTimeout(this.hoverTimeout);
34
+ this.hoverTimeout = void 0;
35
+ }
36
+ if ((_a = this.overlay) == null ? void 0 : _a.disabled) return;
37
+ this.open = true;
38
+ this.pointerentered = true;
39
+ }
40
+ handleTargetPointerleave() {
41
+ this.doPointerleave();
42
+ }
43
+ // set a timeout once the pointer enters and the overlay is shown
44
+ // give the user time to enter the overlay
45
+ handleHostPointerenter() {
46
+ if (this.hoverTimeout) {
47
+ clearTimeout(this.hoverTimeout);
48
+ this.hoverTimeout = void 0;
49
+ }
50
+ }
51
+ handleHostPointerleave() {
52
+ this.doPointerleave();
53
+ }
54
+ prepareDescription() {
55
+ if (!this.overlay.elements.length) return;
56
+ const triggerRoot = this.target.getRootNode();
57
+ const contentRoot = this.overlay.elements[0].getRootNode();
58
+ const overlayRoot = this.overlay.getRootNode();
59
+ if (triggerRoot === overlayRoot) {
60
+ this.prepareOverlayRelativeDescription();
61
+ } else if (triggerRoot === contentRoot) {
62
+ this.prepareContentRelativeDescription();
63
+ }
64
+ }
65
+ prepareOverlayRelativeDescription() {
66
+ const releaseDescription = conditionAttributeWithId(
67
+ this.target,
68
+ "aria-describedby",
69
+ [this.overlay.id]
70
+ );
71
+ this.releaseDescription = () => {
72
+ releaseDescription();
73
+ this.releaseDescription = noop;
74
+ };
75
+ }
76
+ prepareContentRelativeDescription() {
77
+ const elementIds = [];
78
+ const appliedIds = this.overlay.elements.map((el) => {
79
+ elementIds.push(el.id);
80
+ if (!el.id) {
81
+ el.id = `${this.overlay.tagName.toLowerCase()}-helper-${randomID()}`;
82
+ }
83
+ return el.id;
84
+ });
85
+ this.elementIds = elementIds;
86
+ const releaseDescription = conditionAttributeWithId(
87
+ this.target,
88
+ "aria-describedby",
89
+ appliedIds
90
+ );
91
+ this.releaseDescription = () => {
92
+ releaseDescription();
93
+ this.overlay.elements.map((el, index) => {
94
+ el.id = this.elementIds[index];
95
+ });
96
+ this.releaseDescription = noop;
97
+ };
98
+ }
99
+ doPointerleave() {
100
+ this.pointerentered = false;
101
+ const triggerElement = this.target;
102
+ if (this.focusedin && triggerElement.matches(":focus-visible")) return;
103
+ this.hoverTimeout = setTimeout(() => {
104
+ this.open = false;
105
+ }, HOVER_DELAY);
106
+ }
107
+ init() {
108
+ var _a;
109
+ (_a = this.abortController) == null ? void 0 : _a.abort();
110
+ this.abortController = new AbortController();
111
+ const { signal } = this.abortController;
112
+ this.target.addEventListener(
113
+ "focusin",
114
+ () => this.handleTargetFocusin(),
115
+ { signal }
116
+ );
117
+ this.target.addEventListener(
118
+ "focusout",
119
+ () => this.handleTargetFocusout(),
120
+ { signal }
121
+ );
122
+ this.target.addEventListener(
123
+ "pointerenter",
124
+ () => this.handleTargetPointerenter(),
125
+ { signal }
126
+ );
127
+ this.target.addEventListener(
128
+ "pointerleave",
129
+ () => this.handleTargetPointerleave(),
130
+ { signal }
131
+ );
132
+ if (this.overlay) {
133
+ this.initOverlay();
134
+ }
135
+ }
136
+ initOverlay() {
137
+ if (!this.abortController) {
138
+ return;
139
+ }
140
+ const { signal } = this.abortController;
141
+ this.overlay.addEventListener(
142
+ "pointerenter",
143
+ () => this.handleHostPointerenter(),
144
+ { signal }
145
+ );
146
+ this.overlay.addEventListener(
147
+ "pointerleave",
148
+ () => this.handleHostPointerleave(),
149
+ { signal }
150
+ );
151
+ }
152
+ }
153
+ //# sourceMappingURL=HoverController.dev.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["HoverController.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2024 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport { conditionAttributeWithId } from '@spectrum-web-components/base/src/condition-attribute-with-id.js';\nimport { randomID } from '@spectrum-web-components/shared/src/random-id.js';\n\nimport {\n InteractionController,\n InteractionTypes,\n} from './InteractionController.dev.js'\nimport { noop } from './AbstractOverlay.dev.js'\n\nconst HOVER_DELAY = 300;\n\nexport class HoverController extends InteractionController {\n override type = InteractionTypes.hover;\n\n private elementIds: string[] = [];\n\n focusedin = false;\n\n private hoverTimeout?: ReturnType<typeof setTimeout>;\n\n pointerentered = false;\n\n handleTargetFocusin(): void {\n if (!this.target.matches(':focus-visible')) {\n return;\n }\n this.open = true;\n this.focusedin = true;\n }\n\n handleTargetFocusout(): void {\n this.focusedin = false;\n if (this.pointerentered) return;\n this.open = false;\n }\n\n handleTargetPointerenter(): void {\n if (this.hoverTimeout) {\n clearTimeout(this.hoverTimeout);\n this.hoverTimeout = undefined;\n }\n if (this.overlay?.disabled) return;\n this.open = true;\n this.pointerentered = true;\n }\n\n handleTargetPointerleave(): void {\n this.doPointerleave();\n }\n\n // set a timeout once the pointer enters and the overlay is shown\n // give the user time to enter the overlay\n handleHostPointerenter(): void {\n if (this.hoverTimeout) {\n clearTimeout(this.hoverTimeout);\n this.hoverTimeout = undefined;\n }\n }\n\n handleHostPointerleave(): void {\n this.doPointerleave();\n }\n\n override prepareDescription(): void {\n // require \"content\" to apply relationship\n if (!this.overlay.elements.length) return;\n\n const triggerRoot = this.target.getRootNode();\n const contentRoot = this.overlay.elements[0].getRootNode();\n const overlayRoot = this.overlay.getRootNode();\n if (triggerRoot === overlayRoot) {\n this.prepareOverlayRelativeDescription();\n } else if (triggerRoot === contentRoot) {\n this.prepareContentRelativeDescription();\n }\n }\n\n private prepareOverlayRelativeDescription(): void {\n const releaseDescription = conditionAttributeWithId(\n this.target,\n 'aria-describedby',\n [this.overlay.id]\n );\n this.releaseDescription = () => {\n releaseDescription();\n this.releaseDescription = noop;\n };\n }\n\n private prepareContentRelativeDescription(): void {\n const elementIds: string[] = [];\n const appliedIds = this.overlay.elements.map((el) => {\n elementIds.push(el.id);\n if (!el.id) {\n el.id = `${this.overlay.tagName.toLowerCase()}-helper-${randomID()}`;\n }\n return el.id;\n });\n this.elementIds = elementIds;\n const releaseDescription = conditionAttributeWithId(\n this.target,\n 'aria-describedby',\n appliedIds\n );\n this.releaseDescription = () => {\n releaseDescription();\n this.overlay.elements.map((el, index) => {\n el.id = this.elementIds[index];\n });\n this.releaseDescription = noop;\n };\n }\n\n protected doPointerleave(): void {\n this.pointerentered = false;\n const triggerElement = this.target as HTMLElement;\n if (this.focusedin && triggerElement.matches(':focus-visible')) return;\n\n this.hoverTimeout = setTimeout(() => {\n this.open = false;\n }, HOVER_DELAY);\n }\n\n override init(): void {\n // Clean up listeners if they've already been bound\n this.abortController?.abort();\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n this.target.addEventListener(\n 'focusin',\n () => this.handleTargetFocusin(),\n { signal }\n );\n this.target.addEventListener(\n 'focusout',\n () => this.handleTargetFocusout(),\n { signal }\n );\n this.target.addEventListener(\n 'pointerenter',\n () => this.handleTargetPointerenter(),\n { signal }\n );\n this.target.addEventListener(\n 'pointerleave',\n () => this.handleTargetPointerleave(),\n { signal }\n );\n if (this.overlay) {\n this.initOverlay();\n }\n }\n\n override initOverlay(): void {\n if (!this.abortController) {\n return;\n }\n const { signal } = this.abortController;\n this.overlay.addEventListener(\n 'pointerenter',\n () => this.handleHostPointerenter(),\n { signal }\n );\n this.overlay.addEventListener(\n 'pointerleave',\n () => this.handleHostPointerleave(),\n { signal }\n );\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";import{conditionAttributeWithId as o}from"@spectrum-web-components/base/src/condition-attribute-with-id.js";import{randomID as a}from"@spectrum-web-components/shared/src/random-id.js";import{InteractionController as l,InteractionTypes as h}from"./InteractionController.js";import{noop as s}from"./AbstractOverlay.js";const d=300;export class HoverController extends l{constructor(){super(...arguments);this.type=h.hover;this.elementIds=[];this.focusedin=!1;this.pointerentered=!1}handleTargetFocusin(){this.target.matches(":focus-visible")&&(this.open=!0,this.focusedin=!0)}handleTargetFocusout(){this.focusedin=!1,!this.pointerentered&&(this.open=!1)}handleTargetPointerenter(){var e;this.hoverTimeout&&(clearTimeout(this.hoverTimeout),this.hoverTimeout=void 0),!((e=this.overlay)!=null&&e.disabled)&&(this.open=!0,this.pointerentered=!0)}handleTargetPointerleave(){this.doPointerleave()}handleHostPointerenter(){this.hoverTimeout&&(clearTimeout(this.hoverTimeout),this.hoverTimeout=void 0)}handleHostPointerleave(){this.doPointerleave()}prepareDescription(){if(!this.overlay.elements.length)return;const e=this.target.getRootNode(),t=this.overlay.elements[0].getRootNode(),r=this.overlay.getRootNode();e===r?this.prepareOverlayRelativeDescription():e===t&&this.prepareContentRelativeDescription()}prepareOverlayRelativeDescription(){const e=o(this.target,"aria-describedby",[this.overlay.id]);this.releaseDescription=()=>{e(),this.releaseDescription=s}}prepareContentRelativeDescription(){const e=[],t=this.overlay.elements.map(i=>(e.push(i.id),i.id||(i.id=`${this.overlay.tagName.toLowerCase()}-helper-${a()}`),i.id));this.elementIds=e;const r=o(this.target,"aria-describedby",t);this.releaseDescription=()=>{r(),this.overlay.elements.map((i,n)=>{i.id=this.elementIds[n]}),this.releaseDescription=s}}doPointerleave(){this.pointerentered=!1;const e=this.target;this.focusedin&&e.matches(":focus-visible")||(this.hoverTimeout=setTimeout(()=>{this.open=!1},d))}init(){var t;(t=this.abortController)==null||t.abort(),this.abortController=new AbortController;const{signal:e}=this.abortController;this.target.addEventListener("focusin",()=>this.handleTargetFocusin(),{signal:e}),this.target.addEventListener("focusout",()=>this.handleTargetFocusout(),{signal:e}),this.target.addEventListener("pointerenter",()=>this.handleTargetPointerenter(),{signal:e}),this.target.addEventListener("pointerleave",()=>this.handleTargetPointerleave(),{signal:e}),this.overlay&&this.initOverlay()}initOverlay(){if(!this.abortController)return;const{signal:e}=this.abortController;this.overlay.addEventListener("pointerenter",()=>this.handleHostPointerenter(),{signal:e}),this.overlay.addEventListener("pointerleave",()=>this.handleHostPointerleave(),{signal:e})}}
2
+ //# sourceMappingURL=HoverController.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["HoverController.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2024 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport { conditionAttributeWithId } from '@spectrum-web-components/base/src/condition-attribute-with-id.js';\nimport { randomID } from '@spectrum-web-components/shared/src/random-id.js';\n\nimport {\n InteractionController,\n InteractionTypes,\n} from './InteractionController.js';\nimport { noop } from './AbstractOverlay.js';\n\nconst HOVER_DELAY = 300;\n\nexport class HoverController extends InteractionController {\n override type = InteractionTypes.hover;\n\n private elementIds: string[] = [];\n\n focusedin = false;\n\n private hoverTimeout?: ReturnType<typeof setTimeout>;\n\n pointerentered = false;\n\n handleTargetFocusin(): void {\n if (!this.target.matches(':focus-visible')) {\n return;\n }\n this.open = true;\n this.focusedin = true;\n }\n\n handleTargetFocusout(): void {\n this.focusedin = false;\n if (this.pointerentered) return;\n this.open = false;\n }\n\n handleTargetPointerenter(): void {\n if (this.hoverTimeout) {\n clearTimeout(this.hoverTimeout);\n this.hoverTimeout = undefined;\n }\n if (this.overlay?.disabled) return;\n this.open = true;\n this.pointerentered = true;\n }\n\n handleTargetPointerleave(): void {\n this.doPointerleave();\n }\n\n // set a timeout once the pointer enters and the overlay is shown\n // give the user time to enter the overlay\n handleHostPointerenter(): void {\n if (this.hoverTimeout) {\n clearTimeout(this.hoverTimeout);\n this.hoverTimeout = undefined;\n }\n }\n\n handleHostPointerleave(): void {\n this.doPointerleave();\n }\n\n override prepareDescription(): void {\n // require \"content\" to apply relationship\n if (!this.overlay.elements.length) return;\n\n const triggerRoot = this.target.getRootNode();\n const contentRoot = this.overlay.elements[0].getRootNode();\n const overlayRoot = this.overlay.getRootNode();\n if (triggerRoot === overlayRoot) {\n this.prepareOverlayRelativeDescription();\n } else if (triggerRoot === contentRoot) {\n this.prepareContentRelativeDescription();\n }\n }\n\n private prepareOverlayRelativeDescription(): void {\n const releaseDescription = conditionAttributeWithId(\n this.target,\n 'aria-describedby',\n [this.overlay.id]\n );\n this.releaseDescription = () => {\n releaseDescription();\n this.releaseDescription = noop;\n };\n }\n\n private prepareContentRelativeDescription(): void {\n const elementIds: string[] = [];\n const appliedIds = this.overlay.elements.map((el) => {\n elementIds.push(el.id);\n if (!el.id) {\n el.id = `${this.overlay.tagName.toLowerCase()}-helper-${randomID()}`;\n }\n return el.id;\n });\n this.elementIds = elementIds;\n const releaseDescription = conditionAttributeWithId(\n this.target,\n 'aria-describedby',\n appliedIds\n );\n this.releaseDescription = () => {\n releaseDescription();\n this.overlay.elements.map((el, index) => {\n el.id = this.elementIds[index];\n });\n this.releaseDescription = noop;\n };\n }\n\n protected doPointerleave(): void {\n this.pointerentered = false;\n const triggerElement = this.target as HTMLElement;\n if (this.focusedin && triggerElement.matches(':focus-visible')) return;\n\n this.hoverTimeout = setTimeout(() => {\n this.open = false;\n }, HOVER_DELAY);\n }\n\n override init(): void {\n // Clean up listeners if they've already been bound\n this.abortController?.abort();\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n this.target.addEventListener(\n 'focusin',\n () => this.handleTargetFocusin(),\n { signal }\n );\n this.target.addEventListener(\n 'focusout',\n () => this.handleTargetFocusout(),\n { signal }\n );\n this.target.addEventListener(\n 'pointerenter',\n () => this.handleTargetPointerenter(),\n { signal }\n );\n this.target.addEventListener(\n 'pointerleave',\n () => this.handleTargetPointerleave(),\n { signal }\n );\n if (this.overlay) {\n this.initOverlay();\n }\n }\n\n override initOverlay(): void {\n if (!this.abortController) {\n return;\n }\n const { signal } = this.abortController;\n this.overlay.addEventListener(\n 'pointerenter',\n () => this.handleHostPointerenter(),\n { signal }\n );\n this.overlay.addEventListener(\n 'pointerleave',\n () => this.handleHostPointerleave(),\n { signal }\n );\n }\n}\n"],
5
+ "mappings": "aAYA,OAAS,4BAAAA,MAAgC,mEACzC,OAAS,YAAAC,MAAgB,mDAEzB,OACI,yBAAAC,EACA,oBAAAC,MACG,6BACP,OAAS,QAAAC,MAAY,uBAErB,MAAMC,EAAc,IAEb,aAAM,wBAAwBH,CAAsB,CAApD,kCACH,KAAS,KAAOC,EAAiB,MAEjC,KAAQ,WAAuB,CAAC,EAEhC,eAAY,GAIZ,oBAAiB,GAEjB,qBAA4B,CACnB,KAAK,OAAO,QAAQ,gBAAgB,IAGzC,KAAK,KAAO,GACZ,KAAK,UAAY,GACrB,CAEA,sBAA6B,CACzB,KAAK,UAAY,GACb,MAAK,iBACT,KAAK,KAAO,GAChB,CAEA,0BAAiC,CAhDrC,IAAAG,EAiDY,KAAK,eACL,aAAa,KAAK,YAAY,EAC9B,KAAK,aAAe,QAEpB,GAAAA,EAAA,KAAK,UAAL,MAAAA,EAAc,YAClB,KAAK,KAAO,GACZ,KAAK,eAAiB,GAC1B,CAEA,0BAAiC,CAC7B,KAAK,eAAe,CACxB,CAIA,wBAA+B,CACvB,KAAK,eACL,aAAa,KAAK,YAAY,EAC9B,KAAK,aAAe,OAE5B,CAEA,wBAA+B,CAC3B,KAAK,eAAe,CACxB,CAES,oBAA2B,CAEhC,GAAI,CAAC,KAAK,QAAQ,SAAS,OAAQ,OAEnC,MAAMC,EAAc,KAAK,OAAO,YAAY,EACtCC,EAAc,KAAK,QAAQ,SAAS,CAAC,EAAE,YAAY,EACnDC,EAAc,KAAK,QAAQ,YAAY,EACzCF,IAAgBE,EAChB,KAAK,kCAAkC,EAChCF,IAAgBC,GACvB,KAAK,kCAAkC,CAE/C,CAEQ,mCAA0C,CAC9C,MAAME,EAAqBV,EACvB,KAAK,OACL,mBACA,CAAC,KAAK,QAAQ,EAAE,CACpB,EACA,KAAK,mBAAqB,IAAM,CAC5BU,EAAmB,EACnB,KAAK,mBAAqBN,CAC9B,CACJ,CAEQ,mCAA0C,CAC9C,MAAMO,EAAuB,CAAC,EACxBC,EAAa,KAAK,QAAQ,SAAS,IAAKC,IAC1CF,EAAW,KAAKE,EAAG,EAAE,EAChBA,EAAG,KACJA,EAAG,GAAK,GAAG,KAAK,QAAQ,QAAQ,YAAY,CAAC,WAAWZ,EAAS,CAAC,IAE/DY,EAAG,GACb,EACD,KAAK,WAAaF,EAClB,MAAMD,EAAqBV,EACvB,KAAK,OACL,mBACAY,CACJ,EACA,KAAK,mBAAqB,IAAM,CAC5BF,EAAmB,EACnB,KAAK,QAAQ,SAAS,IAAI,CAACG,EAAIC,IAAU,CACrCD,EAAG,GAAK,KAAK,WAAWC,CAAK,CACjC,CAAC,EACD,KAAK,mBAAqBV,CAC9B,CACJ,CAEU,gBAAuB,CAC7B,KAAK,eAAiB,GACtB,MAAMW,EAAiB,KAAK,OACxB,KAAK,WAAaA,EAAe,QAAQ,gBAAgB,IAE7D,KAAK,aAAe,WAAW,IAAM,CACjC,KAAK,KAAO,EAChB,EAAGV,CAAW,EAClB,CAES,MAAa,CAvI1B,IAAAC,GAyIQA,EAAA,KAAK,kBAAL,MAAAA,EAAsB,QACtB,KAAK,gBAAkB,IAAI,gBAC3B,KAAM,CAAE,OAAAU,CAAO,EAAI,KAAK,gBACxB,KAAK,OAAO,iBACR,UACA,IAAM,KAAK,oBAAoB,EAC/B,CAAE,OAAAA,CAAO,CACb,EACA,KAAK,OAAO,iBACR,WACA,IAAM,KAAK,qBAAqB,EAChC,CAAE,OAAAA,CAAO,CACb,EACA,KAAK,OAAO,iBACR,eACA,IAAM,KAAK,yBAAyB,EACpC,CAAE,OAAAA,CAAO,CACb,EACA,KAAK,OAAO,iBACR,eACA,IAAM,KAAK,yBAAyB,EACpC,CAAE,OAAAA,CAAO,CACb,EACI,KAAK,SACL,KAAK,YAAY,CAEzB,CAES,aAAoB,CACzB,GAAI,CAAC,KAAK,gBACN,OAEJ,KAAM,CAAE,OAAAA,CAAO,EAAI,KAAK,gBACxB,KAAK,QAAQ,iBACT,eACA,IAAM,KAAK,uBAAuB,EAClC,CAAE,OAAAA,CAAO,CACb,EACA,KAAK,QAAQ,iBACT,eACA,IAAM,KAAK,uBAAuB,EAClC,CAAE,OAAAA,CAAO,CACb,CACJ,CACJ",
6
+ "names": ["conditionAttributeWithId", "randomID", "InteractionController", "InteractionTypes", "noop", "HOVER_DELAY", "_a", "triggerRoot", "contentRoot", "overlayRoot", "releaseDescription", "elementIds", "appliedIds", "el", "index", "triggerElement", "signal"]
7
+ }
@@ -0,0 +1,38 @@
1
+ import type { ReactiveController } from '@spectrum-web-components/base';
2
+ import { AbstractOverlay } from './AbstractOverlay.js';
3
+ export declare enum InteractionTypes {
4
+ 'click' = 0,
5
+ 'hover' = 1,
6
+ 'longpress' = 2
7
+ }
8
+ export type ControllerOptions = {
9
+ overlay?: AbstractOverlay;
10
+ handleOverlayReady?: (overlay: AbstractOverlay) => void;
11
+ isPersistent?: boolean;
12
+ };
13
+ export declare class InteractionController implements ReactiveController {
14
+ target: HTMLElement;
15
+ abortController: AbortController;
16
+ get activelyOpening(): boolean;
17
+ private handleOverlayReady?;
18
+ private isLazilyOpen;
19
+ get open(): boolean;
20
+ /**
21
+ * Set `open` against the associated Overlay lazily.
22
+ */
23
+ set open(open: boolean);
24
+ get overlay(): AbstractOverlay;
25
+ set overlay(overlay: AbstractOverlay | undefined);
26
+ private _overlay;
27
+ protected isPersistent: boolean;
28
+ type: InteractionTypes;
29
+ constructor(target: HTMLElement, { overlay, isPersistent, handleOverlayReady }: ControllerOptions);
30
+ prepareDescription(_: HTMLElement): void;
31
+ releaseDescription(): void;
32
+ shouldCompleteOpen(): void;
33
+ init(): void;
34
+ initOverlay(): void;
35
+ abort(): void;
36
+ hostConnected(): void;
37
+ hostDisconnected(): void;
38
+ }
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ export var InteractionTypes = /* @__PURE__ */ ((InteractionTypes2) => {
3
+ InteractionTypes2[InteractionTypes2["click"] = 0] = "click";
4
+ InteractionTypes2[InteractionTypes2["hover"] = 1] = "hover";
5
+ InteractionTypes2[InteractionTypes2["longpress"] = 2] = "longpress";
6
+ return InteractionTypes2;
7
+ })(InteractionTypes || {});
8
+ export class InteractionController {
9
+ constructor(target, { overlay, isPersistent, handleOverlayReady }) {
10
+ this.target = target;
11
+ // Holds optimistic open state when an Overlay is not yet present
12
+ this.isLazilyOpen = false;
13
+ this.isPersistent = false;
14
+ this.isPersistent = !!isPersistent;
15
+ this.handleOverlayReady = handleOverlayReady;
16
+ if (this.isPersistent) {
17
+ this.init();
18
+ }
19
+ this.overlay = overlay;
20
+ }
21
+ get activelyOpening() {
22
+ return false;
23
+ }
24
+ get open() {
25
+ var _a, _b;
26
+ return (_b = (_a = this.overlay) == null ? void 0 : _a.open) != null ? _b : this.isLazilyOpen;
27
+ }
28
+ /**
29
+ * Set `open` against the associated Overlay lazily.
30
+ */
31
+ set open(open) {
32
+ if (open === this.open) return;
33
+ this.isLazilyOpen = open;
34
+ if (this.overlay) {
35
+ this.overlay.open = open;
36
+ return;
37
+ }
38
+ if (!open) {
39
+ return;
40
+ }
41
+ customElements.whenDefined("sp-overlay").then(async () => {
42
+ const { Overlay } = await import("./Overlay.dev.js");
43
+ this.overlay = new Overlay();
44
+ this.overlay.open = true;
45
+ });
46
+ import("@spectrum-web-components/overlay/sp-overlay.js");
47
+ }
48
+ get overlay() {
49
+ return this._overlay;
50
+ }
51
+ set overlay(overlay) {
52
+ var _a;
53
+ if (!overlay) return;
54
+ if (this.overlay === overlay) return;
55
+ if (this.overlay) {
56
+ this.overlay.removeController(this);
57
+ }
58
+ this._overlay = overlay;
59
+ this.overlay.addController(this);
60
+ this.initOverlay();
61
+ this.prepareDescription(this.target);
62
+ (_a = this.handleOverlayReady) == null ? void 0 : _a.call(this, this.overlay);
63
+ }
64
+ prepareDescription(_) {
65
+ }
66
+ releaseDescription() {
67
+ }
68
+ shouldCompleteOpen() {
69
+ }
70
+ /* c8 ignore next 3 */
71
+ init() {
72
+ }
73
+ /* c8 ignore next 3 */
74
+ initOverlay() {
75
+ }
76
+ abort() {
77
+ var _a;
78
+ this.releaseDescription();
79
+ (_a = this.abortController) == null ? void 0 : _a.abort();
80
+ }
81
+ hostConnected() {
82
+ this.init();
83
+ }
84
+ hostDisconnected() {
85
+ if (!this.isPersistent) {
86
+ this.abort();
87
+ }
88
+ }
89
+ }
90
+ //# sourceMappingURL=InteractionController.dev.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["InteractionController.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2024 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport type { ReactiveController } from '@spectrum-web-components/base';\nimport { AbstractOverlay } from './AbstractOverlay.dev.js'\n\nexport enum InteractionTypes {\n 'click',\n 'hover',\n 'longpress',\n}\n\nexport type ControllerOptions = {\n overlay?: AbstractOverlay;\n handleOverlayReady?: (overlay: AbstractOverlay) => void;\n isPersistent?: boolean;\n};\n\nexport class InteractionController implements ReactiveController {\n abortController!: AbortController;\n\n get activelyOpening(): boolean {\n return false;\n }\n\n private handleOverlayReady?: (overlay: AbstractOverlay) => void;\n\n // Holds optimistic open state when an Overlay is not yet present\n private isLazilyOpen = false;\n\n public get open(): boolean {\n return this.overlay?.open ?? this.isLazilyOpen;\n }\n\n /**\n * Set `open` against the associated Overlay lazily.\n */\n public set open(open: boolean) {\n if (open === this.open) return;\n this.isLazilyOpen = open;\n if (this.overlay) {\n // If there already is an Overlay, apply the value of `open` directly.\n this.overlay.open = open;\n return;\n }\n if (!open) {\n // When `open` moves to `false` and there is not yet an Overlay,\n // assume that no Overlay and a closed Overlay are the same and return early.\n return;\n }\n // When there is no Overlay and `open` is moving to `true`, lazily import/create\n // an Overlay and apply that state to it.\n customElements\n .whenDefined('sp-overlay')\n .then(async (): Promise<void> => {\n const { Overlay } = await import('./Overlay.dev.js');\n this.overlay = new Overlay();\n this.overlay.open = true;\n });\n import('@spectrum-web-components/overlay/sp-overlay.js');\n }\n\n public get overlay(): AbstractOverlay {\n return this._overlay;\n }\n\n public set overlay(overlay: AbstractOverlay | undefined) {\n if (!overlay) return;\n if (this.overlay === overlay) return;\n if (this.overlay) {\n this.overlay.removeController(this);\n }\n this._overlay = overlay;\n this.overlay.addController(this);\n this.initOverlay();\n this.prepareDescription(this.target);\n this.handleOverlayReady?.(this.overlay);\n }\n\n private _overlay!: AbstractOverlay;\n\n protected isPersistent = false;\n\n type!: InteractionTypes;\n\n constructor(\n public target: HTMLElement,\n { overlay, isPersistent, handleOverlayReady }: ControllerOptions\n ) {\n this.isPersistent = !!isPersistent;\n this.handleOverlayReady = handleOverlayReady;\n if (this.isPersistent) {\n this.init();\n }\n this.overlay = overlay;\n }\n\n prepareDescription(_: HTMLElement): void {}\n\n releaseDescription(): void {}\n\n shouldCompleteOpen(): void {}\n\n /* c8 ignore next 3 */\n init(): void {\n // Abstract init() method.\n }\n\n /* c8 ignore next 3 */\n initOverlay(): void {\n // Abstract initOverlay() method.\n }\n\n abort(): void {\n this.releaseDescription();\n this.abortController?.abort();\n }\n\n hostConnected(): void {\n this.init();\n }\n\n hostDisconnected(): void {\n if (!this.isPersistent) {\n this.abort();\n }\n }\n}\n"],
5
+ "mappings": ";AAeO,WAAK,mBAAL,kBAAKA,sBAAL;AACH,EAAAA,oCAAA;AACA,EAAAA,oCAAA;AACA,EAAAA,oCAAA;AAHQ,SAAAA;AAAA,GAAA;AAYL,aAAM,sBAAoD;AAAA,EAmE7D,YACW,QACP,EAAE,SAAS,cAAc,mBAAmB,GAC9C;AAFS;AA1DX;AAAA,SAAQ,eAAe;AAqDvB,SAAU,eAAe;AAQrB,SAAK,eAAe,CAAC,CAAC;AACtB,SAAK,qBAAqB;AAC1B,QAAI,KAAK,cAAc;AACnB,WAAK,KAAK;AAAA,IACd;AACA,SAAK,UAAU;AAAA,EACnB;AAAA,EA1EA,IAAI,kBAA2B;AAC3B,WAAO;AAAA,EACX;AAAA,EAOA,IAAW,OAAgB;AAvC/B;AAwCQ,YAAO,gBAAK,YAAL,mBAAc,SAAd,YAAsB,KAAK;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,KAAK,MAAe;AAC3B,QAAI,SAAS,KAAK,KAAM;AACxB,SAAK,eAAe;AACpB,QAAI,KAAK,SAAS;AAEd,WAAK,QAAQ,OAAO;AACpB;AAAA,IACJ;AACA,QAAI,CAAC,MAAM;AAGP;AAAA,IACJ;AAGA,mBACK,YAAY,YAAY,EACxB,KAAK,YAA2B;AAC7B,YAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,kBAAkB;AACnD,WAAK,UAAU,IAAI,QAAQ;AAC3B,WAAK,QAAQ,OAAO;AAAA,IACxB,CAAC;AACL,WAAO,gDAAgD;AAAA,EAC3D;AAAA,EAEA,IAAW,UAA2B;AAClC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAW,QAAQ,SAAsC;AA3E7D;AA4EQ,QAAI,CAAC,QAAS;AACd,QAAI,KAAK,YAAY,QAAS;AAC9B,QAAI,KAAK,SAAS;AACd,WAAK,QAAQ,iBAAiB,IAAI;AAAA,IACtC;AACA,SAAK,WAAW;AAChB,SAAK,QAAQ,cAAc,IAAI;AAC/B,SAAK,YAAY;AACjB,SAAK,mBAAmB,KAAK,MAAM;AACnC,eAAK,uBAAL,8BAA0B,KAAK;AAAA,EACnC;AAAA,EAoBA,mBAAmB,GAAsB;AAAA,EAAC;AAAA,EAE1C,qBAA2B;AAAA,EAAC;AAAA,EAE5B,qBAA2B;AAAA,EAAC;AAAA;AAAA,EAG5B,OAAa;AAAA,EAEb;AAAA;AAAA,EAGA,cAAoB;AAAA,EAEpB;AAAA,EAEA,QAAc;AA1HlB;AA2HQ,SAAK,mBAAmB;AACxB,eAAK,oBAAL,mBAAsB;AAAA,EAC1B;AAAA,EAEA,gBAAsB;AAClB,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,mBAAyB;AACrB,QAAI,CAAC,KAAK,cAAc;AACpB,WAAK,MAAM;AAAA,IACf;AAAA,EACJ;AACJ;",
6
+ "names": ["InteractionTypes"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";export var InteractionTypes=(r=>(r[r.click=0]="click",r[r.hover=1]="hover",r[r.longpress=2]="longpress",r))(InteractionTypes||{});export class InteractionController{constructor(e,{overlay:t,isPersistent:r,handleOverlayReady:i}){this.target=e;this.isLazilyOpen=!1;this.isPersistent=!1;this.isPersistent=!!r,this.handleOverlayReady=i,this.isPersistent&&this.init(),this.overlay=t}get activelyOpening(){return!1}get open(){var e,t;return(t=(e=this.overlay)==null?void 0:e.open)!=null?t:this.isLazilyOpen}set open(e){if(e!==this.open){if(this.isLazilyOpen=e,this.overlay){this.overlay.open=e;return}e&&(customElements.whenDefined("sp-overlay").then(async()=>{const{Overlay:t}=await import("./Overlay.js");this.overlay=new t,this.overlay.open=!0}),import("@spectrum-web-components/overlay/sp-overlay.js"))}}get overlay(){return this._overlay}set overlay(e){var t;e&&this.overlay!==e&&(this.overlay&&this.overlay.removeController(this),this._overlay=e,this.overlay.addController(this),this.initOverlay(),this.prepareDescription(this.target),(t=this.handleOverlayReady)==null||t.call(this,this.overlay))}prepareDescription(e){}releaseDescription(){}shouldCompleteOpen(){}init(){}initOverlay(){}abort(){var e;this.releaseDescription(),(e=this.abortController)==null||e.abort()}hostConnected(){this.init()}hostDisconnected(){this.isPersistent||this.abort()}}
2
+ //# sourceMappingURL=InteractionController.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["InteractionController.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2024 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport type { ReactiveController } from '@spectrum-web-components/base';\nimport { AbstractOverlay } from './AbstractOverlay.js';\n\nexport enum InteractionTypes {\n 'click',\n 'hover',\n 'longpress',\n}\n\nexport type ControllerOptions = {\n overlay?: AbstractOverlay;\n handleOverlayReady?: (overlay: AbstractOverlay) => void;\n isPersistent?: boolean;\n};\n\nexport class InteractionController implements ReactiveController {\n abortController!: AbortController;\n\n get activelyOpening(): boolean {\n return false;\n }\n\n private handleOverlayReady?: (overlay: AbstractOverlay) => void;\n\n // Holds optimistic open state when an Overlay is not yet present\n private isLazilyOpen = false;\n\n public get open(): boolean {\n return this.overlay?.open ?? this.isLazilyOpen;\n }\n\n /**\n * Set `open` against the associated Overlay lazily.\n */\n public set open(open: boolean) {\n if (open === this.open) return;\n this.isLazilyOpen = open;\n if (this.overlay) {\n // If there already is an Overlay, apply the value of `open` directly.\n this.overlay.open = open;\n return;\n }\n if (!open) {\n // When `open` moves to `false` and there is not yet an Overlay,\n // assume that no Overlay and a closed Overlay are the same and return early.\n return;\n }\n // When there is no Overlay and `open` is moving to `true`, lazily import/create\n // an Overlay and apply that state to it.\n customElements\n .whenDefined('sp-overlay')\n .then(async (): Promise<void> => {\n const { Overlay } = await import('./Overlay.js');\n this.overlay = new Overlay();\n this.overlay.open = true;\n });\n import('@spectrum-web-components/overlay/sp-overlay.js');\n }\n\n public get overlay(): AbstractOverlay {\n return this._overlay;\n }\n\n public set overlay(overlay: AbstractOverlay | undefined) {\n if (!overlay) return;\n if (this.overlay === overlay) return;\n if (this.overlay) {\n this.overlay.removeController(this);\n }\n this._overlay = overlay;\n this.overlay.addController(this);\n this.initOverlay();\n this.prepareDescription(this.target);\n this.handleOverlayReady?.(this.overlay);\n }\n\n private _overlay!: AbstractOverlay;\n\n protected isPersistent = false;\n\n type!: InteractionTypes;\n\n constructor(\n public target: HTMLElement,\n { overlay, isPersistent, handleOverlayReady }: ControllerOptions\n ) {\n this.isPersistent = !!isPersistent;\n this.handleOverlayReady = handleOverlayReady;\n if (this.isPersistent) {\n this.init();\n }\n this.overlay = overlay;\n }\n\n prepareDescription(_: HTMLElement): void {}\n\n releaseDescription(): void {}\n\n shouldCompleteOpen(): void {}\n\n /* c8 ignore next 3 */\n init(): void {\n // Abstract init() method.\n }\n\n /* c8 ignore next 3 */\n initOverlay(): void {\n // Abstract initOverlay() method.\n }\n\n abort(): void {\n this.releaseDescription();\n this.abortController?.abort();\n }\n\n hostConnected(): void {\n this.init();\n }\n\n hostDisconnected(): void {\n if (!this.isPersistent) {\n this.abort();\n }\n }\n}\n"],
5
+ "mappings": "aAeO,WAAK,kBAAAA,IACRA,IAAA,iBACAA,IAAA,iBACAA,IAAA,yBAHQA,IAAA,sBAYL,aAAM,qBAAoD,CAmE7D,YACWC,EACP,CAAE,QAAAC,EAAS,aAAAC,EAAc,mBAAAC,CAAmB,EAC9C,CAFS,YAAAH,EA1DX,KAAQ,aAAe,GAqDvB,KAAU,aAAe,GAQrB,KAAK,aAAe,CAAC,CAACE,EACtB,KAAK,mBAAqBC,EACtB,KAAK,cACL,KAAK,KAAK,EAEd,KAAK,QAAUF,CACnB,CA1EA,IAAI,iBAA2B,CAC3B,MAAO,EACX,CAOA,IAAW,MAAgB,CAvC/B,IAAAG,EAAAC,EAwCQ,OAAOA,GAAAD,EAAA,KAAK,UAAL,YAAAA,EAAc,OAAd,KAAAC,EAAsB,KAAK,YACtC,CAKA,IAAW,KAAKC,EAAe,CAC3B,GAAIA,IAAS,KAAK,KAElB,IADA,KAAK,aAAeA,EAChB,KAAK,QAAS,CAEd,KAAK,QAAQ,KAAOA,EACpB,MACJ,CACKA,IAOL,eACK,YAAY,YAAY,EACxB,KAAK,SAA2B,CAC7B,KAAM,CAAE,QAAAC,CAAQ,EAAI,KAAM,QAAO,cAAc,EAC/C,KAAK,QAAU,IAAIA,EACnB,KAAK,QAAQ,KAAO,EACxB,CAAC,EACL,OAAO,gDAAgD,GAC3D,CAEA,IAAW,SAA2B,CAClC,OAAO,KAAK,QAChB,CAEA,IAAW,QAAQN,EAAsC,CA3E7D,IAAAG,EA4EaH,GACD,KAAK,UAAYA,IACjB,KAAK,SACL,KAAK,QAAQ,iBAAiB,IAAI,EAEtC,KAAK,SAAWA,EAChB,KAAK,QAAQ,cAAc,IAAI,EAC/B,KAAK,YAAY,EACjB,KAAK,mBAAmB,KAAK,MAAM,GACnCG,EAAA,KAAK,qBAAL,MAAAA,EAAA,UAA0B,KAAK,SACnC,CAoBA,mBAAmBI,EAAsB,CAAC,CAE1C,oBAA2B,CAAC,CAE5B,oBAA2B,CAAC,CAG5B,MAAa,CAEb,CAGA,aAAoB,CAEpB,CAEA,OAAc,CA1HlB,IAAAJ,EA2HQ,KAAK,mBAAmB,GACxBA,EAAA,KAAK,kBAAL,MAAAA,EAAsB,OAC1B,CAEA,eAAsB,CAClB,KAAK,KAAK,CACd,CAEA,kBAAyB,CAChB,KAAK,cACN,KAAK,MAAM,CAEnB,CACJ",
6
+ "names": ["InteractionTypes", "target", "overlay", "isPersistent", "handleOverlayReady", "_a", "_b", "open", "Overlay", "_"]
7
+ }
@@ -0,0 +1,21 @@
1
+ import { InteractionController, InteractionTypes } from './InteractionController.js';
2
+ export declare const LONGPRESS_INSTRUCTIONS: {
3
+ touch: string;
4
+ keyboard: string;
5
+ mouse: string;
6
+ };
7
+ export declare class LongpressController extends InteractionController {
8
+ type: InteractionTypes;
9
+ get activelyOpening(): boolean;
10
+ protected longpressState: null | 'potential' | 'opening' | 'pressed';
11
+ releaseDescription: () => void;
12
+ private timeout;
13
+ handleLongpress(): void;
14
+ handlePointerdown(event: PointerEvent): void;
15
+ private handlePointerup;
16
+ private handleKeydown;
17
+ private handleKeyup;
18
+ prepareDescription(trigger: HTMLElement): void;
19
+ shouldCompleteOpen(): void;
20
+ init(): void;
21
+ }
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ import {
3
+ isAndroid,
4
+ isIOS
5
+ } from "@spectrum-web-components/shared/src/platform.js";
6
+ import { conditionAttributeWithId } from "@spectrum-web-components/base/src/condition-attribute-with-id.js";
7
+ import { randomID } from "@spectrum-web-components/shared/src/random-id.js";
8
+ import { noop } from "./AbstractOverlay.dev.js";
9
+ import {
10
+ InteractionController,
11
+ InteractionTypes
12
+ } from "./InteractionController.dev.js";
13
+ const LONGPRESS_DURATION = 300;
14
+ export const LONGPRESS_INSTRUCTIONS = {
15
+ touch: "Double tap and long press for additional options",
16
+ keyboard: "Press Space or Alt+Down Arrow for additional options",
17
+ mouse: "Click and hold for additional options"
18
+ };
19
+ export class LongpressController extends InteractionController {
20
+ constructor() {
21
+ super(...arguments);
22
+ this.type = InteractionTypes.longpress;
23
+ this.longpressState = null;
24
+ this.releaseDescription = noop;
25
+ this.handlePointerup = () => {
26
+ var _a;
27
+ clearTimeout(this.timeout);
28
+ if (!this.target) return;
29
+ this.longpressState = ((_a = this.overlay) == null ? void 0 : _a.state) === "opening" ? "pressed" : null;
30
+ document.removeEventListener("pointerup", this.handlePointerup);
31
+ document.removeEventListener("pointercancel", this.handlePointerup);
32
+ };
33
+ }
34
+ get activelyOpening() {
35
+ return this.longpressState === "opening" || this.longpressState === "pressed";
36
+ }
37
+ handleLongpress() {
38
+ this.open = true;
39
+ this.longpressState = this.longpressState === "potential" ? "opening" : "pressed";
40
+ }
41
+ handlePointerdown(event) {
42
+ if (!this.target) return;
43
+ if (event.button !== 0) return;
44
+ this.longpressState = "potential";
45
+ document.addEventListener("pointerup", this.handlePointerup);
46
+ document.addEventListener("pointercancel", this.handlePointerup);
47
+ const triggerHandlesLongpress = "holdAffordance" in this.target;
48
+ if (triggerHandlesLongpress) return;
49
+ this.timeout = setTimeout(() => {
50
+ if (!this.target) return;
51
+ this.target.dispatchEvent(
52
+ new CustomEvent("longpress", {
53
+ bubbles: true,
54
+ composed: true,
55
+ detail: {
56
+ source: "pointer"
57
+ }
58
+ })
59
+ );
60
+ }, LONGPRESS_DURATION);
61
+ }
62
+ handleKeydown(event) {
63
+ const { code, altKey } = event;
64
+ if (altKey && code === "ArrowDown") {
65
+ event.stopPropagation();
66
+ event.stopImmediatePropagation();
67
+ }
68
+ }
69
+ handleKeyup(event) {
70
+ const { code, altKey } = event;
71
+ if (code === "Space" || altKey && code === "ArrowDown") {
72
+ if (!this.target) {
73
+ return;
74
+ }
75
+ event.stopPropagation();
76
+ this.target.dispatchEvent(
77
+ new CustomEvent("longpress", {
78
+ bubbles: true,
79
+ composed: true,
80
+ detail: {
81
+ source: "keyboard"
82
+ }
83
+ })
84
+ );
85
+ setTimeout(() => {
86
+ this.longpressState = null;
87
+ });
88
+ }
89
+ }
90
+ prepareDescription(trigger) {
91
+ if (
92
+ // do not reapply until target is recycled
93
+ this.releaseDescription !== noop || // require "longpress content" to apply relationship
94
+ !this.overlay.elements.length
95
+ ) {
96
+ return;
97
+ }
98
+ const longpressDescription = document.createElement("div");
99
+ longpressDescription.id = `longpress-describedby-descriptor-${randomID()}`;
100
+ const messageType = isIOS() || isAndroid() ? "touch" : "keyboard";
101
+ longpressDescription.textContent = LONGPRESS_INSTRUCTIONS[messageType];
102
+ longpressDescription.slot = "longpress-describedby-descriptor";
103
+ const triggerParent = trigger.getRootNode();
104
+ const overlayParent = this.overlay.getRootNode();
105
+ if (triggerParent === overlayParent) {
106
+ this.overlay.append(longpressDescription);
107
+ } else {
108
+ longpressDescription.hidden = !("host" in triggerParent);
109
+ trigger.insertAdjacentElement("afterend", longpressDescription);
110
+ }
111
+ const releaseDescription = conditionAttributeWithId(
112
+ trigger,
113
+ "aria-describedby",
114
+ [longpressDescription.id]
115
+ );
116
+ this.releaseDescription = () => {
117
+ releaseDescription();
118
+ longpressDescription.remove();
119
+ this.releaseDescription = noop;
120
+ };
121
+ }
122
+ shouldCompleteOpen() {
123
+ this.longpressState = this.longpressState === "pressed" ? null : this.longpressState;
124
+ }
125
+ init() {
126
+ var _a;
127
+ (_a = this.abortController) == null ? void 0 : _a.abort();
128
+ this.abortController = new AbortController();
129
+ const { signal } = this.abortController;
130
+ this.target.addEventListener(
131
+ "longpress",
132
+ () => this.handleLongpress(),
133
+ { signal }
134
+ );
135
+ this.target.addEventListener(
136
+ "pointerdown",
137
+ (event) => this.handlePointerdown(event),
138
+ { signal }
139
+ );
140
+ this.prepareDescription(this.target);
141
+ if (this.target.holdAffordance) {
142
+ return;
143
+ }
144
+ this.target.addEventListener(
145
+ "keydown",
146
+ (event) => this.handleKeydown(event),
147
+ { signal }
148
+ );
149
+ this.target.addEventListener(
150
+ "keyup",
151
+ (event) => this.handleKeyup(event),
152
+ { signal }
153
+ );
154
+ }
155
+ }
156
+ //# sourceMappingURL=LongpressController.dev.js.map