@anywayseo/tools 1.0.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/components/base/center/index.d.ts +6 -0
  2. package/dist/components/base/grid/index.d.ts +19 -0
  3. package/dist/components/base/grid/types.d.ts +3 -0
  4. package/dist/components/base/grid/utils.d.ts +2 -0
  5. package/dist/components/base/index.d.ts +3 -0
  6. package/dist/components/base/link-button/index.d.ts +7 -0
  7. package/dist/components/bonus-card/content/index.d.ts +7 -0
  8. package/dist/components/bonus-card/index.d.ts +7 -0
  9. package/dist/components/bonus-card/title/index.d.ts +7 -0
  10. package/dist/components/game-card/index.d.ts +7 -0
  11. package/dist/components/game-info/utils.d.ts +1 -1
  12. package/dist/components/index.cjs +9 -1
  13. package/dist/components/index.d.ts +6 -0
  14. package/dist/components/index.mjs +12 -4
  15. package/dist/components/layout/container/index.d.ts +3 -0
  16. package/dist/components/layout/hero/index.d.ts +2 -0
  17. package/dist/components/list/index.d.ts +13 -0
  18. package/dist/components/table/index.d.ts +12 -0
  19. package/dist/components/tabs/index.d.ts +8 -0
  20. package/dist/i18n/index.cjs +1 -1
  21. package/dist/i18n/index.mjs +1 -1
  22. package/dist/i18n/resources/de/index.d.ts +108 -0
  23. package/dist/i18n/resources/en/index.d.ts +9 -0
  24. package/dist/i18n/resources/it/index.d.ts +9 -0
  25. package/dist/index-B-5oUop6.js +47 -0
  26. package/dist/index-BUx1Bxrs.mjs +48 -0
  27. package/dist/{index-alye-Zt-.js → index-CB4bJU2N.js} +182 -10
  28. package/dist/{index-D5QkKj_Z.mjs → index-CD5ZU1Gw.mjs} +194 -22
  29. package/dist/{index-BtWxmLHW.mjs → index-CJvs4SfG.mjs} +12 -2
  30. package/dist/{index-DB1dS9cp.js → index-DCIXk-YH.js} +140 -4
  31. package/dist/{index-Bh5idiRE.mjs → index-DxLcykuT.mjs} +140 -4
  32. package/dist/{index-JMmaWcmu.js → index-jvxaXXE3.js} +11 -1
  33. package/dist/index.cjs +15 -3
  34. package/dist/index.mjs +20 -8
  35. package/dist/types/components/bonus-card/index.d.ts +9 -0
  36. package/dist/types/components/common/index.d.ts +3 -0
  37. package/dist/types/components/game-card/index.d.ts +6 -0
  38. package/dist/types/{game-info → components/game-info}/index.d.ts +2 -2
  39. package/dist/types/components/index.d.ts +8 -0
  40. package/dist/types/components/tabs/index.d.ts +8 -0
  41. package/dist/types/i18n/index.d.ts +2 -2
  42. package/dist/types/index.d.ts +4 -7
  43. package/dist/types/models/bonus/index.d.ts +4 -0
  44. package/dist/types/models/game/index.d.ts +3 -0
  45. package/dist/types/models/index.d.ts +5 -0
  46. package/dist/types/models/link/index.d.ts +4 -0
  47. package/dist/types/site-metadata/index.d.ts +1 -1
  48. package/dist/types/theme/index.d.ts +27 -0
  49. package/dist/utils/index.cjs +5 -1
  50. package/dist/utils/index.d.ts +1 -0
  51. package/dist/utils/index.mjs +6 -2
  52. package/dist/utils/numbers/index.d.ts +1 -0
  53. package/dist/utils/theme/index.d.ts +3 -0
  54. package/package.json +3 -1
  55. /package/dist/types/{faq → components/faq}/index.d.ts +0 -0
  56. /package/dist/types/{how-to → components/how-to}/index.d.ts +0 -0
  57. /package/dist/types/{pros-cons → components/pros-cons}/index.d.ts +0 -0
  58. /package/dist/types/{author → models/author}/index.d.ts +0 -0
  59. /package/dist/types/{feature → models/feature}/index.d.ts +0 -0
@@ -9,9 +9,10 @@ const index = require("./index-D96zh94V.js");
9
9
  const react = require("react");
10
10
  const index$1 = require("./index-IpSV-c71.js");
11
11
  const react$2 = require("@emotion/react");
12
- const i18n = require("./index-DB1dS9cp.js");
12
+ const i18n = require("./index-DCIXk-YH.js");
13
13
  const i18n$1 = require("i18next");
14
- const index$2 = require("./index-JMmaWcmu.js");
14
+ const index$2 = require("./index-jvxaXXE3.js");
15
+ require("@ctrl/tinycolor");
15
16
  const gatsby = require("gatsby");
16
17
  const ONE_LINE_HEIGHT = 24;
17
18
  const Bio = ({ content, maxLines = 1 }) => {
@@ -78,6 +79,81 @@ const Author = ({ author, ...cardProps }) => {
78
79
  )
79
80
  ] });
80
81
  };
