@anywayseo/tools 2.6.0 → 3.0.1

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 (41) hide show
  1. package/dist/components/author-card/index.d.ts +7 -0
  2. package/dist/components/{author → base/author}/index.d.ts +3 -3
  3. package/dist/components/base/index.d.ts +1 -1
  4. package/dist/components/index.cjs +4 -3
  5. package/dist/components/index.d.ts +3 -2
  6. package/dist/components/index.mjs +10 -9
  7. package/dist/components/not-found/index.d.ts +3 -0
  8. package/dist/components/seo/index.d.ts +7 -12
  9. package/dist/components/seo/types.d.ts +6 -0
  10. package/dist/components/seo/utils.d.ts +2 -0
  11. package/dist/components/{expert-tip → tip}/index.d.ts +4 -4
  12. package/dist/i18n/index.cjs +1 -1
  13. package/dist/i18n/index.mjs +1 -1
  14. package/dist/{index-BqUBNm7v.mjs → index-25M8hPOF.mjs} +1 -6
  15. package/dist/{index-BEqFPNAt.js → index-Biz1dDqA.js} +12 -12
  16. package/dist/index-BuvY6WUO.mjs +27 -0
  17. package/dist/{index-D2APUOog.js → index-Cte2-g6s.js} +1 -6
  18. package/dist/index-D32PZCoe.js +1039 -0
  19. package/dist/{index-F6_fGeRI.mjs → index-DoBCANwf.mjs} +12 -12
  20. package/dist/{index-m97PmVsd.js → index-Sod4uKHB.js} +16 -7
  21. package/dist/{index-Ct1pg92K.mjs → index-VQ0_fg4m.mjs} +116 -98
  22. package/dist/index.cjs +7 -7
  23. package/dist/index.mjs +12 -12
  24. package/dist/providers/index.cjs +1 -1
  25. package/dist/providers/index.mjs +1 -1
  26. package/dist/providers/site-provider/index.d.ts +1 -2
  27. package/dist/types/components/how-to/index.d.ts +2 -2
  28. package/dist/types/components/image/index.d.ts +4 -0
  29. package/dist/types/content/author/index.d.ts +5 -4
  30. package/dist/types/content/index.d.ts +1 -0
  31. package/dist/types/content/seo/index.d.ts +4 -0
  32. package/dist/types/site/index.d.ts +8 -14
  33. package/dist/utils/index.cjs +1 -2
  34. package/dist/utils/index.d.ts +0 -1
  35. package/dist/utils/index.mjs +1 -2
  36. package/package.json +1 -1
  37. package/dist/components/base/expert/index.d.ts +0 -8
  38. package/dist/index-C-e_0aJJ.mjs +0 -18
  39. package/dist/index-qgcoV14g.js +0 -1021
  40. package/dist/utils/url/index.d.ts +0 -1
  41. /package/dist/components/base/{expert → author}/bio/index.d.ts +0 -0
@@ -35,17 +35,17 @@ var GameCharacteristic = /* @__PURE__ */ ((GameCharacteristic2) => {
35
35
  })(GameCharacteristic || {});
36
36
  const pageNotFound$3 = {
37
37
  seo: {
38
- title: "Seite nicht gefunden | {{domain}}"
38
+ title: "Seite nicht gefunden | {{siteName}}"
39
39
  },
40
40
  title: "404 — Seite nicht gefunden",
41
41
  description: "Entschuldigung 😔, wir konnten nicht finden, wonach Sie gesucht haben.",
42
42
  action: "Zur Startseite"
43
43
  };
44
44
  const footer$3 = {
45
- copyright: "© {{year}} {{domain}}. Alle Rechte vorbehalten.",
45
+ copyright: "© {{year}} {{siteName}}. Alle Rechte vorbehalten.",
46
46
  disclaimer: {
47
47
  title: "Spielen Sie verantwortungsbewusst: ",
48
- description: "{{domain}} ist eine unabhängige Ressource und nicht mit den von uns beworbenen Seiten verbunden. Stellen Sie sicher, dass Sie über alle erforderlichen Zertifikate verfügen und die gesetzlichen Anforderungen erfüllt sind, bevor Sie mit dem Spielen beginnen. Der Hauptzweck von {{domain}} besteht darin, informative und unterhaltsame Inhalte bereitzustellen. Wenn Sie nach Links zu verwandten Ressourcen suchen, werden Sie zu den entsprechenden Plattformen weitergeleitet."
48
+ description: "{{siteName}} ist eine unabhängige Ressource und nicht mit den von uns beworbenen Seiten verbunden. Stellen Sie sicher, dass Sie über alle erforderlichen Zertifikate verfügen und die gesetzlichen Anforderungen erfüllt sind, bevor Sie mit dem Spielen beginnen. Der Hauptzweck von {{siteName}} besteht darin, informative und unterhaltsame Inhalte bereitzustellen. Wenn Sie nach Links zu verwandten Ressourcen suchen, werden Sie zu den entsprechenden Plattformen weitergeleitet."
49
49
  }
50
50
  };
