@rxdrag/website-lib 0.0.151 → 0.0.153

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 (51) hide show
  1. package/README.md +2 -2
  2. package/components/AnimationNumber.astro +217 -217
  3. package/components/Background.astro +140 -114
  4. package/components/BackgroundGroup.astro +20 -26
  5. package/components/BaseFooter.astro +24 -39
  6. package/components/BaseHeader.astro +22 -25
  7. package/components/Box.astro +20 -22
  8. package/components/Button.astro +80 -0
  9. package/components/Carousel.astro +456 -315
  10. package/components/CarouselPagination.astro +97 -76
  11. package/components/CarouselSlide.astro +10 -16
  12. package/components/Collapse.astro +125 -125
  13. package/components/CollapseIndicator.astro +20 -20
  14. package/components/Container.astro +27 -32
  15. package/components/Content.astro +20 -0
  16. package/components/CookieConsent.astro +47 -47
  17. package/components/CookieConsent.css +52 -52
  18. package/components/CookieConsentConfig.ts +208 -208
  19. package/components/Dialog.astro +342 -338
  20. package/components/DialogTrigger.astro +32 -32
  21. package/components/Document.astro +240 -225
  22. package/components/Frame.astro +32 -0
  23. package/components/GlassBorder.astro +104 -0
  24. package/components/GlassRefraction.astro +85 -0
  25. package/components/GradientBorder.astro +80 -0
  26. package/components/Grid.astro +32 -34
  27. package/components/GridCell.astro +28 -32
  28. package/components/Heading.astro +24 -24
  29. package/components/Icon.astro +29 -29
  30. package/components/Image.astro +100 -100
  31. package/components/Image.md +14 -14
  32. package/components/Link.astro +89 -99
  33. package/components/Main.astro +17 -17
  34. package/components/Meta.astro +65 -65
  35. package/components/Popover.astro +189 -189
  36. package/components/RichTextView.astro +28 -28
  37. package/components/Section.astro +26 -44
  38. package/components/TabButton.astro +32 -16
  39. package/components/TabPanel.astro +20 -19
  40. package/components/Tabs.astro +220 -147
  41. package/components/Video.astro +6 -4
  42. package/components/YearsSince.astro +20 -20
  43. package/components//344/270/211/345/261/202/346/250/241/345/236/213.md +5 -5
  44. package/components//344/270/273/351/242/230Token.md +198 -198
  45. package/components//345/216/237/345/255/220/345/206/273/347/273/223/346/270/205/345/215/225.md +270 -260
  46. package/components//347/211/251/346/226/231/346/270/205/345/215/225.md +599 -567
  47. package/index.ts +5 -5
  48. package/package.json +7 -7
  49. package/components/BaseBlock.astro +0 -34
  50. package/components/Motion.astro +0 -77
  51. package/components/Stack.astro +0 -31