82
+ const Center = ({ children, className }) => {
83
+ return /* @__PURE__ */ jsxRuntime.jsx(react$1.Center, { className, children });
84
+ };
85
+ const LinkButton = ({ label, url, width = "auto" }) => {
86
+ return /* @__PURE__ */ jsxRuntime.jsx(
87
+ react$1.Button,
88
+ {
89
+ as: react$1.Link,
90
+ href: url,
91
+ w: width,
92
+ bg: "brand.600",
93
+ textTransform: "uppercase",
94
+ _hover: { textDecoration: "none", bg: "brand.300" },
95
+ _active: { transform: "scale(0.95)" },
96
+ children: label
97
+ }
98
+ );
99
+ };
100
+ const BonusCardContent = ({ content }) => {
101
+ const { t } = reactI18next.useTranslation("author");
102
+ return /* @__PURE__ */ jsxRuntime.jsx(react$1.Popover, { flip: false, matchWidth: false, placement: "bottom", children: ({ isOpen }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
103
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.PopoverTrigger, { children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Button, { size: "sm", variant: "link", color: "white", children: isOpen ? t("action.collapse") : t("action.expand") }) }),
104
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.PopoverContent, { w: 60, children: /* @__PURE__ */ jsxRuntime.jsx(react$1.PopoverBody, { children: Array.isArray(content) ? /* @__PURE__ */ jsxRuntime.jsx(react$1.Stack, { children: content.map((paragraph, index2) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { as: "span", children: paragraph }, index2)) }) : /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { children: content }) }) })
105
+ ] }) });
106
+ };
107
+ const BonusCardTitle = ({ content }) => {
108
+ return /* @__PURE__ */ jsxRuntime.jsx(
109
+ react$1.Text,
110
+ {
111
+ as: "h3",
112
+ display: "inline-block",
113
+ py: 1,
114
+ px: 2,
115
+ borderRadius: "md",
116
+ bg: "yellow",
117
+ color: "black",
118
+ fontWeight: "bold",
119
+ fontSize: "lg",
120
+ children: content
121
+ }
122
+ );
123
+ };
124
+ const BonusCard = ({ title, subtitle, content, link, image, className }) => {
125
+ return /* @__PURE__ */ jsxRuntime.jsxs(
126
+ react$1.Card,
127
+ {
128
+ as: "article",
129
+ h: "full",
130
+ bg: "linear-gradient(90deg, #3b1f47, #731d58)",
131
+ overflow: "hidden",
132
+ _before: image ? {
133
+ content: '""',
134
+ position: "absolute",
135
+ top: 0,
136
+ left: 0,
137
+ w: "100%",
138
+ h: "100%",
139
+ bgImage: `url(${image})`,
140
+ bgSize: "cover",
141
+ bgPosition: "center",
142
+ filter: "blur(0.05em) opacity(50%)",
143
+ zIndex: 0
144
+ } : void 0,
145
+ className,
146
+ children: [
147
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.CardBody, { as: "section", pb: 0, flex: 1, children: [
148
+ /* @__PURE__ */ jsxRuntime.jsx(BonusCardTitle, { content: title }),
149
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { fontSize: "2xl", fontWeight: "bold", my: 2, children: subtitle }),
150
+ /* @__PURE__ */ jsxRuntime.jsx(BonusCardContent, { content })
151
+ ] }),
152
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.CardFooter, { as: "footer", p: 4, children: /* @__PURE__ */ jsxRuntime.jsx(LinkButton, { ...link, width: "full" }) })
153
+ ]
154
+ }
155
+ );
156
+ };
81
157
  const ContactForm = () => {
82
158
  const toast = react$1.useToast();
83
159
  const { t } = reactI18next.useTranslation("contactForm");
@@ -194,6 +270,26 @@ const Features = ({ features, ...boxProps }) => {
194
270
  /* @__PURE__ */ jsxRuntime.jsx(react$1.CardBody, { as: "section", pt: 0, children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { color: "gray.600", children: description }) })
195
271
  ] }) }, title)) });
196
272
  };
273
+ const GameCard = ({ name, image, link, className }) => {
274
+ return /* @__PURE__ */ jsxRuntime.jsxs(
275
+ react$1.LinkBox,
276
+ {
277
+ as: "article",
278
+ rounded: "md",
279
+ borderWidth: 1,
280
+ transition: "transform 0.2s ease",
281
+ cursor: link ? "pointer" : "default",
282
+ overflow: "hidden",
283
+ bg: "blackAlpha.400",
284
+ _hover: { transform: "scale(1.1)" },
285
+ className,
286
+ children: [
287
+ typeof image === "string" ? /* @__PURE__ */ jsxRuntime.jsx(react$1.Image, { src: image, alt: name, w: "100%", aspectRatio: "16/9", objectFit: "cover", objectPosition: "center" }) : !!image && /* @__PURE__ */ jsxRuntime.jsx(react$1.Box, { w: "100%", aspectRatio: "16/9", children: image }),
288
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Box, { as: "section", rounded: "md", p: 4, children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { as: "span", children: link ? /* @__PURE__ */ jsxRuntime.jsx(react$1.LinkOverlay, { href: link, children: name }) : name }) })
289
+ ]
290
+ }
291
+ );
292
+ };
197
293
  const GameDemoContent = ({ src, isFullscreen, isLoaded, onLoad, onToggleFullscreen }) => {
198
294
  const { t } = reactI18next.useTranslation("gameDemo");
199
295
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -329,8 +425,14 @@ function getGameInfoItemValue(key, value, currency) {
329
425
  if (key === i18n.GameCharacteristic.Rtp) {
330
426
  formattedValue = index$2.formatNumber(value, { percent: "real", precision: 3 });
331
427
  }
332
- if (key === i18n.GameCharacteristic.MinBet || key === i18n.GameCharacteristic.MaxBet || key === i18n.GameCharacteristic.MaxWin && typeof value === "number") {
333
- formattedValue = index$2.formatNumber(value, { currency });
428
+ if ((key === i18n.GameCharacteristic.MinBet || key === i18n.GameCharacteristic.MaxBet || key === i18n.GameCharacteristic.MaxWin) && typeof value === "number") {
429
+ if (Array.isArray(currency)) {
430
+ const [primary, ...secondaries] = currency || ["USD"];
431
+ const primaryValue = index$2.formatNumber(value, { currency: primary });
432
+ formattedValue = secondaries.length ? `${primaryValue} (${secondaries.map((currency2) => index$2.getCurrencySymbol(currency2)).join(", ")})` : primaryValue;
433
+ } else {
434
+ formattedValue = index$2.formatNumber(value, { currency });
435
+ }
334
436
  }
335
437
  if (key === i18n.GameCharacteristic.Compatibility || key === i18n.GameCharacteristic.BonusFeatures && typeof value !== "string") {
336
438
  formattedValue = stringifyArray(value);
@@ -389,8 +491,11 @@ const HowTo = ({ steps, ...boxProps }) => {
389
491
  ] })
390
492
  ] }, index2)) });