51
51
  const gameDemo$3 = {
@@ -152,17 +152,17 @@ const dictionary$3 = {
152
152
  };
153
153
  const pageNotFound$2 = {
154
154
  seo: {
155
- title: "Page not found | {{domain}}"
155
+ title: "Page not found | {{siteName}}"
156
156
  },
157
157
  title: "404 — Page not found",
158
158
  description: "Sorry 😔, we couldn’t find what you were looking for.",
159
159
  action: "Go Home"
160
160
  };
161
161
  const footer$2 = {
162
- copyright: "© {{year}} {{domain}}. All rights reserved.",
162
+ copyright: "© {{year}} {{siteName}}. All rights reserved.",
163
163
  disclaimer: {
164
164
  title: "Play responsibly: ",
165
- description: "{{domain}} is an independent resource not affiliated with the sites we promote. Make sure you have all the necessary certifications and legal requirements are met before you start playing. The main purpose of {{domain}} is to provide informative and entertaining content. If you are looking for links to related resources, you will be redirected to the relevant platforms."
165
+ description: "{{siteName}} is an independent resource not affiliated with the sites we promote. Make sure you have all the necessary certifications and legal requirements are met before you start playing. The main purpose of {{siteName}} is to provide informative and entertaining content. If you are looking for links to related resources, you will be redirected to the relevant platforms."
166
166
  }
167
167
  };
168
168
  const gameDemo$2 = {
@@ -269,17 +269,17 @@ const dictionary$2 = {
269
269
  };
270
270
  const pageNotFound$1 = {
271
271
  seo: {
272
- title: "Pagina non trovata | {{domain}}"
272
+ title: "Pagina non trovata | {{siteName}}"
273
273
  },
274
274
  title: "404 — Pagina non trovata",
275
275
  description: "Spiacenti 😔, non siamo riusciti a trovare quello che cercavi.",
276
276
  action: "Ritorna alla pagina principale"
277
277
  };
278
278
  const footer$1 = {
279
- copyright: "© {{year}} {{domain}}. Tutte le cose sono fatte.",
279
+ copyright: "© {{year}} {{siteName}}. Tutte le cose sono fatte.",
280
280
  disclaimer: {
281
281
  title: "Gioca responsabilmente: ",
282
- description: "{{domain}} è una risorsa indipendente e non affiliata ai siti che promuoviamo. Prima di iniziare a giocare, assicurati di possedere tutte le certificazioni necessarie e di rispettare i requisiti legali in vigore. L'obiettivo principale di {{domain}} è offrire contenuti informativi e di intrattenimento. Se cerchi collegamenti a risorse correlate, verrai reindirizzato alle piattaforme pertinenti."
282
+ description: "{{siteName}} è una risorsa indipendente e non affiliata ai siti che promuoviamo. Prima di iniziare a giocare, assicurati di possedere tutte le certificazioni necessarie e di rispettare i requisiti legali in vigore. L'obiettivo principale di {{siteName}} è offrire contenuti informativi e di intrattenimento. Se cerchi collegamenti a risorse correlate, verrai reindirizzato alle piattaforme pertinenti."
283
283
  }
284
284
  };
285
285
  const gameDemo$1 = {
@@ -386,17 +386,17 @@ const dictionary$1 = {
386
386
  };
387
387
  const pageNotFound = {
388
388
  seo: {
389
- title: "Страница не найдена | {{domain}}"
389
+ title: "Страница не найдена | {{siteName}}"
390
390
  },
391
391
  title: "404 — Страница не найдена",
392
392
  description: "Извините 😔, мы не смогли найти то, что вы искали.",
393
393
  action: "На главную"
394
394
  };
395
395
  const footer = {
396
- copyright: "© {{year}} {{domain}}. Все права защищены.",
396
+ copyright: "© {{year}} {{siteName}}. Все права защищены.",
397
397
  disclaimer: {
398
398
  title: "Играйте ответственно: ",
399
- description: "{{domain}} — независимый ресурс, не связанный с продвигаемыми сайтами. Убедитесь, что у вас есть все необходимые сертификаты и соблюдены юридические требования перед началом игры. Основная цель {{domain}} — предоставление информационного и развлекательного контента. Если вы ищете ссылки на связанные ресурсы, вас перенаправят на соответствующие платформы."
399
+ description: "{{siteName}} — независимый ресурс, не связанный с продвигаемыми сайтами. Убедитесь, что у вас есть все необходимые сертификаты и соблюдены юридические требования перед началом игры. Основная цель {{siteName}} — предоставление информационного и развлекательного контента. Если вы ищете ссылки на связанные ресурсы, вас перенаправят на соответствующие платформы."
400
400
  }
401
401
  };
402
402
  const gameDemo = {
@@ -2,14 +2,23 @@
2
2
  const jsxRuntime = require("react/jsx-runtime");
3
3
  const react$1 = require("@chakra-ui/react");
4
4
  const react = require("@mdx-js/react");
5
+ function omitProps(props, keysToOmit) {
6
+ const result = { ...props };
7
+ keysToOmit.forEach((key) => {
8
+ if (key in result) {
9
+ delete result[key];
10
+ }
11
+ });
12
+ return result;
13
+ }
5
14
  const components = {
6
- h1: (props) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Heading, { as: "h1", size: "xl", mb: 4, ...props }),
7
- h2: (props) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Heading, { as: "h2", size: "lg", mt: 6, mb: 4, ...props }),
8
- h3: (props) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Heading, { as: "h3", size: "md", mt: 4, mb: 4, ...props }),
9
- ol: (props) => /* @__PURE__ */ jsxRuntime.jsx(react$1.OrderedList, { mb: 4, ...props }),
10
- ul: (props) => /* @__PURE__ */ jsxRuntime.jsx(react$1.UnorderedList, { mb: 4, ...props }),
11
- p: (props) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { mb: 4, ...props }),
12
- a: (props) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Link, { ...props, color: "brand.400" })
15
+ h1: (props) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Heading, { as: "h1", size: "xl", mb: 4, ...omitProps(props, ["node"]) }),
16
+ h2: (props) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Heading, { as: "h2", size: "lg", mt: 6, mb: 4, ...omitProps(props, ["node"]) }),
17
+ h3: (props) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Heading, { as: "h3", size: "md", mt: 4, mb: 4, ...omitProps(props, ["node"]) }),
18
+ ol: (props) => /* @__PURE__ */ jsxRuntime.jsx(react$1.OrderedList, { mb: 4, ...omitProps(props, ["node"]) }),
19
+ ul: (props) => /* @__PURE__ */ jsxRuntime.jsx(react$1.UnorderedList, { mb: 4, ...omitProps(props, ["node"]) }),
20
+ p: (props) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { mb: 4, ...omitProps(props, ["node"]) }),
21
+ a: (props) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Link, { color: "brand.400", ...omitProps(props, ["node"]) })
13
22
  };
