@deriv-web-design/ui 0.0.3 → 0.0.5

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,16 +20,31 @@ 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,
29
35
  FeatureCards: () => FeatureCards,
36
+ Footer: () => Footer,
37
+ Hero: () => Hero,
30
38
  Link: () => Link,
31
39
  Pagination: () => Pagination,
40
+ PaymentMethods: () => PaymentMethods,
41
+ SCROLLYTELLING_DATA: () => SCROLLYTELLING_DATA,
42
+ STEPS_DATA: () => STEPS_DATA,
43
+ Scrollytelling: () => Scrollytelling,
32
44
  SearchField: () => SearchField,
45
+ Stats: () => Stats,
46
+ StickyStackedCards: () => StickyStackedCards,
47
+ TEXT_CONTENT: () => TEXT_CONTENT,
33
48
  Tag: () => Tag,
34
49
  TextField: () => TextField
35
50
  });
@@ -390,9 +405,116 @@ var SearchField = (0, import_react3.forwardRef)(
390
405
  SearchField.displayName = "SearchField";
391
406
 
392
407
  // primitives/Breadcrumb/Breadcrumb.tsx
408
+ var import_react5 = require("react");
409
+
410
+ // primitives/BottomSheet/BottomSheet.tsx
393
411
  var import_react4 = require("react");
412
+ var import_react_dom = require("react-dom");
394
413
  var import_jsx_runtime8 = require("react/jsx-runtime");
395
- var ChevronRightIcon = () => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
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
+ };
514
+
515
+ // primitives/Breadcrumb/Breadcrumb.tsx
516
+ var import_jsx_runtime9 = require("react/jsx-runtime");
517
+ var ChevronRightIcon = () => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
396
518
  "svg",
397
519
  {
398
520
  width: "1em",
@@ -401,7 +523,7 @@ var ChevronRightIcon = () => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
401
523
  fill: "none",
402
524
  xmlns: "http://www.w3.org/2000/svg",
403
525
  "aria-hidden": "true",
404
- children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
526
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
405
527
  "path",
406
528
  {
407
529
  d: "M6 3.5L10.5 8L6 12.5",
@@ -414,9 +536,9 @@ var ChevronRightIcon = () => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
414
536
  }
415
537
  );
416
538
  function BreadcrumbLink({ item }) {
417
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
418
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("a", { href: item.href, onClick: item.onClick, className: "bc-link", children: item.label }),
419
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "bc-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, {}) })
420
542
  ] });
421
543
  }
422
544
  function Breadcrumb({
@@ -426,48 +548,67 @@ function Breadcrumb({
426
548
  className,
427
549
  ...navProps
428
550
  }) {
429
- const [expanded, setExpanded] = (0, import_react4.useState)(false);
551
+ const [sheetOpen, setSheetOpen] = (0, import_react5.useState)(false);
430
552
  const truncatable = collapsible && items.length > 3;
431
- const listClass = [
432
- "bc-list",
433
- size,
434
- truncatable ? "collapsible" : "",
435
- truncatable && expanded ? "expanded" : ""
436
- ].filter(Boolean).join(" ");
553
+ const listClass = ["bc-list", size, truncatable ? "collapsible" : ""].filter(Boolean).join(" ");
437
554
  if (!truncatable) {
438
- 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) => {
439
556
  const isLast = index === items.length - 1;
440
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("li", { className: "bc-item", children: isLast ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "bc-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);
441
558
  }) }) });
442
559
  }
443
560
  const firstItem = items[0];
444
561
  const middleItems = items.slice(1, items.length - 2);
445
562
  const parentItem = items[items.length - 2];
446
563
  const currentItem = items[items.length - 1];
447
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("nav", { "aria-label": "Breadcrumb", className, ...navProps, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("ol", { className: listClass, children: [
448
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("li", { className: "bc-item", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(BreadcrumbLink, { item: firstItem }) }),
449
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("li", { className: "bc-ellipsisItem", "aria-hidden": expanded, children: [
450
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
451
- "button",
452
- {
453
- className: "bc-ellipsisButton",
454
- onClick: () => setExpanded(true),
455
- "aria-label": "Show all breadcrumb items",
456
- children: "\u2026"
457
- }
458
- ),
459
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "bc-separator", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ChevronRightIcon, {}) })
460
- ] }),
461
- middleItems.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("li", { className: "bc-middleItem", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(BreadcrumbLink, { item }) }, `m-${index}`)),
462
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("li", { className: "bc-item", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(BreadcrumbLink, { item: parentItem }) }),
463
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("li", { className: "bc-item", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "bc-current", "aria-current": "page", children: currentItem.label }) })
464
- ] }) });
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
+ ] });
465
606
  }
466
607
 
467
608
  // primitives/ChipDropdown/ChipDropdown.tsx
468
- var import_react5 = require("react");
469
- var import_jsx_runtime9 = require("react/jsx-runtime");
470
- 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)(
471
612
  "svg",
472
613
  {
473
614
  width: "16",
@@ -476,7 +617,7 @@ var ChevronDownIcon = () => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
476
617
  fill: "none",
477
618
  xmlns: "http://www.w3.org/2000/svg",
478
619
  "aria-hidden": "true",
479
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
620
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
480
621
  "path",
481
622
  {
482
623
  d: "M3 6l5 5 5-5",
@@ -488,7 +629,7 @@ var ChevronDownIcon = () => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
488
629
  )
489
630
  }
490
631
  );
491
- var CheckIcon = () => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
632
+ var CheckIcon = () => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
492
633
  "svg",