391
493
  };
494
+ const Container = ({ children }) => {
495
+ return /* @__PURE__ */ jsxRuntime.jsx(react$1.Container, { maxW: "container.xl", children });
496
+ };
392
497
  const Content = ({ children }) => {
393
- return /* @__PURE__ */ jsxRuntime.jsx(react$1.Container, { as: "section", maxW: "container.xl", children });
498
+ return /* @__PURE__ */ jsxRuntime.jsx(react$1.Box, { as: "section", py: 4, children: /* @__PURE__ */ jsxRuntime.jsx(Container, { children }) });
394
499
  };
395
500
  const Logo = () => {
396
501
  const { logoImageData } = index.useSiteMetadataContext();
@@ -457,7 +562,7 @@ const Footer = () => {
457
562
  bg: react$1.useColorModeValue("gray.50", "gray.900"),
458
563
  color: react$1.useColorModeValue("gray.700", "gray.200"),
459
564
  py: 4,
460
- children: /* @__PURE__ */ jsxRuntime.jsxs(Content, { children: [
565
+ children: /* @__PURE__ */ jsxRuntime.jsxs(Container, { children: [
461
566
  /* @__PURE__ */ jsxRuntime.jsx(Navigation$1, {}),
462
567
  /* @__PURE__ */ jsxRuntime.jsx(Disclaimer, {}),
463
568
  /* @__PURE__ */ jsxRuntime.jsx(Brand$1, { brand: /* @__PURE__ */ jsxRuntime.jsx(Logo, {}) }),
@@ -601,12 +706,25 @@ const Header = () => {
601
706
  color: react$1.useColorModeValue("gray.700", "gray.200"),
602
707
  boxShadow: "sm",
603
708
  zIndex: 100,
604
- children: /* @__PURE__ */ jsxRuntime.jsx(Content, { children: /* @__PURE__ */ jsxRuntime.jsx(Navbar, { brand: /* @__PURE__ */ jsxRuntime.jsx(Logo, {}) }) })
709
+ children: /* @__PURE__ */ jsxRuntime.jsx(Container, { children: /* @__PURE__ */ jsxRuntime.jsx(Navbar, { brand: /* @__PURE__ */ jsxRuntime.jsx(Logo, {}) }) })
605
710
  }
606
711
  );
607
712
  };
608
- const Hero = () => {
609
- return /* @__PURE__ */ jsxRuntime.jsx("section", { children: /* @__PURE__ */ jsxRuntime.jsx(Content, {}) });
713
+ const Hero = ({ title, subtitle, content, link, image }) => {
714
+ return /* @__PURE__ */ jsxRuntime.jsx(react$1.Box, { as: "section", bg: "gray.900", children: /* @__PURE__ */ jsxRuntime.jsx(Container, { children: /* @__PURE__ */ jsxRuntime.jsxs(react$1.Flex, { direction: { base: "column", md: "row" }, children: [
715
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Flex, { align: "center", justify: { base: "center", md: "flex-start" }, flex: 1, py: 8, pe: 8, children: /* @__PURE__ */ jsxRuntime.jsxs(react$1.Stack, { spacing: 6, w: "full", maxW: "lg", children: [
716
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.Heading, { as: "h1", fontSize: { base: "3xl", md: "4xl", lg: "5xl" }, children: [
717
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.Text, { as: "span", display: "block", children: [
718
+ title,
719
+ " —"
720
+ ] }),
721
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { as: "span", display: "block", color: "brand.400", children: subtitle })
722
+ ] }),
723
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { fontSize: { base: "md", lg: "lg" }, color: "gray.500", children: content }),
724
+ !!link && /* @__PURE__ */ jsxRuntime.jsx(react$1.Flex, { direction: { base: "column", md: "row" }, children: /* @__PURE__ */ jsxRuntime.jsx(LinkButton, { ...link }) })
725
+ ] }) }),
726
+ image && /* @__PURE__ */ jsxRuntime.jsx(react$1.Flex, { display: { base: "none", md: "flex" }, flex: 1, children: image })
727
+ ] }) }) });
610
728
  };
611
729
  const Main = ({ children }) => {
612
730
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -615,7 +733,6 @@ const Main = ({ children }) => {
615
733
  as: "main",
616
734
  direction: "column",
617
735
  flexGrow: 1,
618
- py: 4,
619
736
  bg: react$1.useColorModeValue("white", "gray.800"),
620
737
  color: react$1.useColorModeValue("gray.700", "gray.200"),
621
738
  children
@@ -674,6 +791,12 @@ const Layout = ({ children }) => {
674
791
  /* @__PURE__ */ jsxRuntime.jsx(ScrollToTop, {})
675
792
  ] });
676
793
  };
794
+ const List = ({ items, bullet = "—", render, className }) => {
795
+ return /* @__PURE__ */ jsxRuntime.jsx(react$1.List, { as: "ul", pl: 0, ml: 2, mb: 4, className, children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsxs(react$1.ListItem, { as: "li", display: "flex", gap: 1, children: [
796
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Box, { children: bullet }),
797
+ render ? render(item) : item
798
+ ] })) });
799
+ };
677
800
  const TitleMap = {
678
801
  pros: "advantages",
679
802
  cons: "disadvantages"
@@ -763,14 +886,63 @@ const Seo = ({ children, siteMetadata, title, description, lang }) => {
763
886
  children
764
887
  ] });
