@deriv-web-design/ui 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -20,23 +20,36 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
+ AVATAR_DATA: () => AVATAR_DATA,
23
24
  Accordion: () => Accordion,
25
+ BottomSheet: () => BottomSheet,
24
26
  Breadcrumb: () => Breadcrumb,
25
27
  Button: () => Button,
28
+ COL_ONE_LOGOS: () => COL_ONE_LOGOS,
29
+ COL_TWO_LOGOS: () => COL_TWO_LOGOS,
30
+ CTABanner: () => CTABanner,
26
31
  Card: () => Card,
27
32
  Chip: () => Chip,
28
33
  ChipDropdown: () => ChipDropdown,
34
+ DayNightTransition: () => DayNightTransition,
35
+ FeatureCards: () => FeatureCards,
36
+ Footer: () => Footer,
37
+ Hero: () => Hero,
29
38
  Link: () => Link,
30
39
  Pagination: () => Pagination,
40
+ PaymentMethods: () => PaymentMethods,
41
+ SCROLLYTELLING_DATA: () => SCROLLYTELLING_DATA,
42
+ STEPS_DATA: () => STEPS_DATA,
43
+ Scrollytelling: () => Scrollytelling,
31
44
  SearchField: () => SearchField,
45
+ Stats: () => Stats,
46
+ StickyStackedCards: () => StickyStackedCards,
47
+ TEXT_CONTENT: () => TEXT_CONTENT,
32
48
  Tag: () => Tag,
33
49
  TextField: () => TextField
34
50
  });
35
51
  module.exports = __toCommonJS(index_exports);
36
52
 
37
- // primitives/Button/Button.module.css
38
- var Button_default = {};
39
-
40
53
  // primitives/Button/Button.tsx
41
54
  var import_jsx_runtime = require("react/jsx-runtime");
42
55
  var Button = ({
@@ -54,13 +67,13 @@ var Button = ({
54
67
  }) => {
55
68
  const isIconOnly = iconPosition === "icon-only";
56
69
  const classNames = [
57
- Button_default.button,
58
- Button_default[`${colorScheme}_${variant}`],
59
- isIconOnly ? Button_default.iconOnly : "",
60
- fullWidth ? Button_default.fullWidth : "",
70
+ "button",
71
+ `${colorScheme}_${variant}`,
72
+ isIconOnly ? "iconOnly" : "",
73
+ fullWidth ? "fullWidth" : "",
61
74
  className ?? ""
62
75
  ].filter(Boolean).join(" ");
63
- const iconNode = icon ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: Button_default.icon, children: icon }) : null;
76
+ const iconNode = icon ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "icon", children: icon }) : null;
64
77
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
65
78
  "button",
66
79
  {
@@ -70,18 +83,15 @@ var Button = ({
70
83
  ...props,
71
84
  children: [
72
85
  iconPosition === "icon-left" && iconNode,
73
- !isIconOnly && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: Button_default.label, children: label ?? children }),
86
+ !isIconOnly && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "label", children: label ?? children }),
74
87
  iconPosition === "icon-only" && iconNode,
75
88
  iconPosition === "icon-right" && iconNode,
76
- showFocusRing && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: Button_default.focusRing, "aria-hidden": "true" })
89
+ showFocusRing && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "focusRing", "aria-hidden": "true" })
77
90
  ]
78
91
  }
79
92
  );
80
93
  };
81
94
 
82
- // primitives/Link/Link.module.css
83
- var Link_default = {};
84
-
85
95
  // primitives/Link/Link.tsx
86
96
  var import_jsx_runtime2 = require("react/jsx-runtime");
87
97
  var ChevronIcon = () => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("path", { d: "M3 8h10M9 4l4 4-4 4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) });
@@ -98,10 +108,10 @@ var Link = ({
98
108
  }) => {
99
109
  const hasIcon = !!icon;
100
110
  const classNames = [
101
- Link_default.link,
102
- Link_default[colorScheme],
103
- hasIcon ? Link_default.withIcon : Link_default.withChevron,
104
- disabled ? Link_default.disabled : "",
111
+ "link",
112
+ colorScheme,
113
+ hasIcon ? "withIcon" : "withChevron",
114
+ disabled ? "disabled" : "",
105
115
  className ?? ""
106
116
  ].filter(Boolean).join(" ");
107
117
  const handleClick = (e) => {
@@ -120,17 +130,14 @@ var Link = ({
120
130
  onClick: handleClick,
121
131
  ...props,
122
132
  children: [
123
- hasIcon && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: Link_default.icon, children: icon }),
124
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: Link_default.label, children: label ?? children }),
125
- !hasIcon && showChevron && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: Link_default.chevron, "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ChevronIcon, {}) })
133
+ hasIcon && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "icon", children: icon }),
134
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "label", children: label ?? children }),
135
+ !hasIcon && showChevron && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "chevron", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ChevronIcon, {}) })
126
136
  ]
127
137
  }
128
138
  );
129
139
  };
130
140
 
131
- // primitives/Chip/Chip.module.css
132
- var Chip_default = {};
133
-
134
141
  // primitives/Chip/Chip.tsx
135
142
  var import_jsx_runtime3 = require("react/jsx-runtime");
136
143
  var Chip = ({
@@ -146,9 +153,9 @@ var Chip = ({
146
153
  ...props
147
154
  }) => {
148
155
  const classNames = [
149
- Chip_default.chip,
150
- Chip_default[size],
151
- selected ? Chip_default.selected : "",
156
+ "chip",
157
+ size,
158
+ selected ? "selected" : "",
152
159
  className ?? ""
153
160
  ].filter(Boolean).join(" ");
154
161
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
@@ -159,18 +166,15 @@ var Chip = ({
159
166
  "aria-pressed": selected,
160
167
  ...props,
161
168
  children: [
162
- icon && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: Chip_default.icon, children: icon }),
163
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: Chip_default.label, children: label ?? children }),
164
- tag && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: Chip_default.tag, children: tag }),
165
- showFocusRing && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: Chip_default.focusRing, "aria-hidden": "true" })
169
+ icon && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "icon", children: icon }),
170
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "label", children: label ?? children }),
171
+ tag && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "tag", children: tag }),
172
+ showFocusRing && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "focusRing", "aria-hidden": "true" })
166
173
  ]
167
174
  }
168
175
  );
169
176
  };
170
177
 
171
- // primitives/Tag/Tag.module.css
172
- var Tag_default = {};
173
-
174
178
  // primitives/Tag/Tag.tsx
175
179
  var import_jsx_runtime4 = require("react/jsx-runtime");
176
180
  var Tag = ({
@@ -184,25 +188,20 @@ var Tag = ({
184
188
  ...props
185
189
  }) => {
186
190
  const classNames = [
187
- Tag_default.tag,
188
- Tag_default[size],
189
- Tag_default[variant],
190
- Tag_default[fontWeight],
191
+ "tag",
192
+ size,
193
+ variant,
194
+ fontWeight,
191
195
  className ?? ""
192
196
  ].filter(Boolean).join(" ");
193
197
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: classNames, ...props, children: [
194
- icon && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: Tag_default.icon, children: icon }),
195
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: Tag_default.label, children: label ?? children })
198
+ icon && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "icon", children: icon }),
199
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "label", children: label ?? children })
196
200
  ] });
197
201
  };
198
202
 
199
203
  // primitives/Accordion/Accordion.tsx
200
204
  var import_react = require("react");
201
-
202
- // primitives/Accordion/Accordion.module.css
203
- var Accordion_default = {};
204
-
205
- // primitives/Accordion/Accordion.tsx
206
205
  var import_jsx_runtime5 = require("react/jsx-runtime");
207
206
  var ChevronIcon2 = () => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("path", { d: "M4 6l4 4 4-4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) });
208
207
  var Accordion = ({
@@ -224,7 +223,7 @@ var Accordion = ({
224
223
  if (!isControlled) setInternalOpen(next);
225
224
  onToggle?.(next);
226
225
  };
227
- const classNames = [Accordion_default.accordion, className ?? ""].filter(Boolean).join(" ");
226
+ const classNames = ["accordion", className ?? ""].filter(Boolean).join(" ");
228
227
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
229
228
  "div",
230
229
  {
@@ -237,17 +236,17 @@ var Accordion = ({
237
236
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
238
237
  "button",
239
238
  {
240
- className: Accordion_default.header,
239
+ className: "header",
241
240
  onClick: handleToggle,
242
241
  "aria-expanded": isOpen,
243
242
  children: [
244
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: Accordion_default.titleWrapper, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: Accordion_default.title, children: title }) }),
245
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: [Accordion_default.chevron, isOpen ? Accordion_default.chevronRotated : ""].filter(Boolean).join(" "), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ChevronIcon2, {}) }),
246
- showFocusRing && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: Accordion_default.focusRing, "aria-hidden": "true" })
243
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "titleWrapper", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "title", children: title }) }),
244
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: ["chevron", isOpen ? "chevronRotated" : ""].filter(Boolean).join(" "), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ChevronIcon2, {}) }),
245
+ showFocusRing && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "focusRing", "aria-hidden": "true" })
247
246
  ]
248
247
  }
249
248
  ),
250
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: [Accordion_default.bodyWrapper, isOpen ? Accordion_default.bodyWrapperOpen : ""].filter(Boolean).join(" "), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: Accordion_default.bodyInner, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: Accordion_default.body, children }) }) })
249
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: ["bodyWrapper", isOpen ? "bodyWrapperOpen" : ""].filter(Boolean).join(" "), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "bodyInner", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "body", children }) }) })
251
250
  ]
252
251
  }
253
252
  );
@@ -255,11 +254,6 @@ var Accordion = ({
255
254
 
256
255
  // primitives/TextField/TextField.tsx
257
256
  var import_react2 = require("react");
258
-
259
- // primitives/TextField/TextField.module.css
260
- var TextField_default = {};
261
-
262
- // primitives/TextField/TextField.tsx
263
257
  var import_jsx_runtime6 = require("react/jsx-runtime");
264
258
  var SuccessIcon = () => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [
265
259
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("circle", { cx: "8", cy: "8", r: "6", stroke: "currentColor", strokeWidth: "1.5" }),
@@ -279,9 +273,9 @@ var TextField = (0, import_react2.forwardRef)(
279
273
  ...inputProps
280
274
  }, ref) => {
281
275
  const wrapperClass = [
282
- TextField_default.wrapper,
283
- TextField_default[variant],
284
- TextField_default[status],
276
+ "tf-wrapper",
277
+ variant,
278
+ status,
285
279
  className ?? ""
286
280
  ].filter(Boolean).join(" ");
287
281
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: wrapperClass, "data-disabled": disabled || void 0, children: [
@@ -289,13 +283,13 @@ var TextField = (0, import_react2.forwardRef)(
289
283
  "input",
290
284
  {
291
285
  ref,
292
- className: TextField_default.input,
286
+ className: "tf-input",
293
287
  disabled,
294
288
  ...inputProps
295
289
  }
296
290
  ),
297
- status === "success" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: [TextField_default.iconSlot, TextField_default.iconSuccess].join(" "), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SuccessIcon, {}) }),
298
- status === "fail" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: [TextField_default.iconSlot, TextField_default.iconFail].join(" "), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FailIcon, {}) })
291
+ status === "success" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "iconSlot iconSuccess", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SuccessIcon, {}) }),
292
+ status === "fail" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "iconSlot iconFail", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FailIcon, {}) })
299
293
  ] });
300
294
  }
301
295
  );
@@ -303,11 +297,6 @@ TextField.displayName = "TextField";
303
297
 
304
298
  // primitives/SearchField/SearchField.tsx
305
299
  var import_react3 = require("react");
306
-
307
- // primitives/SearchField/SearchField.module.css
308
- var SearchField_default = {};
309
-
310
- // primitives/SearchField/SearchField.tsx
311
300
  var import_jsx_runtime7 = require("react/jsx-runtime");
312
301
  var SearchIcon = () => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [
313
302
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("circle", { cx: "6.5", cy: "6.5", r: "4", stroke: "currentColor", strokeWidth: "1.25" }),
@@ -372,8 +361,8 @@ var SearchField = (0, import_react3.forwardRef)(
372
361
  const showSuccessIcon = status === "success" && hasValue && !disabled;
373
362
  const showClearButton = hasValue && !disabled;
374
363
  const wrapperClass = [
375
- SearchField_default.wrapper,
376
- SearchField_default[status],
364
+ "sf-wrapper",
365
+ status,
377
366
  className ?? ""
378
367
  ].filter(Boolean).join(" ");
379
368
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
@@ -382,12 +371,12 @@ var SearchField = (0, import_react3.forwardRef)(
382
371
  className: wrapperClass,
383
372
  "data-disabled": disabled || void 0,
384
373
  children: [
385
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: SearchField_default.iconSlot, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SearchIcon, {}) }),
374
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "iconSlot", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SearchIcon, {}) }),
386
375
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
387
376
  "input",
388
377
  {
389
378
  ref: setRef,
390
- className: SearchField_default.input,
379
+ className: "sf-input",
391
380
  disabled,
392
381
  value,
393
382
  defaultValue,
@@ -395,13 +384,13 @@ var SearchField = (0, import_react3.forwardRef)(
395
384
  ...inputProps
396
385
  }
397
386
  ),
398
- showSuccessIcon && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: [SearchField_default.iconSlot, SearchField_default.iconSuccess].join(" "), children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SuccessIcon2, {}) }),
399
- showFailIcon && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: [SearchField_default.iconSlot, SearchField_default.iconFail].join(" "), children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(FailIcon2, {}) }),
387
+ showSuccessIcon && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "iconSlot iconSuccess", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SuccessIcon2, {}) }),
388
+ showFailIcon && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "iconSlot iconFail", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(FailIcon2, {}) }),
400
389
  showClearButton && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