14
23
  const MdxProvider = ({ children }) => {
15
24
  return /* @__PURE__ */ jsxRuntime.jsx(react.MDXProvider, { components, children });
@@ -1,20 +1,17 @@
1
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
- import { Center as Center$1, Box, Collapse, Text, Button, Flex, Stack, Image, SimpleGrid, Link, Card, CardHeader, Heading, CardBody, Popover, PopoverTrigger, Portal, PopoverContent, PopoverBody, CardFooter, useToast, useColorModeValue, VStack, FormControl, FormLabel, InputGroup, InputLeftElement, Input, Textarea, Accordion, AccordionItem, AccordionButton, AccordionIcon, AccordionPanel, LinkBox, LinkOverlay, IconButton, AbsoluteCenter, Spinner, useDisclosure, Divider, Circle, Container as Container$1, List as List$1, ListItem, Icon, ListIcon, TableContainer, Table as Table$1, Thead, Tr, Th, Tbody, Td, TableCaption, Tabs as Tabs$1, TabList, Tab, TabPanels, TabPanel } from "@chakra-ui/react";
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { Box, Collapse, Text, Button, Flex, Stack, Image, Center as Center$1, SimpleGrid, Link, Card, CardHeader, Heading, CardBody, Popover, PopoverTrigger, Portal, PopoverContent, PopoverBody, CardFooter, useToast, useColorModeValue, VStack, FormControl, FormLabel, InputGroup, InputLeftElement, Input, Textarea, Accordion, AccordionItem, AccordionButton, AccordionIcon, AccordionPanel, LinkBox, LinkOverlay, IconButton, AbsoluteCenter, Spinner, useDisclosure, Divider, Circle, Container as Container$1, List as List$1, ListItem, Icon, 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
- import { A as Animation, b as formatNumber, c as getCurrencySymbol, f as formatDate, d as getDomain, g as getCurrentYear, a as getCurrentMonth } from "./index-BqUBNm7v.mjs";
5
- import { a as GameCharacteristic } from "./index-F6_fGeRI.mjs";
4
+ import { A as Animation, b as formatNumber, c as getCurrencySymbol, f as formatDate, g as getCurrentYear, a as getCurrentMonth } from "./index-25M8hPOF.mjs";
5
+ import { a as GameCharacteristic } from "./index-DoBCANwf.mjs";
6
6
  import "@ctrl/tinycolor";
7
- import { useMDXComponents } from "@mdx-js/react";
8
- import { u as useSiteContext } from "./index-BNb-P8a6.mjs";
9
7
  import { useRef, useState, useLayoutEffect, Fragment as Fragment$1, forwardRef, useEffect, useMemo } from "react";
10
8
  import { EmailIcon, StarIcon, CloseIcon, ExternalLinkIcon, ChevronRightIcon, ChevronDownIcon, HamburgerIcon, ChevronUpIcon, WarningIcon, CheckCircleIcon } from "@chakra-ui/icons";
11
9
  import { u as usePrimaryColors } from "./index-xuSxvz5z.mjs";
10
+ import { useMDXComponents } from "@mdx-js/react";
11
+ import { u as useSiteContext } from "./index-BNb-P8a6.mjs";
12
12
  import { t } from "i18next";
13
13
  import { Link as Link$1 } from "gatsby";
14
14
  import Markdown from "react-markdown";
15
- const Center = ({ children, ...boxProps }) => {
16
- return /* @__PURE__ */ jsx(Center$1, { ...boxProps, children });
17
- };
18
15
  const ONE_LINE_HEIGHT = 24;
19
16
  const Bio = ({ content, maxLines = 1 }) => {
20
17
  const ref = useRef(null);
@@ -39,19 +36,15 @@ const Bio = ({ content, maxLines = 1 }) => {
39
36
  showToggle && /* @__PURE__ */ jsx(Button, { size: "sm", variant: "link", colorScheme: "blue", onClick: handleClick, children: isExpanded ? t2("action.collapse") : t2("action.expand") })
40
37
  ] });
41
38
  };