765
888
  };
889
+ const Table = ({
890
+ columnNumber,
891
+ items,
892
+ caption,
893
+ bordered = false,
894
+ striped = true,
895
+ scrollable,
896
+ className
897
+ }) => {
898
+ const headerItems = items.slice(0, columnNumber);
899
+ const bodyItems = items.slice(columnNumber);
900
+ return /* @__PURE__ */ jsxRuntime.jsxs(
901
+ react$1.TableContainer,
902
+ {
903
+ border: bordered ? void 0 : "none",
904
+ ...scrollable ? { maxH: "50vh", overflowY: "auto" } : {},
905
+ className,
906
+ children: [
907
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.Table, { variant: striped ? "striped" : "simple", children: [
908
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Thead, { ...scrollable ? { position: "sticky", top: 0, zIndex: 1, bg: "gray.800" } : {}, children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Tr, { children: headerItems.map((item, index2) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Th, { children: item }, index2)) }) }),
909
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Tbody, { children: Array.from({ length: Math.ceil(bodyItems.length / columnNumber) }, (_, rowIndex) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Tr, { children: Array.from({ length: columnNumber }, (_2, colIndex) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Td, { children: bodyItems[rowIndex * columnNumber + colIndex] || "" }, colIndex)) }, rowIndex)) })
910
+ ] }),
911
+ !!caption && /* @__PURE__ */ jsxRuntime.jsx(react$1.TableCaption, { children: caption })
912
+ ]
913
+ }
914
+ );
915
+ };
916
+ const Tabs = ({ items, className, render }) => {
917
+ const { tabs, panels } = react.useMemo(() => {
918
+ const tabs2 = [];
919
+ const panels2 = [];
920
+ items.forEach(({ content, ...tab }) => {
921
+ tabs2.push(tab);
922
+ panels2.push(content);
923
+ });
924
+ return { tabs: tabs2, panels: panels2 };
925
+ }, []);
926
+ return /* @__PURE__ */ jsxRuntime.jsxs(react$1.Tabs, { overflow: "hidden", colorScheme: "brand", className, children: [
927
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.TabList, { overflow: "auto hidden", children: tabs.map(({ label, icon }, index2) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Tab, { children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { as: "h3", isTruncated: true, children: icon ? `${icon} ${label}` : label }) }, index2)) }),
928
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.TabPanels, { children: panels.map((panel, index2) => /* @__PURE__ */ jsxRuntime.jsx(react$1.TabPanel, { children: render(panel) }, index2)) })
929
+ ] });
930
+ };
766
931
  exports.Author = Author;
932
+ exports.BonusCard = BonusCard;
933
+ exports.Center = Center;
767
934
  exports.ContactForm = ContactForm;
768
935
  exports.ExpertTip = ExpertTip;
769
936
  exports.Faq = Faq;
770
937
  exports.Features = Features;
938
+ exports.GameCard = GameCard;
771
939
  exports.GameDemo = GameDemo;
772
940
  exports.GameInfo = GameInfo;
773
941
  exports.HowTo = HowTo;
774
942
  exports.Layout = Layout;
943
+ exports.LinkButton = LinkButton;
944
+ exports.List = List;
775
945
  exports.ProsCons = ProsCons;
776
946
  exports.Seo = Seo;
947
+ exports.Table = Table;
948
+ exports.Tabs = Tabs;
@@ -1,17 +1,18 @@
1
1
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
- import { Box, Collapse, Text, Button, Flex, Stack, Card, CardHeader, Heading, CardBody, useToast, useColorModeValue, VStack, FormControl, FormLabel, InputGroup, InputLeftElement, Input, Textarea, CardFooter, Accordion, AccordionItem, AccordionButton, AccordionIcon, AccordionPanel, SimpleGrid, IconButton, AbsoluteCenter, Spinner, useDisclosure, Divider, Circle, Container, Popover, PopoverTrigger, PopoverContent, Icon, useBreakpointValue, List, ListItem, ListIcon } from "@chakra-ui/react";
2
+ import { Box, Collapse, Text, Button, Flex, Stack, Card, CardHeader, Heading, CardBody, Center as Center$1, Link, Popover, PopoverTrigger, PopoverContent, PopoverBody, CardFooter, useToast, useColorModeValue, VStack, FormControl, FormLabel, InputGroup, InputLeftElement, Input, Textarea, Accordion, AccordionItem, AccordionButton, AccordionIcon, AccordionPanel, SimpleGrid, LinkBox, Image, LinkOverlay, IconButton, AbsoluteCenter, Spinner, useDisclosure, Divider, Circle, Container as Container$1, Icon, useBreakpointValue, List as List$1, ListItem, ListIcon, TableContainer, Table as Table$1, Thead, Tr, Th, Tbody, Td, TableCaption, Tabs as Tabs$1, TabList, Tab, TabPanels, TabPanel } from "@chakra-ui/react";
3
3
  import { useTranslation } from "react-i18next";
4
4
  import { EmailIcon, StarIcon, CloseIcon, ExternalLinkIcon, ChevronRightIcon, ChevronDownIcon, HamburgerIcon, ChevronUpIcon, WarningIcon, CheckCircleIcon } from "@chakra-ui/icons";
5
5
  import { getImage, GatsbyImage } from "gatsby-plugin-image";
6
6
  import "@mdx-js/react";