401
390
  "button",
402
391
  {
403
392
  type: "button",
404
- className: SearchField_default.clearButton,
393
+ className: "clearButton",
405
394
  onClick: handleClear,
406
395
  "aria-label": "Clear search",
407
396
  tabIndex: -1,
@@ -416,14 +405,116 @@ var SearchField = (0, import_react3.forwardRef)(
416
405
  SearchField.displayName = "SearchField";
417
406
 
418
407
  // primitives/Breadcrumb/Breadcrumb.tsx
419
- var import_react4 = require("react");
408
+ var import_react5 = require("react");
420
409
 
421
- // primitives/Breadcrumb/Breadcrumb.module.css
422
- var Breadcrumb_default = {};
410
+ // primitives/BottomSheet/BottomSheet.tsx
411
+ var import_react4 = require("react");
412
+ var import_react_dom = require("react-dom");
413
+ var import_jsx_runtime8 = require("react/jsx-runtime");
414
+ var XMarkIcon = () => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
415
+ "svg",
416
+ {
417
+ width: "16",
418
+ height: "16",
419
+ viewBox: "0 0 16 16",
420
+ fill: "none",
421
+ xmlns: "http://www.w3.org/2000/svg",
422
+ "aria-hidden": "true",
423
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
424
+ "path",
425
+ {
426
+ d: "M3 3l10 10M13 3L3 13",
427
+ stroke: "currentColor",
428
+ strokeWidth: "1.5",
429
+ strokeLinecap: "round"
430
+ }
431
+ )
432
+ }
433
+ );
434
+ var BottomSheet = ({
435
+ open,
436
+ onClose,
437
+ title,
438
+ showHeader = true,
439
+ showHandleBar = true,
440
+ primaryAction,
441
+ secondaryAction,
442
+ children
443
+ }) => {
444
+ const titleId = (0, import_react4.useId)();
445
+ (0, import_react4.useEffect)(() => {
446
+ if (!open) return;
447
+ const handleKeyDown = (e) => {
448
+ if (e.key === "Escape") onClose();
449
+ };
450
+ document.addEventListener("keydown", handleKeyDown);
451
+ return () => document.removeEventListener("keydown", handleKeyDown);
452
+ }, [open, onClose]);
453
+ if (!open || typeof document === "undefined") return null;
454
+ return (0, import_react_dom.createPortal)(
455
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
456
+ "div",
457
+ {
458
+ className: "bs-overlay",
459
+ onClick: onClose,
460
+ "aria-hidden": "true",
461
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
462
+ "div",
463
+ {
464
+ className: "bs-sheet",
465
+ role: "dialog",
466
+ "aria-modal": "true",
467
+ "aria-labelledby": title ? titleId : void 0,
468
+ onClick: (e) => e.stopPropagation(),
469
+ children: [
470
+ showHandleBar && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "bs-handle-container", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "bs-handle-bar" }) }),
471
+ showHeader && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "bs-header", children: [
472
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "bs-header-spacer" }),
473
+ title && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { id: titleId, className: "bs-title", children: title }),
474
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "bs-close-container", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
475
+ "button",
476
+ {
477
+ type: "button",
478
+ className: "bs-close-btn",
479
+ onClick: onClose,
480
+ "aria-label": "Close",
481
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(XMarkIcon, {})
482
+ }
483
+ ) })
484
+ ] }),
485
+ children && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "bs-body", children }),
486
+ (primaryAction || secondaryAction) && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "bs-actions", children: [
487
+ primaryAction && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
488
+ "button",
489
+ {
490
+ type: "button",
491
+ className: "bs-action-primary",
492
+ onClick: primaryAction.onClick,
493
+ children: primaryAction.label
494
+ }
495
+ ),
496
+ secondaryAction && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
497
+ "button",
498
+ {
499
+ type: "button",
500
+ className: "bs-action-secondary",
501
+ onClick: secondaryAction.onClick,
502
+ children: secondaryAction.label
503
+ }
504
+ )
505
+ ] })
506
+ ]
507
+ }
508
+ )
509
+ }
510
+ ),
511
+ document.body
512
+ );
513
+ };
423
514
 
424
515
  // primitives/Breadcrumb/Breadcrumb.tsx
425
- var import_jsx_runtime8 = require("react/jsx-runtime");
426
- var ChevronRightIcon = () => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
516
+ var import_jsx_runtime9 = require("react/jsx-runtime");
517
+ var ChevronRightIcon = () => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
427
518
  "svg",
428
519
  {
429
520
  width: "1em",
@@ -432,7 +523,7 @@ var ChevronRightIcon = () => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
432
523
  fill: "none",
433
524
  xmlns: "http://www.w3.org/2000/svg",
434
525
  "aria-hidden": "true",
435
- children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
526
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
436
527
  "path",
437
528
  {
438
529
  d: "M6 3.5L10.5 8L6 12.5",
@@ -445,9 +536,9 @@ var ChevronRightIcon = () => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
445
536
  }
446
537
  );
447
538
  function BreadcrumbLink({ item }) {
448
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
449
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("a", { href: item.href, onClick: item.onClick, className: Breadcrumb_default.link, children: item.label }),
450
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: Breadcrumb_default.separator, "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ChevronRightIcon, {}) })
539
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
540
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("a", { href: item.href, onClick: item.onClick, className: "bc-link", children: item.label }),
541
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "bc-separator", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ChevronRightIcon, {}) })
451
542
  ] });
452
543
  }
453
544
  function Breadcrumb({
@@ -457,53 +548,67 @@ function Breadcrumb({
457
548
  className,
458
549
  ...navProps
459
550
  }) {
460
- const [expanded, setExpanded] = (0, import_react4.useState)(false);
551
+ const [sheetOpen, setSheetOpen] = (0, import_react5.useState)(false);
461
552
  const truncatable = collapsible && items.length > 3;
462
- const listClass = [
463
- Breadcrumb_default.list,
464
- Breadcrumb_default[size],
465
- truncatable ? Breadcrumb_default.collapsible : "",
466
- truncatable && expanded ? Breadcrumb_default.expanded : ""
467
- ].filter(Boolean).join(" ");
553
+ const listClass = ["bc-list", size, truncatable ? "collapsible" : ""].filter(Boolean).join(" ");
468
554
  if (!truncatable) {
469
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("nav", { "aria-label": "Breadcrumb", className, ...navProps, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("ol", { className: listClass, children: items.map((item, index) => {
555
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("nav", { "aria-label": "Breadcrumb", className, ...navProps, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("ol", { className: listClass, children: items.map((item, index) => {
470
556
  const isLast = index === items.length - 1;
471
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("li", { className: Breadcrumb_default.item, children: isLast ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: Breadcrumb_default.current, "aria-current": "page", children: item.label }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(BreadcrumbLink, { item }) }, index);
557
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("li", { className: "bc-item", children: isLast ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "bc-current", "aria-current": "page", children: item.label }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(BreadcrumbLink, { item }) }, index);
472
558
  }) }) });
473
559
  }
474
560
  const firstItem = items[0];
475
561
  const middleItems = items.slice(1, items.length - 2);
476
562
  const parentItem = items[items.length - 2];
477
563
  const currentItem = items[items.length - 1];
478
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("nav", { "aria-label": "Breadcrumb", className, ...navProps, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("ol", { className: listClass, children: [
479
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("li", { className: Breadcrumb_default.item, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(BreadcrumbLink, { item: firstItem }) }),
480
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("li", { className: Breadcrumb_default.ellipsisItem, "aria-hidden": expanded, children: [
481
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
482
- "button",
483
- {
484
- className: Breadcrumb_default.ellipsisButton,
485
- onClick: () => setExpanded(true),
486
- "aria-label": "Show all breadcrumb items",
487
- children: "\u2026"
488
- }
489
- ),
490
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: Breadcrumb_default.separator, "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ChevronRightIcon, {}) })
491
- ] }),
492
- middleItems.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("li", { className: Breadcrumb_default.middleItem, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(BreadcrumbLink, { item }) }, `m-${index}`)),
493
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("li", { className: Breadcrumb_default.item, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(BreadcrumbLink, { item: parentItem }) }),
494
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("li", { className: Breadcrumb_default.item, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: Breadcrumb_default.current, "aria-current": "page", children: currentItem.label }) })
495
- ] }) });
564
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
565
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("nav", { "aria-label": "Breadcrumb", className, ...navProps, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("ol", { className: listClass, children: [
566
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("li", { className: "bc-item", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(BreadcrumbLink, { item: firstItem }) }),
567
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("li", { className: "bc-ellipsisItem", children: [
568
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
569
+ "button",
570
+ {
571
+ className: "bc-ellipsisButton",
572
+ onClick: () => setSheetOpen(true),
573
+ "aria-label": "Show all breadcrumb items",
574
+ "aria-haspopup": "dialog",
575
+ children: "\u2026"
576
+ }
577
+ ),
578
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "bc-separator", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ChevronRightIcon, {}) })
579
+ ] }),
580
+ middleItems.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("li", { className: "bc-middleItem", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(BreadcrumbLink, { item }) }, `m-${index}`)),
581
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("li", { className: "bc-item", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(BreadcrumbLink, { item: parentItem }) }),
582
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("li", { className: "bc-item", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "bc-current", "aria-current": "page", children: currentItem.label }) })
583
+ ] }) }),
584
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
585
+ BottomSheet,
586
+ {
587
+ open: sheetOpen,
588
+ onClose: () => setSheetOpen(false),
589
+ showHandleBar: true,
590
+ showHeader: false,
591
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("ul", { className: "bc-sheet-list", role: "list", children: middleItems.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("li", { className: "bc-sheet-item", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
592
+ "a",
593
+ {
594
+ href: item.href,
595
+ className: "bc-sheet-link",
596
+ onClick: (e) => {
597
+ item.onClick?.(e);
598
+ setSheetOpen(false);
599
+ },
600
+ children: item.label
601
+ }
602
+ ) }, `sheet-${index}`)) })
603
+ }
604
+ )
605
+ ] });
496
606
  }
497
607
 
498
608
  // primitives/ChipDropdown/ChipDropdown.tsx
499
- var import_react5 = require("react");
500
-
501
- // primitives/ChipDropdown/ChipDropdown.module.css
502
- var ChipDropdown_default = {};
503
-
504
- // primitives/ChipDropdown/ChipDropdown.tsx
505
- var import_jsx_runtime9 = require("react/jsx-runtime");
506
- var ChevronDownIcon = () => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
609
+ var import_react6 = require("react");
610
+ var import_jsx_runtime10 = require("react/jsx-runtime");
611
+ var ChevronDownIcon = () => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
507
612
  "svg",
508
613
  {
509
614
  width: "16",
@@ -512,7 +617,7 @@ var ChevronDownIcon = () => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
512
617
  fill: "none",
513
618
  xmlns: "http://www.w3.org/2000/svg",
514
619
  "aria-hidden": "true",
515
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
620
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
516
621
  "path",
517
622
  {
518
623
  d: "M3 6l5 5 5-5",
@@ -524,7 +629,7 @@ var ChevronDownIcon = () => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
524
629
  )
525
630
  }
526
631
  );
527
- var CheckIcon = () => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
632
+ var CheckIcon = () => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
528
633
  "svg",
529
634
  {
530
635
  width: "12",
@@ -533,7 +638,7 @@ var CheckIcon = () => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
533
638
  fill: "none",
534
639
  xmlns: "http://www.w3.org/2000/svg",
535
640
  "aria-hidden": "true",
536
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
641
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
537
642
  "path",
538
643
  {
539
644
  d: "M2 6l3 3 5-5",
@@ -557,13 +662,22 @@ var ChipDropdown = ({
557
662
  className,
558
663
  ...props
559
664
  }) => {
560
- const [open, setOpen] = (0, import_react5.useState)(false);
561
- const wrapperRef = (0, import_react5.useRef)(null);
665
+ const [open, setOpen] = (0, import_react6.useState)(false);
666
+ const [isMobile, setIsMobile] = (0, import_react6.useState)(
667
+ () => typeof window !== "undefined" && window.matchMedia("(max-width: 767px)").matches
668
+ );
669
+ const wrapperRef = (0, import_react6.useRef)(null);
562
670
  const selectedOption = options.find((o) => o.value === value) ?? null;
563
671
  const displayLabel = selectedOption ? selectedOption.label : label;
564
672
  const isSelected = selectedOption !== null;
565
- (0, import_react5.useEffect)(() => {
566
- if (!open) return;
673
+ (0, import_react6.useEffect)(() => {
674
+ const mq = window.matchMedia("(max-width: 767px)");
675
+ const handler = (e) => setIsMobile(e.matches);
676
+ mq.addEventListener("change", handler);
677
+ return () => mq.removeEventListener("change", handler);
678
+ }, []);
679
+ (0, import_react6.useEffect)(() => {
680
+ if (!open || isMobile) return;
567
681
  const handleClickOutside = (e) => {
568
682
  if (wrapperRef.current && !wrapperRef.current.contains(e.target)) {
569
683
  setOpen(false);
@@ -571,19 +685,40 @@ var ChipDropdown = ({
571
685
  };
572
686
  document.addEventListener("mousedown", handleClickOutside);
573
687
  return () => document.removeEventListener("mousedown", handleClickOutside);
574
- }, [open]);
688
+ }, [open, isMobile]);
575
689
  const triggerClassNames = [
576
- ChipDropdown_default.trigger,
577
- ChipDropdown_default[size],
578
- isSelected ? ChipDropdown_default.selected : "",
579
- open ? ChipDropdown_default.expand : "",
690
+ "cd-trigger",
691
+ size,
692
+ isSelected ? "selected" : "",
693
+ open ? "expand" : "",
580
694
  className ?? ""
581
695
  ].filter(Boolean).join(" ");
582
696
  const handleKeyDown = (e) => {
583
697
  if (e.key === "Escape") setOpen(false);
584
698
  };
585
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { ref: wrapperRef, className: ChipDropdown_default.wrapper, children: [
586
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
699
+ const handleSelect = (optionValue) => {
700
+ onChange?.(optionValue);
701
+ setOpen(false);
702
+ };
703
+ const optionList = options.map((option) => {
704
+ const isActive = option.value === value;
705
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
706
+ "li",
707
+ {
708
+ role: "option",
709
+ "aria-selected": isActive,
710
+ className: ["cd-item", isActive ? "itemSelected" : ""].filter(Boolean).join(" "),
711
+ onClick: () => handleSelect(option.value),
712
+ children: [
713
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "cd-itemLabel", children: option.label }),
714
+ isActive && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "cd-itemCheck", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckIcon, {}) })
715
+ ]
716
+ },
717
+ option.value
718
+ );
719
+ });
720
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { ref: wrapperRef, className: "cd-wrapper", children: [
721
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
587
722
  "button",
588
723
  {
589
724
  type: "button",
@@ -595,80 +730,37 @@ var ChipDropdown = ({
595
730
  onKeyDown: handleKeyDown,
596
731
  ...props,
597
732
  children: [
598
- icon && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: ChipDropdown_default.icon, children: icon }),
599
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: ChipDropdown_default.label, children: displayLabel }),
600
- tag && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: ChipDropdown_default.tag, children: tag }),
601
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
733
+ icon && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "cd-icon", children: icon }),
734
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "cd-label", children: displayLabel }),
735
+ tag && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "cd-tag", children: tag }),
736
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
602
737
  "span",