42
- const Expert = ({ expert, variant }) => {
43
- var _a;
44
- const { firstName, lastName, jobTitle, bio } = expert;
45
- const { assets } = useSiteContext();
46
- const fullName = `${firstName} ${lastName}`;
47
- const image = (_a = assets == null ? void 0 : assets.images) == null ? void 0 : _a.expert;
48
- const imageComponent = typeof image === "string" ? /* @__PURE__ */ jsx(Image, { src: image, alt: fullName, rounded: "full" }) : image;
39
+ const Author = ({ author, variant }) => {
40
+ const { name, role, bio, avatar } = author;
41
+ const imageComponent = typeof avatar === "string" ? /* @__PURE__ */ jsx(Image, { src: avatar, alt: name, rounded: "full" }) : avatar;
49
42
  if (variant === "short") {
50
43
  return /* @__PURE__ */ jsxs(Flex, { as: "article", align: "center", gap: 4, children: [
51
44
  !!imageComponent && /* @__PURE__ */ jsx(Box, { w: 12, h: 12, children: imageComponent }),
52
45
  /* @__PURE__ */ jsxs(Box, { fontWeight: "semibold", children: [
53
- /* @__PURE__ */ jsx(Text, { children: fullName }),
54
- /* @__PURE__ */ jsx(Text, { color: "gray.500", children: expert.jobTitle })
46
+ /* @__PURE__ */ jsx(Text, { children: name }),
47
+ /* @__PURE__ */ jsx(Text, { color: "gray.500", children: role })
55
48
  ] })
56
49
  ] });
57
50
  }
@@ -59,13 +52,17 @@ const Expert = ({ expert, variant }) => {
59
52
  !!imageComponent && /* @__PURE__ */ jsx(Flex, { grow: 1, maxW: { base: 48, sm: 32 }, children: imageComponent }),
60
53
  /* @__PURE__ */ jsx(Flex, { w: "100%", children: /* @__PURE__ */ jsxs(Stack, { children: [
61
54
  /* @__PURE__ */ jsxs(Text, { fontSize: "lg", fontWeight: 600, children: [
62
- `${fullName}, `,
63
- /* @__PURE__ */ jsx(Text, { as: "span", color: "gray.500", children: jobTitle })
55
+ name,
56
+ ", ",
57
+ /* @__PURE__ */ jsx(Text, { as: "span", color: "gray.500", children: role })
64
58
  ] }),
65
59
  /* @__PURE__ */ jsx(Bio, { content: bio })
66
60
  ] }) })
67
61
  ] });
68
62
  };
63
+ const Center = ({ children, ...boxProps }) => {
64
+ return /* @__PURE__ */ jsx(Center$1, { ...boxProps, children });
65
+ };
69
66
  const defaultColumns = { base: 1, sm: 2, md: 3, lg: 4, xl: 5 };
70
67
  const Grid = ({ items, columns = defaultColumns, gap, render, getKey, ...boxProps }) => {
71
68
  return /* @__PURE__ */ jsx(SimpleGrid, { as: "ul", columns, spacing: gap, p: 0, m: 0, listStyleType: "none", ...boxProps, children: items.map((item, index) => /* @__PURE__ */ jsx(Box, { as: "li", children: render(item) }, getKey ? getKey(item) : index)) });
@@ -104,9 +101,9 @@ const PulseButton = ({ label, colorScheme = "light", to, onClick }) => {
104
101
  }
105
102
  );
106
103
  };