@@ -1,338 +1,342 @@
1
- ---
2
- interface Props {
3
- dialogId: string;
4
- dialogClass?: string | string[];
5
- backdropClass?: string | string[];
6
- closeSelector?: string;
7
- closeAnimMs?: number;
8
- forceFallback?: boolean;
9
- preset?: "center" | "top";
10
- openAnimMs?: number;
11
- translateY?: number;
12
- backdropOpacity?: number;
13
- backdropBlurPx?: number;
14
- topOffsetPx?: number;
15
- baseTransform?: string;
16
- left?: string;
17
- right?: string;
18
- top?: string;
19
- bottom?: string;
20
- openTransform?: string;
21
- enterTransform?: string;
22
- exitTransform?: string;
23
- }
24
-
25
- const {
26
- dialogId,
27
- dialogClass = "",
28
- backdropClass = "",
29
- closeSelector = "[data-dialog-close]",
30
- closeAnimMs = 240,
31
- forceFallback = false,
32
- preset = "center",
33
- openAnimMs = 320,
34
- translateY = 64,
35
- backdropOpacity = 0.35,
36
- backdropBlurPx = 0,
37
- topOffsetPx = 0,
38
- baseTransform,
39
- left,
40
- right,
41
- top,
42
- bottom,
43
- openTransform,
44
- enterTransform,
45
- exitTransform,
46
- } = Astro.props;
47
-
48
- const backdropClassString = Array.isArray(backdropClass)
49
- ? backdropClass.join(" ")
50
- : backdropClass;
51
-
52
- const resolvedBaseTransform =
53
- baseTransform ||
54
- (preset === "center" ? "translate(-50%,-50%)" : "translateX(-50%)");
55
-
56
- const resolvedLeft = left ?? (preset === "center" || preset === "top" ? "50%" : "auto");
57
- const resolvedRight = right ?? "auto";
58
- const resolvedTop = top ?? (preset === "center" ? "50%" : "0");
59
- const resolvedBottom = bottom ?? "auto";
60
-
61
- const resolvedOpenTransform = openTransform || resolvedBaseTransform;
62
- const resolvedEnterTransform =
63
- enterTransform || `${resolvedOpenTransform} translateY(${translateY}px)`;
64
- const resolvedExitTransform =
65
- exitTransform || `${resolvedOpenTransform} translateY(${translateY}px)`;
66
- ---
67
-
68
- <style is:global>
69
- dialog[data-generic-dialog] {
70
- margin: 0;
71
- outline: none;
72
- position: fixed;
73
- left: var(--dialog-left);
74
- right: var(--dialog-right);
75
- top: var(--dialog-top);
76
- bottom: var(--dialog-bottom);
77
- transform: var(--dialog-open-transform);
78
- }
79
-
80
- @keyframes genericDialogIn {
81
- from {
82
- opacity: 0;
83
- transform: var(--dialog-enter-transform);
84
- }
85
- to {
86
- opacity: 1;
87
- transform: var(--dialog-open-transform);
88
- }
89
- }
90
-
91
- @keyframes genericDialogOut {
92
- from {
93
- opacity: 1;
94
- transform: var(--dialog-open-transform);
95
- }
96
- to {
97
- opacity: 0;
98
- transform: var(--dialog-exit-transform);
99
- }
100
- }
101
-
102
- @keyframes genericBackdropIn {
103
- from {
104
- opacity: 0;
105
- }
106
- to {
107
- opacity: 1;
108
- }
109
- }
110
-
111
- @keyframes genericBackdropOut {
112
- from {
113
- opacity: 1;
114
- }
115
- to {
116
- opacity: 0;
117
- }
118
- }
119
-
120
- dialog[data-generic-dialog][open] {
121
- animation: genericDialogIn var(--dialog-open-ms) ease-out;
122
- transform-origin: top center;
123
- }
124
-
125
- dialog[data-generic-dialog][data-dialog-state="closing"] {
126
- animation: genericDialogOut var(--dialog-close-ms) ease-in;
127
- animation-fill-mode: forwards;
128
- transform-origin: top center;
129
- }
130
-
131
- dialog[data-generic-dialog]::backdrop {
132
- background: rgba(0, 0, 0, var(--dialog-backdrop-opacity));
133
- backdrop-filter: blur(var(--dialog-backdrop-blur));
134
- animation: genericBackdropIn var(--dialog-open-ms) ease-out;
135
- }
136
-
137
- dialog[data-generic-dialog][data-dialog-state="closing"]::backdrop {
138
- animation: genericBackdropOut var(--dialog-close-ms) ease-in;
139
- }
140
-
141
- dialog[data-generic-dialog] + .backdrop {
142
- animation: genericBackdropIn var(--dialog-open-ms) ease-out;
143
- }
144
-
145
- dialog[data-generic-dialog] + .backdrop[data-dialog-state="closing"] {
146
- animation: genericBackdropOut var(--dialog-close-ms) ease-in;
147
- }
148
- </style>
149
-
150
- <dialog
151
- id={dialogId}
152
- data-generic-dialog
153
- data-openable-key={dialogId}
154
- data-dialog-preset={preset}
155
- tabindex="-1"
156
- class:list={[dialogClass]}
157
- style={preset === "center"
158
- ? `--dialog-left:${resolvedLeft};--dialog-right:${resolvedRight};--dialog-top:${resolvedTop};--dialog-bottom:${resolvedBottom};--dialog-open-transform:${resolvedOpenTransform};--dialog-enter-transform:${resolvedEnterTransform};--dialog-exit-transform:${resolvedExitTransform};--dialog-open-ms:${openAnimMs}ms;--dialog-close-ms:${closeAnimMs}ms;--dialog-ty:${translateY}px;--dialog-backdrop-opacity:${backdropOpacity};--dialog-backdrop-blur:${backdropBlurPx}px;`
159
- : `--dialog-left:${resolvedLeft};--dialog-right:${resolvedRight};--dialog-top:${resolvedTop};--dialog-bottom:${resolvedBottom};--dialog-open-transform:${resolvedOpenTransform};--dialog-enter-transform:${resolvedEnterTransform};--dialog-exit-transform:${resolvedExitTransform};--dialog-open-ms:${openAnimMs}ms;--dialog-close-ms:${closeAnimMs}ms;--dialog-ty:${translateY}px;--dialog-backdrop-opacity:${backdropOpacity};--dialog-backdrop-blur:${backdropBlurPx}px;margin-top:${topOffsetPx}px;`}
160
- >
161
- <slot />
162
- </dialog>
163
-
164
- <script
165
- is:inline
166
- define:vars={{
167
- openableKey: dialogId,
168
- closeSelector,
169
- closeAnimMs,
170
- forceFallback,
171
- backdropClassString,
172
- openAnimMs,
173
- backdropOpacity,
174
- backdropBlurPx,
175
- }}
176
- >
177
- (() => {
178
- const globalKey = "__generic_dialog_open_bound__";
179
- const w = window;
180
- if (!w[globalKey]) w[globalKey] = new Set();
181
-
182
- const backdropClass = backdropClassString || "";
183
-
184
- const isDialogEl = (el) => {
185
- if (!(el instanceof HTMLElement)) return false;
186
- return el.tagName.toLowerCase() === "dialog";
187
- };
188
-
189
- const getDialog = () => {
190
- const el = document.getElementById(openableKey);
191
- if (!isDialogEl(el)) {
192
- return null;
193
- }
194
- return el;
195
- };
196
-
197
- const isOpen = (dialog) => {
198
- return dialog.open === true || dialog.hasAttribute("open");
199
- };
200
-
201
- const ensureBackdrop = (dialog) => {
202
- if (dialog.nextElementSibling?.classList?.contains("backdrop")) return;
203
- const backdrop = document.createElement("div");
204
- backdrop.className = backdropClass
205
- ? `backdrop ${backdropClass}`
206
- : "backdrop";
207
- backdrop.removeAttribute("data-dialog-state");
208
- backdrop.style.background = `rgba(0, 0, 0, ${backdropOpacity})`;
209
- backdrop.style.backdropFilter = backdropBlurPx
210
- ? `blur(${backdropBlurPx}px)`
211
- : "";
212
- backdrop.style.animation = `genericBackdropIn ${openAnimMs}ms ease-out`;
213
- backdrop.addEventListener("click", () =>
214
- requestClose(dialog, "backdrop")
215
- );
216
- dialog.insertAdjacentElement("afterend", backdrop);
217
- };
218
-
219
- const getBackdrop = (dialog) => {
220
- const next = dialog.nextElementSibling;
221
- if (next && next.classList?.contains("backdrop")) return next;
222
- return null;
223
- };
224
-
225
- const removeBackdrop = (dialog) => {
226
- const next = dialog.nextElementSibling;
227
- if (next && next.classList?.contains("backdrop")) {
228
- next.remove();
229
- }
230
- };
231
-
232
- const closeNow = (dialog) => {
233
- if (typeof dialog.close === "function") {
234
- dialog.close();
235
- } else {
236
- dialog.removeAttribute("open");
237
- }
238
- removeBackdrop(dialog);
239
- document.removeEventListener("keydown", dialog.__genericDialogEscHandler);
240
- dialog.__genericDialogEscHandler = undefined;
241
- };
242
-
243
- const requestClose = (dialog, reason = "unknown") => {
244
- if (!isOpen(dialog)) return;
245
- if (dialog.getAttribute("data-dialog-state") === "closing") return;
246
- dialog.setAttribute("data-dialog-state", "closing");
247
- const backdrop = getBackdrop(dialog);
248
- backdrop?.setAttribute?.("data-dialog-state", "closing");
249
- if (backdrop) {
250
- backdrop.style.animation = `genericBackdropOut ${closeAnimMs}ms ease-in`;
251
- }
252
- window.setTimeout(() => {
253
- dialog.removeAttribute("data-dialog-state");
254
- closeNow(dialog);
255
- }, closeAnimMs);
256
- };
257
-
258
- const ensureDialogBound = (dialog) => {
259
- if (dialog.dataset.genericDialogBound) return;
260
- dialog.dataset.genericDialogBound = "1";
261
-
262
- dialog.addEventListener("click", (e) => {
263
- if (e.target === dialog) requestClose(dialog, "dialog_blank_area");
264
- });
265
-
266
- if (typeof dialog.addEventListener === "function") {
267
- dialog.addEventListener("cancel", (e) => {
268
- e.preventDefault();
269
- requestClose(dialog, "cancel");
270
- });
271
- }
272
-
273
- dialog
274
- .querySelector(closeSelector)
275
- ?.addEventListener("click", () =>
276
- requestClose(dialog, "close_selector")
277
- );
278
- };
279
-
280
- const open = () => {
281
- const dialog = getDialog();
282
- if (!dialog) return;
283
- ensureDialogBound(dialog);
284
- if (isOpen(dialog)) return;
285
-
286
- try {
287
- const { scrollX, scrollY } = window;
288
- dialog.removeAttribute("data-dialog-state");
289
-
290
- const effectiveForceFallback =
291
- forceFallback === true || window.__force_dialog_fallback__ === true;
292
-
293
- if (!effectiveForceFallback && typeof dialog.showModal === "function") {
294
- dialog.showModal();
295
- } else {
296
- ensureBackdrop(dialog);
297
- dialog.setAttribute("open", "");
298
- dialog.__genericDialogEscHandler = (e) => {
299
- if (e.key === "Escape") requestClose(dialog, "esc");
300
- };
301
- document.addEventListener(
302
- "keydown",
303
- dialog.__genericDialogEscHandler
304
- );
305
- }
306
-
307
- requestAnimationFrame(() => {
308
- window.scrollTo(scrollX, scrollY);
309
- try {
310
- dialog.focus({ preventScroll: true });
311
- } catch {
312
- dialog.focus();
313
- }
314
- });
315
- } catch (err) {
316
- }
317
- };
318
-
319
- const init = () => {
320
- if (!w[globalKey].has(openableKey)) {
321
- w[globalKey].add(openableKey);
322
- document.addEventListener("click", (e) => {
323
- const target = e.target;
324
- if (!(target instanceof Element)) return;
325
- const opener = target.closest(`[data-modal-open="${openableKey}"]`);
326
- if (!opener) return;
327
- const cta = opener.getAttribute("data-call-to-action") || "";
328
- window.lastCta = cta;
329
- open();
330
- });
331
- }
332
- };
333
-
334
- init();
335
- document.addEventListener("astro:page-load", init);
336
- document.addEventListener("astro:after-swap", init);
337
- })();
338
- </script>
1
+ ---
2
+ interface Props {
3
+ dialogId: string;
4
+ dialogClass?: string | string[];
5
+ backdropClass?: string | string[];
6
+ closeSelector?: string;
7
+ closeAnimMs?: number;
8
+ forceFallback?: boolean;
9
+ preset?: "center" | "top";
10
+ openAnimMs?: number;
11
+ translateY?: number;
12
+ backdropOpacity?: number;
13
+ backdropBlurPx?: number;
14
+ topOffsetPx?: number;
15
+ baseTransform?: string;
16
+ left?: string;
17
+ right?: string;
18
+ top?: string;
19
+ bottom?: string;
20
+ openTransform?: string;
21
+ enterTransform?: string;
22
+ exitTransform?: string;
23
+ }
24
+
25
+ const {
26
+ dialogId,
27
+ dialogClass = "",
28
+ backdropClass = "",
29
+ closeSelector = "[data-dialog-close]",
30
+ closeAnimMs = 240,
31
+ forceFallback = false,
32
+ preset = "center",
33
+ openAnimMs = 320,
34
+ translateY = 64,
35
+ backdropOpacity = 0.35,
36
+ backdropBlurPx = 0,
37
+ topOffsetPx = 0,
38
+ baseTransform,
39
+ left,
40
+ right,
41
+ top,
42
+ bottom,
43
+ openTransform,
44
+ enterTransform,
45
+ exitTransform,
46
+ } = Astro.props;
47
+
48
+ const backdropClassString = Array.isArray(backdropClass)
49
+ ? backdropClass.join(" ")
50
+ : backdropClass;
51
+
52
+ const resolvedBaseTransform =
53
+ baseTransform ||
54
+ (preset === "center" ? "translate(-50%,-50%)" : "translateX(-50%)");
55
+
56
+ const resolvedLeft = left ?? (preset === "center" || preset === "top" ? "50%" : "auto");
57
+ const resolvedRight = right ?? "auto";
58
+ const resolvedTop = top ?? (preset === "center" ? "50%" : "0");
59
+ const resolvedBottom = bottom ?? "auto";
60
+
61
+ const resolvedOpenTransform = openTransform || resolvedBaseTransform;
62
+ const resolvedEnterTransform =
63
+ enterTransform || `${resolvedOpenTransform} translateY(${translateY}px)`;
64
+ const resolvedExitTransform =
65
+ exitTransform || `${resolvedOpenTransform} translateY(${translateY}px)`;
66
+ ---
67
+
68
+ <style is:global>
69
+ dialog[data-generic-dialog] {
70
+ margin: 0;
71
+ outline: none;
72
+ position: fixed;
73
+ left: var(--dialog-left);
74
+ right: var(--dialog-right);
75
+ top: var(--dialog-top);
76
+ bottom: var(--dialog-bottom);
77
+ transform: var(--dialog-open-transform);
78
+ transition: none !important;
79
+ }
80
+
81
+ @keyframes genericDialogIn {
82
+ from {
83
+ opacity: 0;
84
+ transform: var(--dialog-enter-transform);
85
+ }
86
+ to {
87
+ opacity: 1;
88
+ transform: var(--dialog-open-transform);
89
+ }
90
+ }
91
+
92
+ @keyframes genericDialogOut {
93
+ from {
94
+ opacity: 1;
95
+ transform: var(--dialog-open-transform);
96
+ }
97
+ to {
98
+ opacity: 0;
99
+ transform: var(--dialog-exit-transform);
100
+ }
101
+ }
102
+
103
+ @keyframes genericBackdropIn {
104
+ from {
105
+ opacity: 0;
106
+ }
107
+ to {
108
+ opacity: 1;
109
+ }
110
+ }
111
+
112
+ @keyframes genericBackdropOut {
113
+ from {
114
+ opacity: 1;
115
+ }
116
+ to {
117
+ opacity: 0;
118
+ }
119
+ }
120
+
121
+ dialog[data-generic-dialog][open] {
122
+ animation: genericDialogIn var(--dialog-open-ms) ease-out;
123
+ animation-fill-mode: both;
124
+ transform-origin: top center;
125
+ will-change: transform, opacity;
126
+ }
127
+
128
+ dialog[data-generic-dialog][data-dialog-state="closing"] {
129
+ animation: genericDialogOut var(--dialog-close-ms) ease-in;
130
+ animation-fill-mode: both;
131
+ transform-origin: top center;
132
+ will-change: transform, opacity;
133
+ }
134
+
135
+ dialog[data-generic-dialog]::backdrop {
136
+ background: rgba(0, 0, 0, var(--dialog-backdrop-opacity));
137
+ backdrop-filter: blur(var(--dialog-backdrop-blur));
138
+ animation: genericBackdropIn var(--dialog-open-ms) ease-out;
139
+ }
140
+
141
+ dialog[data-generic-dialog][data-dialog-state="closing"]::backdrop {
142
+ animation: genericBackdropOut var(--dialog-close-ms) ease-in;
143
+ }
144
+
145
+ dialog[data-generic-dialog] + .backdrop {
146
+ animation: genericBackdropIn var(--dialog-open-ms) ease-out;
147
+ }
148
+
149
+ dialog[data-generic-dialog] + .backdrop[data-dialog-state="closing"] {
150
+ animation: genericBackdropOut var(--dialog-close-ms) ease-in;
151
+ }
152
+ </style>
153
+
154
+ <dialog
155
+ id={dialogId}
156
+ data-generic-dialog
157
+ data-openable-key={dialogId}
158
+ data-dialog-preset={preset}
159
+ tabindex="-1"
160
+ class:list={[dialogClass]}
161
+ style={preset === "center"
162
+ ? `--dialog-left:${resolvedLeft};--dialog-right:${resolvedRight};--dialog-top:${resolvedTop};--dialog-bottom:${resolvedBottom};--dialog-open-transform:${resolvedOpenTransform};--dialog-enter-transform:${resolvedEnterTransform};--dialog-exit-transform:${resolvedExitTransform};--dialog-open-ms:${openAnimMs}ms;--dialog-close-ms:${closeAnimMs}ms;--dialog-ty:${translateY}px;--dialog-backdrop-opacity:${backdropOpacity};--dialog-backdrop-blur:${backdropBlurPx}px;`
163
+ : `--dialog-left:${resolvedLeft};--dialog-right:${resolvedRight};--dialog-top:${resolvedTop};--dialog-bottom:${resolvedBottom};--dialog-open-transform:${resolvedOpenTransform};--dialog-enter-transform:${resolvedEnterTransform};--dialog-exit-transform:${resolvedExitTransform};--dialog-open-ms:${openAnimMs}ms;--dialog-close-ms:${closeAnimMs}ms;--dialog-ty:${translateY}px;--dialog-backdrop-opacity:${backdropOpacity};--dialog-backdrop-blur:${backdropBlurPx}px;margin-top:${topOffsetPx}px;`}
164
+ >
165
+ <slot />
166
+ </dialog>
167
+
168
+ <script
169
+ is:inline
170
+ define:vars={{
171
+ openableKey: dialogId,
172
+ closeSelector,
173
+ closeAnimMs,
174
+ forceFallback,
175
+ backdropClassString,
176
+ openAnimMs,
177
+ backdropOpacity,
178
+ backdropBlurPx,
179
+ }}
180
+ >
181
+ (() => {
182
+ const globalKey = "__generic_dialog_open_bound__";
183
+ const w = window;
184
+ if (!w[globalKey]) w[globalKey] = new Set();
185
+
186
+ const backdropClass = backdropClassString || "";
187
+
188
+ const isDialogEl = (el) => {
189
+ if (!(el instanceof HTMLElement)) return false;
190
+ return el.tagName.toLowerCase() === "dialog";
191
+ };
192
+
193
+ const getDialog = () => {
194
+ const el = document.getElementById(openableKey);
195
+ if (!isDialogEl(el)) {
196
+ return null;
197
+ }
198
+ return el;
199
+ };
200
+
201
+ const isOpen = (dialog) => {
202
+ return dialog.open === true || dialog.hasAttribute("open");
203
+ };
204
+
205
+ const ensureBackdrop = (dialog) => {
206
+ if (dialog.nextElementSibling?.classList?.contains("backdrop")) return;
207
+ const backdrop = document.createElement("div");
208
+ backdrop.className = backdropClass
209
+ ? `backdrop ${backdropClass}`
210
+ : "backdrop";
211
+ backdrop.removeAttribute("data-dialog-state");
212
+ backdrop.style.background = `rgba(0, 0, 0, ${backdropOpacity})`;
213
+ backdrop.style.backdropFilter = backdropBlurPx
214
+ ? `blur(${backdropBlurPx}px)`
215
+ : "";
216
+ backdrop.style.animation = `genericBackdropIn ${openAnimMs}ms ease-out`;
217
+ backdrop.addEventListener("click", () =>
218
+ requestClose(dialog, "backdrop")
219
+ );
220
+ dialog.insertAdjacentElement("afterend", backdrop);
221
+ };
222
+
223
+ const getBackdrop = (dialog) => {
224
+ const next = dialog.nextElementSibling;
225
+ if (next && next.classList?.contains("backdrop")) return next;
226
+ return null;
227
+ };
228
+
229
+ const removeBackdrop = (dialog) => {
230
+ const next = dialog.nextElementSibling;
231
+ if (next && next.classList?.contains("backdrop")) {
232
+ next.remove();
233
+ }
234
+ };
235
+
236
+ const closeNow = (dialog) => {
237
+ if (typeof dialog.close === "function") {
238
+ dialog.close();
239
+ } else {
240
+ dialog.removeAttribute("open");
241
+ }
242
+ removeBackdrop(dialog);
243
+ document.removeEventListener("keydown", dialog.__genericDialogEscHandler);
244
+ dialog.__genericDialogEscHandler = undefined;
245
+ };
246
+
247
+ const requestClose = (dialog, reason = "unknown") => {
248
+ if (!isOpen(dialog)) return;
249
+ if (dialog.getAttribute("data-dialog-state") === "closing") return;
250
+ dialog.setAttribute("data-dialog-state", "closing");
251
+ const backdrop = getBackdrop(dialog);
252
+ backdrop?.setAttribute?.("data-dialog-state", "closing");
253
+ if (backdrop) {
254
+ backdrop.style.animation = `genericBackdropOut ${closeAnimMs}ms ease-in`;
255
+ }
256
+ window.setTimeout(() => {
257
+ dialog.removeAttribute("data-dialog-state");
258
+ closeNow(dialog);
259
+ }, closeAnimMs);
260
+ };
261
+
262
+ const ensureDialogBound = (dialog) => {
263
+ if (dialog.dataset.genericDialogBound) return;
264
+ dialog.dataset.genericDialogBound = "1";
265
+
266
+ dialog.addEventListener("click", (e) => {
267
+ if (e.target === dialog) requestClose(dialog, "dialog_blank_area");
268
+ });
269
+
270
+ if (typeof dialog.addEventListener === "function") {
271
+ dialog.addEventListener("cancel", (e) => {
272
+ e.preventDefault();
273
+ requestClose(dialog, "cancel");
274
+ });
275
+ }
276
+
277
+ dialog
278
+ .querySelector(closeSelector)
279
+ ?.addEventListener("click", () =>
280
+ requestClose(dialog, "close_selector")
281
+ );
282
+ };
283
+
284
+ const open = () => {
285
+ const dialog = getDialog();
286
+ if (!dialog) return;
287
+ ensureDialogBound(dialog);
288
+ if (isOpen(dialog)) return;
289
+
290
+ try {
291
+ const { scrollX, scrollY } = window;
292
+ dialog.removeAttribute("data-dialog-state");
293
+
294
+ const effectiveForceFallback =
295
+ forceFallback === true || window.__force_dialog_fallback__ === true;
296
+
297
+ if (!effectiveForceFallback && typeof dialog.showModal === "function") {
298
+ dialog.showModal();
299
+ } else {
300
+ ensureBackdrop(dialog);
301
+ dialog.setAttribute("open", "");
302
+ dialog.__genericDialogEscHandler = (e) => {
303
+ if (e.key === "Escape") requestClose(dialog, "esc");
304
+ };
305
+ document.addEventListener(
306
+ "keydown",
307
+ dialog.__genericDialogEscHandler
308
+ );
309
+ }
310
+
311
+ requestAnimationFrame(() => {
312
+ window.scrollTo(scrollX, scrollY);
313
+ try {
314
+ dialog.focus({ preventScroll: true });
315
+ } catch {
316
+ dialog.focus();
317
+ }
318
+ });
319
+ } catch (err) {
320
+ }
321
+ };
322
+
323
+ const init = () => {
324
+ if (!w[globalKey].has(openableKey)) {
325
+ w[globalKey].add(openableKey);
326
+ document.addEventListener("click", (e) => {
327
+ const target = e.target;
328
+ if (!(target instanceof Element)) return;
329
+ const opener = target.closest(`[data-modal-open="${openableKey}"]`);
330
+ if (!opener) return;
331
+ const cta = opener.getAttribute("data-call-to-action") || "";
332
+ window.lastCta = cta;
333
+ open();
334
+ });
335
+ }
336
+ };
337
+
338
+ init();
339
+ document.addEventListener("astro:page-load", init);
340
+ document.addEventListener("astro:after-swap", init);
341
+ })();
342
+ </script>