603
738
  {
604
- className: [ChipDropdown_default.chevron, open ? ChipDropdown_default.chevronOpen : ""].filter(Boolean).join(" "),
739
+ className: ["cd-chevron", open ? "chevronOpen" : ""].filter(Boolean).join(" "),
605
740
  "aria-hidden": "true",
606
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ChevronDownIcon, {})
741
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ChevronDownIcon, {})
607
742
  }
608
743
  )
609
744
  ]
610
745
  }
611
746
  ),
612
- open && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
613
- "ul",
747
+ !isMobile && open && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("ul", { role: "listbox", "aria-label": label, className: "cd-list", children: optionList }),
748
+ isMobile && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
749
+ BottomSheet,
614
750
  {
615
- role: "listbox",
616
- "aria-label": label,
617
- className: ChipDropdown_default.list,
618
- children: options.map((option) => {
619
- const isActive = option.value === value;
620
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
621
- "li",
622
- {
623
- role: "option",
624
- "aria-selected": isActive,
625
- className: [
626
- ChipDropdown_default.item,
627
- isActive ? ChipDropdown_default.itemSelected : ""
628
- ].filter(Boolean).join(" "),
629
- onClick: () => {
630
- onChange?.(option.value);
631
- setOpen(false);
632
- },
633
- children: [
634
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: ChipDropdown_default.itemLabel, children: option.label }),
635
- isActive && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: ChipDropdown_default.itemCheck, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(CheckIcon, {}) })
636
- ]
637
- },
638
- option.value
639
- );
640
- })
751
+ open,
752
+ onClose: () => setOpen(false),
753
+ title: label,
754
+ showHandleBar: true,
755
+ showHeader: true,
756
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("ul", { role: "listbox", "aria-label": label, className: "cd-list cd-list--sheet", children: optionList })
641
757
  }
642
758
  )
643
759
  ] });
644
760
  };
645
761
 
646
- // components/Card/CardPrimaryVariant.module.css
647
- var CardPrimaryVariant_default = {};
648
-
649
762
  // components/Card/CardPrimaryVariant.tsx
650
- var import_jsx_runtime10 = require("react/jsx-runtime");
651
- var ArrowRightIcon = () => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
652
- "svg",
653
- {
654
- "aria-hidden": "true",
655
- fill: "none",
656
- height: "16",
657
- viewBox: "0 0 16 16",
658
- width: "16",
659
- xmlns: "http://www.w3.org/2000/svg",
660
- children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
661
- "path",
662
- {
663
- d: "M3 8h10M9 4l4 4-4 4",
664
- stroke: "currentColor",
665
- strokeLinecap: "round",
666
- strokeLinejoin: "round",
667
- strokeWidth: "1.5"
668
- }
669
- )
670
- }
671
- );
763
+ var import_jsx_runtime11 = require("react/jsx-runtime");
672
764
  var CardPrimaryVariant = ({
673
765
  colorScheme = "light",
674
766
  title,
@@ -683,68 +775,40 @@ var CardPrimaryVariant = ({
683
775
  ...props
684
776
  }) => {
685
777
  const isInverse = colorScheme === "dark" || colorScheme === "brand" || colorScheme === "image";
686
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
778
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
687
779
  "div",
688
780
  {
689
781
  className: [
690
- CardPrimaryVariant_default.card,
691
- CardPrimaryVariant_default[`style--${colorScheme}`],
782
+ "card-primary",
783
+ `style--${colorScheme}`,
692
784
  className ?? ""
693
785
  ].filter(Boolean).join(" "),
694
786
  ...props,
695
787
  children: [
696
- colorScheme === "image" && image && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { "aria-hidden": "true", className: CardPrimaryVariant_default.imageOverlay, children: [
697
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("img", { alt: "", className: CardPrimaryVariant_default.overlayImg, src: image }),
698
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: CardPrimaryVariant_default.gradient })
788
+ colorScheme === "image" && image && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { "aria-hidden": "true", className: "cp-imageOverlay", children: [
789
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("img", { alt: "", className: "cp-overlayImg", src: image }),
790
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "cp-gradient" })
699
791
  ] }),
700
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: CardPrimaryVariant_default.content, children: [
701
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: [CardPrimaryVariant_default.title, isInverse ? CardPrimaryVariant_default.textInverse : CardPrimaryVariant_default.textDefault].join(" "), children: title }),
702
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: [CardPrimaryVariant_default.description, isInverse ? CardPrimaryVariant_default.textInverse : CardPrimaryVariant_default.textDefault].join(" "), children: description }),
703
- showLink && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
704
- "button",
792
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "cp-content", children: [
793
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: ["cp-title", isInverse ? "textInverse" : "textDefault"].join(" "), children: title }),
794
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: ["cp-description", isInverse ? "textInverse" : "textDefault"].join(" "), children: description }),
795
+ showLink && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
796
+ Link,
705
797
  {
706
- className: [CardPrimaryVariant_default.link, isInverse ? CardPrimaryVariant_default.linkInverse : CardPrimaryVariant_default.linkCoral].join(" "),
707
- onClick: onLinkClick,
708
- type: "button",
709
- children: [
710
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: linkText }),
711
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ArrowRightIcon, {})
712
- ]
798
+ colorScheme: isInverse ? "white" : "coral",
799
+ label: linkText,
800
+ onClick: onLinkClick
713
801
  }
714
802
  )
715
803
  ] }),
716
- colorScheme !== "image" && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: CardPrimaryVariant_default.imageSection, children: image && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("img", { alt: imageAlt, className: CardPrimaryVariant_default.image, src: image }) })
804
+ colorScheme !== "image" && image && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "cp-imageSection", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("img", { alt: imageAlt, className: "cp-image", src: image }) })
717
805
  ]
718
806
  }
719
807
  );
720
808
  };
721
809
 
722
- // components/Card/CardSecondaryVariant.module.css
723
- var CardSecondaryVariant_default = {};
724
-
725
810
  // components/Card/CardSecondaryVariant.tsx
726
- var import_jsx_runtime11 = require("react/jsx-runtime");
727
- var ArrowRightIcon2 = () => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
728
- "svg",
729
- {
730
- "aria-hidden": "true",
731
- fill: "none",
732
- height: "16",
733
- viewBox: "0 0 16 16",
734
- width: "16",
735
- xmlns: "http://www.w3.org/2000/svg",
736
- children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
737
- "path",
738
- {
739
- d: "M3 8h10M9 4l4 4-4 4",
740
- stroke: "currentColor",
741
- strokeLinecap: "round",
742
- strokeLinejoin: "round",
743
- strokeWidth: "1.5"
744
- }
745
- )
746
- }
747
- );
811
+ var import_jsx_runtime12 = require("react/jsx-runtime");
748
812
  var CardSecondaryVariant = ({
749
813
  title,
750
814
  description,
@@ -757,25 +821,21 @@ var CardSecondaryVariant = ({
757
821
  variant: _variant,
758
822
  ...props
759
823
  }) => {
760
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
824
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
761
825
  "div",
762
826
  {
763
- className: [CardSecondaryVariant_default.card, className ?? ""].filter(Boolean).join(" "),
827
+ className: ["card-secondary", className ?? ""].filter(Boolean).join(" "),
764
828
  ...props,
765
829
  children: [
766
- showIcon && icon && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: CardSecondaryVariant_default.icon, children: icon }),
767
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: CardSecondaryVariant_default.title, children: title }),
768
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: CardSecondaryVariant_default.description, children: description }),
769
- showLink && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
770
- "button",
830
+ showIcon && icon && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "cs-icon", children: icon }),
831
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "cs-title", children: title }),
832
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "cs-description", children: description }),
833
+ showLink && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
834
+ Link,
771
835
  {
772
- className: CardSecondaryVariant_default.link,
773
- onClick: onLinkClick,
774
- type: "button",
775
- children: [
776
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { children: linkText }),
777
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(ArrowRightIcon2, {})
778
- ]
836
+ colorScheme: "coral",
837
+ label: linkText,
838
+ onClick: onLinkClick
779
839
  }
780
840
  )
781
841
  ]
@@ -783,12 +843,9 @@ var CardSecondaryVariant = ({
783
843
  );
784
844
  };
785
845
 
786
- // components/Card/CardThumbnailVariant.module.css
787
- var CardThumbnailVariant_default = {};
788
-
789
846
  // components/Card/CardThumbnailVariant.tsx
790
- var import_jsx_runtime12 = require("react/jsx-runtime");
791
- var LinkIcon = () => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
847
+ var import_jsx_runtime13 = require("react/jsx-runtime");
848
+ var LinkIcon = () => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
792
849
  "svg",
793
850
  {
794
851
  "aria-hidden": "true",
@@ -798,7 +855,7 @@ var LinkIcon = () => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
798
855
  width: "14",
799
856
  xmlns: "http://www.w3.org/2000/svg",
800
857
  children: [
801
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
858
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
802
859
  "path",
803
860
  {
804
861
  d: "M5.25 2.625H3.5A1.75 1.75 0 0 0 1.75 4.375v5.25A1.75 1.75 0 0 0 3.5 11.375h5.25a1.75 1.75 0 0 0 1.75-1.75V7.875",
@@ -808,7 +865,7 @@ var LinkIcon = () => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
808
865
  strokeWidth: "1.25"
809
866
  }
810
867
  ),
811
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
868
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
812
869
  "path",
813
870
  {
814
871
  d: "M7.875 1.75h4.375v4.375M12.25 1.75 6.125 7.875",
@@ -821,7 +878,7 @@ var LinkIcon = () => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
821
878
  ]
822
879
  }
823
880
  );
824
- var PlayIcon = () => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
881
+ var PlayIcon = () => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
825
882
  "svg",
826
883
  {
827
884
  "aria-hidden": "true",
@@ -831,8 +888,8 @@ var PlayIcon = () => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
831
888
  width: "80",
832
889
  xmlns: "http://www.w3.org/2000/svg",
833
890
  children: [
834
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("circle", { cx: "40", cy: "40", fill: "rgba(255,255,255,0.88)", r: "40" }),
835
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("path", { d: "M32 27l22 13-22 13V27z", fill: "rgba(24,28,37,0.72)" })
891
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("circle", { cx: "40", cy: "40", fill: "rgba(255,255,255,0.88)", r: "40" }),
892
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("path", { d: "M32 27l22 13-22 13V27z", fill: "rgba(24,28,37,0.72)" })
836
893
  ]
837
894
  }
838
895
  );
@@ -853,33 +910,33 @@ var CardThumbnailVariant = ({
853
910
  ...props
854
911
  }) => {
855
912
  const isVideo = type === "video";
856
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
913
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
857
914
  "div",
858
915
  {
859
- className: [CardThumbnailVariant_default.card, className ?? ""].filter(Boolean).join(" "),
916
+ className: ["card-thumbnail", className ?? ""].filter(Boolean).join(" "),
860
917
  ...props,
861
918
  children: [
862
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: CardThumbnailVariant_default.thumbnailWrapper, children: [
863
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("img", { alt: thumbnailAlt, className: CardThumbnailVariant_default.thumbnailImage, src: thumbnail }),
864
- isVideo && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { "aria-label": "Play video", className: CardThumbnailVariant_default.playButton, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(PlayIcon, {}) }),
865
- !isVideo && avatar && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("img", { alt: avatarAlt, className: CardThumbnailVariant_default.avatar, src: avatar })
919
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "ct-thumbnailWrapper", children: [
920
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("img", { alt: thumbnailAlt, className: "ct-thumbnailImage", src: thumbnail }),
921
+ isVideo && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { "aria-label": "Play video", className: "ct-playButton", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(PlayIcon, {}) }),
922
+ !isVideo && avatar && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("img", { alt: avatarAlt, className: "ct-avatar", src: avatar })
866
923
  ] }),