7
7
  import { u as useSiteMetadataContext } from "./index-Bs4zA1wD.mjs";
8
- import { useRef, useState, useLayoutEffect, Fragment as Fragment$1, useEffect } from "react";
8
+ import { useRef, useState, useLayoutEffect, Fragment as Fragment$1, useEffect, useMemo } from "react";
9
9
  import { u as usePrimaryColors } from "./index-xuSxvz5z.mjs";
10
10
  import { keyframes } from "@emotion/react";
11
- import { a as GameCharacteristic } from "./index-Bh5idiRE.mjs";
11
+ import { a as GameCharacteristic } from "./index-DxLcykuT.mjs";
12
12
  import { t } from "i18next";
13
- import { b as formatNumber, f as formatDate, c as getDomain, g as getCurrentYear, a as getCurrentMonth } from "./index-BtWxmLHW.mjs";
14
- import { Link } from "gatsby";
13
+ import { b as formatNumber, c as getCurrencySymbol, f as formatDate, d as getDomain, g as getCurrentYear, a as getCurrentMonth } from "./index-CJvs4SfG.mjs";
14
+ import "@ctrl/tinycolor";
15
+ import { Link as Link$1 } from "gatsby";
15
16
  const ONE_LINE_HEIGHT = 24;
16
17
  const Bio = ({ content, maxLines = 1 }) => {
17
18
  const ref = useRef(null);
@@ -77,6 +78,81 @@ const Author = ({ author, ...cardProps }) => {
77
78
  )
78
79
  ] });
79
80
  };
81
+ const Center = ({ children, className }) => {
82
+ return /* @__PURE__ */ jsx(Center$1, { className, children });
83
+ };
84
+ const LinkButton = ({ label, url, width = "auto" }) => {
85
+ return /* @__PURE__ */ jsx(
86
+ Button,
87
+ {
88
+ as: Link,
89
+ href: url,
90
+ w: width,
91
+ bg: "brand.600",
92
+ textTransform: "uppercase",
93
+ _hover: { textDecoration: "none", bg: "brand.300" },
94
+ _active: { transform: "scale(0.95)" },
95
+ children: label
96
+ }
97
+ );
98
+ };
99
+ const BonusCardContent = ({ content }) => {
100
+ const { t: t2 } = useTranslation("author");
101
+ return /* @__PURE__ */ jsx(Popover, { flip: false, matchWidth: false, placement: "bottom", children: ({ isOpen }) => /* @__PURE__ */ jsxs(Fragment, { children: [
102
+ /* @__PURE__ */ jsx(PopoverTrigger, { children: /* @__PURE__ */ jsx(Button, { size: "sm", variant: "link", color: "white", children: isOpen ? t2("action.collapse") : t2("action.expand") }) }),
103
+ /* @__PURE__ */ jsx(PopoverContent, { w: 60, children: /* @__PURE__ */ jsx(PopoverBody, { children: Array.isArray(content) ? /* @__PURE__ */ jsx(Stack, { children: content.map((paragraph, index) => /* @__PURE__ */ jsx(Text, { as: "span", children: paragraph }, index)) }) : /* @__PURE__ */ jsx(Text, { children: content }) }) })
104
+ ] }) });
105
+ };
106
+ const BonusCardTitle = ({ content }) => {
107
+ return /* @__PURE__ */ jsx(
108
+ Text,
109
+ {
110
+ as: "h3",
111
+ display: "inline-block",
112
+ py: 1,
113
+ px: 2,
114
+ borderRadius: "md",
115
+ bg: "yellow",
116
+ color: "black",
117
+ fontWeight: "bold",
118
+ fontSize: "lg",
119
+ children: content
120
+ }
121
+ );
122
+ };
123
+ const BonusCard = ({ title, subtitle, content, link, image, className }) => {
124
+ return /* @__PURE__ */ jsxs(
125
+ Card,
126
+ {
127
+ as: "article",
128
+ h: "full",
129
+ bg: "linear-gradient(90deg, #3b1f47, #731d58)",
130
+ overflow: "hidden",
131
+ _before: image ? {
132
+ content: '""',
133
+ position: "absolute",
134
+ top: 0,
135
+ left: 0,
136
+ w: "100%",
137
+ h: "100%",
138
+ bgImage: `url(${image})`,
139
+ bgSize: "cover",
140
+ bgPosition: "center",
141
+ filter: "blur(0.05em) opacity(50%)",
142
+ zIndex: 0
143
+ } : void 0,
144
+ className,
145
+ children: [
146
+ /* @__PURE__ */ jsxs(CardBody, { as: "section", pb: 0, flex: 1, children: [
147
+ /* @__PURE__ */ jsx(BonusCardTitle, { content: title }),
148
+ /* @__PURE__ */ jsx(Text, { fontSize: "2xl", fontWeight: "bold", my: 2, children: subtitle }),
149
+ /* @__PURE__ */ jsx(BonusCardContent, { content })
150
+ ] }),
151
+ /* @__PURE__ */ jsx(CardFooter, { as: "footer", p: 4, children: /* @__PURE__ */ jsx(LinkButton, { ...link, width: "full" }) })
152
+ ]
153
+ }
154
+ );
155
+ };
80
156
  const ContactForm = () => {
81
157
  const toast = useToast();
82
158
  const { t: t2 } = useTranslation("contactForm");
@@ -193,6 +269,26 @@ const Features = ({ features, ...boxProps }) => {
193
269
  /* @__PURE__ */ jsx(CardBody, { as: "section", pt: 0, children: /* @__PURE__ */ jsx(Text, { color: "gray.600", children: description }) })
194
270
  ] }) }, title)) });
195
271
  };
