@anywayseo/tools 1.0.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 (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -0
  3. package/dist/components/author/index.d.ts +8 -0
  4. package/dist/components/contact-form/index.d.ts +3 -0
  5. package/dist/components/expert/bio/index.d.ts +8 -0
  6. package/dist/components/expert/index.d.ts +8 -0
  7. package/dist/components/expert-tip/index.d.ts +9 -0
  8. package/dist/components/faq/index.d.ts +9 -0
  9. package/dist/components/features/index.d.ts +8 -0
  10. package/dist/components/game-demo/content/index.d.ts +10 -0
  11. package/dist/components/game-demo/index.d.ts +10 -0
  12. package/dist/components/game-demo/preview/index.d.ts +9 -0
  13. package/dist/components/game-info/index.d.ts +7 -0
  14. package/dist/components/game-info/item/index.d.ts +7 -0
  15. package/dist/components/game-info/utils.d.ts +2 -0
  16. package/dist/components/how-to/index.d.ts +8 -0
  17. package/dist/components/index.cjs +14 -0
  18. package/dist/components/index.d.ts +11 -0
  19. package/dist/components/index.mjs +14 -0
  20. package/dist/components/layout/content/index.d.ts +3 -0
  21. package/dist/components/layout/footer/brand/index.d.ts +6 -0
  22. package/dist/components/layout/footer/copyright/index.d.ts +3 -0
  23. package/dist/components/layout/footer/disclaimer/index.d.ts +3 -0
  24. package/dist/components/layout/footer/index.d.ts +3 -0
  25. package/dist/components/layout/footer/navigation/index.d.ts +3 -0
  26. package/dist/components/layout/header/index.d.ts +3 -0
  27. package/dist/components/layout/header/navbar/brand/index.d.ts +6 -0
  28. package/dist/components/layout/header/navbar/index.d.ts +6 -0
  29. package/dist/components/layout/header/navbar/navigation/desktop/index.d.ts +4 -0
  30. package/dist/components/layout/header/navbar/navigation/desktop/item/index.d.ts +5 -0
  31. package/dist/components/layout/header/navbar/navigation/index.d.ts +4 -0
  32. package/dist/components/layout/header/navbar/navigation/mobile/index.d.ts +4 -0
  33. package/dist/components/layout/header/navbar/navigation/mobile/item/index.d.ts +5 -0
  34. package/dist/components/layout/header/navbar/navigation/types.d.ts +4 -0
  35. package/dist/components/layout/header/navbar/theme-toggler/index.d.ts +3 -0
  36. package/dist/components/layout/hero/index.d.ts +9 -0
  37. package/dist/components/layout/index.d.ts +12 -0
  38. package/dist/components/layout/logo/index.d.ts +3 -0
  39. package/dist/components/layout/main/index.d.ts +3 -0
  40. package/dist/components/layout/scroll-to-top/index.d.ts +3 -0
  41. package/dist/components/pros-cons/card/index.d.ts +8 -0
  42. package/dist/components/pros-cons/card/utils.d.ts +6 -0
  43. package/dist/components/pros-cons/index.d.ts +8 -0
  44. package/dist/components/seo/index.d.ts +16 -0
  45. package/dist/hooks/index.cjs +4 -0
  46. package/dist/hooks/index.d.ts +1 -0
  47. package/dist/hooks/index.mjs +4 -0
  48. package/dist/hooks/use-primary-colors/index.d.ts +6 -0
  49. package/dist/i18n/index.cjs +7 -0
  50. package/dist/i18n/index.d.ts +9 -0
  51. package/dist/i18n/index.mjs +7 -0
  52. package/dist/i18n/resources/en/index.d.ts +99 -0
  53. package/dist/i18n/resources/index.d.ts +8 -0
  54. package/dist/i18n/resources/it/index.d.ts +99 -0
  55. package/dist/index-BWuTDC6H.js +17 -0
  56. package/dist/index-Bh5idiRE.mjs +257 -0
  57. package/dist/index-Bs4zA1wD.mjs +17 -0
  58. package/dist/index-BtWxmLHW.mjs +80 -0
  59. package/dist/index-D96zh94V.js +16 -0
  60. package/dist/index-DB1dS9cp.js +256 -0
  61. package/dist/index-Dfw_EKZ6.mjs +767 -0
  62. package/dist/index-IpSV-c71.js +8 -0
  63. package/dist/index-JMmaWcmu.js +79 -0
  64. package/dist/index-NWY9BnRg.js +766 -0
  65. package/dist/index-wbMOJRW_.mjs +18 -0
  66. package/dist/index-xuSxvz5z.mjs +9 -0
  67. package/dist/index.cjs +36 -0
  68. package/dist/index.d.ts +6 -0
  69. package/dist/index.mjs +36 -0
  70. package/dist/providers/index.cjs +7 -0
  71. package/dist/providers/index.d.ts +2 -0
  72. package/dist/providers/index.mjs +7 -0
  73. package/dist/providers/mdx-provider/index.d.ts +3 -0
  74. package/dist/providers/site-metadata-provider/index.d.ts +14 -0
  75. package/dist/style.css +15 -0
  76. package/dist/types/author/index.d.ts +17 -0
  77. package/dist/types/faq/index.d.ts +4 -0
  78. package/dist/types/feature/index.d.ts +4 -0
  79. package/dist/types/game-info/index.d.ts +63 -0
  80. package/dist/types/how-to/index.d.ts +5 -0
  81. package/dist/types/i18n/index.d.ts +2 -0
  82. package/dist/types/index.d.ts +9 -0
  83. package/dist/types/navigation/index.d.ts +9 -0
  84. package/dist/types/pros-cons/index.d.ts +6 -0
  85. package/dist/types/site-metadata/index.d.ts +10 -0
  86. package/dist/utils/date/index.d.ts +9 -0
  87. package/dist/utils/index.cjs +11 -0
  88. package/dist/utils/index.d.ts +3 -0
  89. package/dist/utils/index.mjs +11 -0
  90. package/dist/utils/numbers/index.d.ts +19 -0
  91. package/dist/utils/numbers/types.d.ts +1 -0
  92. package/dist/utils/url/index.d.ts +1 -0
  93. package/package.json +99 -0
@@ -0,0 +1,766 @@
1
+ "use strict";
2
+ const jsxRuntime = require("react/jsx-runtime");
3
+ const react$1 = require("@chakra-ui/react");
4
+ const reactI18next = require("react-i18next");
5
+ const icons = require("@chakra-ui/icons");
6
+ const gatsbyPluginImage = require("gatsby-plugin-image");
7
+ require("@mdx-js/react");
8
+ const index = require("./index-D96zh94V.js");
9
+ const react = require("react");
10
+ const index$1 = require("./index-IpSV-c71.js");
11
+ const i18n = require("./index-DB1dS9cp.js");
12
+ const i18n$1 = require("i18next");
13
+ const index$2 = require("./index-JMmaWcmu.js");
14
+ const gatsby = require("gatsby");
15
+ const ONE_LINE_HEIGHT = 24;
16
+ const Bio = ({ content, maxLines = 1 }) => {
17
+ const ref = react.useRef(null);
18
+ const [showToggle, setShowToggle] = react.useState(false);
19
+ const [isExpanded, setIsExpanded] = react.useState(false);
20
+ const { t } = reactI18next.useTranslation("author");
21
+ react.useLayoutEffect(() => {
22
+ if (ref.current) {
23
+ const { scrollWidth, clientWidth, scrollHeight, clientHeight } = ref.current;
24
+ const isClamped = scrollWidth > clientWidth || scrollHeight > clientHeight;
25
+ setShowToggle(isClamped);
26
+ }
27
+ return () => {
28
+ setShowToggle(false);
29
+ };
30
+ }, []);
31
+ function handleClick() {
32
+ setIsExpanded((prev) => !prev);
33
+ }
34
+ return /* @__PURE__ */ jsxRuntime.jsxs(react$1.Box, { children: [
35
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Collapse, { in: isExpanded, startingHeight: ONE_LINE_HEIGHT * maxLines, children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { ref, fontSize: "md", noOfLines: isExpanded ? void 0 : maxLines, children: content }) }),
36
+ showToggle && /* @__PURE__ */ jsxRuntime.jsx(react$1.Button, { size: "sm", variant: "link", colorScheme: "blue", onClick: handleClick, children: isExpanded ? t("action.collapse") : t("action.expand") })
37
+ ] });
38
+ };
39
+ const Expert = ({ expert, variant }) => {
40
+ const { firstName, lastName, jobTitle, bio } = expert;
41
+ const { expertImageData } = index.useSiteMetadataContext();
42
+ const image = gatsbyPluginImage.getImage(expertImageData);
43
+ const fullName = `${firstName} ${lastName}`;
44
+ if (variant === "short") {
45
+ return /* @__PURE__ */ jsxRuntime.jsxs(react$1.Flex, { as: "article", align: "center", gap: 4, children: [
46
+ !!image && /* @__PURE__ */ jsxRuntime.jsx(react$1.Box, { w: 12, h: 12, children: /* @__PURE__ */ jsxRuntime.jsx(gatsbyPluginImage.GatsbyImage, { image, alt: fullName, style: { borderRadius: "50%" } }) }),
47
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.Box, { fontWeight: "semibold", children: [
48
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { children: fullName }),
49
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { color: "gray.500", children: expert.jobTitle })
50
+ ] })
51
+ ] });
52
+ }
53
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
54
+ !!image && /* @__PURE__ */ jsxRuntime.jsx(react$1.Flex, { grow: 1, maxW: { base: 48, sm: 32 }, children: /* @__PURE__ */ jsxRuntime.jsx(gatsbyPluginImage.GatsbyImage, { image, alt: fullName, style: { borderRadius: "50%" } }) }),
55
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Flex, { w: "100%", children: /* @__PURE__ */ jsxRuntime.jsxs(react$1.Stack, { children: [
56
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.Text, { fontSize: "lg", fontWeight: 600, children: [
57
+ `${fullName}, `,
58
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { as: "span", color: "gray.500", children: jobTitle })
59
+ ] }),
60
+ /* @__PURE__ */ jsxRuntime.jsx(Bio, { content: bio })
61
+ ] }) })
62
+ ] });
63
+ };
64
+ const Author = ({ author, ...cardProps }) => {
65
+ const { t } = reactI18next.useTranslation("author");
66
+ return /* @__PURE__ */ jsxRuntime.jsxs(react$1.Card, { as: "article", variant: "filled", ...cardProps, children: [
67
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.CardHeader, { pb: 0, children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Heading, { size: "md", children: t("title") }) }),
68
+ /* @__PURE__ */ jsxRuntime.jsx(
69
+ react$1.CardBody,
70
+ {
71
+ display: "flex",
72
+ flexDirection: { base: "column", sm: "row" },
73
+ alignItems: { base: "center", sm: "flex-start" },
74
+ gap: 4,
75
+ children: /* @__PURE__ */ jsxRuntime.jsx(Expert, { expert: author, variant: "full" })
76
+ }
77
+ )
78
+ ] });
79
+ };
80
+ const ContactForm = () => {
81
+ const toast = react$1.useToast();
82
+ const { t } = reactI18next.useTranslation("contactForm");
83
+ function handleSubmit(event) {
84
+ event.preventDefault();
85
+ const form = event.currentTarget;
86
+ const formData = new FormData(form);
87
+ const name = formData.get("name");
88
+ const email = formData.get("email");
89
+ const message = formData.get("message");
90
+ if (name && email && message) {
91
+ form.reset();
92
+ toast({
93
+ title: t("notification.title", { name }),
94
+ description: t("notification.description", { email }),
95
+ colorScheme: "brand",
96
+ status: "success",
97
+ duration: 5e3,
98
+ isClosable: true
99
+ });
100
+ } else {
101
+ console.error("Please fill out both fields");
102
+ }
103
+ }
104
+ return /* @__PURE__ */ jsxRuntime.jsx(
105
+ react$1.Box,
106
+ {
107
+ as: "form",
108
+ borderRadius: "lg",
109
+ p: 8,
110
+ color: react$1.useColorModeValue("gray.700", "whiteAlpha.900"),
111
+ bg: react$1.useColorModeValue("white", "gray.700"),
112
+ shadow: "base",
113
+ onSubmit: handleSubmit,
114
+ children: /* @__PURE__ */ jsxRuntime.jsxs(react$1.VStack, { spacing: 4, children: [
115
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.FormControl, { isRequired: true, children: [
116
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.FormLabel, { children: t("field.name.label") }),
117
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.InputGroup, { children: [
118
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.InputLeftElement, { children: /* @__PURE__ */ jsxRuntime.jsx(
119
+ "svg",
120
+ {
121
+ xmlns: "http://www.w3.org/2000/svg",
122
+ width: "16",
123
+ height: "16",
124
+ fill: "currentColor",
125
+ className: "bi bi-person-fill",
126
+ viewBox: "0 0 16 16",
127
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 14s-1 0-1-1 1-4 6-4 6 3 6 4-1 1-1 1zm5-6a3 3 0 1 0 0-6 3 3 0 0 0 0 6" })
128
+ }
129
+ ) }),
130
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Input, { type: "text", name: "name", placeholder: t("field.name.placeholder") })
131
+ ] })
132
+ ] }),
133
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.FormControl, { isRequired: true, children: [
134
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.FormLabel, { children: t("field.email.label") }),
135
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.InputGroup, { children: [
136
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.InputLeftElement, { children: /* @__PURE__ */ jsxRuntime.jsx(icons.EmailIcon, {}) }),
137
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Input, { type: "email", name: "email", placeholder: t("field.email.placeholder") })
138
+ ] })
139
+ ] }),
140
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.FormControl, { isRequired: true, children: [
141
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.FormLabel, { children: t("field.message.label") }),
142
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Textarea, { name: "message", placeholder: t("field.message.placeholder"), rows: 6, resize: "none" })
143
+ ] }),
144
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Button, { type: "submit", colorScheme: "brand", width: "full", children: t("action.send") })
145
+ ] })
146
+ }
147
+ );
148
+ };
149
+ const ExpertTip = ({ tip, expert, ...boxProps }) => {
150
+ return /* @__PURE__ */ jsxRuntime.jsxs(
151
+ react$1.Card,
152
+ {
153
+ variant: "filled",
154
+ p: 4,
155
+ borderLeft: "4px solid gray",
156
+ gap: 4,
157
+ _before: {
158
+ content: '"❛❛"',
159
+ position: "absolute",
160
+ top: -8,
161
+ left: -2,
162
+ fontSize: "6rem",
163
+ fontStyle: "italic",
164
+ color: react$1.useColorModeValue("blackAlpha.300", "whiteAlpha.300")
165
+ },
166
+ ...boxProps,
167
+ children: [
168
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.CardBody, { as: "blockquote", p: 0, fontStyle: "italic", children: tip }),
169
+ !!expert && /* @__PURE__ */ jsxRuntime.jsx(react$1.CardFooter, { alignItems: "center", justify: "flex-end", p: 0, children: /* @__PURE__ */ jsxRuntime.jsx(Expert, { expert, variant: "short" }) })
170
+ ]
171
+ }
172
+ );
173
+ };
174
+ const Faq = ({ items, mb }) => {
175
+ const { bgColor, color } = index$1.usePrimaryColors();
176
+ return /* @__PURE__ */ jsxRuntime.jsx(react$1.Accordion, { allowToggle: true, mb, children: items.map(({ question, answer }) => {
177
+ return /* @__PURE__ */ jsxRuntime.jsxs(react$1.AccordionItem, { border: 0, children: [
178
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Box, { as: "h3", children: /* @__PURE__ */ jsxRuntime.jsxs(react$1.AccordionButton, { _hover: { color, bgColor }, children: [
179
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Box, { as: "span", flex: "1", textAlign: "left", fontWeight: "bold", children: question }),
180
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.AccordionIcon, {})
181
+ ] }) }),
182
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.AccordionPanel, { children: answer })
183
+ ] }, question);
184
+ }) });
185
+ };
186
+ const Features = ({ features, ...boxProps }) => {
187
+ return /* @__PURE__ */ jsxRuntime.jsx(react$1.SimpleGrid, { as: "ul", columns: { base: 1, md: 2, lg: 3 }, spacing: 10, p: 0, ...boxProps, children: features.map(({ title, description }) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Stack, { as: "li", children: /* @__PURE__ */ jsxRuntime.jsxs(react$1.Card, { as: "article", variant: "outline", textAlign: "center", h: "100%", children: [
188
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.CardHeader, { as: "header", display: "flex", alignItems: "center", justifyContent: "center", gap: 2, pb: 2, children: [
189
+ /* @__PURE__ */ jsxRuntime.jsx(icons.StarIcon, { w: 8, h: 8, color: "yellow.400" }),
190
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { fontWeight: 600, children: title }),
191
+ /* @__PURE__ */ jsxRuntime.jsx(icons.StarIcon, { w: 8, h: 8, color: "yellow.400" })
192
+ ] }),
193
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.CardBody, { as: "section", pt: 0, children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { color: "gray.600", children: description }) })
194
+ ] }) }, title)) });
195
+ };
196
+ const GameDemoContent = ({ src, isFullscreen, isLoaded, onLoad, onToggleFullscreen }) => {
197
+ const { t } = reactI18next.useTranslation("gameDemo");
198
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
199
+ /* @__PURE__ */ jsxRuntime.jsx(
200
+ react$1.Box,
201
+ {
202
+ as: "iframe",
203
+ src,
204
+ sandbox: "allow-scripts allow-same-origin",
205
+ loading: "lazy",
206
+ w: "100%",
207
+ h: "100%",
208
+ allowFullScreen: true,
209
+ onLoad,
210
+ children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: t("warning") })
211
+ }
212
+ ),
213
+ /* @__PURE__ */ jsxRuntime.jsx(
214
+ react$1.IconButton,
215
+ {
216
+ icon: isFullscreen ? /* @__PURE__ */ jsxRuntime.jsx(icons.CloseIcon, { w: 3, h: 3 }) : /* @__PURE__ */ jsxRuntime.jsx(icons.ExternalLinkIcon, { w: 4, h: 4 }),
217
+ size: "sm",
218
+ variant: "outline",
219
+ title: t(isFullscreen ? "action.deactivateFullscreen" : "action.activateFullscreen"),
220
+ "aria-label": "Fullscreen mode Toggle",
221
+ isRound: true,
222
+ disabled: !isLoaded,
223
+ position: "absolute",
224
+ top: 2,
225
+ left: 2,
226
+ border: "none",
227
+ color: "white",
228
+ _hover: { bgColor: "whiteAlpha.400" },
229
+ onClick: onToggleFullscreen
230
+ }
231
+ ),
232
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.AbsoluteCenter, { children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Spinner, { size: "xl", thickness: "0.6rem", display: isLoaded ? "none" : "block", color: "brand.100" }) })
233
+ ] });
234
+ };
235
+ const pulsing = "_pulsing_u8aju_1";
236
+ const styles = {
237
+ pulsing
238
+ };
239
+ const GameDemoPreview = ({ gameName, onPlay }) => {
240
+ const { gamePreviewImageData } = index.useSiteMetadataContext();
241
+ const { t } = reactI18next.useTranslation("gameDemo");
242
+ const image = gatsbyPluginImage.getImage(gamePreviewImageData);
243
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
244
+ !!image && /* @__PURE__ */ jsxRuntime.jsx(gatsbyPluginImage.GatsbyImage, { image, alt: `Play ${gameName} online`, objectFit: "contain" }),
245
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.AbsoluteCenter, { children: /* @__PURE__ */ jsxRuntime.jsx(
246
+ react$1.Button,
247
+ {
248
+ size: { base: "sm", md: "lg" },
249
+ color: "gray.200",
250
+ bgColor: "brand.500",
251
+ _hover: { bgColor: "brand.200", color: "gray.700" },
252
+ className: styles.pulsing,
253
+ onClick: onPlay,
254
+ children: t("action.playForFree")
255
+ }
256
+ ) })
257
+ ] });
258
+ };
259
+ const GameDemo = ({ name, src, previewImageFit, ...boxProps }) => {
260
+ const [isRunning, setIsRunning] = react.useState(false);
261
+ const [isLoaded, setIsLoaded] = react.useState(false);
262
+ const { isOpen: isFullscreen, onToggle } = react$1.useDisclosure({ defaultIsOpen: false });
263
+ function handlePlay() {
264
+ setIsRunning(true);
265
+ }
266
+ function onLoad() {
267
+ setIsLoaded(true);
268
+ }
269
+ function handleToggleFullscreen() {
270
+ document.body.style.overflowY = isFullscreen ? "auto" : "hidden";
271
+ onToggle();
272
+ }
273
+ return /* @__PURE__ */ jsxRuntime.jsx(
274
+ react$1.Box,
275
+ {
276
+ as: "article",
277
+ display: "grid",
278
+ w: "100%",
279
+ aspectRatio: "16/9 auto",
280
+ ...isFullscreen ? { zIndex: 100, inset: 0, position: "fixed", h: "100dvh" } : { position: "relative" },
281
+ ...boxProps,
282
+ children: isRunning ? /* @__PURE__ */ jsxRuntime.jsx(
283
+ GameDemoContent,
284
+ {
285
+ src,
286
+ isFullscreen,
287
+ isLoaded,
288
+ onLoad,
289
+ onToggleFullscreen: handleToggleFullscreen
290
+ }
291
+ ) : /* @__PURE__ */ jsxRuntime.jsx(GameDemoPreview, { gameName: name, previewImageFit, onPlay: handlePlay })
292
+ }
293
+ );
294
+ };
295
+ const GameInfoItem = ({ title, value }) => {
296
+ return /* @__PURE__ */ jsxRuntime.jsxs(react$1.Flex, { gap: 2, children: [
297
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.Text, { w: "50%", color: "gray.500", textTransform: "capitalize", children: [
298
+ title,
299
+ ":"
300
+ ] }),
301
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { w: "50%", textTransform: "capitalize", children: value })
302
+ ] });
303
+ };
304
+ const VISIBLE_LANGUAGE_NUMBER = 5;
305
+ function stringifyHasFeature(value) {
306
+ return i18n$1.t(`gameInfo:value.boolean.${value}`);
307
+ }
308
+ function stringifyVolatility(value) {
309
+ return i18n$1.t(`gameInfo:value.volatility.${value}`);
310
+ }
311
+ function stringifyArray(array) {
312
+ return array.join(", ");
313
+ }
314
+ function stringifyLanguageArray(languages) {
315
+ return languages.length > VISIBLE_LANGUAGE_NUMBER ? `${stringifyArray(languages.slice(0, VISIBLE_LANGUAGE_NUMBER))}, +${languages.length - VISIBLE_LANGUAGE_NUMBER}` : stringifyArray(languages);
316
+ }
317
+ function getGameInfoItemValue(key, value, currency) {
318
+ let formattedValue = "";
319
+ if (key === i18n.GameCharacteristic.Rtp) {
320
+ formattedValue = index$2.formatNumber(value, { percent: "real", precision: 3 });
321
+ }
322
+ if (key === i18n.GameCharacteristic.MinBet || key === i18n.GameCharacteristic.MaxBet || key === i18n.GameCharacteristic.MaxWin && typeof value === "number") {
323
+ formattedValue = index$2.formatNumber(value, { currency });
324
+ }
325
+ if (key === i18n.GameCharacteristic.Compatibility || key === i18n.GameCharacteristic.BonusFeatures && typeof value !== "string") {
326
+ formattedValue = stringifyArray(value);
327
+ }
328
+ if (key === i18n.GameCharacteristic.Languages) {
329
+ formattedValue = stringifyLanguageArray(value);
330
+ }
331
+ if (key === i18n.GameCharacteristic.ReleaseDate) {
332
+ formattedValue = index$2.formatDate({ value, options: { year: "numeric", month: "long" } });
333
+ }
334
+ if (key === i18n.GameCharacteristic.Volatility) {
335
+ formattedValue = stringifyVolatility(value);
336
+ }
337
+ if (typeof value === "boolean") {
338
+ formattedValue = stringifyHasFeature(value);
339
+ }
340
+ if (!formattedValue) {
341
+ formattedValue = value.toLocaleString();
342
+ }
343
+ return formattedValue;
344
+ }
345
+ const GameInfo = ({ info }) => {
346
+ const { siteMetadata } = index.useSiteMetadataContext();
347
+ const { currency } = siteMetadata;
348
+ const { t } = reactI18next.useTranslation("gameInfo");
349
+ return /* @__PURE__ */ jsxRuntime.jsx(
350
+ react$1.Box,
351
+ {
352
+ as: "aside",
353
+ float: { base: "none", lg: "right" },
354
+ w: { base: "100%", lg: "xs" },
355
+ ml: { base: 0, lg: 4 },
356
+ mb: { base: 0, lg: 4 },
357
+ children: /* @__PURE__ */ jsxRuntime.jsxs(react$1.Card, { as: "article", variant: "outline", h: "100%", p: 2, children: [
358
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.CardHeader, { as: "header", p: 0, children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Heading, { as: "h2", fontSize: "xl", children: t("title") }) }),
359
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.CardBody, { as: "section", p: 0, children: Object.entries(info).map(([group, items]) => /* @__PURE__ */ jsxRuntime.jsxs(react.Fragment, { children: [
360
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Divider, { my: 2 }),
361
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { fontWeight: "semibold", mb: 2, children: t(`group.${group}`) }),
362
+ Object.entries(items).map(([itemKey, itemValue]) => {
363
+ const feature = itemKey;
364
+ const value = getGameInfoItemValue(feature, itemValue, currency);
365
+ return /* @__PURE__ */ jsxRuntime.jsx(GameInfoItem, { title: t(`feature.${feature}`), value }, itemKey);
366
+ })
367
+ ] }, group)) })
368
+ ] })
369
+ }
370
+ );
371
+ };
372
+ const HowTo = ({ steps, ...boxProps }) => {
373
+ const { color, bgColor } = index$1.usePrimaryColors();
374
+ return /* @__PURE__ */ jsxRuntime.jsx(react$1.SimpleGrid, { as: "ol", columns: { base: 1, md: 2, lg: 3 }, gap: 4, p: 0, ...boxProps, children: steps.map(({ title, description }, index2) => /* @__PURE__ */ jsxRuntime.jsxs(react$1.Flex, { as: "li", alignItems: "flex-start", gap: 4, children: [
375
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Circle, { size: 12, bgColor, color, fontSize: "lg", fontWeight: "bold", children: String(index2 + 1) }),
376
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.Stack, { flex: 1, children: [
377
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { fontSize: "lg", fontWeight: "bold", children: title }),
378
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { children: description })
379
+ ] })
380
+ ] }, index2)) });
381
+ };
382
+ const Content = ({ children }) => {
383
+ return /* @__PURE__ */ jsxRuntime.jsx(react$1.Container, { as: "section", maxW: "container.xl", children });
384
+ };
385
+ const Logo = () => {
386
+ const { logoImageData } = index.useSiteMetadataContext();
387
+ const image = gatsbyPluginImage.getImage(logoImageData);
388
+ if (!image) {
389
+ return null;
390
+ }
391
+ return /* @__PURE__ */ jsxRuntime.jsx(gatsbyPluginImage.GatsbyImage, { image, objectFit: "contain", alt: "Logo" });
392
+ };
393
+ const Brand$1 = ({ brand }) => {
394
+ return /* @__PURE__ */ jsxRuntime.jsxs(react$1.Box, { position: "relative", my: 2, py: 8, children: [
395
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Divider, {}),
396
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.AbsoluteCenter, { display: "flex", bgColor: react$1.useColorModeValue("gray.50", "gray.900"), children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Box, { as: gatsby.Link, to: "/", children: brand }) })
397
+ ] });
398
+ };
399
+ const Copyright = () => {
400
+ const { siteMetadata } = index.useSiteMetadataContext();
401
+ const { siteUrl } = siteMetadata;
402
+ const { t } = reactI18next.useTranslation("footer");
403
+ return /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { as: "small", colorScheme: "gray", display: "flex", align: "center", justifyContent: "center", children: t("copyright", { year: index$2.getCurrentYear(), domain: index$2.getDomain(siteUrl) }) });
404
+ };
405
+ const Disclaimer = () => {
406
+ const { siteMetadata } = index.useSiteMetadataContext();
407
+ const { siteUrl } = siteMetadata;
408
+ const { t } = reactI18next.useTranslation("footer");
409
+ return /* @__PURE__ */ jsxRuntime.jsxs(react$1.Text, { as: "small", colorScheme: "gray", fontSize: "sm", children: [
410
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { as: "span", fontWeight: "bold", color: "red.600", children: t("disclaimer.title") }),
411
+ t("disclaimer.description", { domain: index$2.getDomain(siteUrl) })
412
+ ] });
413
+ };
414
+ const Navigation$1 = () => {
415
+ const { siteMetadata } = index.useSiteMetadataContext();
416
+ const { footerMenuLinks } = siteMetadata;
417
+ return /* @__PURE__ */ jsxRuntime.jsx(
418
+ react$1.SimpleGrid,
419
+ {
420
+ columns: { base: 1, sm: 2, md: 4 },
421
+ pt: 4,
422
+ pb: 6,
423
+ spacing: 4,
424
+ justifyItems: { base: "flex-start", md: "center" },
425
+ justifyContent: "space-between",
426
+ children: footerMenuLinks.map(({ url, title }) => /* @__PURE__ */ jsxRuntime.jsx(
427
+ react$1.Text,
428
+ {
429
+ as: gatsby.Link,
430
+ to: url,
431
+ fontSize: "md",
432
+ fontWeight: "semibold",
433
+ colorScheme: "gray",
434
+ _hover: { textDecoration: "none", color: "brand.400" },
435
+ children: title
436
+ },
437
+ url
438
+ ))
439
+ }
440
+ );
441
+ };
442
+ const Footer = () => {
443
+ return /* @__PURE__ */ jsxRuntime.jsx(
444
+ react$1.Box,
445
+ {
446
+ as: "footer",
447
+ bg: react$1.useColorModeValue("gray.50", "gray.900"),
448
+ color: react$1.useColorModeValue("gray.700", "gray.200"),
449
+ py: 4,
450
+ children: /* @__PURE__ */ jsxRuntime.jsxs(Content, { children: [
451
+ /* @__PURE__ */ jsxRuntime.jsx(Navigation$1, {}),
452
+ /* @__PURE__ */ jsxRuntime.jsx(Disclaimer, {}),
453
+ /* @__PURE__ */ jsxRuntime.jsx(Brand$1, { brand: /* @__PURE__ */ jsxRuntime.jsx(Logo, {}) }),
454
+ /* @__PURE__ */ jsxRuntime.jsx(Copyright, {})
455
+ ] })
456
+ }
457
+ );
458
+ };
459
+ const Brand = ({ brand }) => {
460
+ return /* @__PURE__ */ jsxRuntime.jsx(
461
+ react$1.Box,
462
+ {
463
+ as: gatsby.Link,
464
+ to: "/",
465
+ display: "flex",
466
+ h: { base: "40px", md: "60px" },
467
+ fontFamily: "heading",
468
+ color: react$1.useColorModeValue("gray.800", "white"),
469
+ children: brand
470
+ }
471
+ );
472
+ };
473
+ const DesktopNavItem = ({ title, url, children }) => {
474
+ const background = react$1.useColorModeValue("white", "gray.800");
475
+ const backgroundHover = react$1.useColorModeValue("brand.50", "gray.900");
476
+ return /* @__PURE__ */ jsxRuntime.jsxs(react$1.Popover, { trigger: "hover", placement: "bottom-start", children: [
477
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.PopoverTrigger, { children: /* @__PURE__ */ jsxRuntime.jsx(
478
+ react$1.Text,
479
+ {
480
+ as: gatsby.Link,
481
+ to: url,
482
+ p: 2,
483
+ fontSize: "sm",
484
+ fontWeight: 500,
485
+ _hover: { textDecoration: "none", color: "brand.400" },
486
+ children: title
487
+ }
488
+ ) }),
489
+ !!children && /* @__PURE__ */ jsxRuntime.jsx(react$1.PopoverContent, { p: 4, border: 0, minW: "sm", rounded: "xl", boxShadow: "xl", bg: background, children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Stack, { as: "ul", children: children.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
490
+ react$1.Box,
491
+ {
492
+ as: "li",
493
+ role: "group",
494
+ display: "block",
495
+ p: 2,
496
+ cursor: "pointer",
497
+ rounded: "md",
498
+ _hover: { bg: backgroundHover },
499
+ children: /* @__PURE__ */ jsxRuntime.jsxs(react$1.Stack, { direction: "row", children: [
500
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.Box, { children: [
501
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { fontWeight: 500, transition: "all .3s ease", _groupHover: { color: "brand.400" }, children: child.title }),
502
+ !!child.subtitle && /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { fontSize: "sm", children: child.subtitle })
503
+ ] }),
504
+ /* @__PURE__ */ jsxRuntime.jsx(
505
+ react$1.Flex,
506
+ {
507
+ flex: 1,
508
+ justify: "flex-end",
509
+ align: "center",
510
+ opacity: 0,
511
+ transition: "all .3s ease",
512
+ transform: "translateX(-10px)",
513
+ _groupHover: { opacity: 1, transform: "translateX(0)" },
514
+ children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Icon, { as: icons.ChevronRightIcon, color: "brand.400", w: 5, h: 5 })
515
+ }
516
+ )
517
+ ] })
518
+ },
519
+ child.url
520
+ )) }) })
521
+ ] });
522
+ };
523
+ const DesktopNavigation = ({ menu }) => {
524
+ return /* @__PURE__ */ jsxRuntime.jsx(react$1.Stack, { as: "ul", direction: "row", spacing: 4, children: menu.map((item) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Flex, { as: "li", children: /* @__PURE__ */ jsxRuntime.jsx(DesktopNavItem, { ...item }) }, item.url)) });
525
+ };
526
+ const MobileNavItem = ({ title, children, url }) => {
527
+ const { isOpen, onToggle } = react$1.useDisclosure();
528
+ return /* @__PURE__ */ jsxRuntime.jsxs(react$1.Stack, { w: "100%", p: 2, children: [
529
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.Flex, { align: "center", gap: 2, justify: "space-between", children: [
530
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { as: gatsby.Link, to: url, isTruncated: true, fontWeight: 600, children: title }),
531
+ !!children && /* @__PURE__ */ jsxRuntime.jsx(react$1.Flex, { as: "button", onClick: onToggle, children: /* @__PURE__ */ jsxRuntime.jsx(
532
+ react$1.Icon,
533
+ {
534
+ as: icons.ChevronDownIcon,
535
+ w: 6,
536
+ h: 6,
537
+ transform: isOpen ? "rotate(180deg)" : "",
538
+ transition: "all .25s ease-in-out"
539
+ }
540
+ ) })
541
+ ] }),
542
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Collapse, { in: isOpen, animateOpacity: true, children: /* @__PURE__ */ jsxRuntime.jsx(
543
+ react$1.Stack,
544
+ {
545
+ as: "ul",
546
+ pl: 2,
547
+ borderLeft: 1,
548
+ borderStyle: "solid",
549
+ borderColor: react$1.useColorModeValue("gray.200", "gray.700"),
550
+ children: !!children && children.map((child) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Flex, { as: "li", children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Text, { as: gatsby.Link, to: `${url}${child.url}`, py: 2, children: child.title }) }, child.url))
551
+ }
552
+ ) })
553
+ ] });
554
+ };
555
+ const MobileNavigation = ({ menu }) => {
556
+ const { isOpen, onToggle } = react$1.useDisclosure();
557
+ const background = react$1.useColorModeValue("white", "gray.800");
558
+ return menu.length ? /* @__PURE__ */ jsxRuntime.jsxs(react$1.Box, { children: [
559
+ /* @__PURE__ */ jsxRuntime.jsx(
560
+ react$1.IconButton,
561
+ {
562
+ icon: isOpen ? /* @__PURE__ */ jsxRuntime.jsx(icons.CloseIcon, { w: 3, h: 3 }) : /* @__PURE__ */ jsxRuntime.jsx(icons.HamburgerIcon, {}),
563
+ size: "md",
564
+ variant: "ghost",
565
+ "aria-label": "Toggle Navigation",
566
+ onClick: onToggle
567
+ }
568
+ ),
569
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Collapse, { in: isOpen, animateOpacity: true, children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Box, { position: "absolute", top: 14, right: 0, w: "100vw", px: 2, children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Stack, { as: "ul", spacing: 2, p: 2, w: "100%", borderRadius: "md", boxShadow: "md", bg: background, children: menu.map((item) => /* @__PURE__ */ jsxRuntime.jsx(react$1.Flex, { as: "li", children: /* @__PURE__ */ jsxRuntime.jsx(MobileNavItem, { ...item }) }, item.url)) }) }) })
570
+ ] }) : null;
571
+ };
572
+ const Navigation = ({ menu }) => {
573
+ const isDesktop = react$1.useBreakpointValue({ base: false, md: true });
574
+ return isDesktop ? /* @__PURE__ */ jsxRuntime.jsx(DesktopNavigation, { menu }) : /* @__PURE__ */ jsxRuntime.jsx(MobileNavigation, { menu });
575
+ };
576
+ const Navbar = ({ brand }) => {
577
+ const menu = [];
578
+ return /* @__PURE__ */ jsxRuntime.jsxs(react$1.Flex, { as: "nav", gap: 2, py: 1, children: [
579
+ /* @__PURE__ */ jsxRuntime.jsx(Brand, { brand }),
580
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.Flex, { as: "section", flex: 1, align: "center", justifyContent: "flex-end", gap: 2, children: /* @__PURE__ */ jsxRuntime.jsx(Navigation, { menu }) })
581
+ ] });
582
+ };
583
+ const Header = () => {
584
+ return /* @__PURE__ */ jsxRuntime.jsx(
585
+ react$1.Box,
586
+ {
587
+ as: "header",
588
+ position: "sticky",
589
+ top: 0,
590
+ bg: react$1.useColorModeValue("white", "gray.900"),
591
+ color: react$1.useColorModeValue("gray.700", "gray.200"),
592
+ boxShadow: "sm",
593
+ zIndex: 100,
594
+ children: /* @__PURE__ */ jsxRuntime.jsx(Content, { children: /* @__PURE__ */ jsxRuntime.jsx(Navbar, { brand: /* @__PURE__ */ jsxRuntime.jsx(Logo, {}) }) })
595
+ }
596
+ );
597
+ };
598
+ const Hero = () => {
599
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { children: /* @__PURE__ */ jsxRuntime.jsx(Content, {}) });
600
+ };
601
+ const Main = ({ children }) => {
602
+ return /* @__PURE__ */ jsxRuntime.jsx(
603
+ react$1.Flex,
604
+ {
605
+ as: "main",
606
+ direction: "column",
607
+ flexGrow: 1,
608
+ py: 4,
609
+ bg: react$1.useColorModeValue("white", "gray.800"),
610
+ color: react$1.useColorModeValue("gray.700", "gray.200"),
611
+ children
612
+ }
613
+ );
614
+ };
615
+ const ScrollToTop = () => {
616
+ const [isVisible, setIsVisible] = react.useState(false);
617
+ react.useEffect(() => {
618
+ const toggleVisibility = () => {
619
+ setIsVisible(window.scrollY > 300);
620
+ };
621
+ window.addEventListener("scroll", toggleVisibility);
622
+ return () => {
623
+ window.removeEventListener("scroll", toggleVisibility);
624
+ };
625
+ }, []);
626
+ function handleClick() {
627
+ window.scrollTo({
628
+ top: 0,
629
+ behavior: "smooth"
630
+ });
631
+ }
632
+ return /* @__PURE__ */ jsxRuntime.jsx(
633
+ react$1.Box,
634
+ {
635
+ position: "fixed",
636
+ bottom: { base: 4, md: 8, lg: 16 },
637
+ right: { base: 4, md: 8, lg: 16 },
638
+ zIndex: "1000",
639
+ opacity: isVisible ? 1 : 0,
640
+ transform: isVisible ? "translateY(0)" : "translateY(0.5rem)",
641
+ transition: "opacity 0.4s ease, transform 0.4s ease",
642
+ pointerEvents: isVisible ? "auto" : "none",
643
+ children: /* @__PURE__ */ jsxRuntime.jsx(
644
+ react$1.IconButton,
645
+ {
646
+ "aria-label": "Scroll to top",
647
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.ChevronUpIcon, { w: 6, h: 6 }),
648
+ size: "lg",
649
+ shadow: "lg",
650
+ colorScheme: "brand",
651
+ isRound: true,
652
+ onClick: handleClick
653
+ }
654
+ )
655
+ }
656
+ );
657
+ };
658
+ const Layout = ({ children }) => {
659
+ const content = typeof children === "function" ? children({ Hero, Content }) : /* @__PURE__ */ jsxRuntime.jsx(Content, { children });
660
+ return /* @__PURE__ */ jsxRuntime.jsxs(react$1.Stack, { spacing: 0, position: "relative", w: "100%", minH: "100dvh", children: [
661
+ /* @__PURE__ */ jsxRuntime.jsx(Header, {}),
662
+ /* @__PURE__ */ jsxRuntime.jsx(Main, { children: content }),
663
+ /* @__PURE__ */ jsxRuntime.jsx(Footer, {}),
664
+ /* @__PURE__ */ jsxRuntime.jsx(ScrollToTop, {})
665
+ ] });
666
+ };
667
+ const TitleMap = {
668
+ pros: "advantages",
669
+ cons: "disadvantages"
670
+ };
671
+ const IconMap = {
672
+ pros: icons.CheckCircleIcon,
673
+ cons: icons.WarningIcon
674
+ };
675
+ const IconColorMap = {
676
+ pros: "green.500",
677
+ cons: "red.500"
678
+ };
679
+ const BgColorMap = {
680
+ pros: "green",
681
+ cons: "red"
682
+ };
683
+ const ProsConsCard = ({ itemType, items }) => {
684
+ const { t } = reactI18next.useTranslation("prosCons");
685
+ return /* @__PURE__ */ jsxRuntime.jsxs(
686
+ react$1.Card,
687
+ {
688
+ as: "article",
689
+ flex: 1,
690
+ p: 2,
691
+ bgColor: react$1.useColorModeValue(`${BgColorMap[itemType]}.100`, `${BgColorMap[itemType]}.800`),
692
+ children: [
693
+ /* @__PURE__ */ jsxRuntime.jsx(
694
+ react$1.CardHeader,
695
+ {
696
+ as: "header",
697
+ p: 2,
698
+ borderTopRadius: "md",
699
+ bgColor: react$1.useColorModeValue("whiteAlpha.800", "blackAlpha.800"),
700
+ children: /* @__PURE__ */ jsxRuntime.jsx(react$1.Heading, { as: "h3", textTransform: "uppercase", fontSize: "xl", children: t(TitleMap[itemType]) })
701
+ }
702
+ ),
703
+ /* @__PURE__ */ jsxRuntime.jsx(
704
+ react$1.CardBody,
705
+ {
706
+ as: "section",
707
+ p: 2,
708
+ borderBottomRadius: "md",
709
+ bgColor: react$1.useColorModeValue("whiteAlpha.800", "blackAlpha.800"),
710
+ children: /* @__PURE__ */ jsxRuntime.jsx(react$1.List, { spacing: 4, p: 0, children: items.map(({ title, description }) => /* @__PURE__ */ jsxRuntime.jsxs(react$1.ListItem, { display: "flex", children: [
711
+ /* @__PURE__ */ jsxRuntime.jsx(react$1.ListIcon, { as: IconMap[itemType], w: 6, h: 6, color: IconColorMap[itemType] }),
712
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.Text, { fontWeight: "semibold", fontSize: "md", children: [
713
+ title,
714
+ !!description && /* @__PURE__ */ jsxRuntime.jsxs(react$1.Text, { as: "span", fontWeight: "normal", children: [
715
+ ": ",
716
+ description
717
+ ] })
718
+ ] })
719
+ ] }, title)) })
720
+ }
721
+ )
722
+ ]
723
+ }
724
+ );
725
+ };
726
+ const ProsCons = ({ items, ...boxProps }) => {
727
+ const { pros, cons } = items;
728
+ return /* @__PURE__ */ jsxRuntime.jsxs(react$1.Flex, { as: "section", direction: { base: "column", md: "row" }, gap: 4, ...boxProps, children: [
729
+ /* @__PURE__ */ jsxRuntime.jsx(ProsConsCard, { itemType: "pros", items: pros }),
730
+ /* @__PURE__ */ jsxRuntime.jsx(ProsConsCard, { itemType: "cons", items: cons })
731
+ ] });
732
+ };
733
+ const Seo = ({ children, siteMetadata, title, description, lang }) => {
734
+ const { title: defaultTitle, description: defaultDescription, lang: defaultLang, siteUrl } = siteMetadata;
735
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
736
+ /* @__PURE__ */ jsxRuntime.jsx("html", { lang: lang ?? defaultLang }),
737
+ /* @__PURE__ */ jsxRuntime.jsx("title", { children: title ? typeof title === "string" ? title : title({
738
+ domain: index$2.getDomain(siteUrl),
739
+ currentYear: index$2.getCurrentYear(),
740
+ currentMonth: index$2.getCurrentMonth()
741
+ }) : defaultTitle }),
742
+ /* @__PURE__ */ jsxRuntime.jsx(
743
+ "meta",
744
+ {
745
+ name: "description",
746
+ content: description ? typeof description === "string" ? description : description({
747
+ domain: index$2.getDomain(siteUrl),
748
+ currentYear: index$2.getCurrentYear(),
749
+ currentMonth: index$2.getCurrentMonth()
750
+ }) : defaultDescription
751
+ }
752
+ ),
753
+ children
754
+ ] });
755
+ };
756
+ exports.Author = Author;
757
+ exports.ContactForm = ContactForm;
758
+ exports.ExpertTip = ExpertTip;
759
+ exports.Faq = Faq;
760
+ exports.Features = Features;
761
+ exports.GameDemo = GameDemo;
762
+ exports.GameInfo = GameInfo;
763
+ exports.HowTo = HowTo;
764
+ exports.Layout = Layout;
765
+ exports.ProsCons = ProsCons;
766
+ exports.Seo = Seo;