867
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: CardThumbnailVariant_default.content, children: [
868
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: CardThumbnailVariant_default.metaRow, children: [
869
- !hideTags && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: CardThumbnailVariant_default.tagsList, children: tags.map((tag, i) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Tag, { icon: tag.icon, label: tag.label, size: "md", variant: "fill" }, i)) }),
870
- showCopyLink && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
924
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "ct-content", children: [
925
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "ct-metaRow", children: [
926
+ !hideTags && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "ct-tagsList", children: tags.map((tag, i) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Tag, { icon: tag.icon, label: tag.label, size: "md", variant: "fill" }, i)) }),
927
+ showCopyLink && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
871
928
  "button",
872
929
  {
873
930
  "aria-label": "Copy link",
874
- className: CardThumbnailVariant_default.copyLink,
931
+ className: "ct-copyLink",
875
932
  onClick: onCopyLink,
876
933
  type: "button",
877
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(LinkIcon, {})
934
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(LinkIcon, {})
878
935
  }
879
936
  )
880
937
  ] }),
881
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: CardThumbnailVariant_default.title, children: title }),
882
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: CardThumbnailVariant_default.summary, children: summary })
938
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "ct-title", children: title }),
939
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "ct-summary", children: summary })
883
940
  ] })
884
941
  ]
885
942
  }
@@ -887,24 +944,21 @@ var CardThumbnailVariant = ({
887
944
  };
888
945
 
889
946
  // components/Card/Card.tsx
890
- var import_jsx_runtime13 = require("react/jsx-runtime");
947
+ var import_jsx_runtime14 = require("react/jsx-runtime");
891
948
  var Card = (props) => {
892
949
  if (props.variant === "primary") {
893
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(CardPrimaryVariant, { ...props });
950
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(CardPrimaryVariant, { ...props });
894
951
  }
895
952
  if (props.variant === "secondary") {
896
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(CardSecondaryVariant, { ...props });
953
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(CardSecondaryVariant, { ...props });
897
954
  }
898
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(CardThumbnailVariant, { ...props });
955
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(CardThumbnailVariant, { ...props });
899
956
  };
900
957
 
901
- // primitives/Pagination/Pagination.module.css
902
- var Pagination_default = {};
903
-
904
958
  // primitives/Pagination/Pagination.tsx
905
- var import_jsx_runtime14 = require("react/jsx-runtime");
906
- var ChevronLeft = () => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("path", { d: "M10 12L6 8L10 4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) });
907
- var ChevronRight = () => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("path", { d: "M6 4L10 8L6 12", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) });
959
+ var import_jsx_runtime15 = require("react/jsx-runtime");
960
+ var ChevronLeft = () => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("path", { d: "M10 12L6 8L10 4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) });
961
+ var ChevronRight = () => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("path", { d: "M6 4L10 8L6 12", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) });
908
962
  function getPageItems(currentPage, totalPages) {
909
963
  if (totalPages <= 5) {
910
964
  return Array.from({ length: totalPages }, (_, i) => i + 1);
@@ -926,28 +980,28 @@ var Pagination = ({
926
980
  const items = getPageItems(currentPage, totalPages);
927
981
  const isPrevDisabled = currentPage <= 1;
928
982
  const isNextDisabled = currentPage >= totalPages;
929
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
983
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
930
984
  "nav",
931
985
  {
932
- className: [Pagination_default.pagination, className ?? ""].filter(Boolean).join(" "),
986
+ className: ["pagination", className ?? ""].filter(Boolean).join(" "),
933
987
  "aria-label": "Pagination navigation",
934
988
  children: [
935
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
989
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
936
990
  "button",
937
991
  {
938
- className: [Pagination_default.navButton, isPrevDisabled ? Pagination_default.navButtonDisabled : ""].filter(Boolean).join(" "),
992
+ className: ["navButton", isPrevDisabled ? "navButtonDisabled" : ""].filter(Boolean).join(" "),
939
993
  onClick: () => onPageChange(currentPage - 1),
940
994
  disabled: isPrevDisabled,
941
995
  "aria-label": "Previous page",
942
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: Pagination_default.navIcon, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ChevronLeft, {}) })
996
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "navIcon", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ChevronLeft, {}) })
943
997
  }
944
998
  ),
945
999
  items.map((item, index) => {
946
1000
  if (item === "ellipsis-left" || item === "ellipsis-right") {
947
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1001
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
948
1002
  "span",
949
1003
  {
950
- className: Pagination_default.ellipsis,
1004
+ className: "ellipsis",
951
1005
  "aria-hidden": "true",
952
1006
  children: "\u2026"
953
1007
  },
@@ -955,10 +1009,10 @@ var Pagination = ({
955
1009
  );
956
1010
  }
957
1011
  const isSelected = item === currentPage;
958
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1012
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
959
1013
  "button",
960
1014
  {
961
- className: [Pagination_default.pageButton, isSelected ? Pagination_default.pageButtonSelected : ""].filter(Boolean).join(" "),
1015
+ className: ["pageButton", isSelected ? "pageButtonSelected" : ""].filter(Boolean).join(" "),
962
1016
  onClick: () => {
963
1017
  if (!isSelected) onPageChange(item);
964
1018
  },
@@ -969,31 +1023,1469 @@ var Pagination = ({
969
1023
  item
970
1024
  );
971
1025
  }),
972
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1026
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
973
1027
  "button",
974
1028
  {
975
- className: [Pagination_default.navButton, isNextDisabled ? Pagination_default.navButtonDisabled : ""].filter(Boolean).join(" "),
1029
+ className: ["navButton", isNextDisabled ? "navButtonDisabled" : ""].filter(Boolean).join(" "),
976
1030
  onClick: () => onPageChange(currentPage + 1),
977
1031
  disabled: isNextDisabled,
978
1032
  "aria-label": "Next page",
979
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: Pagination_default.navIcon, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ChevronRight, {}) })
1033
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "navIcon", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ChevronRight, {}) })
980
1034
  }
981
1035
  )
982
1036
  ]
983
1037
  }
984
1038
  );
985
1039
  };