272
+ const GameCard = ({ name, image, link, className }) => {
273
+ return /* @__PURE__ */ jsxs(
274
+ LinkBox,
275
+ {
276
+ as: "article",
277
+ rounded: "md",
278
+ borderWidth: 1,
279
+ transition: "transform 0.2s ease",
280
+ cursor: link ? "pointer" : "default",
281
+ overflow: "hidden",
282
+ bg: "blackAlpha.400",
283
+ _hover: { transform: "scale(1.1)" },
284
+ className,
285
+ children: [
286
+ typeof image === "string" ? /* @__PURE__ */ jsx(Image, { src: image, alt: name, w: "100%", aspectRatio: "16/9", objectFit: "cover", objectPosition: "center" }) : !!image && /* @__PURE__ */ jsx(Box, { w: "100%", aspectRatio: "16/9", children: image }),
287
+ /* @__PURE__ */ jsx(Box, { as: "section", rounded: "md", p: 4, children: /* @__PURE__ */ jsx(Text, { as: "span", children: link ? /* @__PURE__ */ jsx(LinkOverlay, { href: link, children: name }) : name }) })
288
+ ]
289
+ }
290
+ );
291
+ };
196
292
  const GameDemoContent = ({ src, isFullscreen, isLoaded, onLoad, onToggleFullscreen }) => {
197
293
  const { t: t2 } = useTranslation("gameDemo");
198
294
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -328,8 +424,14 @@ function getGameInfoItemValue(key, value, currency) {
328
424
  if (key === GameCharacteristic.Rtp) {
329
425
  formattedValue = formatNumber(value, { percent: "real", precision: 3 });
330
426
  }
331
- if (key === GameCharacteristic.MinBet || key === GameCharacteristic.MaxBet || key === GameCharacteristic.MaxWin && typeof value === "number") {
332
- formattedValue = formatNumber(value, { currency });
427
+ if ((key === GameCharacteristic.MinBet || key === GameCharacteristic.MaxBet || key === GameCharacteristic.MaxWin) && typeof value === "number") {
428
+ if (Array.isArray(currency)) {
429
+ const [primary, ...secondaries] = currency || ["USD"];
430
+ const primaryValue = formatNumber(value, { currency: primary });
431
+ formattedValue = secondaries.length ? `${primaryValue} (${secondaries.map((currency2) => getCurrencySymbol(currency2)).join(", ")})` : primaryValue;
432
+ } else {
433
+ formattedValue = formatNumber(value, { currency });
434
+ }
333
435
  }
334
436
  if (key === GameCharacteristic.Compatibility || key === GameCharacteristic.BonusFeatures && typeof value !== "string") {
335
437
  formattedValue = stringifyArray(value);
@@ -388,8 +490,11 @@ const HowTo = ({ steps, ...boxProps }) => {
388
490
  ] })
389
491
  ] }, index)) });
390
492
  };
493
+ const Container = ({ children }) => {
494
+ return /* @__PURE__ */ jsx(Container$1, { maxW: "container.xl", children });
495
+ };
391
496
  const Content = ({ children }) => {
392
- return /* @__PURE__ */ jsx(Container, { as: "section", maxW: "container.xl", children });
497
+ return /* @__PURE__ */ jsx(Box, { as: "section", py: 4, children: /* @__PURE__ */ jsx(Container, { children }) });
393
498
  };