107
- const Author = ({ author, ...cardProps }) => {
104
+ const AuthorCard = ({ author, ...boxProps }) => {
108
105
  const { t: t2 } = useTranslation("author");
109
- return /* @__PURE__ */ jsxs(Card, { as: "article", variant: "filled", ...cardProps, children: [
106
+ return /* @__PURE__ */ jsxs(Card, { as: "article", variant: "filled", ...boxProps, children: [
110
107
  /* @__PURE__ */ jsx(CardHeader, { pb: 0, children: /* @__PURE__ */ jsx(Heading, { size: "md", children: t2("title") }) }),
111
108
  /* @__PURE__ */ jsx(
112
109
  CardBody,
@@ -115,7 +112,7 @@ const Author = ({ author, ...cardProps }) => {
115
112
  flexDirection: { base: "column", sm: "row" },
116
113
  alignItems: { base: "center", sm: "flex-start" },
117
114
  gap: 4,
118
- children: /* @__PURE__ */ jsx(Expert, { expert: author, variant: "full" })
115
+ children: /* @__PURE__ */ jsx(Author, { author, variant: "full" })
119
116
  }
120
117
  )
121
118
  ] });
@@ -247,31 +244,6 @@ const ContactForm = ({ ...boxProps }) => {
247
244
  }
248
245
  );
249
246
  };
250
- const ExpertTip = ({ tip, expert, ...boxProps }) => {
251
- return /* @__PURE__ */ jsxs(
252
- Card,
253
- {
254
- variant: "filled",
255
- p: 4,
256
- borderLeft: "4px solid gray",
257
- gap: 4,
258
- _before: {
259
- content: '"❛❛"',
260
- position: "absolute",
261
- top: -8,
262
- left: -2,
263
- fontSize: "6rem",
264
- fontStyle: "italic",
265
- color: useColorModeValue("blackAlpha.300", "whiteAlpha.300")
266
- },
267
- ...boxProps,
268
- children: [
269
- /* @__PURE__ */ jsx(CardBody, { as: "blockquote", p: 0, fontStyle: "italic", children: tip }),
270
- !!expert && /* @__PURE__ */ jsx(CardFooter, { alignItems: "center", justify: "flex-end", p: 0, children: /* @__PURE__ */ jsx(Expert, { expert, variant: "short" }) })
271
- ]
272
- }
273
- );
274
- };
275
247
  const Faq = ({ items, ...boxProps }) => {
276
248
  const { bgColor, color } = usePrimaryColors();
277
249
  return /* @__PURE__ */ jsx(Accordion, { allowToggle: true, ...boxProps, children: items.map(({ question, answer }) => {
@@ -437,23 +409,28 @@ function stringifyLanguageArray(languages) {
437
409
  }
438
410
  function getGameInfoItemValue(key, value, currency) {
439
411
  let formattedValue = "";
440
- if (key === GameCharacteristic.Rtp) {
441
- formattedValue = formatNumber(value, { percent: "real", precision: 3 });
442
- }
443
- if ((key === GameCharacteristic.MinBet || key === GameCharacteristic.MaxBet || key === GameCharacteristic.MaxWin) && typeof value === "number") {
444
- if (Array.isArray(currency)) {
445
- const [primary, ...secondaries] = currency || ["USD"];
446
- const primaryValue = formatNumber(value, { currency: primary });
447
- formattedValue = secondaries.length ? `${primaryValue} (${secondaries.map((currency2) => getCurrencySymbol(currency2)).join(", ")})` : primaryValue;
448
- } else {
449
- formattedValue = formatNumber(value, { currency });
412
+ if (typeof value !== "string") {
413
+ if (key === GameCharacteristic.Rtp) {
414
+ formattedValue = formatNumber(value, { percent: "real", precision: 3 });
415
+ }
416
+ if (key === GameCharacteristic.MinBet || key === GameCharacteristic.MaxBet || key === GameCharacteristic.MaxWin) {
417
+ if (Array.isArray(currency)) {
418
+ const [primary, ...secondaries] = currency || ["USD"];
419
+ const primaryValue = formatNumber(value, { currency: primary });
420
+ formattedValue = secondaries.length ? `${primaryValue} (${secondaries.map((currency2) => getCurrencySymbol(currency2)).join(", ")})` : primaryValue;
421
+ } else {
422
+ formattedValue = formatNumber(value, { currency });
423
+ }
424
+ }
425
+ if (key === GameCharacteristic.Compatibility || key === GameCharacteristic.BonusFeatures) {
426
+ formattedValue = stringifyArray(value);
427
+ }
428
+ if (key === GameCharacteristic.Languages) {
429
+ formattedValue = stringifyLanguageArray(value);
430
+ }
431
+ if (typeof value === "boolean") {
432
+ formattedValue = stringifyHasFeature(value);
450
433
  }
451
- }
452
- if (key === GameCharacteristic.Compatibility || key === GameCharacteristic.BonusFeatures && typeof value !== "string") {
453
- formattedValue = stringifyArray(value);
454
- }
455
- if (key === GameCharacteristic.Languages) {
456
- formattedValue = stringifyLanguageArray(value);
457
434
  }
458
435
  if (key === GameCharacteristic.ReleaseDate) {
459
436
  formattedValue = formatDate({ value, options: { year: "numeric", month: "long" } });
@@ -461,9 +438,6 @@ function getGameInfoItemValue(key, value, currency) {
461
438
  if (key === GameCharacteristic.Volatility) {
462
439
  formattedValue = stringifyVolatility(value);
463
440
  }
464
- if (typeof value === "boolean") {
465
- formattedValue = stringifyHasFeature(value);
466
- }
467
441
  if (!formattedValue) {
468
442
  formattedValue = value.toLocaleString();
469
443
  }
@@ -487,6 +461,9 @@ const GameInfo = ({ info }) => {
487
461
  /* @__PURE__ */ jsx(Divider, { my: 2 }),
488
462
  /* @__PURE__ */ jsx(Text, { fontWeight: "semibold", mb: 2, children: t2(`group.${group}`) }),
489
463
  Object.entries(items).map(([itemKey, itemValue]) => {
464
+ if (!itemValue) {
465
+ return null;
466
+ }
490
467
  const feature = itemKey;
491
468
  const value = getGameInfoItemValue(feature, itemValue, currency);
492
469
  return /* @__PURE__ */ jsx(GameInfoItem, { title: t2(`feature.${feature}`), value }, itemKey);
@@ -498,11 +475,11 @@ const GameInfo = ({ info }) => {
498
475
  };
499
476
  const HowTo = ({ steps, ...boxProps }) => {
500
477
  const { color, bgColor } = usePrimaryColors();
501
- return /* @__PURE__ */ jsx(SimpleGrid, { as: "ol", columns: { base: 1, md: 2, lg: 3 }, gap: 4, p: 0, ...boxProps, children: steps.map(({ title, description, image }, index) => /* @__PURE__ */ jsxs(Flex, { as: "li", alignItems: "flex-start", gap: 4, children: [
478
+ return /* @__PURE__ */ jsx(SimpleGrid, { as: "ol", columns: { base: 1, md: 2, lg: 3 }, gap: 4, p: 0, ...boxProps, children: steps.map(({ title, description, thumbnail }, index) => /* @__PURE__ */ jsxs(Flex, { as: "li", alignItems: "flex-start", gap: 4, children: [
502
479
  /* @__PURE__ */ jsx(Circle, { size: 12, bgColor, color, fontSize: "lg", fontWeight: "bold", children: String(index + 1) }),
503
480
  /* @__PURE__ */ jsxs(Stack, { flex: 1, children: [
504
481
  /* @__PURE__ */ jsx(Text, { fontSize: "lg", fontWeight: "bold", children: title }),
505
- typeof image === "string" ? /* @__PURE__ */ jsx(Image, { src: image, alt: title, aspectRatio: "16/9", objectFit: "cover" }) : image,
482
+ typeof thumbnail === "string" ? /* @__PURE__ */ jsx(Image, { src: thumbnail, alt: title, aspectRatio: "16/9", objectFit: "cover" }) : thumbnail,
506
483
  /* @__PURE__ */ jsx(Text, { children: description })
507
484
  ] })
508
485
  ] }, index)) });
@@ -514,13 +491,9 @@ const Content = ({ children }) => {
514
491
  return /* @__PURE__ */ jsx(Box, { as: "section", py: 4, children: /* @__PURE__ */ jsx(Container, { children }) });
515
492
  };
516
493
  const Logo = () => {
517
- var _a;
518
- const { assets } = useSiteContext();
519
- const image = (_a = assets == null ? void 0 : assets.images) == null ? void 0 : _a.logo;
520
- if (!image) {
521
- return null;
522
- }
523
- return /* @__PURE__ */ jsx(Box, { display: "flex", h: { base: 10, md: 14 }, overflow: "hidden", children: typeof image === "string" ? /* @__PURE__ */ jsx(Image, { src: image, alt: "Logo", objectFit: "contain" }) : image });
494
+ const { metadata } = useSiteContext();
495
+ const { logo } = metadata;
496
+ return /* @__PURE__ */ jsx(Box, { display: "flex", h: { base: 10, md: 14 }, overflow: "hidden", children: typeof logo === "string" ? /* @__PURE__ */ jsx(Image, { src: logo, alt: "Logo", objectFit: "contain" }) : logo });
524
497
  };
525
498
  const Brand$1 = ({ brand }) => {
526
499
  return /* @__PURE__ */ jsxs(Box, { position: "relative", my: 2, py: 8, children: [
@@ -530,17 +503,17 @@ const Brand$1 = ({ brand }) => {
530
503
  };
531
504
  const Copyright = () => {
532
505
  const { metadata } = useSiteContext();
533
- const { siteUrl } = metadata;
506
+ const { name: siteName } = metadata;
534
507
  const { t: t2 } = useTranslation("footer");
535
- return /* @__PURE__ */ jsx(Text, { as: "small", colorScheme: "gray", display: "flex", align: "center", justifyContent: "center", children: t2("copyright", { year: getCurrentYear(), domain: getDomain(siteUrl) }) });
508
+ return /* @__PURE__ */ jsx(Text, { as: "small", colorScheme: "gray", display: "flex", align: "center", justifyContent: "center", children: t2("copyright", { year: getCurrentYear(), siteName }) });
536
509
  };
537
510
  const Disclaimer = () => {
538
511
  const { metadata } = useSiteContext();
539
- const { siteUrl } = metadata;
512
+ const { name: siteName } = metadata;
540
513
  const { t: t2 } = useTranslation("footer");
541
514
  return /* @__PURE__ */ jsxs(Text, { as: "small", colorScheme: "gray", fontSize: "sm", children: [
542
515
  /* @__PURE__ */ jsx(Text, { as: "span", fontWeight: "bold", color: "red.600", children: t2("disclaimer.title") }),
543
- t2("disclaimer.description", { domain: getDomain(siteUrl) })
516
+ t2("disclaimer.description", { siteName })
544
517
  ] });
545
518
  };
546
519
  const Extra = ({ children }) => {
@@ -862,6 +835,17 @@ const List = ({ items, bullet = "—", render, ...boxProps }) => {
862
835
  render ? render(item) : item
863
836
  ] }, index)) });
864
837
  };
838
+ const NotFound = () => {
839
+ const { t: t2 } = useTranslation("pageNotFound");
840
+ return /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
841
+ /* @__PURE__ */ jsx(Heading, { as: "h1", children: t2("title") }),
842
+ /* @__PURE__ */ jsxs(Text, { fontSize: "xl", children: [
843
+ t2("description"),
844
+ " ",
845
+ /* @__PURE__ */ jsx(Button, { as: Link$1, to: "/", variant: "link", colorScheme: "brand", fontSize: "xl", children: t2("action") })
846
+ ] })
847
+ ] });
848
+ };
865
849
  const TitleMap = {
866
850
  pros: "advantages",
867
851
  cons: "disadvantages"
@@ -932,24 +916,32 @@ const RichTextRenderer = ({ content }) => {
932
916
  const components = useMDXComponents();
933
917
  return /* @__PURE__ */ jsx(Markdown, { components, children: content });
934
918
  };
919
+ function replacePlaceholders(text, placeholders) {
920
+ Object.entries(placeholders).forEach(([placeholder, replacement]) => {
921
+ const regex = new RegExp(`{{${placeholder}}}`, "g");
922
+ text = text.replace(regex, replacement);
923
+ });
924
+ return text;
925
+ }
935
926
  const Seo = ({ children, siteMetadata, title, description, lang }) => {
936
- const { title: defaultTitle, description: defaultDescription, lang: defaultLang, siteUrl } = siteMetadata;
937
- return /* @__PURE__ */ jsxs(Fragment, { children: [
938
- /* @__PURE__ */ jsx("html", { lang: lang ?? defaultLang }),
939
- /* @__PURE__ */ jsx("title", { children: title ? typeof title === "string" ? title : title({
940
- domain: getDomain(siteUrl),
927
+ const { name: siteName, lang: defaultLang, seo } = siteMetadata;
928
+ const { title: defaultTitle, description: defaultDescription } = seo;
929
+ const placeholders = useMemo(
930
+ () => ({
931
+ siteName,
941
932
  currentYear: getCurrentYear(),
942
933
  currentMonth: getCurrentMonth()
943
- }) : defaultTitle }),
934
+ }),
935
+ [siteName]
936
+ );
937
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
938
+ /* @__PURE__ */ jsx("html", { lang: lang ?? defaultLang }),
939
+ /* @__PURE__ */ jsx("title", { children: title ? typeof title === "string" ? replacePlaceholders(title, placeholders) : title(placeholders) : defaultTitle }),
944
940
  /* @__PURE__ */ jsx(
945
941
  "meta",
946
942
  {
947
943
  name: "description",
948
- content: description ? typeof description === "string" ? description : description({
949
- domain: getDomain(siteUrl),
950
- currentYear: getCurrentYear(),
951
- currentMonth: getCurrentMonth()
952
- }) : defaultDescription
944
+ content: description ? typeof description === "string" ? replacePlaceholders(description, placeholders) : description(placeholders) : defaultDescription
953
945
  }
954
946
  ),
955
947
  children
@@ -995,15 +987,40 @@ const Tabs = ({ items, render, ...boxProps }) => {
995
987
  /* @__PURE__ */ jsx(TabPanels, { children: panels.map((panel, index) => /* @__PURE__ */ jsx(TabPanel, { children: render ? render(panel) : panel }, index)) })
996
988
  ] });
997
989
  };
990
+ const Tip = ({ tip, author = null, ...boxProps }) => {
991
+ return /* @__PURE__ */ jsxs(
992
+ Card,
993
+ {
994
+ variant: "filled",
995
+ p: 4,
996
+ borderLeft: "4px solid gray",
997
+ gap: 4,
998
+ _before: {
999
+ content: '"❛❛"',
1000
+ position: "absolute",
1001
+ top: -8,
1002
+ left: -2,
1003
+ fontSize: "6rem",
1004
+ fontStyle: "italic",
1005
+ color: useColorModeValue("blackAlpha.300", "whiteAlpha.300")
1006
+ },
1007
+ ...boxProps,
1008
+ children: [
1009
+ /* @__PURE__ */ jsx(CardBody, { as: "blockquote", p: 0, fontStyle: "italic", children: tip }),
1010
+ !!author && /* @__PURE__ */ jsx(CardFooter, { alignItems: "center", justify: "flex-end", p: 0, children: /* @__PURE__ */ jsx(Author, { author, variant: "short" }) })
1011
+ ]
1012
+ }
1013
+ );
1014
+ };
998
1015
  export {
999
- Author as A,
1016
+ AuthorCard as A,
1000
1017
  BonusCard as B,
1001
1018
  ContactForm as C,
1002
- ExpertTip as E,
1003
1019
  Faq as F,
1004
1020
  GameCard as G,
1005
1021
  HowTo as H,
1006
1022
  Layout as L,
1023
+ NotFound as N,
1007
1024
  ProsCons as P,
1008
1025
  RichTextRenderer as R,
1009
1026
  Seo as S,
@@ -1014,9 +1031,10 @@ export {
1014
1031
  GameInfo as d,
1015
1032
  List as e,
1016
1033
  Tabs as f,
1017
- Center as g,
1018
- Expert as h,
1019
- Grid as i,
1020
- LinkButton as j,
1021
- PulseButton as k
1034
+ Tip as g,
1035
+ Author as h,
1036
+ Center as i,
1037
+ Grid as j,
1038
+ LinkButton as k,
1039
+ PulseButton as l
1022
1040
  };
package/dist/index.cjs CHANGED
@@ -1,19 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const index = require("./index-qgcoV14g.js");
3
+ const index = require("./index-D32PZCoe.js");
4
4
  const index$1 = require("./index-IpSV-c71.js");
5
- const i18n$1 = require("./index-BEqFPNAt.js");
6
- const index$2 = require("./index-m97PmVsd.js");
5
+ const i18n$1 = require("./index-Biz1dDqA.js");
6
+ const index$2 = require("./index-Sod4uKHB.js");
7
7
  const index$3 = require("./index-BhsXlbd8.js");
8
- const index$4 = require("./index-D2APUOog.js");
8
+ const index$4 = require("./index-Cte2-g6s.js");
9
9
  const index$5 = require("./index-B-5oUop6.js");
10
10
  const i18n = require("i18next");
11
11
  exports.Author = index.Author;
12
+ exports.AuthorCard = index.AuthorCard;
12
13
  exports.BonusCard = index.BonusCard;
13
14
  exports.Center = index.Center;
14
15
  exports.ContactForm = index.ContactForm;
15
- exports.Expert = index.Expert;
16
- exports.ExpertTip = index.ExpertTip;
17
16
  exports.Faq = index.Faq;
18
17
  exports.FeatureCard = index.FeatureCard;
19
18
  exports.Features = index.Features;
@@ -25,12 +24,14 @@ exports.HowTo = index.HowTo;
25
24
  exports.Layout = index.Layout;
26
25
  exports.LinkButton = index.LinkButton;
27
26
  exports.List = index.List;
27
+ exports.NotFound = index.NotFound;
28
28
  exports.ProsCons = index.ProsCons;
29
29
  exports.PulseButton = index.PulseButton;
30
30
  exports.RichTextRenderer = index.RichTextRenderer;
31
31
  exports.Seo = index.Seo;
32
32
  exports.Table = index.Table;
33
33
  exports.Tabs = index.Tabs;
34
+ exports.Tip = index.Tip;
34
35
  exports.usePrimaryColors = index$1.usePrimaryColors;
35
36
  exports.GameCharacteristic = i18n$1.GameCharacteristic;
36
37
  exports.GameVolatility = i18n$1.GameVolatility;
@@ -44,7 +45,6 @@ exports.formatNumber = index$4.formatNumber;
44
45
  exports.getCurrencySymbol = index$4.getCurrencySymbol;
45
46
  exports.getCurrentMonth = index$4.getCurrentMonth;
46
47
  exports.getCurrentYear = index$4.getCurrentYear;
47
- exports.getDomain = index$4.getDomain;
48
48
  exports.parseNumber = index$4.parseNumber;
49
49
  exports.round = index$4.round;
50
50
  exports.toFixedTwo = index$4.toFixedTwo;
package/dist/index.mjs CHANGED
@@ -1,19 +1,18 @@
1
- import { A, B, g, C, h, E, F, a, b, G, c, d, i, H, L, j, e, P, k, R, S, T, f } from "./index-Ct1pg92K.mjs";
1
+ import { h, A, B, i, C, F, a, b, G, c, d, j, H, L, k, e, N, P, l, R, S, T, f, g } from "./index-VQ0_fg4m.mjs";
2
2
  import { u } from "./index-xuSxvz5z.mjs";
3
- import { a as a2, G as G2, r } from "./index-F6_fGeRI.mjs";
4
- import { M } from "./index-C-e_0aJJ.mjs";
3
+ import { a as a2, G as G2, r } from "./index-DoBCANwf.mjs";
4
+ import { M } from "./index-BuvY6WUO.mjs";
5
5
  import { S as S2, u as u2 } from "./index-BNb-P8a6.mjs";
6
- import { A as A2, f as f2, b as b2, c as c2, a as a3, g as g2, d as d2, p, r as r2, t } from "./index-BqUBNm7v.mjs";
6
+ import { A as A2, f as f2, b as b2, c as c2, a as a3, g as g2, p, r as r2, t } from "./index-25M8hPOF.mjs";
7
7
  import { e as e2, g as g3 } from "./index-BUx1Bxrs.mjs";
8
8
  import { default as default2 } from "i18next";
9
9
  export {
10
10
  A2 as Animation,
11
- A as Author,
11
+ h as Author,
12
+ A as AuthorCard,
12
13
  B as BonusCard,
13
- g as Center,
14
+ i as Center,
14
15
  C as ContactForm,
15
- h as Expert,
16
- E as ExpertTip,
17
16
  F as Faq,
18
17
  a as FeatureCard,
19
18
  b as Features,
@@ -22,19 +21,21 @@ export {
22
21
  c as GameDemo,
23
22
  d as GameInfo,
24
23
  G2 as GameVolatility,
25
- i as Grid,
24
+ j as Grid,
26
25
  H as HowTo,
27
26
  L as Layout,
28
- j as LinkButton,
27
+ k as LinkButton,
29
28
  e as List,
30
29
  M as MdxProvider,
30
+ N as NotFound,
31
31
  P as ProsCons,
32
- k as PulseButton,
32
+ l as PulseButton,
33
33
  R as RichTextRenderer,
34
34
  S as Seo,
35
35
  S2 as SiteProvider,
36
36
  T as Table,
37
37
  f as Tabs,
38
+ g as Tip,
38
39
  e2 as extractTheme,
39
40
  f2 as formatDate,
40
41
  b2 as formatNumber,
@@ -42,7 +43,6 @@ export {
42
43
  c2 as getCurrencySymbol,
43
44
  a3 as getCurrentMonth,
44
45
  g2 as getCurrentYear,
45
- d2 as getDomain,
46
46
  default2 as i18n,
47
47
  p as parseNumber,
48
48
  r as resources,
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const index = require("../index-m97PmVsd.js");
3
+ const index = require("../index-Sod4uKHB.js");
4
4
  const index$1 = require("../index-BhsXlbd8.js");
5
5
  exports.MdxProvider = index.MdxProvider;
6
6
  exports.SiteProvider = index$1.SiteProvider;
@@ -1,4 +1,4 @@
1
- import { M } from "../index-C-e_0aJJ.mjs";
1
+ import { M } from "../index-BuvY6WUO.mjs";
2
2
  import { S, u } from "../index-BNb-P8a6.mjs";
3
3
  export {
4
4
  M as MdxProvider,
@@ -1,9 +1,8 @@
1
1
  import { FC, PropsWithChildren } from 'react';
2
- import { ISiteAssets, ISiteConfigs, ISiteMetadata } from '../../types';
2
+ import { ISiteConfigs, ISiteMetadata } from '../../types';
3
3
  interface ISiteContext {
4
4
  metadata: ISiteMetadata;
5
5
  configs?: ISiteConfigs;
6
- assets?: ISiteAssets;
7
6
  }
8
7
  type SiteMetadataProviderProps = ISiteContext;
9
8
  declare const SiteProvider: FC<PropsWithChildren<SiteMetadataProviderProps>>;
@@ -1,6 +1,6 @@
1
- import { ReactElement } from 'react';
1
+ import { Image } from '../image';
2
2
  export interface IHowToStep {
3
3
  title: string;
4
4
  description?: string;
5
- image?: string | ReactElement;
5
+ thumbnail?: Image;
6
6
  }
@@ -1,2 +1,6 @@
1
+ import { ReactElement } from 'react';
1
2
  import { ImageProps } from '@chakra-ui/react';
3
+ export type ImageUrl = string;
4
+ export type ImageComponent = ReactElement;
5
+ export type Image = ImageUrl | ImageComponent;
2
6
  export type ImageFit = ImageProps['objectFit'];