1040
+
1041
+ // templates/FeatureCards/FeatureCards.tsx
1042
+ var import_jsx_runtime16 = require("react/jsx-runtime");
1043
+ var FeatureCards = ({
1044
+ sectionTitle,
1045
+ sectionDescription,
1046
+ showLink = false,
1047
+ linkText = "Learn more",
1048
+ onLinkClick,
1049
+ cardColorScheme = "image",
1050
+ cards
1051
+ }) => {
1052
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("section", { className: "fc-section", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "fc-container", children: [
1053
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "fc-header", children: [
1054
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("h2", { className: "fc-sectionTitle", children: sectionTitle }),
1055
+ sectionDescription && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "fc-sectionDescription", children: sectionDescription }),
1056
+ showLink && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1057
+ Link,
1058
+ {
1059
+ colorScheme: "coral",
1060
+ label: linkText,
1061
+ onClick: onLinkClick
1062
+ }
1063
+ )
1064
+ ] }),
1065
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "fc-grid", children: cards.map((card, index) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1066
+ Card,
1067
+ {
1068
+ variant: "primary",
1069
+ colorScheme: card.colorScheme ?? cardColorScheme,
1070
+ title: card.title,
1071
+ description: card.description,
1072
+ image: card.image,
1073
+ imageAlt: card.imageAlt,
1074
+ showLink: card.showLink,
1075
+ linkText: card.linkText,
1076
+ onLinkClick: card.onLinkClick
1077
+ },
1078
+ index
1079
+ )) })
1080
+ ] }) });
1081
+ };
1082
+
1083
+ // templates/Footer/Footer.tsx
1084
+ var import_react7 = require("react");
1085
+ var import_jsx_runtime17 = require("react/jsx-runtime");
1086
+ var ExternalLinkIcon = () => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1087
+ "svg",
1088
+ {
1089
+ width: "12",
1090
+ height: "12",
1091
+ viewBox: "0 0 12 12",
1092
+ fill: "none",
1093
+ "aria-hidden": "true",
1094
+ focusable: "false",
1095
+ children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1096
+ "path",
1097
+ {
1098
+ d: "M2 2H10M10 2V10M10 2L2 10",
1099
+ stroke: "currentColor",
1100
+ strokeWidth: "1.5",
1101
+ strokeLinecap: "round",
1102
+ strokeLinejoin: "round"
1103
+ }
1104
+ )
1105
+ }
1106
+ );
1107
+ var ChevronDownIcon2 = () => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1108
+ "svg",
1109
+ {
1110
+ width: "12",
1111
+ height: "12",
1112
+ viewBox: "0 0 12 12",
1113
+ fill: "none",
1114
+ "aria-hidden": "true",
1115
+ focusable: "false",
1116
+ children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1117
+ "path",
1118
+ {
1119
+ d: "M2 4L6 8L10 4",
1120
+ stroke: "currentColor",
1121
+ strokeWidth: "1.5",
1122
+ strokeLinecap: "round",
1123
+ strokeLinejoin: "round"
1124
+ }
1125
+ )
1126
+ }
1127
+ );
1128
+ var DerivGoBadges = ({
1129
+ googlePlayBadge,
1130
+ appStoreBadge,
1131
+ huaweiBadge,
1132
+ availabilityNote
1133
+ }) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "footer__app-badges", children: [
1134
+ googlePlayBadge && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1135
+ "a",
1136
+ {
1137
+ href: googlePlayBadge.href,
1138
+ className: googlePlayBadge.icon ? "footer__app-badge-svg" : "footer__app-badge",
1139
+ "aria-label": googlePlayBadge.imageAlt,
1140
+ target: "_blank",
1141
+ rel: "noopener noreferrer",
1142
+ children: googlePlayBadge.icon ?? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("img", { src: googlePlayBadge.imageSrc, alt: googlePlayBadge.imageAlt })
1143
+ }
1144
+ ),
1145
+ appStoreBadge && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1146
+ "a",
1147
+ {
1148
+ href: appStoreBadge.href,
1149
+ className: appStoreBadge.icon ? "footer__app-badge-svg" : "footer__app-badge",
1150
+ "aria-label": appStoreBadge.imageAlt,
1151
+ target: "_blank",
1152
+ rel: "noopener noreferrer",
1153
+ children: appStoreBadge.icon ?? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("img", { src: appStoreBadge.imageSrc, alt: appStoreBadge.imageAlt })
1154
+ }
1155
+ ),
1156
+ huaweiBadge && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1157
+ "a",
1158
+ {
1159
+ href: huaweiBadge.href,
1160
+ className: huaweiBadge.icon ? "footer__app-badge-svg" : "footer__app-badge",
1161
+ "aria-label": huaweiBadge.imageAlt,
1162
+ target: "_blank",
1163
+ rel: "noopener noreferrer",
1164
+ children: huaweiBadge.icon ?? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("img", { src: huaweiBadge.imageSrc, alt: huaweiBadge.imageAlt })
1165
+ }
1166
+ ),
1167
+ availabilityNote && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "footer__app-note", children: availabilityNote })
1168
+ ] });
1169
+ var NavLink = ({ label, href, isExternal, onClick }) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
1170
+ "a",
1171
+ {
1172
+ href,
1173
+ className: "footer__nav-link",
1174
+ onClick,
1175
+ ...isExternal ? { target: "_blank", rel: "noopener noreferrer" } : {},
1176
+ children: [
1177
+ label,
1178
+ isExternal && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ExternalLinkIcon, {})
1179
+ ]
1180
+ }
1181
+ );
1182
+ var Footer = ({
1183
+ logoSrc,
1184
+ logoAlt = "Deriv",
1185
+ navColumns,
1186
+ socialLinks = [],
1187
+ derivGo,
1188
+ investorsInPeopleSrc,
1189
+ investorsInPeopleAlt = "Investors in People - Platinum",
1190
+ licenseText,
1191
+ riskWarningText,
1192
+ aiSummary,
1193
+ className,
1194
+ ...props
1195
+ }) => {
1196
+ const allSections = navColumns.flat();
1197
+ const [openSections, setOpenSections] = (0, import_react7.useState)(/* @__PURE__ */ new Set());
1198
+ const toggleSection = (index) => {
1199
+ setOpenSections((prev) => {
1200
+ const next = new Set(prev);
1201
+ if (next.has(index)) {
1202
+ next.delete(index);
1203
+ } else {
1204
+ next.add(index);
1205
+ }
1206
+ return next;
1207
+ });
1208
+ };
1209
+ const aiLabel = aiSummary?.label ?? "Ask AI for a summary of Deriv";
1210
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1211
+ "footer",
1212
+ {
1213
+ className: ["footer", className].filter(Boolean).join(" "),
1214
+ ...props,
1215
+ children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "footer__inner", children: [
1216
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "footer__header", children: [
1217
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "footer__logo-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1218
+ "img",
1219
+ {
1220
+ src: logoSrc,
1221
+ alt: logoAlt,
1222
+ className: "footer__logo"
1223
+ }
1224
+ ) }),
1225
+ aiSummary && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "footer__ai-bar footer__ai-bar--inline", children: [
1226
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "footer__ai-bar-label", children: aiLabel }),
1227
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "footer__ai-bar-icons", children: aiSummary.items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1228
+ "a",
1229
+ {
1230
+ href: item.href,
1231
+ className: "footer__ai-icon",
1232
+ "aria-label": item.imageAlt,
1233
+ target: "_blank",
1234
+ rel: "noopener noreferrer",
1235
+ children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("img", { src: item.imageSrc, alt: item.imageAlt })
1236
+ },
1237
+ i
1238
+ )) })
1239
+ ] }),
1240
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "footer__social footer__social--in-header", children: socialLinks.map((link, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1241
+ "a",
1242
+ {
1243
+ href: link.href,
1244
+ className: "footer__social-icon",
1245
+ "aria-label": link.ariaLabel,
1246
+ target: "_blank",
1247
+ rel: "noopener noreferrer",
1248
+ children: link.icon
1249
+ },
1250
+ i
1251
+ )) })
1252
+ ] }),
1253
+ aiSummary && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "footer__ai-section", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "footer__ai-bar footer__ai-bar--block", children: [
1254
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "footer__ai-bar-label", children: aiLabel }),
1255
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "footer__ai-bar-icons", children: aiSummary.items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1256
+ "a",
1257
+ {
1258
+ href: item.href,
1259
+ className: "footer__ai-icon",
1260
+ "aria-label": item.imageAlt,
1261
+ target: "_blank",
1262
+ rel: "noopener noreferrer",
1263
+ children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("img", { src: item.imageSrc, alt: item.imageAlt })
1264
+ },
1265
+ i
1266
+ )) })
1267
+ ] }) }),
1268
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "footer__nav footer__nav--columns", children: [
1269
+ navColumns.map((column, colIdx) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "footer__column", children: column.map((section, secIdx) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "footer__nav-section", children: [
1270
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "footer__nav-title", children: section.title }),
1271
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("ul", { className: "footer__nav-links", children: section.links.map((link, linkIdx) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(NavLink, { ...link }) }, linkIdx)) })
1272
+ ] }, secIdx)) }, colIdx)),
1273
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "footer__sidebar", children: [
1274
+ investorsInPeopleSrc && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "footer__investors-card", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1275
+ "img",
1276
+ {
1277
+ src: investorsInPeopleSrc,
1278
+ alt: investorsInPeopleAlt,
1279
+ className: "footer__investors-img"
1280
+ }
1281
+ ) }),
1282
+ derivGo && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "footer__deriv-go-card", children: [
1283
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "footer__deriv-go-header", children: [
1284
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1285
+ "img",
1286
+ {
1287
+ src: derivGo.logoSrc,
1288
+ alt: derivGo.logoAlt ?? "Deriv GO",
1289
+ className: "footer__deriv-go-logo"
1290
+ }
1291
+ ),
1292
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "footer__deriv-go-title", children: derivGo.title ?? "Deriv GO" })
1293
+ ] }),
1294
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "footer__deriv-go-desc", children: derivGo.description ?? "Trade multipliers on our mobile app." }),
1295
+ (derivGo.qrCodeSrc || derivGo.qrCodeIcon) && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "footer__deriv-go-qr", children: [
1296
+ derivGo.qrCodeIcon ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "footer__deriv-go-qr-icon", children: derivGo.qrCodeIcon }) : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1297
+ "img",
1298
+ {
1299
+ src: derivGo.qrCodeSrc,
1300
+ alt: derivGo.qrCodeAlt ?? "Scan to download",
1301
+ className: "footer__deriv-go-qr-img"
1302
+ }
1303
+ ),
1304
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "footer__deriv-go-qr-label", children: "Scan to download" })
1305
+ ] }),
1306
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1307
+ DerivGoBadges,
1308
+ {
1309
+ googlePlayBadge: derivGo.googlePlayBadge,
1310
+ appStoreBadge: derivGo.appStoreBadge,
1311
+ huaweiBadge: derivGo.huaweiBadge,
1312
+ availabilityNote: derivGo.availabilityNote
1313
+ }
1314
+ )
1315
+ ] })
1316
+ ] })
1317
+ ] }),
1318
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "footer__nav footer__nav--accordion", children: allSections.map((section, idx) => {
1319
+ const isOpen = openSections.has(idx);
1320
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
1321
+ "div",
1322
+ {
1323
+ className: [
1324
+ "footer__accordion-item",
1325
+ isOpen && "footer__accordion-item--open"
1326
+ ].filter(Boolean).join(" "),
1327
+ children: [
1328
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
1329
+ "button",
1330
+ {
1331
+ type: "button",
1332
+ className: "footer__accordion-toggle",
1333
+ onClick: () => toggleSection(idx),
1334
+ "aria-expanded": isOpen,
1335
+ children: [
1336
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "footer__accordion-label", children: section.title }),
1337
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "footer__accordion-chevron", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ChevronDownIcon2, {}) })
1338
+ ]
1339
+ }
1340
+ ),
1341
+ isOpen && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("ul", { className: "footer__accordion-links", children: section.links.map((link, linkIdx) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(NavLink, { ...link }) }, linkIdx)) })
1342
+ ]
1343
+ },
1344
+ idx
1345
+ );
1346
+ }) }),
1347
+ socialLinks.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "footer__social footer__social--standalone", children: socialLinks.map((link, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1348
+ "a",
1349
+ {
1350
+ href: link.href,
1351
+ className: "footer__social-icon",
1352
+ "aria-label": link.ariaLabel,
1353
+ target: "_blank",
1354
+ rel: "noopener noreferrer",
1355
+ children: link.icon
1356
+ },
1357
+ i
1358
+ )) }),
1359
+ derivGo && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "footer__deriv-go-banner", children: [
1360
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "footer__deriv-go-banner-info", children: [
1361
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "footer__deriv-go-header", children: [
1362
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1363
+ "img",
1364
+ {
1365
+ src: derivGo.logoSrc,
1366
+ alt: derivGo.logoAlt ?? "Deriv GO",
1367
+ className: "footer__deriv-go-logo"
1368
+ }
1369
+ ),
1370
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "footer__deriv-go-title", children: derivGo.title ?? "Deriv GO" })
1371
+ ] }),
1372
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "footer__deriv-go-desc", children: derivGo.description ?? "Trade multipliers on our mobile app." })
1373
+ ] }),
1374
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "footer__deriv-go-banner-badges", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1375
+ DerivGoBadges,
1376
+ {
1377
+ googlePlayBadge: derivGo.googlePlayBadge,
1378
+ appStoreBadge: derivGo.appStoreBadge,
1379
+ huaweiBadge: derivGo.huaweiBadge,
1380
+ availabilityNote: derivGo.availabilityNote
1381
+ }
1382
+ ) })
1383
+ ] }),
1384
+ (licenseText || riskWarningText) && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "footer__legal-block", children: [
1385
+ licenseText && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "footer__license", children: licenseText }),
1386
+ riskWarningText && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "footer__risk-warning", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "footer__risk-warning-text", children: riskWarningText }) })
1387
+ ] }),
1388
+ investorsInPeopleSrc && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "footer__investors-stacked", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1389
+ "img",
1390
+ {
1391
+ src: investorsInPeopleSrc,
1392
+ alt: investorsInPeopleAlt,
1393
+ className: "footer__investors-img"
1394
+ }
1395
+ ) })
1396
+ ] })
1397
+ }
1398
+ );
1399
+ };
1400
+
1401
+ // templates/Hero/Hero.tsx
1402
+ var import_jsx_runtime18 = require("react/jsx-runtime");
1403
+ var Visual = ({
1404
+ src,
1405
+ className,
1406
+ alt = ""
1407
+ }) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className, children: typeof src === "string" ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("img", { src, alt }) : src });
1408
+ var Hero = ({
1409
+ variant,
1410
+ subtitle,
1411
+ title,
1412
+ description,
1413
+ primaryButton,
1414
+ secondaryButton,
1415
+ backgroundImageSrc,
1416
+ heroImage,
1417
+ leftVisual,
1418
+ rightVisual,
1419
+ className,
1420
+ ...props
1421
+ }) => {
1422
+ const variantClass = `hero--${variant}`;
1423
+ const textBlock = /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "hero__text", children: [
1424
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "hero__subtitle", children: subtitle }),
1425
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "hero__title", children: title }),
1426
+ description && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "hero__description", children: description })
1427
+ ] });
1428
+ const buttonBlock = (primaryButton || secondaryButton) && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "hero__buttons", children: [
1429
+ primaryButton && (primaryButton.href ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("a", { href: primaryButton.href, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1430
+ Button,
1431
+ {
1432
+ colorScheme: "coral",
1433
+ variant: "primary",
1434
+ label: primaryButton.label,
1435
+ onClick: primaryButton.onClick
1436
+ }
1437
+ ) }) : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1438
+ Button,
1439
+ {
1440
+ colorScheme: "coral",
1441
+ variant: "primary",
1442
+ label: primaryButton.label,
1443
+ onClick: primaryButton.onClick
1444
+ }
1445
+ )),
1446
+ secondaryButton && (secondaryButton.href ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("a", { href: secondaryButton.href, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1447
+ Button,
1448
+ {
1449
+ colorScheme: "white",
1450
+ variant: "secondary",
1451
+ label: secondaryButton.label,
1452
+ onClick: secondaryButton.onClick
1453
+ }
1454
+ ) }) : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1455
+ Button,
1456
+ {
1457
+ colorScheme: "white",
1458
+ variant: "secondary",
1459
+ label: secondaryButton.label,
1460
+ onClick: secondaryButton.onClick
1461
+ }
1462
+ ))
1463
+ ] });
1464
+ if (variant === "homepage") {
1465
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
1466
+ "section",
1467
+ {
1468
+ className: ["hero", variantClass, className].filter(Boolean).join(" "),
1469
+ ...props,
1470
+ children: [
1471
+ backgroundImageSrc && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1472
+ "img",
1473
+ {
1474
+ src: backgroundImageSrc,
1475
+ alt: "",
1476
+ className: "hero__bg-image",
1477
+ "aria-hidden": "true"
1478
+ }
1479
+ ),
1480
+ heroImage && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1481
+ Visual,
1482
+ {
1483
+ src: heroImage,
1484
+ className: "hero__image-slot",
1485
+ alt: ""
1486
+ }
1487
+ ),
1488
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "hero__overlay", "aria-hidden": "true" }),
1489
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "hero__inner", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "hero__content", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "hero__left", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "hero__body", children: [
1490
+ textBlock,
1491
+ buttonBlock
1492
+ ] }) }) }) })
1493
+ ]
1494
+ }
1495
+ );
1496
+ }
1497
+ if (variant === "full-image") {
1498
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
1499
+ "section",
1500
+ {
1501
+ className: ["hero", variantClass, className].filter(Boolean).join(" "),
1502
+ ...props,
1503
+ children: [
1504
+ backgroundImageSrc && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1505
+ "img",
1506
+ {
1507
+ src: backgroundImageSrc,
1508
+ alt: "",
1509
+ className: "hero__bg-image",
1510
+ "aria-hidden": "true"
1511
+ }
1512
+ ),
1513
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "hero__overlay", "aria-hidden": "true" }),
1514
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "hero__inner", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "hero__content", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "hero__body", children: [
1515
+ textBlock,
1516
+ buttonBlock
1517
+ ] }) }) })
1518
+ ]
1519
+ }
1520
+ );
1521
+ }
1522
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
1523
+ "section",
1524
+ {
1525
+ className: ["hero", variantClass, className].filter(Boolean).join(" "),
1526
+ ...props,
1527
+ children: [
1528
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "hero__grid", "aria-hidden": "true" }),
1529
+ variant === "visuals" && leftVisual && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1530
+ Visual,
1531
+ {
1532
+ src: leftVisual,
1533
+ className: "hero__visual hero__visual--left",
1534
+ alt: ""
1535
+ }
1536
+ ),
1537
+ variant === "visuals" && rightVisual && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1538
+ Visual,
1539
+ {
1540
+ src: rightVisual,
1541
+ className: "hero__visual hero__visual--right",
1542
+ alt: ""
1543
+ }
1544
+ ),
1545
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "hero__overlay", "aria-hidden": "true" }),
1546
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "hero__inner", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "hero__content", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "hero__body", children: [
1547
+ textBlock,
1548
+ buttonBlock
1549
+ ] }) }) })
1550
+ ]
1551
+ }
1552
+ );
1553
+ };
1554
+
1555
+ // templates/Stats/Stats.tsx
1556
+ var import_react8 = require("react");
1557
+ var import_jsx_runtime19 = require("react/jsx-runtime");
1558
+ var INTERVAL_MS = 2e3;
1559
+ var TRANSITION = "transform 0.8s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1)";
1560
+ function relativePos(index, active, total) {
1561
+ const raw = ((index - active) % total + total) % total;
1562
+ return raw > total / 2 ? raw - total : raw;
1563
+ }
1564
+ function getStatStyle(rel) {
1565
+ if (rel === 0) {
1566
+ return { transform: "translateY(-50%) scale(1)", opacity: 1, zIndex: 2, transition: TRANSITION };
1567
+ }
1568
+ if (rel === -1) {
1569
+ return { transform: "translateY(calc(-50% - 110%)) scale(0.7)", opacity: 1, zIndex: 1, transition: TRANSITION };
1570
+ }
1571
+ if (rel === 1) {
1572
+ return { transform: "translateY(calc(-50% + 110%)) scale(0.7)", opacity: 1, zIndex: 1, transition: TRANSITION };
1573
+ }
1574
+ return {
1575
+ transform: rel < 0 ? "translateY(calc(-50% - 110%)) scale(0.4)" : "translateY(calc(-50% + 110%)) scale(0.4)",
1576
+ opacity: 0,
1577
+ zIndex: 0,
1578
+ transition: TRANSITION
1579
+ };
1580
+ }
1581
+ var AwardBadge = ({ imageSrc, imageAlt = "" }) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "stats__award", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("img", { src: imageSrc, alt: imageAlt, className: "stats__award-image" }) });
1582
+ var Stats = ({
1583
+ title,
1584
+ description,
1585
+ stats,
1586
+ leftAwards = [],
1587
+ rightAwards = [],
1588
+ className,
1589
+ ...props
1590
+ }) => {
1591
+ const [activeIndex, setActiveIndex] = (0, import_react8.useState)(0);
1592
+ const intervalRef = (0, import_react8.useRef)(null);
1593
+ const hasAwards = leftAwards.length > 0 || rightAwards.length > 0;
1594
+ const allAwards = [...leftAwards, ...rightAwards];
1595
+ const total = stats.length;
1596
+ (0, import_react8.useEffect)(() => {
1597
+ if (total <= 1) return;
1598
+ intervalRef.current = setInterval(() => {
1599
+ setActiveIndex((prev) => (prev + 1) % total);
1600
+ }, INTERVAL_MS);
1601
+ return () => {
1602
+ if (intervalRef.current) clearInterval(intervalRef.current);
1603
+ };
1604
+ }, [total]);
1605
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1606
+ "section",
1607
+ {
1608
+ className: ["stats", className].filter(Boolean).join(" "),
1609
+ ...props,
1610
+ children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "stats__inner", children: [
1611
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "stats__header", children: [
1612
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("h2", { className: "stats__title", children: title }),
1613
+ description && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "stats__description", children: description })
1614
+ ] }),
1615
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "stats__content", children: [
1616
+ leftAwards.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "stats__awards-col stats__awards-col--left", children: leftAwards.map((award, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(AwardBadge, { ...award }, i)) }),
1617
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "stats__card", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "stats__card-track", children: [
1618
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "stats__fade stats__fade--top", "aria-hidden": "true" }),
1619
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "stats__fade stats__fade--bottom", "aria-hidden": "true" }),
1620
+ stats.map((stat, i) => {
1621
+ const rel = relativePos(i, activeIndex, total);
1622
+ const active = rel === 0;
1623
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
1624
+ "div",
1625
+ {
1626
+ className: [
1627
+ "stats__stat",
1628
+ active ? "stats__stat--active" : "stats__stat--inactive"
1629
+ ].join(" "),
1630
+ style: getStatStyle(rel),
1631
+ "aria-hidden": !active,
1632
+ children: [
1633
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "stats__stat-value", children: stat.value }),
1634
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "stats__stat-label", children: stat.label })
1635
+ ]
1636
+ },
1637
+ i
1638
+ );
1639
+ })
1640
+ ] }) }),
1641
+ rightAwards.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "stats__awards-col stats__awards-col--right", children: rightAwards.map((award, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(AwardBadge, { ...award }, i)) }),
1642
+ hasAwards && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "stats__awards-mobile", children: allAwards.map((award, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(AwardBadge, { ...award }, i)) })
1643
+ ] })
1644
+ ] })
1645
+ }
1646
+ );
1647
+ };
1648
+
1649
+ // templates/Scrollytelling/Scrollytelling.tsx
1650
+ var import_react9 = require("react");
1651
+ var import_dotlottie_react = require("@lottiefiles/dotlottie-react");
1652
+ var import_jsx_runtime20 = require("react/jsx-runtime");
1653
+ var SCROLLYTELLING_DATA = [
1654
+ {
1655
+ title: "Forex",
1656
+ description: "Trade the most popular currency pairs with high leverage, tight spreads, and fast execution.",
1657
+ linkLabel: "Learn more",
1658
+ link: "/markets/forex",
1659
+ mediaUrl: "https://cdn.prod.website-files.com/66fbaad381fa6866fa4991f3/675a906489e5aadf94e501c4_Forex.lottie"
1660
+ },
1661
+ {
1662
+ title: "Derived Indices",
1663
+ description: "Trade 24/7 on exclusive Synthetic and Derived Indices. Choose volatility levels that match your strategy.",
1664
+ linkLabel: "Learn more",
1665
+ link: "/markets/derived-indices/synthetic-indices",
1666
+ mediaUrl: "https://cdn.prod.website-files.com/66fbaad381fa6866fa4991f3/675a9064588b0d2709e7ceac_Derived%20Indices.lottie"
1667
+ },
1668
+ {
1669
+ title: "Stocks",
1670
+ description: "Trade global market leaders like Apple, Tesla, and NVIDIA.",
1671
+ linkLabel: "Learn more",
1672
+ link: "/markets/stocks",
1673
+ mediaUrl: "https://cdn.prod.website-files.com/66fbaad381fa6866fa4991f3/675a9064892f97175b724a9c_Stocks.lottie"
1674
+ },
1675
+ {
1676
+ title: "Commodities",
1677
+ description: "Trade gold, silver, oil, natural gas, sugar, and more.",
1678
+ linkLabel: "Learn more",
1679
+ link: "/markets/commodities",
1680
+ mediaUrl: "https://cdn.prod.website-files.com/66fbaad381fa6866fa4991f3/675a9064edd96a014a6092cf_Commodities.lottie"
1681
+ },
1682
+ {
1683
+ title: "Cryptos",
1684
+ description: "Trade round the clock on the volatility of cryptocurrencies like Bitcoin and Ethereum.",
1685
+ linkLabel: "Learn more",
1686
+ link: "/markets/cryptocurrencies",
1687
+ mediaUrl: "https://cdn.prod.website-files.com/66fbaad381fa6866fa4991f3/675a90647b8d9652a28b94e3_Crypto.lottie"
1688
+ },
1689
+ {
1690
+ title: "Stock Indices",
1691
+ description: "Trade offerings that track the top global stock indices.",
1692
+ linkLabel: "Learn more",
1693
+ link: "/markets/stock-indices",
1694
+ mediaUrl: "https://cdn.prod.website-files.com/66fbaad381fa6866fa4991f3/675a9064f2c16e4e0732abfb_Stock%20Indices.lottie"
1695
+ }
1696
+ ];
1697
+ var ChevronRight2 = () => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1698
+ "svg",
1699
+ {
1700
+ className: "scrolly__item-link-icon",
1701
+ width: "16",
1702
+ height: "16",
1703
+ viewBox: "0 0 16 16",
1704
+ fill: "none",
1705
+ "aria-hidden": "true",
1706
+ children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1707
+ "path",
1708
+ {
1709
+ d: "M6 3l5 5-5 5",
1710
+ stroke: "currentColor",
1711
+ strokeWidth: "1.5",
1712
+ strokeLinecap: "round",
1713
+ strokeLinejoin: "round"
1714
+ }
1715
+ )
1716
+ }
1717
+ );
1718
+ function resolveMediaType(item) {
1719
+ if (item.mediaType) return item.mediaType;
1720
+ return item.mediaUrl.split("?")[0].endsWith(".lottie") ? "lottie" : "image";
1721
+ }
1722
+ var MediaRenderer = ({ item, active }) => {
1723
+ if (resolveMediaType(item) === "lottie") {
1724
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1725
+ import_dotlottie_react.DotLottieReact,
1726
+ {
1727
+ src: item.mediaUrl,
1728
+ loop: true,
1729
+ autoplay: active
1730
+ }
1731
+ );
1732
+ }
1733
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1734
+ "img",
1735
+ {
1736
+ src: item.mediaUrl,
1737
+ alt: item.title,
1738
+ loading: "lazy"
1739
+ }
1740
+ );
1741
+ };
1742
+ var Scrollytelling = ({
1743
+ header,
1744
+ items,
1745
+ variant = "media-right",
1746
+ className,
1747
+ ...props
1748
+ }) => {
1749
+ const [activeIndex, setActiveIndex] = (0, import_react9.useState)(0);
1750
+ const itemRefs = (0, import_react9.useRef)([]);
1751
+ (0, import_react9.useEffect)(() => {
1752
+ const elements = itemRefs.current.filter(Boolean);
1753
+ if (!elements.length) return;
1754
+ const observer = new IntersectionObserver(
1755
+ (entries) => {
1756
+ entries.forEach((entry) => {
1757
+ if (entry.isIntersecting) {
1758
+ const idx = itemRefs.current.indexOf(
1759
+ entry.target
1760
+ );
1761
+ if (idx !== -1) setActiveIndex(idx);
1762
+ }
1763
+ });
1764
+ },
1765
+ {
1766
+ /* Fire when 50 % of the text block is visible.
1767
+ rootMargin trims the effective viewport to its
1768
+ middle third, preventing accidental fires when
1769
+ items are only just entering / leaving the screen. */
1770
+ threshold: 0.5,
1771
+ rootMargin: "-15% 0px -15% 0px"
1772
+ }
1773
+ );
1774
+ elements.forEach((el) => observer.observe(el));
1775
+ return () => observer.disconnect();
1776
+ }, [items.length]);
1777
+ const rootClass = [
1778
+ "scrolly",
1779
+ `scrolly--${variant}`,
1780
+ className
1781
+ ].filter(Boolean).join(" ");
1782
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("section", { className: rootClass, ...props, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "scrolly__inner", children: [
1783
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("h2", { className: "scrolly__header", children: header }),
1784
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "scrolly__layout", children: [
1785
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "scrolly__media-col", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "scrolly__media-wrap", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1786
+ "div",
1787
+ {
1788
+ className: [
1789
+ "scrolly__media-item",
1790
+ i === activeIndex ? "scrolly__media-item--active" : ""
1791
+ ].filter(Boolean).join(" "),
1792
+ children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1793
+ MediaRenderer,
1794
+ {
1795
+ item,
1796
+ active: i === activeIndex
1797
+ }
1798
+ )
1799
+ },
1800
+ i
1801
+ )) }) }),
1802
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "scrolly__content-col", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
1803
+ "div",
1804
+ {
1805
+ ref: (el) => {
1806
+ itemRefs.current[i] = el;
1807
+ },
1808
+ className: [
1809
+ "scrolly__item",
1810
+ i === activeIndex ? "scrolly__item--active" : "scrolly__item--inactive"
1811
+ ].join(" "),
1812
+ children: [
1813
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("h3", { className: "scrolly__item-title", children: item.title }),
1814
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "scrolly__item-desc", children: item.description }),
1815
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
1816
+ "a",
1817
+ {
1818
+ href: item.link,
1819
+ className: "scrolly__item-link",
1820
+ children: [
1821
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { children: item.linkLabel }),
1822
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(ChevronRight2, {})
1823
+ ]
1824
+ }
1825
+ )
1826
+ ]
1827
+ },
1828
+ i
1829
+ )) })
1830
+ ] }),
1831
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "scrolly__mobile-list", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "scrolly__mobile-item", children: [
1832
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("h3", { className: "scrolly__item-title", children: item.title }),
1833
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "scrolly__item-desc", children: item.description }),
1834
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
1835
+ "a",
1836
+ {
1837
+ href: item.link,
1838
+ className: "scrolly__item-link",
1839
+ children: [
1840
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { children: "Learn more" }),
1841
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(ChevronRight2, {})
1842
+ ]
1843
+ }
1844
+ ),
1845
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "scrolly__mobile-media", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(MediaRenderer, { item, active: true }) })
1846
+ ] }, i)) })
1847
+ ] }) });
1848
+ };
1849
+
1850
+ // templates/StickyStackedCards/StickyStackedCards.tsx
1851
+ var import_react10 = require("react");
1852
+ var import_jsx_runtime21 = require("react/jsx-runtime");
1853
+ var STEPS_DATA = [
1854
+ {
1855
+ title: "Sign up",
1856
+ description: "Sign up in minutes. Practise with a zero-risk demo account.",
1857
+ imageUrl: "https://cdn.prod.website-files.com/66585fe0e1dc7e70cc75d440/677cfad9dd757e95ee7fb4d9_image%20phone.webp",
1858
+ theme: "light"
1859
+ },
1860
+ {
1861
+ title: "Deposit",
1862
+ description: "Use your favourite local payment method to fund your account.",
1863
+ imageUrl: "https://cdn.prod.website-files.com/66585fe0e1dc7e70cc75d440/6757df583bf331c84b6c6a61_card-2.webp",
1864
+ theme: "coral"
1865
+ },
1866
+ {
1867
+ title: "Trade",
1868
+ description: "Start your trading journey.",
1869
+ imageUrl: "https://cdn.prod.website-files.com/66585fe0e1dc7e70cc75d440/6757df583bf331c84b6c6a59_card-3.webp",
1870
+ theme: "dark"
1871
+ }
1872
+ ];
1873
+ var MIN_SCALE = { 0: 0.88, 1: 0.94 };
1874
+ var StickyStackedCards = ({
1875
+ header,
1876
+ items,
1877
+ className,
1878
+ ...props
1879
+ }) => {
1880
+ const cardRefs = (0, import_react10.useRef)([]);
1881
+ (0, import_react10.useEffect)(() => {
1882
+ if (typeof window === "undefined") return;
1883
+ let rafId = 0;
1884
+ const update = () => {
1885
+ const cards = cardRefs.current.filter(Boolean);
1886
+ const n = cards.length;
1887
+ cards.forEach((card, i) => {
1888
+ const minScale = MIN_SCALE[i];
1889
+ if (minScale === void 0) {
1890
+ card.style.setProperty("--card-scale", "1");
1891
+ return;
1892
+ }
1893
+ const nextCard = cards[i + 1];
1894
+ if (!nextCard) return;
1895
+ const cardRect = card.getBoundingClientRect();
1896
+ const nextRect = nextCard.getBoundingClientRect();
1897
+ const cardHeight = cardRect.height;
1898
+ const gap = nextRect.top - cardRect.top;
1899
+ const progress = Math.max(0, Math.min(1, 1 - gap / cardHeight));
1900
+ const scale = 1 - (1 - minScale) * progress;
1901
+ card.style.setProperty("--card-scale", String(+scale.toFixed(4)));
1902
+ });
1903
+ };
1904
+ const onScroll = () => {
1905
+ cancelAnimationFrame(rafId);
1906
+ rafId = requestAnimationFrame(update);
1907
+ };
1908
+ window.addEventListener("scroll", onScroll, { passive: true });
1909
+ update();
1910
+ return () => {
1911
+ window.removeEventListener("scroll", onScroll);
1912
+ cancelAnimationFrame(rafId);
1913
+ };
1914
+ }, [items.length]);
1915
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1916
+ "section",
1917
+ {
1918
+ className: ["ssc", className].filter(Boolean).join(" "),
1919
+ ...props,
1920
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "ssc__inner", children: [
1921
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("h2", { className: "ssc__header", children: header }),
1922
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "ssc__track", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
1923
+ "div",
1924
+ {
1925
+ ref: (el) => {
1926
+ cardRefs.current[i] = el;
1927
+ },
1928
+ className: [
1929
+ "ssc__card",
1930
+ `ssc__card--${item.theme ?? "light"}`
1931
+ ].join(" "),
1932
+ style: {
1933
+ zIndex: i + 1,
1934
+ /*
1935
+ * PEEK OFFSET — every card gets i × peek-offset so each
1936
+ * prior card shows as a thin strip at the top of the next.
1937
+ *
1938
+ * Example with 3 cards, peek = 16px:
1939
+ * Card 0 (Sign up) → 80px
1940
+ * Card 1 (Deposit) → 96px (Sign up peeks 16px above)
1941
+ * Card 2 (Trade) → 112px (Deposit peeks 16px, Sign up 32px above)
1942
+ *
1943
+ * Final state: two 16px colour strips at top, Trade fills the rest.
1944
+ */
1945
+ top: `calc(var(--ssc-sticky-top) + ${i} * var(--ssc-peek-offset))`
1946
+ },
1947
+ children: [
1948
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "ssc__card-content", children: [
1949
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("h3", { className: "ssc__card-title", children: item.title }),
1950
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "ssc__card-desc", children: item.description })
1951
+ ] }),
1952
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "ssc__card-image", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1953
+ "img",
1954
+ {
1955
+ src: item.imageUrl,
1956
+ alt: item.title,
1957
+ loading: i === 0 ? "eager" : "lazy"
1958
+ }
1959
+ ) })
1960
+ ]
1961
+ },
1962
+ i
1963
+ )) })
1964
+ ] })
1965
+ }
1966
+ );
1967
+ };
1968
+
1969
+ // templates/CTABanner/CTABanner.tsx
1970
+ var import_react11 = require("react");
1971
+ var import_framer_motion = require("framer-motion");
1972
+ var import_jsx_runtime22 = require("react/jsx-runtime");
1973
+ var ENTRANCE = {
1974
+ near: 80,
1975
+ mid: 130,
1976
+ far: 180,
1977
+ edge: 240,
1978
+ blurStart: 28
1979
+ };
1980
+ var SPRING = { stiffness: 80, damping: 30, restDelta: 1e-3 };
1981
+ var LOCK_AT = 0.5;
1982
+ var PLACEHOLDER_URL = "https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/68da5c86c91c54f39c86ce1a_footer-member-5.webp";
1983
+ var AVATAR_DATA = [
1984
+ /* ── Rank 0 — bottom-centre-ish (dist ≈ 285) ─── */
1985
+ {
1986
+ id: 11,
1987
+ staggerRank: 0,
1988
+ imageUrl: PLACEHOLDER_URL,
1989
+ desktopPos: { left: "45.7%", top: "84.9%" },
1990
+ mobilePos: { left: "calc(50% - var(--ctab-avatar-size) / 2)", top: "81.8%" },
1991
+ mobileVisible: true
1992
+ },
1993
+ /* ── Rank 1 — top-centre (dist ≈ 293) ────────── */
1994
+ {
1995
+ id: 12,
1996
+ staggerRank: 1,
1997
+ imageUrl: PLACEHOLDER_URL,
1998
+ desktopPos: { left: "calc(50% - var(--ctab-avatar-size) / 2)", top: "0%" },
1999
+ mobilePos: { left: "calc(50% - var(--ctab-avatar-size) / 2)", top: "9.2%" },
2000
+ mobileVisible: true
2001
+ },
2002
+ /* ── Rank 2 — right mid-lower (dist ≈ 341) ───── */
2003
+ {
2004
+ id: 10,
2005
+ staggerRank: 2,
2006
+ imageUrl: PLACEHOLDER_URL,
2007
+ desktopPos: { left: "68.5%", top: "70.7%" },
2008
+ mobilePos: null,
2009
+ mobileVisible: false
2010
+ },
2011
+ /* ── Rank 3 — left mid-lower (dist ≈ 342) ────── */
2012
+ {
2013
+ id: 1,
2014
+ staggerRank: 3,
2015
+ imageUrl: PLACEHOLDER_URL,
2016
+ desktopPos: { left: "24.0%", top: "70.7%" },
2017
+ mobilePos: null,
2018
+ mobileVisible: false
2019
+ },
2020
+ /* ── Rank 4 — left upper (dist ≈ 345) ────────── */
2021
+ {
2022
+ id: 3,
2023
+ staggerRank: 4,
2024
+ imageUrl: PLACEHOLDER_URL,
2025
+ desktopPos: { left: "24.0%", top: "14.4%" },
2026
+ mobilePos: { left: "8.3%", top: "18.2%" },
2027
+ mobileVisible: true
2028
+ },
2029
+ /* ── Rank 5 — right upper (dist ≈ 345) ───────── */
2030
+ {
2031
+ id: 6,
2032
+ staggerRank: 5,
2033
+ imageUrl: PLACEHOLDER_URL,
2034
+ desktopPos: { left: "68.5%", top: "14.4%" },
2035
+ mobilePos: { right: "7.8%", top: "18.3%" },
2036
+ mobileVisible: true
2037
+ },
2038
+ /* ── Rank 6 — far-right middle (dist ≈ 572) ──── */
2039
+ {
2040
+ id: 8,
2041
+ staggerRank: 6,
2042
+ imageUrl: PLACEHOLDER_URL,
2043
+ desktopPos: { left: "91.0%", top: "43.0%" },
2044
+ mobilePos: { right: "7.8%", top: "77.2%" },
2045
+ mobileVisible: true
2046
+ },
2047
+ /* ── Rank 7 — far-left middle (dist ≈ 577) ───── */
2048
+ {
2049
+ id: 5,
2050
+ staggerRank: 7,
2051
+ imageUrl: PLACEHOLDER_URL,
2052
+ desktopPos: { left: "1.25%", top: "43.0%" },
2053
+ mobilePos: { left: "8.6%", top: "72.8%" },
2054
+ mobileVisible: true
2055
+ },
2056
+ /* ── Rank 8 — far-right bottom (dist ≈ 639) ──── */
2057
+ {
2058
+ id: 9,
2059
+ staggerRank: 8,
2060
+ imageUrl: PLACEHOLDER_URL,
2061
+ desktopPos: { left: "91.0%", top: "84.9%" },
2062
+ mobilePos: null,
2063
+ mobileVisible: false
2064
+ },
2065
+ /* ── Rank 9 — far-right top (dist ≈ 642) ─────── */
2066
+ {
2067
+ id: 7,
2068
+ staggerRank: 9,
2069
+ imageUrl: PLACEHOLDER_URL,
2070
+ desktopPos: { left: "91.0%", top: "0%" },
2071
+ mobilePos: null,
2072
+ mobileVisible: false
2073
+ },
2074
+ /* ── Rank 10 — far-left bottom (dist ≈ 643) ──── */
2075
+ {
2076
+ id: 2,
2077
+ staggerRank: 10,
2078
+ imageUrl: PLACEHOLDER_URL,
2079
+ desktopPos: { left: "1.25%", top: "84.9%" },
2080
+ mobilePos: null,
2081
+ mobileVisible: false
2082
+ },
2083
+ /* ── Rank 11 — far-left top (dist ≈ 647) ─────── */
2084
+ {
2085
+ id: 4,
2086
+ staggerRank: 11,
2087
+ imageUrl: PLACEHOLDER_URL,
2088
+ desktopPos: { left: "1.25%", top: "0%" },
2089
+ mobilePos: null,
2090
+ mobileVisible: false
2091
+ }
2092
+ ];
2093
+ function useAvatarYValues(smooth) {
2094
+ const y0 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.near, 0]);
2095
+ const y1 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.near, 0]);
2096
+ const y2 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]);
2097
+ const y3 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]);
2098
+ const y4 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]);
2099
+ const y5 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]);
2100
+ const y6 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [0, 0]);
2101
+ const y7 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [0, 0]);
2102
+ const y8 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.far, 0]);
2103
+ const y9 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]);
2104
+ const y10 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.edge, 0]);
2105
+ const y11 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]);
2106
+ return [y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11];
2107
+ }
2108
+ function useAvatarXValues(smooth) {
2109
+ const x0 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [0, 0]);
2110
+ const x1 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [0, 0]);
2111
+ const x2 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]);
2112
+ const x3 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]);
2113
+ const x4 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]);
2114
+ const x5 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]);
2115
+ const x6 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.far, 0]);
2116
+ const x7 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.far, 0]);
2117
+ const x8 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.far, 0]);
2118
+ const x9 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.edge, 0]);
2119
+ const x10 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]);
2120
+ const x11 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]);
2121
+ return [x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11];
2122
+ }
2123
+ var CTABanner = ({
2124
+ headline = "Join 3M+ global traders",
2125
+ ctaLabel = "Open account",
2126
+ ctaHref = "#",
2127
+ avatars = AVATAR_DATA,
2128
+ className,
2129
+ ...props
2130
+ }) => {
2131
+ const sectionRef = (0, import_react11.useRef)(null);
2132
+ const { scrollYProgress } = (0, import_framer_motion.useScroll)({
2133
+ target: sectionRef,
2134
+ offset: ["start end", "end start"]
2135
+ });
2136
+ const smooth = (0, import_framer_motion.useSpring)(scrollYProgress, SPRING);
2137
+ const gridOpacity = (0, import_framer_motion.useTransform)(smooth, [0, 0.3], [0, 1]);
2138
+ const heroY = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [32, 0]);
2139
+ const heroOpacity = (0, import_framer_motion.useTransform)(smooth, [0, 0.3], [0, 1]);
2140
+ const avatarOpacity = (0, import_framer_motion.useTransform)(smooth, [0, 0.25], [0, 1]);
2141
+ const blurPx = (0, import_framer_motion.useTransform)(smooth, [0, 0.3, 0.7, 1], [ENTRANCE.blurStart, 0, 0, ENTRANCE.blurStart]);
2142
+ const avatarFilter = import_framer_motion.useMotionTemplate`blur(${blurPx}px)`;
2143
+ const avatarYValues = useAvatarYValues(smooth);
2144
+ const avatarXValues = useAvatarXValues(smooth);
2145
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
2146
+ "section",
2147
+ {
2148
+ ref: sectionRef,
2149
+ className: ["ctab", className].filter(Boolean).join(" "),
2150
+ ...props,
2151
+ children: [
2152
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2153
+ import_framer_motion.motion.div,
2154
+ {
2155
+ className: "ctab__grid",
2156
+ style: { opacity: gridOpacity },
2157
+ "aria-hidden": "true"
2158
+ }
2159
+ ),
2160
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "ctab__inner", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "ctab__stage", children: [
2161
+ avatars.map((avatar, index) => {
2162
+ const posStyle = {};
2163
+ if (avatar.desktopPos.left) posStyle["--av-d-left"] = avatar.desktopPos.left;
2164
+ if (avatar.desktopPos.right) posStyle["--av-d-right"] = avatar.desktopPos.right;
2165
+ if (avatar.desktopPos.top) posStyle["--av-d-top"] = avatar.desktopPos.top;
2166
+ if (avatar.mobilePos?.left) posStyle["--av-m-left"] = avatar.mobilePos.left;
2167
+ if (avatar.mobilePos?.right) posStyle["--av-m-right"] = avatar.mobilePos.right;
2168
+ if (avatar.mobilePos?.top) posStyle["--av-m-top"] = avatar.mobilePos.top;
2169
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2170
+ import_framer_motion.motion.div,
2171
+ {
2172
+ className: [
2173
+ "ctab__avatar",
2174
+ !avatar.mobileVisible ? "ctab__avatar--desktop-only" : ""
2175
+ ].filter(Boolean).join(" "),
2176
+ style: {
2177
+ ...posStyle,
2178
+ x: avatarXValues[index],
2179
+ y: avatarYValues[index],
2180
+ opacity: avatarOpacity,
2181
+ filter: avatarFilter
2182
+ },
2183
+ children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2184
+ "img",
2185
+ {
2186
+ src: avatar.imageUrl,
2187
+ alt: "",
2188
+ loading: "lazy",
2189
+ draggable: false
2190
+ }
2191
+ )
2192
+ },
2193
+ avatar.id
2194
+ );
2195
+ }),
2196
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
2197
+ import_framer_motion.motion.div,
2198
+ {
2199
+ className: "ctab__hero",
2200
+ style: { y: heroY, opacity: heroOpacity },
2201
+ children: [
2202
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("h2", { className: "ctab__headline", children: headline }),
2203
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("a", { href: ctaHref, className: "ctab__btn", children: ctaLabel })
2204
+ ]
2205
+ }
2206
+ )
2207
+ ] }) })
2208
+ ]
2209
+ }
2210
+ );
2211
+ };
2212
+
2213
+ // templates/DayNightTransition/DayNightTransition.tsx
2214
+ var import_react12 = require("react");
2215
+ var import_framer_motion2 = require("framer-motion");
2216
+ var import_jsx_runtime23 = require("react/jsx-runtime");
2217
+ var SPRING2 = { stiffness: 80, damping: 30, restDelta: 1e-3 };
2218
+ var FADE_START = 0.35;
2219
+ var FADE_END = 0.65;
2220
+ var WORD_START = 0.4;
2221
+ var WORD_END = 0.6;
2222
+ var TEXT_CHANNEL_DAY = 0;
2223
+ var TEXT_CHANNEL_NIGHT = 255;
2224
+ var DayNightTransition = ({
2225
+ dayImageUrl,
2226
+ nightImageUrl,
2227
+ dayHeadline = "Trade all day",
2228
+ nightHeadline = "Trade all night",
2229
+ dayDescription,
2230
+ nightDescription,
2231
+ ctaLabel = "Get started",
2232
+ ctaHref = "#",
2233
+ className,
2234
+ ...props
2235
+ }) => {
2236
+ const wrapperRef = (0, import_react12.useRef)(null);
2237
+ const { scrollYProgress } = (0, import_framer_motion2.useScroll)({
2238
+ target: wrapperRef,
2239
+ offset: ["start end", "end start"]
2240
+ });
2241
+ const smooth = (0, import_framer_motion2.useSpring)(scrollYProgress, SPRING2);
2242
+ const nightOpacity = (0, import_framer_motion2.useTransform)(smooth, [FADE_START, FADE_END], [0, 1]);
2243
+ const channel = (0, import_framer_motion2.useTransform)(smooth, [FADE_START, FADE_END], [TEXT_CHANNEL_DAY, TEXT_CHANNEL_NIGHT]);
2244
+ const textColor = import_framer_motion2.useMotionTemplate`rgb(${channel}, ${channel}, ${channel})`;
2245
+ const dayOpacity = (0, import_framer_motion2.useTransform)(smooth, [WORD_START, WORD_END], [1, 0]);
2246
+ const nightOpacity2 = (0, import_framer_motion2.useTransform)(smooth, [WORD_START, WORD_END], [0, 1]);
2247
+ const hasDescription = Boolean(dayDescription || nightDescription);
2248
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2249
+ "div",
2250
+ {
2251
+ ref: wrapperRef,
2252
+ className: ["dnt", className].filter(Boolean).join(" "),
2253
+ ...props,
2254
+ children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "dnt__sticky", children: [
2255
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2256
+ "img",
2257
+ {
2258
+ className: "dnt__bg dnt__bg--day",
2259
+ src: dayImageUrl,
2260
+ alt: "",
2261
+ loading: "eager",
2262
+ draggable: false
2263
+ }
2264
+ ),
2265
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2266
+ import_framer_motion2.motion.img,
2267
+ {
2268
+ className: "dnt__bg dnt__bg--night",
2269
+ src: nightImageUrl,
2270
+ alt: "",
2271
+ loading: "eager",
2272
+ draggable: false,
2273
+ style: { opacity: nightOpacity }
2274
+ }
2275
+ ),
2276
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "dnt__content", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
2277
+ import_framer_motion2.motion.div,
2278
+ {
2279
+ className: "dnt__text-wrap",
2280
+ style: { color: textColor },
2281
+ children: [
2282
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "dnt__crossfade-wrap", children: [
2283
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2284
+ import_framer_motion2.motion.h2,
2285
+ {
2286
+ className: "dnt__headline",
2287
+ style: { opacity: dayOpacity },
2288
+ children: dayHeadline
2289
+ }
2290
+ ),
2291
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2292
+ import_framer_motion2.motion.h2,
2293
+ {
2294
+ className: "dnt__headline",
2295
+ "aria-hidden": "true",
2296
+ style: { opacity: nightOpacity2 },
2297
+ children: nightHeadline
2298
+ }
2299
+ )
2300
+ ] }),
2301
+ hasDescription && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "dnt__crossfade-wrap", children: [
2302
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2303
+ import_framer_motion2.motion.p,
2304
+ {
2305
+ className: "dnt__description",
2306
+ style: { opacity: dayOpacity },
2307
+ children: dayDescription ?? ""
2308
+ }
2309
+ ),
2310
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2311
+ import_framer_motion2.motion.p,
2312
+ {
2313
+ className: "dnt__description",
2314
+ "aria-hidden": "true",
2315
+ style: { opacity: nightOpacity2 },
2316
+ children: nightDescription ?? ""
2317
+ }
2318
+ )
2319
+ ] }),
2320
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("a", { href: ctaHref, className: "dnt__btn", children: ctaLabel })
2321
+ ]
2322
+ }
2323
+ ) })
2324
+ ] })
2325
+ }
2326
+ );
2327
+ };
2328
+
2329
+ // templates/PaymentMethods/PaymentMethods.tsx
2330
+ var import_react13 = require("react");
2331
+ var import_framer_motion3 = require("framer-motion");
2332
+ var import_jsx_runtime24 = require("react/jsx-runtime");
2333
+ function modWrap(min, max, v) {
2334
+ const range = max - min;
2335
+ return ((v - min) % range + range) % range + min;
2336
+ }
2337
+ var VELOCITY_FACTOR = 0.4;
2338
+ var MAX_SCROLL_V = 2500;
2339
+ var DEADZONE = 2;
2340
+ var CDN = "https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/";
2341
+ var COL_ONE_LOGOS = [
2342
+ { name: "Mastercard", url: `${CDN}68dcd915dc1a82f278b6c061_payment%20method-mastercard.svg` },
2343
+ { name: "Visa", url: `${CDN}68dcd9d10fda048e2d53a3a1_payment%20method-visa.svg` },
2344
+ { name: "Visa Electron", url: `${CDN}68dcd9d10fda048e2d53a3a1_payment%20method-visa-electron.svg` },
2345
+ { name: "Maestro", url: `${CDN}68dcd9d183a5dcfaa9a06587_payment%20method-maestro.svg` },
2346
+ { name: "Pix", url: `${CDN}68dcd9d13461263dcd8ccf54_payment%20method-pix.svg` },
2347
+ { name: "Help2Pay", url: `${CDN}68dcd9d13461263dcd8ccf54_payment%20method-help2pay.svg` },
2348
+ { name: "UPI Neo", url: `${CDN}68dcd9d13461263dcd8ccf54_payment%20method-upineo.svg` },
2349
+ { name: "M-Pesa", url: `${CDN}68dcd9d13461263dcd8ccf54_payment%20method-mpesa.svg` },
2350
+ { name: "Ozow", url: `${CDN}68dcd9d13461263dcd8ccf54_payment%20method-ozow.svg` },
2351
+ { name: "MTN", url: `${CDN}68dcd9d13461263dcd8ccf54_payment%20method-mtn.svg` },
2352
+ { name: "Airtm", url: `${CDN}68dcd9d13461263dcd8ccf54_payment%20method-airtm.svg` }
2353
+ ];
2354
+ var COL_TWO_LOGOS = [
2355
+ { name: "Bitcoin", url: `${CDN}68dcd9d13384aff3f072511a_payment%20method-bitcoin.svg` },
2356
+ { name: "Ethereum", url: `${CDN}68dcd9d10fda048e2d53a3a1_payment%20method-ethereum.svg` },
2357
+ { name: "Tron", url: `${CDN}68dcd9d109305b54383580e5_payment%20method-tron.svg` },
2358
+ { name: "Skrill", url: `${CDN}68dcd9d183a5dcfaa9a06587_payment%20method-skrill.svg` },
2359
+ { name: "Skrill 1-tap", url: `${CDN}68dcd9d183a5dcfaa9a06587_payment%20method-skrill-1tap.svg` },
2360
+ { name: "SticPay", url: `${CDN}68dcd9d183a5dcfaa9a06587_payment%20method-sticpay.svg` },
2361
+ { name: "Litecoin", url: `${CDN}68dcd9d13384aff3f072511a_payment%20method-litecoin.svg` },
2362
+ { name: "USD Coin", url: `${CDN}68dcd9d13384aff3f072511a_payment%20method-usdc.svg` },
2363
+ { name: "Dogecoin", url: `${CDN}68dcd9d13384aff3f072511a_payment%20method-dogecoin.svg` },
2364
+ { name: "Cardano", url: `${CDN}68dcd9d13384aff3f072511a_payment%20method-cardano.svg` },
2365
+ { name: "BNB", url: `${CDN}68dcd9d13384aff3f072511a_payment%20method-bnb.svg` }
2366
+ ];
2367
+ var TEXT_CONTENT = {
2368
+ headline: "Your money, your way",
2369
+ body: "Quick deposits, easy withdrawals, and 60+ payment options mean your money is always accessible.",
2370
+ disclaimer: "*Availability of payment methods and processing speeds may vary based on location and selected payment option.",
2371
+ ctaLabel: "Learn more",
2372
+ ctaHref: "#"
2373
+ };
2374
+ var PaymentMethods = ({
2375
+ headline = TEXT_CONTENT.headline,
2376
+ body = TEXT_CONTENT.body,
2377
+ disclaimer = TEXT_CONTENT.disclaimer,
2378
+ ctaLabel = TEXT_CONTENT.ctaLabel,
2379
+ ctaHref = TEXT_CONTENT.ctaHref,
2380
+ col1Logos = COL_ONE_LOGOS,
2381
+ col2Logos = COL_TWO_LOGOS,
2382
+ className,
2383
+ ...props
2384
+ }) => {
2385
+ const { scrollY } = (0, import_framer_motion3.useScroll)();
2386
+ const scrollVelocity = (0, import_framer_motion3.useVelocity)(scrollY);
2387
+ const col1Y = (0, import_framer_motion3.useMotionValue)(0);
2388
+ const col2Y = (0, import_framer_motion3.useMotionValue)(0);
2389
+ const col1Ref = (0, import_react13.useRef)(null);
2390
+ const col2Ref = (0, import_react13.useRef)(null);
2391
+ (0, import_framer_motion3.useAnimationFrame)((_, delta) => {
2392
+ const raw = scrollVelocity.get();
2393
+ if (Math.abs(raw) < DEADZONE) return;
2394
+ const clamped = Math.sign(raw) * Math.min(Math.abs(raw), MAX_SCROLL_V);
2395
+ const step = clamped * VELOCITY_FACTOR * (delta / 1e3);
2396
+ const cycleH1 = (col1Ref.current?.offsetHeight ?? 2e3) / 2;
2397
+ const cycleH2 = (col2Ref.current?.offsetHeight ?? 2e3) / 2;
2398
+ col1Y.set(modWrap(-cycleH1, 0, col1Y.get() - step));
2399
+ col2Y.set(modWrap(-cycleH2, 0, col2Y.get() + step));
2400
+ });
2401
+ const track1 = [...col1Logos, ...col1Logos];
2402
+ const track2 = [...col2Logos, ...col2Logos];
2403
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2404
+ "section",
2405
+ {
2406
+ className: ["pm", className].filter(Boolean).join(" "),
2407
+ ...props,
2408
+ children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "pm__inner", children: [
2409
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "pm__media", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "pm__carousel", children: [
2410
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "pm__fade pm__fade--top", "aria-hidden": "true" }),
2411
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2412
+ import_framer_motion3.motion.div,
2413
+ {
2414
+ ref: col1Ref,
2415
+ className: "pm__col",
2416
+ style: { y: col1Y },
2417
+ children: track1.map((logo, i) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "pm__card", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "pm__card-img-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2418
+ "img",
2419
+ {
2420
+ src: logo.url,
2421
+ alt: logo.name,
2422
+ loading: "lazy",
2423
+ draggable: false
2424
+ }
2425
+ ) }) }, `c1-${i}`))
2426
+ }
2427
+ ),
2428
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2429
+ import_framer_motion3.motion.div,
2430
+ {
2431
+ ref: col2Ref,
2432
+ className: "pm__col",
2433
+ style: { y: col2Y },
2434
+ children: track2.map((logo, i) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "pm__card", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "pm__card-img-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2435
+ "img",
2436
+ {
2437
+ src: logo.url,
2438
+ alt: logo.name,
2439
+ loading: "lazy",
2440
+ draggable: false
2441
+ }
2442
+ ) }) }, `c2-${i}`))
2443
+ }
2444
+ ),
2445
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "pm__fade pm__fade--bottom", "aria-hidden": "true" })
2446
+ ] }) }),
2447
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "pm__content", children: [
2448
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h2", { className: "pm__headline", children: headline }),
2449
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "pm__text-group", children: [
2450
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "pm__body", children: body }),
2451
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "pm__disclaimer", children: disclaimer })
2452
+ ] }),
2453
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("a", { href: ctaHref, className: "pm__link", children: [
2454
+ ctaLabel,
2455
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { "aria-hidden": "true", children: "\u2192" })
2456
+ ] })
2457
+ ] })
2458
+ ] })
2459
+ }
2460
+ );
2461
+ };
986
2462
  // Annotate the CommonJS export names for ESM import in node:
987
2463
  0 && (module.exports = {
2464
+ AVATAR_DATA,
988
2465
  Accordion,
2466
+ BottomSheet,
989
2467
  Breadcrumb,
990
2468
  Button,
2469
+ COL_ONE_LOGOS,
2470
+ COL_TWO_LOGOS,
2471
+ CTABanner,
991
2472
  Card,
992
2473
  Chip,
993
2474
  ChipDropdown,
2475
+ DayNightTransition,
2476
+ FeatureCards,
2477
+ Footer,
2478
+ Hero,
994
2479
  Link,
995
2480
  Pagination,
2481
+ PaymentMethods,
2482
+ SCROLLYTELLING_DATA,
2483
+ STEPS_DATA,
2484
+ Scrollytelling,
996
2485
  SearchField,
2486
+ Stats,
2487
+ StickyStackedCards,
2488
+ TEXT_CONTENT,
997
2489
  Tag,
998
2490
  TextField
999
2491
  });