394
499
  const Logo = () => {
395
500
  const { logoImageData } = useSiteMetadataContext();
@@ -402,7 +507,7 @@ const Logo = () => {
402
507
  const Brand$1 = ({ brand }) => {
403
508
  return /* @__PURE__ */ jsxs(Box, { position: "relative", my: 2, py: 8, children: [
404
509
  /* @__PURE__ */ jsx(Divider, {}),
405
- /* @__PURE__ */ jsx(AbsoluteCenter, { display: "flex", bgColor: useColorModeValue("gray.50", "gray.900"), children: /* @__PURE__ */ jsx(Box, { as: Link, to: "/", children: brand }) })
510
+ /* @__PURE__ */ jsx(AbsoluteCenter, { display: "flex", bgColor: useColorModeValue("gray.50", "gray.900"), children: /* @__PURE__ */ jsx(Box, { as: Link$1, to: "/", children: brand }) })
406
511
  ] });
407
512
  };
408
513
  const Copyright = () => {
@@ -435,7 +540,7 @@ const Navigation$1 = () => {
435
540
  children: footerMenuLinks.map(({ url, title }) => /* @__PURE__ */ jsx(
436
541
  Text,
437
542
  {
438
- as: Link,
543
+ as: Link$1,
439
544
  to: url,
440
545
  fontSize: "md",
441
546
  fontWeight: "semibold",
@@ -456,7 +561,7 @@ const Footer = () => {
456
561
  bg: useColorModeValue("gray.50", "gray.900"),
457
562
  color: useColorModeValue("gray.700", "gray.200"),
458
563
  py: 4,
459
- children: /* @__PURE__ */ jsxs(Content, { children: [
564
+ children: /* @__PURE__ */ jsxs(Container, { children: [
460
565
  /* @__PURE__ */ jsx(Navigation$1, {}),
461
566
  /* @__PURE__ */ jsx(Disclaimer, {}),
462
567
  /* @__PURE__ */ jsx(Brand$1, { brand: /* @__PURE__ */ jsx(Logo, {}) }),
@@ -469,7 +574,7 @@ const Brand = ({ brand }) => {
469
574
  return /* @__PURE__ */ jsx(
470
575
  Box,
471
576
  {
472
- as: Link,
577
+ as: Link$1,
473
578
  to: "/",
474
579
  display: "flex",
475
580
  h: { base: "40px", md: "60px" },
@@ -486,7 +591,7 @@ const DesktopNavItem = ({ title, url, children }) => {
486
591
  /* @__PURE__ */ jsx(PopoverTrigger, { children: /* @__PURE__ */ jsx(
487
592
  Text,
488
593
  {
489
- as: Link,
594
+ as: Link$1,
490
595
  to: url,
491
596
  p: 2,
492
597
  fontSize: "sm",
@@ -536,7 +641,7 @@ const MobileNavItem = ({ title, children, url }) => {
536
641
  const { isOpen, onToggle } = useDisclosure();
537
642
  return /* @__PURE__ */ jsxs(Stack, { w: "100%", p: 2, children: [
538
643
  /* @__PURE__ */ jsxs(Flex, { align: "center", gap: 2, justify: "space-between", children: [
539
- /* @__PURE__ */ jsx(Text, { as: Link, to: url, isTruncated: true, fontWeight: 600, children: title }),
644
+ /* @__PURE__ */ jsx(Text, { as: Link$1, to: url, isTruncated: true, fontWeight: 600, children: title }),
540
645
  !!children && /* @__PURE__ */ jsx(Flex, { as: "button", onClick: onToggle, children: /* @__PURE__ */ jsx(
541
646
  Icon,
542
647
  {
@@ -556,7 +661,7 @@ const MobileNavItem = ({ title, children, url }) => {
556
661
  borderLeft: 1,
557
662
  borderStyle: "solid",
558
663
  borderColor: useColorModeValue("gray.200", "gray.700"),
559
- children: !!children && children.map((child) => /* @__PURE__ */ jsx(Flex, { as: "li", children: /* @__PURE__ */ jsx(Text, { as: Link, to: `${url}${child.url}`, py: 2, children: child.title }) }, child.url))
664
+ children: !!children && children.map((child) => /* @__PURE__ */ jsx(Flex, { as: "li", children: /* @__PURE__ */ jsx(Text, { as: Link$1, to: `${url}${child.url}`, py: 2, children: child.title }) }, child.url))
560
665
  }
561
666
  ) })
562
667
  ] });
@@ -600,12 +705,25 @@ const Header = () => {
600
705
  color: useColorModeValue("gray.700", "gray.200"),
601
706
  boxShadow: "sm",
602
707
  zIndex: 100,
603
- children: /* @__PURE__ */ jsx(Content, { children: /* @__PURE__ */ jsx(Navbar, { brand: /* @__PURE__ */ jsx(Logo, {}) }) })
708
+ children: /* @__PURE__ */ jsx(Container, { children: /* @__PURE__ */ jsx(Navbar, { brand: /* @__PURE__ */ jsx(Logo, {}) }) })
604
709
  }
605
710
  );
606
711
  };
607
- const Hero = () => {
608
- return /* @__PURE__ */ jsx("section", { children: /* @__PURE__ */ jsx(Content, {}) });
712
+ const Hero = ({ title, subtitle, content, link, image }) => {
713
+ return /* @__PURE__ */ jsx(Box, { as: "section", bg: "gray.900", children: /* @__PURE__ */ jsx(Container, { children: /* @__PURE__ */ jsxs(Flex, { direction: { base: "column", md: "row" }, children: [
714
+ /* @__PURE__ */ jsx(Flex, { align: "center", justify: { base: "center", md: "flex-start" }, flex: 1, py: 8, pe: 8, children: /* @__PURE__ */ jsxs(Stack, { spacing: 6, w: "full", maxW: "lg", children: [
715
+ /* @__PURE__ */ jsxs(Heading, { as: "h1", fontSize: { base: "3xl", md: "4xl", lg: "5xl" }, children: [
716
+ /* @__PURE__ */ jsxs(Text, { as: "span", display: "block", children: [
717
+ title,
718
+ " —"
719
+ ] }),
720
+ /* @__PURE__ */ jsx(Text, { as: "span", display: "block", color: "brand.400", children: subtitle })
721
+ ] }),
722
+ /* @__PURE__ */ jsx(Text, { fontSize: { base: "md", lg: "lg" }, color: "gray.500", children: content }),
723
+ !!link && /* @__PURE__ */ jsx(Flex, { direction: { base: "column", md: "row" }, children: /* @__PURE__ */ jsx(LinkButton, { ...link }) })
724
+ ] }) }),
725
+ image && /* @__PURE__ */ jsx(Flex, { display: { base: "none", md: "flex" }, flex: 1, children: image })
726
+ ] }) }) });
609
727
  };
610
728
  const Main = ({ children }) => {
611
729
  return /* @__PURE__ */ jsx(
@@ -614,7 +732,6 @@ const Main = ({ children }) => {
614
732
  as: "main",
615
733
  direction: "column",
616
734
  flexGrow: 1,
617
- py: 4,
618
735
  bg: useColorModeValue("white", "gray.800"),
619
736
  color: useColorModeValue("gray.700", "gray.200"),
620
737
  children
@@ -673,6 +790,12 @@ const Layout = ({ children }) => {
673
790
  /* @__PURE__ */ jsx(ScrollToTop, {})
674
791
  ] });
675
792
  };
793
+ const List = ({ items, bullet = "—", render, className }) => {
794
+ return /* @__PURE__ */ jsx(List$1, { as: "ul", pl: 0, ml: 2, mb: 4, className, children: items.map((item) => /* @__PURE__ */ jsxs(ListItem, { as: "li", display: "flex", gap: 1, children: [
795
+ /* @__PURE__ */ jsx(Box, { children: bullet }),
796
+ render ? render(item) : item
797
+ ] })) });
798
+ };
676
799
  const TitleMap = {
677
800
  pros: "advantages",
678
801
  cons: "disadvantages"
@@ -716,7 +839,7 @@ const ProsConsCard = ({ itemType, items }) => {
716
839
  p: 2,
717
840
  borderBottomRadius: "md",
718
841
  bgColor: useColorModeValue("whiteAlpha.800", "blackAlpha.800"),
719
- children: /* @__PURE__ */ jsx(List, { spacing: 4, p: 0, children: items.map(({ title, description }) => /* @__PURE__ */ jsxs(ListItem, { display: "flex", children: [
842
+ children: /* @__PURE__ */ jsx(List$1, { spacing: 4, p: 0, children: items.map(({ title, description }) => /* @__PURE__ */ jsxs(ListItem, { display: "flex", children: [
720
843
  /* @__PURE__ */ jsx(ListIcon, { as: IconMap[itemType], w: 6, h: 6, color: IconColorMap[itemType] }),
721
844
  /* @__PURE__ */ jsxs(Text, { fontWeight: "semibold", fontSize: "md", children: [
722
845
  title,
@@ -762,16 +885,65 @@ const Seo = ({ children, siteMetadata, title, description, lang }) => {
762
885
  children
763
886
  ] });
764
887
  };
888
+ const Table = ({
889
+ columnNumber,
890
+ items,
891
+ caption,
892
+ bordered = false,
893
+ striped = true,
894
+ scrollable,
895
+ className
896
+ }) => {
897
+ const headerItems = items.slice(0, columnNumber);
898
+ const bodyItems = items.slice(columnNumber);
899
+ return /* @__PURE__ */ jsxs(
900
+ TableContainer,
901
+ {
902
+ border: bordered ? void 0 : "none",
903
+ ...scrollable ? { maxH: "50vh", overflowY: "auto" } : {},
904
+ className,
905
+ children: [
906
+ /* @__PURE__ */ jsxs(Table$1, { variant: striped ? "striped" : "simple", children: [
907
+ /* @__PURE__ */ jsx(Thead, { ...scrollable ? { position: "sticky", top: 0, zIndex: 1, bg: "gray.800" } : {}, children: /* @__PURE__ */ jsx(Tr, { children: headerItems.map((item, index) => /* @__PURE__ */ jsx(Th, { children: item }, index)) }) }),
908
+ /* @__PURE__ */ jsx(Tbody, { children: Array.from({ length: Math.ceil(bodyItems.length / columnNumber) }, (_, rowIndex) => /* @__PURE__ */ jsx(Tr, { children: Array.from({ length: columnNumber }, (_2, colIndex) => /* @__PURE__ */ jsx(Td, { children: bodyItems[rowIndex * columnNumber + colIndex] || "" }, colIndex)) }, rowIndex)) })
909
+ ] }),
910
+ !!caption && /* @__PURE__ */ jsx(TableCaption, { children: caption })
911
+ ]
912
+ }
913
+ );
914
+ };
915
+ const Tabs = ({ items, className, render }) => {
916
+ const { tabs, panels } = useMemo(() => {
917
+ const tabs2 = [];
918
+ const panels2 = [];
919
+ items.forEach(({ content, ...tab }) => {
920
+ tabs2.push(tab);
921
+ panels2.push(content);
922
+ });
923
+ return { tabs: tabs2, panels: panels2 };
924
+ }, []);
925
+ return /* @__PURE__ */ jsxs(Tabs$1, { overflow: "hidden", colorScheme: "brand", className, children: [
926
+ /* @__PURE__ */ jsx(TabList, { overflow: "auto hidden", children: tabs.map(({ label, icon }, index) => /* @__PURE__ */ jsx(Tab, { children: /* @__PURE__ */ jsx(Text, { as: "h3", isTruncated: true, children: icon ? `${icon} ${label}` : label }) }, index)) }),
927
+ /* @__PURE__ */ jsx(TabPanels, { children: panels.map((panel, index) => /* @__PURE__ */ jsx(TabPanel, { children: render(panel) }, index)) })
928
+ ] });
929
+ };
765
930
  export {
766
931
  Author as A,
932
+ BonusCard as B,
767
933
  ContactForm as C,
768
934
  ExpertTip as E,
769
935
  Faq as F,
770
- GameDemo as G,
936
+ GameCard as G,
771
937
  HowTo as H,
772
938
  Layout as L,
773
939
  ProsCons as P,
774
940
  Seo as S,
941
+ Table as T,
775
942
  Features as a,
776
- GameInfo as b
943
+ GameDemo as b,
944
+ GameInfo as c,
945
+ List as d,
946
+ Tabs as e,
947
+ Center as f,
948
+ LinkButton as g
777
949
  };
@@ -1,4 +1,4 @@
1
- import "./index-Bh5idiRE.mjs";
1
+ import "./index-DxLcykuT.mjs";
2
2
  import i18n from "i18next";
3
3
  function getCurrentYear() {
4
4
  const locale = i18n.language;
@@ -64,6 +64,15 @@ function parseNumber(value) {
64
64
  }
65
65
  return parsedNumber;
66
66
  }
67
+ function getCurrencySymbol(currencyCode) {
68
+ const symbol = 0 .toLocaleString(i18n.language, {
69
+ style: "currency",
70
+ currency: currencyCode,
71
+ minimumFractionDigits: 0,
72
+ maximumFractionDigits: 0
73
+ }).replace(/\d/g, "").trim();
74
+ return symbol;
75
+ }
67
76
  const protocolRegex = /^https?:\/\//;
68
77
  function getDomain(url) {
69
78
  return url.replace(protocolRegex, "");
@@ -71,7 +80,8 @@ function getDomain(url) {
71
80
  export {
72
81
  getCurrentMonth as a,
73
82
  formatNumber as b,
74
- getDomain as c,
83
+ getCurrencySymbol as c,
84
+ getDomain as d,
75
85
  formatDate as f,
76
86
  getCurrentYear as g,
77
87
  parseNumber as p,