493
634
  {
494
635
  width: "12",
@@ -497,7 +638,7 @@ var CheckIcon = () => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
497
638
  fill: "none",
498
639
  xmlns: "http://www.w3.org/2000/svg",
499
640
  "aria-hidden": "true",
500
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
641
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
501
642
  "path",
502
643
  {
503
644
  d: "M2 6l3 3 5-5",
@@ -521,13 +662,22 @@ var ChipDropdown = ({
521
662
  className,
522
663
  ...props
523
664
  }) => {
524
- const [open, setOpen] = (0, import_react5.useState)(false);
525
- 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);
526
670
  const selectedOption = options.find((o) => o.value === value) ?? null;
527
671
  const displayLabel = selectedOption ? selectedOption.label : label;
528
672
  const isSelected = selectedOption !== null;
529
- (0, import_react5.useEffect)(() => {
530
- 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;
531
681
  const handleClickOutside = (e) => {
532
682
  if (wrapperRef.current && !wrapperRef.current.contains(e.target)) {
533
683
  setOpen(false);
@@ -535,7 +685,7 @@ var ChipDropdown = ({
535
685
  };
536
686
  document.addEventListener("mousedown", handleClickOutside);
537
687
  return () => document.removeEventListener("mousedown", handleClickOutside);
538
- }, [open]);
688
+ }, [open, isMobile]);
539
689
  const triggerClassNames = [
540
690
  "cd-trigger",
541
691
  size,
@@ -546,8 +696,29 @@ var ChipDropdown = ({
546
696
  const handleKeyDown = (e) => {
547
697
  if (e.key === "Escape") setOpen(false);
548
698
  };
549
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { ref: wrapperRef, className: "cd-wrapper", children: [
550
- /* @__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)(
551
722
  "button",
552
723
  {
553
724
  type: "button",
@@ -559,56 +730,37 @@ var ChipDropdown = ({
559
730
  onKeyDown: handleKeyDown,
560
731
  ...props,
561
732
  children: [
562
- icon && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "cd-icon", children: icon }),
563
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "cd-label", children: displayLabel }),
564
- tag && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "cd-tag", children: tag }),
565
- /* @__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)(
566
737
  "span",
567
738
  {
568
739
  className: ["cd-chevron", open ? "chevronOpen" : ""].filter(Boolean).join(" "),
569
740
  "aria-hidden": "true",
570
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ChevronDownIcon, {})
741
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ChevronDownIcon, {})
571
742
  }
572
743
  )
573
744
  ]
574
745
  }
575
746
  ),
576
- open && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
577
- "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,
578
750
  {
579
- role: "listbox",
580
- "aria-label": label,
581
- className: "cd-list",
582
- children: options.map((option) => {
583
- const isActive = option.value === value;
584
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
585
- "li",
586
- {
587
- role: "option",
588
- "aria-selected": isActive,
589
- className: [
590
- "cd-item",
591
- isActive ? "itemSelected" : ""
592
- ].filter(Boolean).join(" "),
593
- onClick: () => {
594
- onChange?.(option.value);
595
- setOpen(false);
596
- },
597
- children: [
598
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "cd-itemLabel", children: option.label }),
599
- isActive && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "cd-itemCheck", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(CheckIcon, {}) })
600
- ]
601
- },
602
- option.value
603
- );
604
- })
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 })
605
757
  }
606
758
  )
607
759
  ] });
608
760
  };
609
761
 
610
762
  // components/Card/CardPrimaryVariant.tsx
611
- var import_jsx_runtime10 = require("react/jsx-runtime");
763
+ var import_jsx_runtime11 = require("react/jsx-runtime");
612
764
  var CardPrimaryVariant = ({
613
765
  colorScheme = "light",
614
766
  title,
@@ -623,7 +775,7 @@ var CardPrimaryVariant = ({
623
775
  ...props
624
776
  }) => {
625
777
  const isInverse = colorScheme === "dark" || colorScheme === "brand" || colorScheme === "image";
626
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
778
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
627
779
  "div",
628
780
  {
629
781
  className: [
@@ -633,14 +785,14 @@ var CardPrimaryVariant = ({
633
785
  ].filter(Boolean).join(" "),
634
786
  ...props,
635
787
  children: [
636
- colorScheme === "image" && image && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { "aria-hidden": "true", className: "cp-imageOverlay", children: [
637
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("img", { alt: "", className: "cp-overlayImg", src: image }),
638
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "cp-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" })
639
791
  ] }),
640
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "cp-content", children: [
641
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: ["cp-title", isInverse ? "textInverse" : "textDefault"].join(" "), children: title }),
642
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: ["cp-description", isInverse ? "textInverse" : "textDefault"].join(" "), children: description }),
643
- showLink && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
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)(
644
796
  Link,
645
797
  {
646
798
  colorScheme: isInverse ? "white" : "coral",
@@ -649,14 +801,14 @@ var CardPrimaryVariant = ({
649
801
  }
650
802
  )
651
803
  ] }),
652
- colorScheme !== "image" && image && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "cp-imageSection", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("img", { alt: imageAlt, className: "cp-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 }) })
653
805
  ]
654
806
  }
655
807
  );
656
808
  };
657
809
 
658
810
  // components/Card/CardSecondaryVariant.tsx
659
- var import_jsx_runtime11 = require("react/jsx-runtime");
811
+ var import_jsx_runtime12 = require("react/jsx-runtime");
660
812
  var CardSecondaryVariant = ({
661
813
  title,
662
814
  description,
@@ -669,16 +821,16 @@ var CardSecondaryVariant = ({
669
821
  variant: _variant,
670
822
  ...props
671
823
  }) => {
672
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
824
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
673
825
  "div",
674
826
  {
675
827
  className: ["card-secondary", className ?? ""].filter(Boolean).join(" "),
676
828
  ...props,
677
829
  children: [
678
- showIcon && icon && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "cs-icon", children: icon }),
679
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "cs-title", children: title }),
680
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "cs-description", children: description }),
681
- showLink && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
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)(
682
834
  Link,
683
835
  {
684
836
  colorScheme: "coral",
@@ -692,8 +844,8 @@ var CardSecondaryVariant = ({
692
844
  };
693
845
 
694
846
  // components/Card/CardThumbnailVariant.tsx
695
- var import_jsx_runtime12 = require("react/jsx-runtime");
696
- 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)(
697
849
  "svg",
698
850
  {
699
851
  "aria-hidden": "true",
@@ -703,7 +855,7 @@ var LinkIcon = () => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
703
855
  width: "14",
704
856
  xmlns: "http://www.w3.org/2000/svg",
705
857
  children: [
706
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
858
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
707
859
  "path",
708
860
  {
709
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",
@@ -713,7 +865,7 @@ var LinkIcon = () => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
713
865
  strokeWidth: "1.25"
714
866
  }
715
867
  ),
716
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
868
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
717
869
  "path",
718
870
  {
719
871
  d: "M7.875 1.75h4.375v4.375M12.25 1.75 6.125 7.875",
@@ -726,7 +878,7 @@ var LinkIcon = () => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
726
878
  ]
727
879
  }
728
880
  );
729
- var PlayIcon = () => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
881
+ var PlayIcon = () => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
730
882
  "svg",
731
883
  {
732
884
  "aria-hidden": "true",
@@ -736,8 +888,8 @@ var PlayIcon = () => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
736
888
  width: "80",
737
889
  xmlns: "http://www.w3.org/2000/svg",
738
890
  children: [
739
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("circle", { cx: "40", cy: "40", fill: "rgba(255,255,255,0.88)", r: "40" }),
740
- /* @__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)" })
741
893
  ]
742
894
  }
743
895
  );
@@ -758,33 +910,33 @@ var CardThumbnailVariant = ({
758
910
  ...props
759
911
  }) => {
760
912
  const isVideo = type === "video";
761
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
913
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
762
914
  "div",
763
915
  {
764
916
  className: ["card-thumbnail", className ?? ""].filter(Boolean).join(" "),
765
917
  ...props,
766
918
  children: [
767
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "ct-thumbnailWrapper", children: [
768
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("img", { alt: thumbnailAlt, className: "ct-thumbnailImage", src: thumbnail }),
769
- isVideo && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { "aria-label": "Play video", className: "ct-playButton", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(PlayIcon, {}) }),
770
- !isVideo && avatar && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("img", { alt: avatarAlt, className: "ct-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 })
771
923
  ] }),
772
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "ct-content", children: [
773
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "ct-metaRow", children: [
774
- !hideTags && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "ct-tagsList", children: tags.map((tag, i) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Tag, { icon: tag.icon, label: tag.label, size: "md", variant: "fill" }, i)) }),
775
- 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)(
776
928
  "button",
777
929
  {
778
930
  "aria-label": "Copy link",
779
931
  className: "ct-copyLink",
780
932
  onClick: onCopyLink,
781
933
  type: "button",
782
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(LinkIcon, {})
934
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(LinkIcon, {})
783
935
  }
784
936
  )
785
937
  ] }),
786
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "ct-title", children: title }),
787
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "ct-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 })
788
940
  ] })
789
941
  ]
790
942
  }
@@ -792,21 +944,21 @@ var CardThumbnailVariant = ({
792
944
  };
793
945
 
794
946
  // components/Card/Card.tsx
795
- var import_jsx_runtime13 = require("react/jsx-runtime");
947
+ var import_jsx_runtime14 = require("react/jsx-runtime");
796
948
  var Card = (props) => {
797
949
  if (props.variant === "primary") {
798
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(CardPrimaryVariant, { ...props });
950
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(CardPrimaryVariant, { ...props });
799
951
  }
800
952
  if (props.variant === "secondary") {
801
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(CardSecondaryVariant, { ...props });
953
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(CardSecondaryVariant, { ...props });
802
954
  }
803
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(CardThumbnailVariant, { ...props });
955
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(CardThumbnailVariant, { ...props });
804
956
  };
805
957
 
806
958
  // primitives/Pagination/Pagination.tsx
807
- var import_jsx_runtime14 = require("react/jsx-runtime");
808
- 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" }) });
809
- 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" }) });
810
962
  function getPageItems(currentPage, totalPages) {
811
963
  if (totalPages <= 5) {
812
964
  return Array.from({ length: totalPages }, (_, i) => i + 1);
@@ -828,25 +980,25 @@ var Pagination = ({
828
980
  const items = getPageItems(currentPage, totalPages);
829
981
  const isPrevDisabled = currentPage <= 1;
830
982
  const isNextDisabled = currentPage >= totalPages;
831
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
983
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
832
984
  "nav",
833
985
  {
834
986
  className: ["pagination", className ?? ""].filter(Boolean).join(" "),
835
987
  "aria-label": "Pagination navigation",
836
988
  children: [
837
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
989
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
838
990
  "button",
839
991
  {
840
992
  className: ["navButton", isPrevDisabled ? "navButtonDisabled" : ""].filter(Boolean).join(" "),
841
993
  onClick: () => onPageChange(currentPage - 1),
842
994
  disabled: isPrevDisabled,
843
995
  "aria-label": "Previous page",
844
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "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, {}) })
845
997
  }
846
998
  ),
847
999
  items.map((item, index) => {
848
1000
  if (item === "ellipsis-left" || item === "ellipsis-right") {
849
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1001
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
850
1002
  "span",
851
1003
  {
852
1004
  className: "ellipsis",
@@ -857,7 +1009,7 @@ var Pagination = ({
857
1009
  );
858
1010
  }
859
1011
  const isSelected = item === currentPage;
860
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1012
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
861
1013
  "button",
862
1014
  {
863
1015
  className: ["pageButton", isSelected ? "pageButtonSelected" : ""].filter(Boolean).join(" "),
@@ -871,14 +1023,14 @@ var Pagination = ({
871
1023
  item
872
1024
  );
873
1025
  }),
874
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1026
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
875
1027
  "button",
876
1028
  {
877
1029
  className: ["navButton", isNextDisabled ? "navButtonDisabled" : ""].filter(Boolean).join(" "),
878
1030
  onClick: () => onPageChange(currentPage + 1),
879
1031
  disabled: isNextDisabled,
880
1032
  "aria-label": "Next page",
881
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "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, {}) })
882
1034
  }
883
1035
  )
884
1036
  ]
@@ -887,7 +1039,7 @@ var Pagination = ({
887
1039
  };
888
1040
 
889
1041
  // templates/FeatureCards/FeatureCards.tsx
890
- var import_jsx_runtime15 = require("react/jsx-runtime");
1042
+ var import_jsx_runtime16 = require("react/jsx-runtime");
891
1043
  var FeatureCards = ({
892
1044
  sectionTitle,
893
1045
  sectionDescription,
@@ -897,11 +1049,11 @@ var FeatureCards = ({
897
1049
  cardColorScheme = "image",
898
1050
  cards
899
1051
  }) => {
900
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("section", { className: "fc-section", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "fc-container", children: [
901
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "fc-header", children: [
902
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("h2", { className: "fc-sectionTitle", children: sectionTitle }),
903
- sectionDescription && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "fc-sectionDescription", children: sectionDescription }),
904
- showLink && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
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)(
905
1057
  Link,
906
1058
  {
907
1059
  colorScheme: "coral",
@@ -910,7 +1062,7 @@ var FeatureCards = ({
910
1062
  }
911
1063
  )
912
1064
  ] }),
913
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "fc-grid", children: cards.map((card, index) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1065
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "fc-grid", children: cards.map((card, index) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
914
1066
  Card,
915
1067
  {
916
1068
  variant: "primary",
@@ -927,18 +1079,1504 @@ var FeatureCards = ({
927
1079
  )) })
928
1080
  ] }) });
929
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 — top-centre (col 6, row 1) ─────── */
1985
+ {
1986
+ id: 12,
1987
+ staggerRank: 0,
1988
+ imageUrl: PLACEHOLDER_URL,
1989
+ desktopPos: { left: "calc(var(--ctab-grid-cell) * 6)", top: "calc(var(--ctab-grid-cell) * 1)" },
1990
+ mobilePos: { left: "calc(50% - var(--ctab-avatar-size) / 2)", top: "calc(var(--ctab-grid-cell) * 1)" },
1991
+ mobileVisible: true
1992
+ },
1993
+ /* ── Rank 1 — bot-centre (col 6, row 7) ─────── */
1994
+ {
1995
+ id: 11,
1996
+ staggerRank: 1,
1997
+ imageUrl: PLACEHOLDER_URL,
1998
+ desktopPos: { left: "calc(var(--ctab-grid-cell) * 6)", top: "calc(var(--ctab-grid-cell) * 7)" },
1999
+ mobilePos: null,
2000
+ mobileVisible: false
2001
+ },
2002
+ /* ── Rank 2 — upper-inner-left (col 3, row 2) ── */
2003
+ {
2004
+ id: 3,
2005
+ staggerRank: 2,
2006
+ imageUrl: PLACEHOLDER_URL,
2007
+ desktopPos: { left: "calc(var(--ctab-grid-cell) * 3)", top: "calc(var(--ctab-grid-cell) * 2)" },
2008
+ mobilePos: { left: "0", top: "calc(var(--ctab-grid-cell) * 2)" },
2009
+ mobileVisible: true
2010
+ },
2011
+ /* ── Rank 3 — upper-inner-right (col 9, row 2) ── */
2012
+ {
2013
+ id: 6,
2014
+ staggerRank: 3,
2015
+ imageUrl: PLACEHOLDER_URL,
2016
+ desktopPos: { left: "calc(var(--ctab-grid-cell) * 9)", top: "calc(var(--ctab-grid-cell) * 2)" },
2017
+ mobilePos: { right: "0", top: "calc(var(--ctab-grid-cell) * 2)" },
2018
+ mobileVisible: true
2019
+ },
2020
+ /* ── Rank 4 — lower-inner-left (col 3, row 6) ── */
2021
+ {
2022
+ id: 1,
2023
+ staggerRank: 4,
2024
+ imageUrl: PLACEHOLDER_URL,
2025
+ desktopPos: { left: "calc(var(--ctab-grid-cell) * 3)", top: "calc(var(--ctab-grid-cell) * 6)" },
2026
+ mobilePos: { left: "calc(50% - var(--ctab-avatar-size) / 2)", top: "calc(var(--ctab-grid-cell) * 9)" },
2027
+ mobileVisible: true
2028
+ },
2029
+ /* ── Rank 5 — lower-inner-right (col 9, row 6) ── */
2030
+ {
2031
+ id: 10,
2032
+ staggerRank: 5,
2033
+ imageUrl: PLACEHOLDER_URL,
2034
+ desktopPos: { left: "calc(var(--ctab-grid-cell) * 9)", top: "calc(var(--ctab-grid-cell) * 6)" },
2035
+ mobilePos: null,
2036
+ mobileVisible: false
2037
+ },
2038
+ /* ── Rank 6 — mid-left (col 0, row 4) ──────── */
2039
+ {
2040
+ id: 5,
2041
+ staggerRank: 6,
2042
+ imageUrl: PLACEHOLDER_URL,
2043
+ desktopPos: { left: "0", top: "calc(var(--ctab-grid-cell) * 4)" },
2044
+ mobilePos: { left: "0", top: "calc(var(--ctab-grid-cell) * 8)" },
2045
+ mobileVisible: true
2046
+ },
2047
+ /* ── Rank 7 — mid-right (col 12, row 4) ────── */
2048
+ {
2049
+ id: 8,
2050
+ staggerRank: 7,
2051
+ imageUrl: PLACEHOLDER_URL,
2052
+ desktopPos: { left: "calc(var(--ctab-grid-cell) * 12)", top: "calc(var(--ctab-grid-cell) * 4)" },
2053
+ mobilePos: { right: "0", top: "calc(var(--ctab-grid-cell) * 8)" },
2054
+ mobileVisible: true
2055
+ },
2056
+ /* ── Rank 8 — top-left corner (col 0, row 1) ── */
2057
+ {
2058
+ id: 4,
2059
+ staggerRank: 8,
2060
+ imageUrl: PLACEHOLDER_URL,
2061
+ desktopPos: { left: "0", top: "calc(var(--ctab-grid-cell) * 1)" },
2062
+ mobilePos: null,
2063
+ mobileVisible: false
2064
+ },
2065
+ /* ── Rank 9 — top-right corner (col 12, row 1) ── */
2066
+ {
2067
+ id: 7,
2068
+ staggerRank: 9,
2069
+ imageUrl: PLACEHOLDER_URL,
2070
+ desktopPos: { left: "calc(var(--ctab-grid-cell) * 12)", top: "calc(var(--ctab-grid-cell) * 1)" },
2071
+ mobilePos: null,
2072
+ mobileVisible: false
2073
+ },
2074
+ /* ── Rank 10 — bot-left corner (col 0, row 7) ── */
2075
+ {
2076
+ id: 2,
2077
+ staggerRank: 10,
2078
+ imageUrl: PLACEHOLDER_URL,
2079
+ desktopPos: { left: "0", top: "calc(var(--ctab-grid-cell) * 7)" },
2080
+ mobilePos: null,
2081
+ mobileVisible: false
2082
+ },
2083
+ /* ── Rank 11 — bot-right corner (col 12, row 7) ── */
2084
+ {
2085
+ id: 9,
2086
+ staggerRank: 11,
2087
+ imageUrl: PLACEHOLDER_URL,
2088
+ desktopPos: { left: "calc(var(--ctab-grid-cell) * 12)", top: "calc(var(--ctab-grid-cell) * 7)" },
2089
+ mobilePos: null,
2090
+ mobileVisible: false
2091
+ }
2092
+ ];
2093
+ var COMPACT_AVATAR_DATA = [
2094
+ /* ── Rank 0 — top-centre (col ~6, row 1) ── */
2095
+ {
2096
+ id: 12,
2097
+ staggerRank: 0,
2098
+ imageUrl: PLACEHOLDER_URL,
2099
+ desktopPos: { left: "calc(50% - var(--ctab-avatar-size) / 2)", top: "calc(var(--ctab-grid-cell) * 1)" },
2100
+ mobilePos: { left: "calc(50% - var(--ctab-avatar-size) / 2)", top: "calc(var(--ctab-grid-cell) * 1)" },
2101
+ mobileVisible: true
2102
+ },
2103
+ /* ── Rank 1 — top-left (col 2, row 1) ───── */
2104
+ {
2105
+ id: 3,
2106
+ staggerRank: 1,
2107
+ imageUrl: PLACEHOLDER_URL,
2108
+ desktopPos: { left: "calc(var(--ctab-grid-cell) * 2)", top: "calc(var(--ctab-grid-cell) * 1)" },
2109
+ mobilePos: { left: "0", top: "calc(var(--ctab-grid-cell) * 2)" },
2110
+ mobileVisible: true
2111
+ },
2112
+ /* ── Rank 2 — top-right (col 10, row 1) ─── */
2113
+ {
2114
+ id: 6,
2115
+ staggerRank: 2,
2116
+ imageUrl: PLACEHOLDER_URL,
2117
+ desktopPos: { left: "calc(var(--ctab-grid-cell) * 10)", top: "calc(var(--ctab-grid-cell) * 1)" },
2118
+ mobilePos: { right: "0", top: "calc(var(--ctab-grid-cell) * 2)" },
2119
+ mobileVisible: true
2120
+ },
2121
+ /* ── Rank 3 — mid-left (col 0, row 3) ────── */
2122
+ {
2123
+ id: 5,
2124
+ staggerRank: 3,
2125
+ imageUrl: PLACEHOLDER_URL,
2126
+ desktopPos: { left: "0", top: "calc(var(--ctab-grid-cell) * 3)" },
2127
+ mobilePos: { left: "0", top: "calc(var(--ctab-grid-cell) * 8)" },
2128
+ mobileVisible: true
2129
+ },
2130
+ /* ── Rank 4 — mid-right (col 12, row 3) ──── */
2131
+ {
2132
+ id: 8,
2133
+ staggerRank: 4,
2134
+ imageUrl: PLACEHOLDER_URL,
2135
+ desktopPos: { left: "calc(var(--ctab-grid-cell) * 12)", top: "calc(var(--ctab-grid-cell) * 3)" },
2136
+ mobilePos: { right: "0", top: "calc(var(--ctab-grid-cell) * 8)" },
2137
+ mobileVisible: true
2138
+ },
2139
+ /* ── Rank 5 — bot-left (col 2, row 5) ────── */
2140
+ {
2141
+ id: 1,
2142
+ staggerRank: 5,
2143
+ imageUrl: PLACEHOLDER_URL,
2144
+ desktopPos: { left: "calc(var(--ctab-grid-cell) * 2)", top: "calc(var(--ctab-grid-cell) * 5)" },
2145
+ mobilePos: { left: "calc(50% - var(--ctab-avatar-size) / 2)", top: "calc(var(--ctab-grid-cell) * 9)" },
2146
+ mobileVisible: true
2147
+ },
2148
+ /* ── Rank 6 — bot-right (col 10, row 5) — desktop only ─── */
2149
+ {
2150
+ id: 11,
2151
+ staggerRank: 6,
2152
+ imageUrl: PLACEHOLDER_URL,
2153
+ desktopPos: { left: "calc(var(--ctab-grid-cell) * 10)", top: "calc(var(--ctab-grid-cell) * 5)" },
2154
+ mobilePos: null,
2155
+ mobileVisible: false
2156
+ }
2157
+ ];
2158
+ function useAvatarYValues(smooth) {
2159
+ const y0 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.near, 0]);
2160
+ const y1 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.near, 0]);
2161
+ const y2 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]);
2162
+ const y3 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]);
2163
+ const y4 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]);
2164
+ const y5 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]);
2165
+ const y6 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [0, 0]);
2166
+ const y7 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [0, 0]);
2167
+ const y8 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]);
2168
+ const y9 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]);
2169
+ const y10 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.edge, 0]);
2170
+ const y11 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.edge, 0]);
2171
+ return [y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11];
2172
+ }
2173
+ function useAvatarXValues(smooth) {
2174
+ const x0 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [0, 0]);
2175
+ const x1 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [0, 0]);
2176
+ const x2 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]);
2177
+ const x3 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]);
2178
+ const x4 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]);
2179
+ const x5 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]);
2180
+ const x6 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.far, 0]);
2181
+ const x7 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.far, 0]);
2182
+ const x8 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]);
2183
+ const x9 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.edge, 0]);
2184
+ const x10 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]);
2185
+ const x11 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.edge, 0]);
2186
+ return [x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11];
2187
+ }
2188
+ function useCompactAvatarYValues(smooth) {
2189
+ const y0 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.near, 0]);
2190
+ const y1 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]);
2191
+ const y2 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]);
2192
+ const y3 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [0, 0]);
2193
+ const y4 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [0, 0]);
2194
+ const y5 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]);
2195
+ const y6 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]);
2196
+ return [y0, y1, y2, y3, y4, y5, y6];
2197
+ }
2198
+ function useCompactAvatarXValues(smooth) {
2199
+ const x0 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [0, 0]);
2200
+ const x1 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]);
2201
+ const x2 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]);
2202
+ const x3 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.far, 0]);
2203
+ const x4 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.far, 0]);
2204
+ const x5 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]);
2205
+ const x6 = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]);
2206
+ return [x0, x1, x2, x3, x4, x5, x6];
2207
+ }
2208
+ var CTABanner = ({
2209
+ headline = "Short section title goes here",
2210
+ ctaLabel = "Open account",
2211
+ ctaHref = "#",
2212
+ avatars,
2213
+ variant = "standard",
2214
+ className,
2215
+ ...props
2216
+ }) => {
2217
+ const resolvedAvatars = avatars ?? (variant === "compact" ? COMPACT_AVATAR_DATA : AVATAR_DATA);
2218
+ const sectionRef = (0, import_react11.useRef)(null);
2219
+ const { scrollYProgress } = (0, import_framer_motion.useScroll)({
2220
+ target: sectionRef,
2221
+ offset: ["start end", "end start"]
2222
+ });
2223
+ const smooth = (0, import_framer_motion.useSpring)(scrollYProgress, SPRING);
2224
+ const gridOpacity = (0, import_framer_motion.useTransform)(smooth, [0, 0.3], [0, 1]);
2225
+ const heroY = (0, import_framer_motion.useTransform)(smooth, [0, LOCK_AT], [32, 0]);
2226
+ const heroOpacity = (0, import_framer_motion.useTransform)(smooth, [0, 0.3], [0, 1]);
2227
+ const avatarOpacity = (0, import_framer_motion.useTransform)(smooth, [0, 0.25], [0, 1]);
2228
+ const blurPx = (0, import_framer_motion.useTransform)(smooth, [0, 0.3, 0.7, 1], [ENTRANCE.blurStart, 0, 0, ENTRANCE.blurStart]);
2229
+ const avatarFilter = import_framer_motion.useMotionTemplate`blur(${blurPx}px)`;
2230
+ const standardYValues = useAvatarYValues(smooth);
2231
+ const standardXValues = useAvatarXValues(smooth);
2232
+ const compactYValues = useCompactAvatarYValues(smooth);
2233
+ const compactXValues = useCompactAvatarXValues(smooth);
2234
+ const avatarYValues = variant === "compact" ? compactYValues : standardYValues;
2235
+ const avatarXValues = variant === "compact" ? compactXValues : standardXValues;
2236
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
2237
+ "section",
2238
+ {
2239
+ ref: sectionRef,
2240
+ className: ["ctab", variant === "compact" ? "ctab--compact" : "", className].filter(Boolean).join(" "),
2241
+ ...props,
2242
+ children: [
2243
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2244
+ import_framer_motion.motion.div,
2245
+ {
2246
+ className: "ctab__grid",
2247
+ style: { opacity: gridOpacity },
2248
+ "aria-hidden": "true"
2249
+ }
2250
+ ),
2251
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "ctab__inner", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "ctab__stage", children: [
2252
+ resolvedAvatars.map((avatar, index) => {
2253
+ const posStyle = {};
2254
+ if (avatar.desktopPos.left) posStyle["--av-d-left"] = avatar.desktopPos.left;
2255
+ if (avatar.desktopPos.right) posStyle["--av-d-right"] = avatar.desktopPos.right;
2256
+ if (avatar.desktopPos.top) posStyle["--av-d-top"] = avatar.desktopPos.top;
2257
+ if (avatar.mobilePos?.left) posStyle["--av-m-left"] = avatar.mobilePos.left;
2258
+ if (avatar.mobilePos?.right) posStyle["--av-m-right"] = avatar.mobilePos.right;
2259
+ if (avatar.mobilePos?.top) posStyle["--av-m-top"] = avatar.mobilePos.top;
2260
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2261
+ import_framer_motion.motion.div,
2262
+ {
2263
+ className: [
2264
+ "ctab__avatar",
2265
+ !avatar.mobileVisible ? "ctab__avatar--desktop-only" : ""
2266
+ ].filter(Boolean).join(" "),
2267
+ style: {
2268
+ ...posStyle,
2269
+ x: avatarXValues[index],
2270
+ y: avatarYValues[index],
2271
+ opacity: avatarOpacity,
2272
+ filter: avatarFilter
2273
+ },
2274
+ children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2275
+ "img",
2276
+ {
2277
+ src: avatar.imageUrl,
2278
+ alt: "",
2279
+ loading: "lazy",
2280
+ draggable: false
2281
+ }
2282
+ )
2283
+ },
2284
+ avatar.id
2285
+ );
2286
+ }),
2287
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
2288
+ import_framer_motion.motion.div,
2289
+ {
2290
+ className: "ctab__hero",
2291
+ style: { y: heroY, opacity: heroOpacity },
2292
+ children: [
2293
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("h2", { className: "ctab__headline", children: headline }),
2294
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("a", { href: ctaHref, className: "ctab__cta", children: ctaLabel })
2295
+ ]
2296
+ }
2297
+ )
2298
+ ] }) })
2299
+ ]
2300
+ }
2301
+ );
2302
+ };
2303
+
2304
+ // templates/DayNightTransition/DayNightTransition.tsx
2305
+ var import_react12 = require("react");
2306
+ var import_framer_motion2 = require("framer-motion");
2307
+ var import_jsx_runtime23 = require("react/jsx-runtime");
2308
+ var SPRING2 = { stiffness: 80, damping: 30, restDelta: 1e-3 };
2309
+ var FADE_START = 0.35;
2310
+ var FADE_END = 0.65;
2311
+ var WORD_START = 0.4;
2312
+ var WORD_END = 0.6;
2313
+ var TEXT_CHANNEL_DAY = 0;
2314
+ var TEXT_CHANNEL_NIGHT = 255;
2315
+ var DayNightTransition = ({
2316
+ dayImageUrl,
2317
+ nightImageUrl,
2318
+ dayHeadline = "Trade all day",
2319
+ nightHeadline = "Trade all night",
2320
+ dayDescription,
2321
+ nightDescription,
2322
+ ctaLabel = "Get started",
2323
+ ctaHref = "#",
2324
+ className,
2325
+ ...props
2326
+ }) => {
2327
+ const wrapperRef = (0, import_react12.useRef)(null);
2328
+ const { scrollYProgress } = (0, import_framer_motion2.useScroll)({
2329
+ target: wrapperRef,
2330
+ offset: ["start end", "end start"]
2331
+ });
2332
+ const smooth = (0, import_framer_motion2.useSpring)(scrollYProgress, SPRING2);
2333
+ const nightOpacity = (0, import_framer_motion2.useTransform)(smooth, [FADE_START, FADE_END], [0, 1]);
2334
+ const channel = (0, import_framer_motion2.useTransform)(smooth, [FADE_START, FADE_END], [TEXT_CHANNEL_DAY, TEXT_CHANNEL_NIGHT]);
2335
+ const textColor = import_framer_motion2.useMotionTemplate`rgb(${channel}, ${channel}, ${channel})`;
2336
+ const dayOpacity = (0, import_framer_motion2.useTransform)(smooth, [WORD_START, WORD_END], [1, 0]);
2337
+ const nightOpacity2 = (0, import_framer_motion2.useTransform)(smooth, [WORD_START, WORD_END], [0, 1]);
2338
+ const hasDescription = Boolean(dayDescription || nightDescription);
2339
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2340
+ "div",
2341
+ {
2342
+ ref: wrapperRef,
2343
+ className: ["dnt", className].filter(Boolean).join(" "),
2344
+ ...props,
2345
+ children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "dnt__sticky", children: [
2346
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2347
+ "img",
2348
+ {
2349
+ className: "dnt__bg dnt__bg--day",
2350
+ src: dayImageUrl,
2351
+ alt: "",
2352
+ loading: "eager",
2353
+ draggable: false
2354
+ }
2355
+ ),
2356
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2357
+ import_framer_motion2.motion.img,
2358
+ {
2359
+ className: "dnt__bg dnt__bg--night",
2360
+ src: nightImageUrl,
2361
+ alt: "",
2362
+ loading: "eager",
2363
+ draggable: false,
2364
+ style: { opacity: nightOpacity }
2365
+ }
2366
+ ),
2367
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "dnt__content", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
2368
+ import_framer_motion2.motion.div,
2369
+ {
2370
+ className: "dnt__text-wrap",
2371
+ style: { color: textColor },
2372
+ children: [
2373
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "dnt__crossfade-wrap", children: [
2374
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2375
+ import_framer_motion2.motion.h2,
2376
+ {
2377
+ className: "dnt__headline",
2378
+ style: { opacity: dayOpacity },
2379
+ children: dayHeadline
2380
+ }
2381
+ ),
2382
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2383
+ import_framer_motion2.motion.h2,
2384
+ {
2385
+ className: "dnt__headline",
2386
+ "aria-hidden": "true",
2387
+ style: { opacity: nightOpacity2 },
2388
+ children: nightHeadline
2389
+ }
2390
+ )
2391
+ ] }),
2392
+ hasDescription && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "dnt__crossfade-wrap", children: [
2393
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2394
+ import_framer_motion2.motion.p,
2395
+ {
2396
+ className: "dnt__description",
2397
+ style: { opacity: dayOpacity },
2398
+ children: dayDescription ?? ""
2399
+ }
2400
+ ),
2401
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2402
+ import_framer_motion2.motion.p,
2403
+ {
2404
+ className: "dnt__description",
2405
+ "aria-hidden": "true",
2406
+ style: { opacity: nightOpacity2 },
2407
+ children: nightDescription ?? ""
2408
+ }
2409
+ )
2410
+ ] }),
2411
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("a", { href: ctaHref, className: "dnt__btn", children: ctaLabel })
2412
+ ]
2413
+ }
2414
+ ) })
2415
+ ] })
2416
+ }
2417
+ );
2418
+ };
2419
+
2420
+ // templates/PaymentMethods/PaymentMethods.tsx
2421
+ var import_react13 = require("react");
2422
+ var import_framer_motion3 = require("framer-motion");
2423
+ var import_jsx_runtime24 = require("react/jsx-runtime");
2424
+ function modWrap(min, max, v) {
2425
+ const range = max - min;
2426
+ return ((v - min) % range + range) % range + min;
2427
+ }
2428
+ var VELOCITY_FACTOR = 0.4;
2429
+ var MAX_SCROLL_V = 2500;
2430
+ var DEADZONE = 2;
2431
+ var CDN = "https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/";
2432
+ var COL_ONE_LOGOS = [
2433
+ { name: "Mastercard", url: `${CDN}68dcd915dc1a82f278b6c061_payment%20method-mastercard.svg` },
2434
+ { name: "Visa", url: `${CDN}68dcd9d10fda048e2d53a3a1_payment%20method-visa.svg` },
2435
+ { name: "Visa Electron", url: `${CDN}68dcd9d10fda048e2d53a3a1_payment%20method-visa-electron.svg` },
2436
+ { name: "Maestro", url: `${CDN}68dcd9d183a5dcfaa9a06587_payment%20method-maestro.svg` },
2437
+ { name: "Pix", url: `${CDN}68dcd9d13461263dcd8ccf54_payment%20method-pix.svg` },
2438
+ { name: "Help2Pay", url: `${CDN}68dcd9d13461263dcd8ccf54_payment%20method-help2pay.svg` },
2439
+ { name: "UPI Neo", url: `${CDN}68dcd9d13461263dcd8ccf54_payment%20method-upineo.svg` },
2440
+ { name: "M-Pesa", url: `${CDN}68dcd9d13461263dcd8ccf54_payment%20method-mpesa.svg` },
2441
+ { name: "Ozow", url: `${CDN}68dcd9d13461263dcd8ccf54_payment%20method-ozow.svg` },
2442
+ { name: "MTN", url: `${CDN}68dcd9d13461263dcd8ccf54_payment%20method-mtn.svg` },
2443
+ { name: "Airtm", url: `${CDN}68dcd9d13461263dcd8ccf54_payment%20method-airtm.svg` }
2444
+ ];
2445
+ var COL_TWO_LOGOS = [
2446
+ { name: "Bitcoin", url: `${CDN}68dcd9d13384aff3f072511a_payment%20method-bitcoin.svg` },
2447
+ { name: "Ethereum", url: `${CDN}68dcd9d10fda048e2d53a3a1_payment%20method-ethereum.svg` },
2448
+ { name: "Tron", url: `${CDN}68dcd9d109305b54383580e5_payment%20method-tron.svg` },
2449
+ { name: "Skrill", url: `${CDN}68dcd9d183a5dcfaa9a06587_payment%20method-skrill.svg` },
2450
+ { name: "Skrill 1-tap", url: `${CDN}68dcd9d183a5dcfaa9a06587_payment%20method-skrill-1tap.svg` },
2451
+ { name: "SticPay", url: `${CDN}68dcd9d183a5dcfaa9a06587_payment%20method-sticpay.svg` },
2452
+ { name: "Litecoin", url: `${CDN}68dcd9d13384aff3f072511a_payment%20method-litecoin.svg` },
2453
+ { name: "USD Coin", url: `${CDN}68dcd9d13384aff3f072511a_payment%20method-usdc.svg` },
2454
+ { name: "Dogecoin", url: `${CDN}68dcd9d13384aff3f072511a_payment%20method-dogecoin.svg` },
2455
+ { name: "Cardano", url: `${CDN}68dcd9d13384aff3f072511a_payment%20method-cardano.svg` },
2456
+ { name: "BNB", url: `${CDN}68dcd9d13384aff3f072511a_payment%20method-bnb.svg` }
2457
+ ];
2458
+ var TEXT_CONTENT = {
2459
+ headline: "Your money, your way",
2460
+ body: "Quick deposits, easy withdrawals, and 60+ payment options mean your money is always accessible.",
2461
+ disclaimer: "*Availability of payment methods and processing speeds may vary based on location and selected payment option.",
2462
+ ctaLabel: "Learn more",
2463
+ ctaHref: "#"
2464
+ };
2465
+ var PaymentMethods = ({
2466
+ headline = TEXT_CONTENT.headline,
2467
+ body = TEXT_CONTENT.body,
2468
+ disclaimer = TEXT_CONTENT.disclaimer,
2469
+ ctaLabel = TEXT_CONTENT.ctaLabel,
2470
+ ctaHref = TEXT_CONTENT.ctaHref,
2471
+ col1Logos = COL_ONE_LOGOS,
2472
+ col2Logos = COL_TWO_LOGOS,
2473
+ className,
2474
+ ...props
2475
+ }) => {
2476
+ const { scrollY } = (0, import_framer_motion3.useScroll)();
2477
+ const scrollVelocity = (0, import_framer_motion3.useVelocity)(scrollY);
2478
+ const col1Y = (0, import_framer_motion3.useMotionValue)(0);
2479
+ const col2Y = (0, import_framer_motion3.useMotionValue)(0);
2480
+ const col1Ref = (0, import_react13.useRef)(null);
2481
+ const col2Ref = (0, import_react13.useRef)(null);
2482
+ (0, import_framer_motion3.useAnimationFrame)((_, delta) => {
2483
+ const raw = scrollVelocity.get();
2484
+ if (Math.abs(raw) < DEADZONE) return;
2485
+ const clamped = Math.sign(raw) * Math.min(Math.abs(raw), MAX_SCROLL_V);
2486
+ const step = clamped * VELOCITY_FACTOR * (delta / 1e3);
2487
+ const cycleH1 = (col1Ref.current?.offsetHeight ?? 2e3) / 2;
2488
+ const cycleH2 = (col2Ref.current?.offsetHeight ?? 2e3) / 2;
2489
+ col1Y.set(modWrap(-cycleH1, 0, col1Y.get() - step));
2490
+ col2Y.set(modWrap(-cycleH2, 0, col2Y.get() + step));
2491
+ });
2492
+ const track1 = [...col1Logos, ...col1Logos];
2493
+ const track2 = [...col2Logos, ...col2Logos];
2494
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2495
+ "section",
2496
+ {
2497
+ className: ["pm", className].filter(Boolean).join(" "),
2498
+ ...props,
2499
+ children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "pm__inner", children: [
2500
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "pm__media", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "pm__carousel", children: [
2501
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "pm__fade pm__fade--top", "aria-hidden": "true" }),
2502
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2503
+ import_framer_motion3.motion.div,
2504
+ {
2505
+ ref: col1Ref,
2506
+ className: "pm__col",
2507
+ style: { y: col1Y },
2508
+ 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)(
2509
+ "img",
2510
+ {
2511
+ src: logo.url,
2512
+ alt: logo.name,
2513
+ loading: "lazy",
2514
+ draggable: false
2515
+ }
2516
+ ) }) }, `c1-${i}`))
2517
+ }
2518
+ ),
2519
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2520
+ import_framer_motion3.motion.div,
2521
+ {
2522
+ ref: col2Ref,
2523
+ className: "pm__col",
2524
+ style: { y: col2Y },
2525
+ 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)(
2526
+ "img",
2527
+ {
2528
+ src: logo.url,
2529
+ alt: logo.name,
2530
+ loading: "lazy",
2531
+ draggable: false
2532
+ }
2533
+ ) }) }, `c2-${i}`))
2534
+ }
2535
+ ),
2536
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "pm__fade pm__fade--bottom", "aria-hidden": "true" })
2537
+ ] }) }),
2538
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "pm__content", children: [
2539
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h2", { className: "pm__headline", children: headline }),
2540
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "pm__text-group", children: [
2541
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "pm__body", children: body }),
2542
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "pm__disclaimer", children: disclaimer })
2543
+ ] }),
2544
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("a", { href: ctaHref, className: "pm__link", children: [
2545
+ ctaLabel,
2546
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { "aria-hidden": "true", children: "\u2192" })
2547
+ ] })
2548
+ ] })
2549
+ ] })
2550
+ }
2551
+ );
2552
+ };
930
2553
  // Annotate the CommonJS export names for ESM import in node:
931
2554
  0 && (module.exports = {
2555
+ AVATAR_DATA,
932
2556
  Accordion,
2557
+ BottomSheet,
933
2558
  Breadcrumb,
934
2559
  Button,
2560
+ COL_ONE_LOGOS,
2561
+ COL_TWO_LOGOS,
2562
+ CTABanner,
935
2563
  Card,
936
2564
  Chip,
937
2565
  ChipDropdown,
2566
+ DayNightTransition,
938
2567
  FeatureCards,
2568
+ Footer,
2569
+ Hero,
939
2570
  Link,
940
2571
  Pagination,
2572
+ PaymentMethods,
2573
+ SCROLLYTELLING_DATA,
2574
+ STEPS_DATA,
2575
+ Scrollytelling,
941
2576
  SearchField,
2577
+ Stats,
2578
+ StickyStackedCards,
2579
+ TEXT_CONTENT,
942
2580
  Tag,
943
2581
  TextField
944
2582
  });