@inzumer/ui-library 1.5.0 → 2.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 (77) hide show
  1. package/dist/{chunk-BKPP4D3Q.js → chunk-27HTTVFO.js} +2 -2
  2. package/dist/{chunk-BKPP4D3Q.js.map → chunk-27HTTVFO.js.map} +1 -1
  3. package/dist/chunk-4TPQTZSR.js +76 -0
  4. package/dist/chunk-4TPQTZSR.js.map +1 -0
  5. package/dist/{chunk-D4I5OF3C.js → chunk-5LKLTY55.js} +2 -2
  6. package/dist/{chunk-D4I5OF3C.js.map → chunk-5LKLTY55.js.map} +1 -1
  7. package/dist/{chunk-YYNW2PXL.js → chunk-DIA7L6IA.js} +3 -3
  8. package/dist/{chunk-YYNW2PXL.js.map → chunk-DIA7L6IA.js.map} +1 -1
  9. package/dist/{chunk-DP274HDM.js → chunk-IY452YEX.js} +14 -4
  10. package/dist/chunk-IY452YEX.js.map +1 -0
  11. package/dist/{chunk-4CY55XM3.js → chunk-J7X6NLSR.js} +29 -11
  12. package/dist/chunk-J7X6NLSR.js.map +1 -0
  13. package/dist/{chunk-5IHM2545.js → chunk-KAU7S3D4.js} +2 -2
  14. package/dist/{chunk-5IHM2545.js.map → chunk-KAU7S3D4.js.map} +1 -1
  15. package/dist/{chunk-ZABQF65Z.js → chunk-KSNAVEJP.js} +3 -3
  16. package/dist/{chunk-ZABQF65Z.js.map → chunk-KSNAVEJP.js.map} +1 -1
  17. package/dist/chunk-LLJXVAR6.js +184 -0
  18. package/dist/chunk-LLJXVAR6.js.map +1 -0
  19. package/dist/{chunk-7HQFLM4A.js → chunk-NA7YKEO4.js} +2 -2
  20. package/dist/{chunk-7HQFLM4A.js.map → chunk-NA7YKEO4.js.map} +1 -1
  21. package/dist/{chunk-L4BPQAXU.js → chunk-NTXFFBL6.js} +3 -3
  22. package/dist/{chunk-L4BPQAXU.js.map → chunk-NTXFFBL6.js.map} +1 -1
  23. package/dist/{chunk-P4CV2EPR.js → chunk-SPDOYFCU.js} +2 -2
  24. package/dist/{chunk-P4CV2EPR.js.map → chunk-SPDOYFCU.js.map} +1 -1
  25. package/dist/{chunk-42G4RRCZ.js → chunk-TO3FF6FR.js} +3 -3
  26. package/dist/{chunk-42G4RRCZ.js.map → chunk-TO3FF6FR.js.map} +1 -1
  27. package/dist/{chunk-UL33H4AD.js → chunk-TRLFK626.js} +24 -4
  28. package/dist/chunk-TRLFK626.js.map +1 -0
  29. package/dist/{chunk-3YRDRHO3.js → chunk-UUW7L2AV.js} +3 -3
  30. package/dist/{chunk-3YRDRHO3.js.map → chunk-UUW7L2AV.js.map} +1 -1
  31. package/dist/{chunk-PE6XEC7Y.js → chunk-VCJN4FS2.js} +4 -4
  32. package/dist/{chunk-PE6XEC7Y.js.map → chunk-VCJN4FS2.js.map} +1 -1
  33. package/dist/chunk-VK24YOIC.js +184 -0
  34. package/dist/chunk-VK24YOIC.js.map +1 -0
  35. package/dist/{chunk-BGUNAALU.js → chunk-XUGSIK2P.js} +3 -3
  36. package/dist/{chunk-BGUNAALU.js.map → chunk-XUGSIK2P.js.map} +1 -1
  37. package/dist/{chunk-N5CLCKR3.js → chunk-ZH2EDGW6.js} +3 -3
  38. package/dist/{chunk-N5CLCKR3.js.map → chunk-ZH2EDGW6.js.map} +1 -1
  39. package/dist/components/atoms/Icon/index.js +1 -1
  40. package/dist/components/atoms/Image/index.js +1 -1
  41. package/dist/components/atoms/Input/index.js +2 -2
  42. package/dist/components/atoms/Link/index.js +1 -1
  43. package/dist/components/atoms/RichText/index.js +1 -1
  44. package/dist/components/atoms/Select/index.js +2 -2
  45. package/dist/components/atoms/Switch/index.js +2 -2
  46. package/dist/components/atoms/Textarea/index.js +2 -2
  47. package/dist/components/molecules/BottomSheet/index.js +2 -2
  48. package/dist/components/molecules/Breadcrumbs/index.js +3 -3
  49. package/dist/components/molecules/Card/index.js +2 -2
  50. package/dist/components/molecules/Carousel/index.d.ts +61 -0
  51. package/dist/components/molecules/{CookieBanner → Carousel}/index.js +2 -2
  52. package/dist/components/molecules/Drawer/index.js +2 -2
  53. package/dist/components/molecules/Dropdown/index.js +2 -2
  54. package/dist/components/molecules/MediaCard/index.d.ts +56 -0
  55. package/dist/components/molecules/MediaCard/index.js +6 -0
  56. package/dist/components/molecules/Modal/index.d.ts +4 -0
  57. package/dist/components/molecules/Modal/index.js +2 -2
  58. package/dist/components/molecules/Snackbar/index.js +1 -1
  59. package/dist/components/molecules/Timeline/index.d.ts +7 -0
  60. package/dist/components/molecules/Timeline/index.js +3 -2
  61. package/dist/components/organisms/CookieConsent/index.d.ts +59 -0
  62. package/dist/components/{molecules/CookiePreferences → organisms/CookieConsent}/index.js +4 -4
  63. package/dist/components/organisms/CookieConsent/index.js.map +1 -0
  64. package/dist/index.d.ts +3 -2
  65. package/dist/index.js +20 -19
  66. package/package.json +13 -9
  67. package/dist/chunk-4CY55XM3.js.map +0 -1
  68. package/dist/chunk-DP274HDM.js.map +0 -1
  69. package/dist/chunk-LSWJBAM6.js +0 -79
  70. package/dist/chunk-LSWJBAM6.js.map +0 -1
  71. package/dist/chunk-TR7XKJCO.js +0 -85
  72. package/dist/chunk-TR7XKJCO.js.map +0 -1
  73. package/dist/chunk-UL33H4AD.js.map +0 -1
  74. package/dist/components/molecules/CookieBanner/index.d.ts +0 -46
  75. package/dist/components/molecules/CookiePreferences/index.d.ts +0 -34
  76. /package/dist/components/molecules/{CookieBanner → Carousel}/index.js.map +0 -0
  77. /package/dist/components/molecules/{CookiePreferences → MediaCard}/index.js.map +0 -0
@@ -58,5 +58,5 @@ var Snackbar = forwardRef(
58
58
  Snackbar.displayName = "Snackbar";
59
59
 
60
60
  export { Snackbar };
61
- //# sourceMappingURL=chunk-BKPP4D3Q.js.map
62
- //# sourceMappingURL=chunk-BKPP4D3Q.js.map
61
+ //# sourceMappingURL=chunk-27HTTVFO.js.map
62
+ //# sourceMappingURL=chunk-27HTTVFO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/molecules/Snackbar/Snackbar.styles.ts","../src/components/molecules/Snackbar/Snackbar.tsx"],"names":[],"mappings":";;;;;;AAEO,IAAM,qBAAA,GACX,4EAAA;AAEK,IAAM,cAAA,GAAiB,GAAA;AAAA,EAC5B;AAAA,IACE,mEAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,2EAAA;AAAA,QACN,OAAA,EAAS,kEAAA;AAAA,QACT,KAAA,EAAO,iEAAA;AAAA,QACP,OAAA,EACE;AAAA,OACJ;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,2BAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX;AAEJ,CAAA;ACvBA,IAAM,gBAAA,GAAmB,GAAA;AAUlB,IAAM,QAAA,GAAW,UAAA;AAAA,EACtB,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,QAAA,GAAW,GAAA,EAAM,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACjF,IAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,iBAAA,CAAkB,MAAM,gBAAgB,CAAA;AAErE,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,QAAA,EAAU;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,OAAA,EAAS,QAAQ,CAAA;AAC9C,MAAA,OAAO,MAAM,aAAa,SAAS,CAAA;AAAA,IACrC,CAAA,EAAG,CAAC,IAAA,EAAM,QAAA,EAAU,OAAO,CAAC,CAAA;AAE5B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,qBAAA,EACd,QAAA,kBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAM,MAAA,KAAW,OAAA,GAAU,OAAA,GAAU,QAAA;AAAA,QACrC,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,QAAQ,OAAA,EAAS,GAAG,SAAS,CAAA;AAAA,QAC3D,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA;AAAA,KACH,EACF,CAAA;AAAA,EAEJ;AACF;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-BKPP4D3Q.js","sourcesContent":["import { cva } from 'class-variance-authority';\n\nexport const snackbarWrapperStyles =\n 'pointer-events-none fixed inset-x-0 bottom-4 z-50 flex justify-center px-4';\n\nexport const snackbarStyles = cva(\n [\n 'pointer-events-auto rounded-md border px-4 py-3 text-sm shadow-lg',\n 'transition-all duration-200 ease-out',\n ],\n {\n variants: {\n status: {\n info: 'border-transparent bg-[var(--surface-inverse)] text-[var(--text-inverse)]',\n success: 'border-transparent bg-[rgb(var(--color-success-600))] text-white',\n error: 'border-transparent bg-[rgb(var(--color-danger-600))] text-white',\n warning:\n 'border-transparent bg-[rgb(var(--color-warning-500))] text-[rgb(var(--color-neutral-900))]',\n },\n visible: {\n true: 'translate-y-0 opacity-100',\n false: 'translate-y-2 opacity-0',\n },\n },\n defaultVariants: {\n status: 'info',\n visible: false,\n },\n },\n);\n","import type { VariantProps } from 'class-variance-authority';\nimport { forwardRef, useEffect, type HTMLAttributes, type ReactNode } from 'react';\nimport { useDelayedUnmount } from '@hooks';\nimport { cn } from '@utils';\nimport { snackbarStyles, snackbarWrapperStyles } from './Snackbar.styles';\n\nconst EXIT_DURATION_MS = 200;\n\nexport type SnackbarProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> &\n Omit<VariantProps<typeof snackbarStyles>, 'visible'> & {\n open: boolean;\n onClose: () => void;\n message: ReactNode;\n duration?: number;\n };\n\nexport const Snackbar = forwardRef<HTMLDivElement, SnackbarProps>(\n ({ open, onClose, message, status, duration = 4000, className, ...props }, ref) => {\n const { mounted, visible } = useDelayedUnmount(open, EXIT_DURATION_MS);\n\n useEffect(() => {\n if (!open || !duration) {\n return;\n }\n\n const timeoutId = setTimeout(onClose, duration);\n return () => clearTimeout(timeoutId);\n }, [open, duration, onClose]);\n\n if (!mounted) {\n return null;\n }\n\n return (\n <div className={snackbarWrapperStyles}>\n <div\n ref={ref}\n role={status === 'error' ? 'alert' : 'status'}\n className={cn(snackbarStyles({ status, visible }), className)}\n {...props}\n >\n {message}\n </div>\n </div>\n );\n },\n);\n\nSnackbar.displayName = 'Snackbar';\n"]}
1
+ {"version":3,"sources":["../src/components/molecules/Snackbar/Snackbar.styles.ts","../src/components/molecules/Snackbar/Snackbar.tsx"],"names":[],"mappings":";;;;;;AAEO,IAAM,qBAAA,GACX,4EAAA;AAEK,IAAM,cAAA,GAAiB,GAAA;AAAA,EAC5B;AAAA,IACE,mEAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,2EAAA;AAAA,QACN,OAAA,EAAS,kEAAA;AAAA,QACT,KAAA,EAAO,iEAAA;AAAA,QACP,OAAA,EACE;AAAA,OACJ;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,2BAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX;AAEJ,CAAA;ACvBA,IAAM,gBAAA,GAAmB,GAAA;AAUlB,IAAM,QAAA,GAAW,UAAA;AAAA,EACtB,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,QAAA,GAAW,GAAA,EAAM,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACjF,IAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,iBAAA,CAAkB,MAAM,gBAAgB,CAAA;AAErE,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,QAAA,EAAU;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,OAAA,EAAS,QAAQ,CAAA;AAC9C,MAAA,OAAO,MAAM,aAAa,SAAS,CAAA;AAAA,IACrC,CAAA,EAAG,CAAC,IAAA,EAAM,QAAA,EAAU,OAAO,CAAC,CAAA;AAE5B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,qBAAA,EACd,QAAA,kBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAM,MAAA,KAAW,OAAA,GAAU,OAAA,GAAU,QAAA;AAAA,QACrC,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,QAAQ,OAAA,EAAS,GAAG,SAAS,CAAA;AAAA,QAC3D,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA;AAAA,KACH,EACF,CAAA;AAAA,EAEJ;AACF;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-27HTTVFO.js","sourcesContent":["import { cva } from 'class-variance-authority';\n\nexport const snackbarWrapperStyles =\n 'pointer-events-none fixed inset-x-0 bottom-4 z-50 flex justify-center px-4';\n\nexport const snackbarStyles = cva(\n [\n 'pointer-events-auto rounded-md border px-4 py-3 text-sm shadow-lg',\n 'transition-all duration-200 ease-out',\n ],\n {\n variants: {\n status: {\n info: 'border-transparent bg-[var(--surface-inverse)] text-[var(--text-inverse)]',\n success: 'border-transparent bg-[rgb(var(--color-success-600))] text-white',\n error: 'border-transparent bg-[rgb(var(--color-danger-600))] text-white',\n warning:\n 'border-transparent bg-[rgb(var(--color-warning-500))] text-[rgb(var(--color-neutral-900))]',\n },\n visible: {\n true: 'translate-y-0 opacity-100',\n false: 'translate-y-2 opacity-0',\n },\n },\n defaultVariants: {\n status: 'info',\n visible: false,\n },\n },\n);\n","import { useDelayedUnmount } from '@hooks';\nimport { cn } from '@utils';\nimport type { VariantProps } from 'class-variance-authority';\nimport { forwardRef, useEffect, type HTMLAttributes, type ReactNode } from 'react';\nimport { snackbarStyles, snackbarWrapperStyles } from './Snackbar.styles';\n\nconst EXIT_DURATION_MS = 200;\n\nexport type SnackbarProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> &\n Omit<VariantProps<typeof snackbarStyles>, 'visible'> & {\n open: boolean;\n onClose: () => void;\n message: ReactNode;\n duration?: number;\n };\n\nexport const Snackbar = forwardRef<HTMLDivElement, SnackbarProps>(\n ({ open, onClose, message, status, duration = 4000, className, ...props }, ref) => {\n const { mounted, visible } = useDelayedUnmount(open, EXIT_DURATION_MS);\n\n useEffect(() => {\n if (!open || !duration) {\n return;\n }\n\n const timeoutId = setTimeout(onClose, duration);\n return () => clearTimeout(timeoutId);\n }, [open, duration, onClose]);\n\n if (!mounted) {\n return null;\n }\n\n return (\n <div className={snackbarWrapperStyles}>\n <div\n ref={ref}\n role={status === 'error' ? 'alert' : 'status'}\n className={cn(snackbarStyles({ status, visible }), className)}\n {...props}\n >\n {message}\n </div>\n </div>\n );\n },\n);\n\nSnackbar.displayName = 'Snackbar';\n"]}
@@ -0,0 +1,76 @@
1
+ import { Image } from './chunk-KAU7S3D4.js';
2
+ import { RichText } from './chunk-SPDOYFCU.js';
3
+ import { cn } from './chunk-6LLGTBM6.js';
4
+ import { cva } from 'class-variance-authority';
5
+ import { forwardRef } from 'react';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ var mediaCardStyles = cva(
9
+ "group relative isolate flex flex-col justify-end overflow-hidden rounded-2xl bg-[var(--surface-tertiary)] shadow-sm",
10
+ {
11
+ variants: {
12
+ aspect: {
13
+ portrait: "aspect-[3/4]",
14
+ square: "aspect-square",
15
+ landscape: "aspect-[4/3]"
16
+ }
17
+ },
18
+ defaultVariants: {
19
+ aspect: "portrait"
20
+ }
21
+ }
22
+ );
23
+ var mediaCardImageStyles = [
24
+ "absolute inset-0 -z-20 h-full w-full",
25
+ "transition-transform duration-500 ease-out group-hover:scale-105 motion-reduce:transition-none motion-reduce:group-hover:scale-100"
26
+ ].join(" ");
27
+ var mediaCardScrimStyles = [
28
+ "pointer-events-none absolute inset-0 -z-10",
29
+ "bg-gradient-to-t from-[var(--media-card-scrim,rgb(0_0_0/0.8))] via-[var(--media-card-scrim-mid,rgb(0_0_0/0.3))] via-45% to-transparent to-75%"
30
+ ].join(" ");
31
+ var mediaCardContentStyles = "flex flex-col gap-1 p-4 text-[var(--media-card-text,#fff)]";
32
+ var mediaCardTitleStyles = "text-lg font-bold leading-tight text-inherit";
33
+ var mediaCardSubtitleStyles = "text-sm text-inherit opacity-90";
34
+ var mediaCardLinkStyles = [
35
+ "text-inherit no-underline hover:text-inherit",
36
+ 'after:absolute after:inset-0 after:z-[1] after:rounded-2xl after:content-[""]',
37
+ "focus-visible:outline-none focus-visible:after:ring-4 focus-visible:after:ring-inset focus-visible:after:ring-[var(--border-focus)]"
38
+ ].join(" ");
39
+ var mediaCardBadgeStyles = [
40
+ "absolute left-3 top-3 z-[2] rounded-full px-2.5 py-1 text-xs font-bold uppercase tracking-wide",
41
+ "bg-[var(--media-card-badge-bg,rgb(255_255_255/0.92))] text-[var(--media-card-badge-text,rgb(31_31_31))]"
42
+ ].join(" ");
43
+ var mediaCardActionsStyles = "absolute right-3 top-3 z-[2] flex gap-2 [&>*]:rounded-full [&>*]:shadow-md";
44
+ var MediaCard = forwardRef(
45
+ ({
46
+ src,
47
+ alt = "",
48
+ media,
49
+ title,
50
+ subtitle,
51
+ headingLevel = "h3",
52
+ href,
53
+ linkId,
54
+ badge,
55
+ actions,
56
+ aspect,
57
+ className,
58
+ ...props
59
+ }, ref) => {
60
+ return /* @__PURE__ */ jsxs("article", { ref, className: cn(mediaCardStyles({ aspect }), className), ...props, children: [
61
+ media ?? (src && /* @__PURE__ */ jsx(Image, { src, alt, className: mediaCardImageStyles })),
62
+ /* @__PURE__ */ jsx("div", { "aria-hidden": "true", className: mediaCardScrimStyles }),
63
+ /* @__PURE__ */ jsxs("div", { className: mediaCardContentStyles, children: [
64
+ /* @__PURE__ */ jsx(RichText, { as: headingLevel, variant: "s1", className: mediaCardTitleStyles, children: href ? /* @__PURE__ */ jsx("a", { id: linkId, href, className: mediaCardLinkStyles, children: title }) : title }),
65
+ subtitle && /* @__PURE__ */ jsx(RichText, { as: "p", variant: "p3", className: mediaCardSubtitleStyles, children: subtitle })
66
+ ] }),
67
+ badge && /* @__PURE__ */ jsx("span", { className: mediaCardBadgeStyles, children: badge }),
68
+ actions && /* @__PURE__ */ jsx("div", { className: mediaCardActionsStyles, children: actions })
69
+ ] });
70
+ }
71
+ );
72
+ MediaCard.displayName = "MediaCard";
73
+
74
+ export { MediaCard };
75
+ //# sourceMappingURL=chunk-4TPQTZSR.js.map
76
+ //# sourceMappingURL=chunk-4TPQTZSR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/molecules/MediaCard/MediaCard.styles.ts","../src/components/molecules/MediaCard/MediaCard.tsx"],"names":[],"mappings":";;;;;;;AAEO,IAAM,eAAA,GAAkB,GAAA;AAAA,EAC7B,qHAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,cAAA;AAAA,QACV,MAAA,EAAQ,eAAA;AAAA,QACR,SAAA,EAAW;AAAA;AACb,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,MAAA,EAAQ;AAAA;AACV;AAEJ,CAAA;AAEO,IAAM,oBAAA,GAAuB;AAAA,EAClC,sCAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,GAAG,CAAA;AAMH,IAAM,oBAAA,GAAuB;AAAA,EAClC,4CAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,GAAG,CAAA;AAEH,IAAM,sBAAA,GAAyB,4DAAA;AAE/B,IAAM,oBAAA,GAAuB,8CAAA;AAE7B,IAAM,uBAAA,GAA0B,iCAAA;AAGhC,IAAM,mBAAA,GAAsB;AAAA,EACjC,8CAAA;AAAA,EACA,+EAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,GAAG,CAAA;AAEH,IAAM,oBAAA,GAAuB;AAAA,EAClC,gGAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,GAAG,CAAA;AAGH,IAAM,sBAAA,GACX,4EAAA;ACVK,IAAM,SAAA,GAAY,UAAA;AAAA,EACvB,CACE;AAAA,IACE,GAAA;AAAA,IACA,GAAA,GAAM,EAAA;AAAA,IACN,KAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA,GAAe,IAAA;AAAA,IACf,IAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,uBACE,IAAA,CAAC,SAAA,EAAA,EAAQ,GAAA,EAAU,SAAA,EAAW,EAAA,CAAG,eAAA,CAAgB,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,KAAA,EAC3E,QAAA,EAAA;AAAA,MAAA,KAAA,KAAU,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAM,GAAA,EAAU,GAAA,EAAU,WAAW,oBAAA,EAAsB,CAAA,CAAA;AAAA,sBAC9E,GAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAY,MAAA,EAAO,WAAW,oBAAA,EAAsB,CAAA;AAAA,sBACzD,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,sBAAA,EACd,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,YAAS,EAAA,EAAI,YAAA,EAAc,OAAA,EAAQ,IAAA,EAAK,WAAW,oBAAA,EACjD,QAAA,EAAA,IAAA,mBACC,GAAA,CAAC,GAAA,EAAA,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAY,WAAW,mBAAA,EACnC,QAAA,EAAA,KAAA,EACH,IAEA,KAAA,EAEJ,CAAA;AAAA,QACC,QAAA,wBACE,QAAA,EAAA,EAAS,EAAA,EAAG,KAAI,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAW,uBAAA,EACtC,QAAA,EAAA,QAAA,EACH;AAAA,OAAA,EAEJ,CAAA;AAAA,MACC,KAAA,oBAAS,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,sBAAuB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MACvD,OAAA,oBAAW,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,wBAAyB,QAAA,EAAA,OAAA,EAAQ;AAAA,KAAA,EAC/D,CAAA;AAAA,EAEJ;AACF;AAEA,SAAA,CAAU,WAAA,GAAc,WAAA","file":"chunk-4TPQTZSR.js","sourcesContent":["import { cva } from 'class-variance-authority';\n\nexport const mediaCardStyles = cva(\n 'group relative isolate flex flex-col justify-end overflow-hidden rounded-2xl bg-[var(--surface-tertiary)] shadow-sm',\n {\n variants: {\n aspect: {\n portrait: 'aspect-[3/4]',\n square: 'aspect-square',\n landscape: 'aspect-[4/3]',\n },\n },\n defaultVariants: {\n aspect: 'portrait',\n },\n },\n);\n\nexport const mediaCardImageStyles = [\n 'absolute inset-0 -z-20 h-full w-full',\n 'transition-transform duration-500 ease-out group-hover:scale-105 motion-reduce:transition-none motion-reduce:group-hover:scale-100',\n].join(' ');\n\n/**\n * Scrim from the bottom so the text reads on any photo. Text over photos is always light on dark,\n * whatever the theme; sites can tune it with --media-card-scrim and --media-card-text.\n */\nexport const mediaCardScrimStyles = [\n 'pointer-events-none absolute inset-0 -z-10',\n 'bg-gradient-to-t from-[var(--media-card-scrim,rgb(0_0_0/0.8))] via-[var(--media-card-scrim-mid,rgb(0_0_0/0.3))] via-45% to-transparent to-75%',\n].join(' ');\n\nexport const mediaCardContentStyles = 'flex flex-col gap-1 p-4 text-[var(--media-card-text,#fff)]';\n\nexport const mediaCardTitleStyles = 'text-lg font-bold leading-tight text-inherit';\n\nexport const mediaCardSubtitleStyles = 'text-sm text-inherit opacity-90';\n\n/** Stretched link: its ::after covers the whole card, so the card is one link named by the title. */\nexport const mediaCardLinkStyles = [\n 'text-inherit no-underline hover:text-inherit',\n 'after:absolute after:inset-0 after:z-[1] after:rounded-2xl after:content-[\"\"]',\n 'focus-visible:outline-none focus-visible:after:ring-4 focus-visible:after:ring-inset focus-visible:after:ring-[var(--border-focus)]',\n].join(' ');\n\nexport const mediaCardBadgeStyles = [\n 'absolute left-3 top-3 z-[2] rounded-full px-2.5 py-1 text-xs font-bold uppercase tracking-wide',\n 'bg-[var(--media-card-badge-bg,rgb(255_255_255/0.92))] text-[var(--media-card-badge-text,rgb(31_31_31))]',\n].join(' ');\n\n/** Floating actions: round, above the card link, so they stay clickable. */\nexport const mediaCardActionsStyles =\n 'absolute right-3 top-3 z-[2] flex gap-2 [&>*]:rounded-full [&>*]:shadow-md';\n","import { Image, RichText } from '@components';\nimport { cn } from '@utils';\nimport { type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport {\n mediaCardActionsStyles,\n mediaCardBadgeStyles,\n mediaCardContentStyles,\n mediaCardImageStyles,\n mediaCardLinkStyles,\n mediaCardScrimStyles,\n mediaCardStyles,\n mediaCardSubtitleStyles,\n mediaCardTitleStyles,\n} from './MediaCard.styles';\n\nexport type MediaCardProps = Omit<HTMLAttributes<HTMLElement>, 'title'> &\n VariantProps<typeof mediaCardStyles> & {\n /** Image URL; or pass your own element (e.g. an optimized `<picture>`) in `media`. */\n src?: string;\n /** Describes the photo; use `''` if it is only decorative. */\n alt?: string;\n media?: ReactNode;\n title: ReactNode;\n /** One short line under the title (time, category, cost per serving…). */\n subtitle?: ReactNode;\n /** Heading level of the title in the page outline. */\n headingLevel?: 'h2' | 'h3' | 'h4';\n /** Makes the whole card a link, named by the title. */\n href?: string;\n linkId?: string;\n /** Small label on the top-left corner (\"New\", \"Featured\"). */\n badge?: ReactNode;\n /** Floating buttons on the top-right corner (save, share); they stay above the link. */\n actions?: ReactNode;\n };\n\n/**\n * Vertical card with a full-bleed photo, a dark gradient from the bottom for the title and\n * subtitle, an optional badge and floating actions. For recipes, articles and guides; pair it with\n * `Carousel` for rows of cards.\n */\nexport const MediaCard = forwardRef<HTMLElement, MediaCardProps>(\n (\n {\n src,\n alt = '',\n media,\n title,\n subtitle,\n headingLevel = 'h3',\n href,\n linkId,\n badge,\n actions,\n aspect,\n className,\n ...props\n },\n ref,\n ) => {\n return (\n <article ref={ref} className={cn(mediaCardStyles({ aspect }), className)} {...props}>\n {media ?? (src && <Image src={src} alt={alt} className={mediaCardImageStyles} />)}\n <div aria-hidden=\"true\" className={mediaCardScrimStyles} />\n <div className={mediaCardContentStyles}>\n <RichText as={headingLevel} variant=\"s1\" className={mediaCardTitleStyles}>\n {href ? (\n <a id={linkId} href={href} className={mediaCardLinkStyles}>\n {title}\n </a>\n ) : (\n title\n )}\n </RichText>\n {subtitle && (\n <RichText as=\"p\" variant=\"p3\" className={mediaCardSubtitleStyles}>\n {subtitle}\n </RichText>\n )}\n </div>\n {badge && <span className={mediaCardBadgeStyles}>{badge}</span>}\n {actions && <div className={mediaCardActionsStyles}>{actions}</div>}\n </article>\n );\n },\n);\n\nMediaCard.displayName = 'MediaCard';\n"]}
@@ -39,5 +39,5 @@ var Link = forwardRef(
39
39
  Link.displayName = "Link";
40
40
 
41
41
  export { Link };
42
- //# sourceMappingURL=chunk-D4I5OF3C.js.map
43
- //# sourceMappingURL=chunk-D4I5OF3C.js.map
42
+ //# sourceMappingURL=chunk-5LKLTY55.js.map
43
+ //# sourceMappingURL=chunk-5LKLTY55.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/atoms/Link/Link.styles.ts","../src/components/atoms/Link/Link.tsx"],"names":[],"mappings":";;;;;AAEO,IAAM,UAAA,GAAa,GAAA;AAAA,EACxB;AAAA,IACE,oEAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,SAAA,EAAW;AAAA,QACT,MAAA,EAAQ,8BAAA;AAAA,QACR,KAAA,EAAO,oCAAA;AAAA,QACP,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,SAAA,EAAW;AAAA;AACb;AAEJ,CAAA;ACRO,IAAM,IAAA,GAAO,UAAA;AAAA,EAClB,CAAC,EAAE,EAAA,EAAI,SAAA,GAAY,GAAA,EAAK,QAAA,EAAU,SAAA,EAAW,SAAA,EAAW,MAAA,EAAQ,GAAA,EAAK,GAAG,KAAA,IAAS,GAAA,KAAQ;AACvF,IAAA,MAAM,UAAA,GAAa,YAAY,MAAA,KAAW,QAAA;AAE1C,IAAA,uBACE,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,MAAA,EAAQ,aAAa,QAAA,GAAW,MAAA;AAAA,QAChC,GAAA,EAAK,aAAa,qBAAA,GAAwB,GAAA;AAAA,QAC1C,WAAW,EAAA,CAAG,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,SAAS,CAAA;AAAA,QACjD,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AAEA,IAAA,CAAK,WAAA,GAAc,MAAA","file":"chunk-D4I5OF3C.js","sourcesContent":["import { cva } from 'class-variance-authority';\n\nexport const linkStyles = cva(\n [\n 'text-[var(--text-link)] transition-colors duration-150 ease-in-out',\n 'hover:text-[var(--text-link-hover)]',\n ],\n {\n variants: {\n underline: {\n always: 'underline underline-offset-4',\n hover: 'underline-offset-4 hover:underline',\n none: 'no-underline',\n },\n },\n defaultVariants: {\n underline: 'hover',\n },\n },\n);\n","import type { VariantProps } from 'class-variance-authority';\nimport { forwardRef, type AnchorHTMLAttributes, type ElementType } from 'react';\nimport { cn } from '@utils';\nimport { linkStyles } from './Link.styles';\n\nexport type LinkProps = AnchorHTMLAttributes<HTMLAnchorElement> &\n VariantProps<typeof linkStyles> & {\n as?: ElementType;\n external?: boolean;\n };\n\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>(\n ({ as: Component = 'a', external, underline, className, target, rel, ...props }, ref) => {\n const isExternal = external ?? target === '_blank';\n\n return (\n <Component\n ref={ref}\n target={isExternal ? '_blank' : target}\n rel={isExternal ? 'noopener noreferrer' : rel}\n className={cn(linkStyles({ underline }), className)}\n {...props}\n />\n );\n },\n);\n\nLink.displayName = 'Link';\n"]}
1
+ {"version":3,"sources":["../src/components/atoms/Link/Link.styles.ts","../src/components/atoms/Link/Link.tsx"],"names":[],"mappings":";;;;;AAEO,IAAM,UAAA,GAAa,GAAA;AAAA,EACxB;AAAA,IACE,oEAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,SAAA,EAAW;AAAA,QACT,MAAA,EAAQ,8BAAA;AAAA,QACR,KAAA,EAAO,oCAAA;AAAA,QACP,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,SAAA,EAAW;AAAA;AACb;AAEJ,CAAA;ACRO,IAAM,IAAA,GAAO,UAAA;AAAA,EAClB,CAAC,EAAE,EAAA,EAAI,SAAA,GAAY,GAAA,EAAK,QAAA,EAAU,SAAA,EAAW,SAAA,EAAW,MAAA,EAAQ,GAAA,EAAK,GAAG,KAAA,IAAS,GAAA,KAAQ;AACvF,IAAA,MAAM,UAAA,GAAa,YAAY,MAAA,KAAW,QAAA;AAE1C,IAAA,uBACE,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,MAAA,EAAQ,aAAa,QAAA,GAAW,MAAA;AAAA,QAChC,GAAA,EAAK,aAAa,qBAAA,GAAwB,GAAA;AAAA,QAC1C,WAAW,EAAA,CAAG,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,SAAS,CAAA;AAAA,QACjD,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AAEA,IAAA,CAAK,WAAA,GAAc,MAAA","file":"chunk-5LKLTY55.js","sourcesContent":["import { cva } from 'class-variance-authority';\n\nexport const linkStyles = cva(\n [\n 'text-[var(--text-link)] transition-colors duration-150 ease-in-out',\n 'hover:text-[var(--text-link-hover)]',\n ],\n {\n variants: {\n underline: {\n always: 'underline underline-offset-4',\n hover: 'underline-offset-4 hover:underline',\n none: 'no-underline',\n },\n },\n defaultVariants: {\n underline: 'hover',\n },\n },\n);\n","import { cn } from '@utils';\nimport type { VariantProps } from 'class-variance-authority';\nimport { forwardRef, type AnchorHTMLAttributes, type ElementType } from 'react';\nimport { linkStyles } from './Link.styles';\n\nexport type LinkProps = AnchorHTMLAttributes<HTMLAnchorElement> &\n VariantProps<typeof linkStyles> & {\n as?: ElementType;\n external?: boolean;\n };\n\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>(\n ({ as: Component = 'a', external, underline, className, target, rel, ...props }, ref) => {\n const isExternal = external ?? target === '_blank';\n\n return (\n <Component\n ref={ref}\n target={isExternal ? '_blank' : target}\n rel={isExternal ? 'noopener noreferrer' : rel}\n className={cn(linkStyles({ underline }), className)}\n {...props}\n />\n );\n },\n);\n\nLink.displayName = 'Link';\n"]}
@@ -1,6 +1,6 @@
1
1
  import { selectStyles, selectChevronStyles } from './chunk-4H6VER5P.js';
2
2
  import { inputLabelStyles, inputErrorStyles, inputHintStyles } from './chunk-FFKHEBQ7.js';
3
- import { RichText } from './chunk-P4CV2EPR.js';
3
+ import { RichText } from './chunk-SPDOYFCU.js';
4
4
  import { cn } from './chunk-6LLGTBM6.js';
5
5
  import { forwardRef, useId } from 'react';
6
6
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -58,5 +58,5 @@ var Select = forwardRef(
58
58
  Select.displayName = "Select";
59
59
 
60
60
  export { Select };
61
- //# sourceMappingURL=chunk-YYNW2PXL.js.map
62
- //# sourceMappingURL=chunk-YYNW2PXL.js.map
61
+ //# sourceMappingURL=chunk-DIA7L6IA.js.map
62
+ //# sourceMappingURL=chunk-DIA7L6IA.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/atoms/Select/Select.tsx"],"names":[],"mappings":";;;;;;;AAsBO,IAAM,MAAA,GAAS,UAAA;AAAA,EACpB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,WAAW,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,QAAA,EAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC5F,IAAA,MAAM,cAAc,KAAA,EAAM;AAC1B,IAAA,MAAM,KAAK,MAAA,IAAU,WAAA;AACrB,IAAA,MAAM,aAAA,GAAgB,QAAQ,OAAA,GAAU,KAAA;AAExC,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,oBACC,GAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAS,EAAA,EACd,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,EAAA,EAAG,MAAA,EAAO,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAW,gBAAA,EACzC,iBACH,CAAA,EACF,CAAA;AAAA,sBAEF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,EAAA;AAAA,YACA,kBAAA,EAAkB,QAAQ,CAAA,EAAG,EAAE,WAAW,IAAA,GAAO,CAAA,EAAG,EAAE,CAAA,KAAA,CAAA,GAAU,MAAA;AAAA,YAChE,cAAA,EAAc,QAAQ,MAAA,GAAS,MAAA;AAAA,YAC/B,SAAA,EAAW,GAAG,YAAA,CAAa,EAAE,OAAO,aAAA,EAAe,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA;AAAA,YACzE,GAAG,KAAA;AAAA,YAEH;AAAA;AAAA,SACH;AAAA,wBACA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,OAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAa,CAAA;AAAA,YACb,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YACf,SAAA,EAAW,mBAAA;AAAA,YAEX,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAA,EAAe;AAAA;AAAA;AACzB,OAAA,EACF,CAAA;AAAA,MACC,KAAA,oBACC,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,GAAA;AAAA,UACH,EAAA,EAAI,GAAG,EAAE,CAAA,MAAA,CAAA;AAAA,UACT,IAAA,EAAK,OAAA;AAAA,UACL,OAAA,EAAQ,IAAA;AAAA,UACR,SAAA,EAAW,gBAAA;AAAA,UAEV,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,MAED,CAAC,KAAA,IAAS,IAAA,oBACT,GAAA,CAAC,YAAS,EAAA,EAAG,GAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAE,CAAA,KAAA,CAAA,EAAS,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAW,iBACxD,QAAA,EAAA,IAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-YYNW2PXL.js","sourcesContent":["import { RichText } from '@components';\nimport { cn } from '@utils';\nimport type { VariantProps } from 'class-variance-authority';\nimport { forwardRef, useId, type SelectHTMLAttributes } from 'react';\nimport {\n inputErrorStyles,\n inputHintStyles,\n inputLabelStyles,\n} from '@components/atoms/Input/Input.styles';\nimport { selectChevronStyles, selectStyles } from './Select.styles';\n\nexport type SelectProps = SelectHTMLAttributes<HTMLSelectElement> &\n VariantProps<typeof selectStyles> & {\n label?: string;\n hint?: string;\n error?: string;\n };\n\n/**\n * A native `<select>` with the same label / hint / error contract and look as `Input`. Native on\n * purpose: it gets the platform picker on mobile, typeahead and full screen reader support for free.\n */\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n ({ className, state, inputSize, label, hint, error, id: idProp, children, ...props }, ref) => {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const resolvedState = error ? 'error' : state;\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n {label && (\n <label htmlFor={id}>\n <RichText as=\"span\" variant=\"p3\" className={inputLabelStyles}>\n {label}\n </RichText>\n </label>\n )}\n <div className=\"relative\">\n <select\n ref={ref}\n id={id}\n aria-describedby={error ? `${id}-error` : hint ? `${id}-hint` : undefined}\n aria-invalid={error ? 'true' : undefined}\n className={cn(selectStyles({ state: resolvedState, inputSize }), className)}\n {...props}\n >\n {children}\n </select>\n <svg\n aria-hidden\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={selectChevronStyles}\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </div>\n {error && (\n <RichText\n as=\"p\"\n id={`${id}-error`}\n role=\"alert\"\n variant=\"p4\"\n className={inputErrorStyles}\n >\n {error}\n </RichText>\n )}\n {!error && hint && (\n <RichText as=\"p\" id={`${id}-hint`} variant=\"p4\" className={inputHintStyles}>\n {hint}\n </RichText>\n )}\n </div>\n );\n },\n);\n\nSelect.displayName = 'Select';\n"]}
1
+ {"version":3,"sources":["../src/components/atoms/Select/Select.tsx"],"names":[],"mappings":";;;;;;;AAsBO,IAAM,MAAA,GAAS,UAAA;AAAA,EACpB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,WAAW,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,QAAA,EAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC5F,IAAA,MAAM,cAAc,KAAA,EAAM;AAC1B,IAAA,MAAM,KAAK,MAAA,IAAU,WAAA;AACrB,IAAA,MAAM,aAAA,GAAgB,QAAQ,OAAA,GAAU,KAAA;AAExC,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,oBACC,GAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAS,EAAA,EACd,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,EAAA,EAAG,MAAA,EAAO,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAW,gBAAA,EACzC,iBACH,CAAA,EACF,CAAA;AAAA,sBAEF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,EAAA;AAAA,YACA,kBAAA,EAAkB,QAAQ,CAAA,EAAG,EAAE,WAAW,IAAA,GAAO,CAAA,EAAG,EAAE,CAAA,KAAA,CAAA,GAAU,MAAA;AAAA,YAChE,cAAA,EAAc,QAAQ,MAAA,GAAS,MAAA;AAAA,YAC/B,SAAA,EAAW,GAAG,YAAA,CAAa,EAAE,OAAO,aAAA,EAAe,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA;AAAA,YACzE,GAAG,KAAA;AAAA,YAEH;AAAA;AAAA,SACH;AAAA,wBACA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,OAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAa,CAAA;AAAA,YACb,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YACf,SAAA,EAAW,mBAAA;AAAA,YAEX,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAA,EAAe;AAAA;AAAA;AACzB,OAAA,EACF,CAAA;AAAA,MACC,KAAA,oBACC,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,GAAA;AAAA,UACH,EAAA,EAAI,GAAG,EAAE,CAAA,MAAA,CAAA;AAAA,UACT,IAAA,EAAK,OAAA;AAAA,UACL,OAAA,EAAQ,IAAA;AAAA,UACR,SAAA,EAAW,gBAAA;AAAA,UAEV,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,MAED,CAAC,KAAA,IAAS,IAAA,oBACT,GAAA,CAAC,YAAS,EAAA,EAAG,GAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAE,CAAA,KAAA,CAAA,EAAS,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAW,iBACxD,QAAA,EAAA,IAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-DIA7L6IA.js","sourcesContent":["import { RichText } from '@components';\nimport { cn } from '@utils';\nimport type { VariantProps } from 'class-variance-authority';\nimport { forwardRef, useId, type SelectHTMLAttributes } from 'react';\nimport {\n inputErrorStyles,\n inputHintStyles,\n inputLabelStyles,\n} from '@components/atoms/Input/Input.styles';\nimport { selectChevronStyles, selectStyles } from './Select.styles';\n\nexport type SelectProps = SelectHTMLAttributes<HTMLSelectElement> &\n VariantProps<typeof selectStyles> & {\n label?: string;\n hint?: string;\n error?: string;\n };\n\n/**\n * A native `<select>` with the same label / hint / error contract and look as `Input`. Native on\n * purpose: it gets the platform picker on mobile, typeahead and full screen reader support for free.\n */\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n ({ className, state, inputSize, label, hint, error, id: idProp, children, ...props }, ref) => {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const resolvedState = error ? 'error' : state;\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n {label && (\n <label htmlFor={id}>\n <RichText as=\"span\" variant=\"p3\" className={inputLabelStyles}>\n {label}\n </RichText>\n </label>\n )}\n <div className=\"relative\">\n <select\n ref={ref}\n id={id}\n aria-describedby={error ? `${id}-error` : hint ? `${id}-hint` : undefined}\n aria-invalid={error ? 'true' : undefined}\n className={cn(selectStyles({ state: resolvedState, inputSize }), className)}\n {...props}\n >\n {children}\n </select>\n <svg\n aria-hidden\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={selectChevronStyles}\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </div>\n {error && (\n <RichText\n as=\"p\"\n id={`${id}-error`}\n role=\"alert\"\n variant=\"p4\"\n className={inputErrorStyles}\n >\n {error}\n </RichText>\n )}\n {!error && hint && (\n <RichText as=\"p\" id={`${id}-hint`} variant=\"p4\" className={inputHintStyles}>\n {hint}\n </RichText>\n )}\n </div>\n );\n },\n);\n\nSelect.displayName = 'Select';\n"]}
@@ -1,5 +1,5 @@
1
1
  import { inputLabelStyles, inputStyles, inputErrorStyles, inputHintStyles } from './chunk-FFKHEBQ7.js';
2
- import { RichText } from './chunk-P4CV2EPR.js';
2
+ import { RichText } from './chunk-SPDOYFCU.js';
3
3
  import { cn } from './chunk-6LLGTBM6.js';
4
4
  import { forwardRef, useId } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -22,7 +22,17 @@ var Input = forwardRef(
22
22
  ...props
23
23
  }
24
24
  ),
25
- error && /* @__PURE__ */ jsx(RichText, { as: "p", id: `${id}-error`, role: "alert", variant: "p4", className: inputErrorStyles, children: error }),
25
+ error && /* @__PURE__ */ jsx(
26
+ RichText,
27
+ {
28
+ as: "p",
29
+ id: `${id}-error`,
30
+ role: "alert",
31
+ variant: "p4",
32
+ className: inputErrorStyles,
33
+ children: error
34
+ }
35
+ ),
26
36
  !error && hint && /* @__PURE__ */ jsx(RichText, { as: "p", id: `${id}-hint`, variant: "p4", className: inputHintStyles, children: hint })
27
37
  ] });
28
38
  }
@@ -30,5 +40,5 @@ var Input = forwardRef(
30
40
  Input.displayName = "Input";
31
41
 
32
42
  export { Input };
33
- //# sourceMappingURL=chunk-DP274HDM.js.map
34
- //# sourceMappingURL=chunk-DP274HDM.js.map
43
+ //# sourceMappingURL=chunk-IY452YEX.js.map
44
+ //# sourceMappingURL=chunk-IY452YEX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/atoms/Input/Input.tsx"],"names":[],"mappings":";;;;;;AAaO,IAAM,KAAA,GAAQ,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,GAAG,KAAA,IAAS,GAAA,KAAQ;AAClF,IAAA,MAAM,cAAc,KAAA,EAAM;AAC1B,IAAA,MAAM,KAAK,MAAA,IAAU,WAAA;AACrB,IAAA,MAAM,aAAA,GAAgB,QAAQ,OAAA,GAAU,KAAA;AAExC,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,oBACC,GAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAS,EAAA,EACd,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,EAAA,EAAG,MAAA,EAAO,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAW,gBAAA,EACzC,iBACH,CAAA,EACF,CAAA;AAAA,sBAEF,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,EAAA;AAAA,UACA,kBAAA,EAAkB,QAAQ,CAAA,EAAG,EAAE,WAAW,IAAA,GAAO,CAAA,EAAG,EAAE,CAAA,KAAA,CAAA,GAAU,MAAA;AAAA,UAChE,cAAA,EAAc,QAAQ,MAAA,GAAS,MAAA;AAAA,UAC/B,SAAA,EAAW,GAAG,WAAA,CAAY,EAAE,OAAO,aAAA,EAAe,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA;AAAA,UACxE,GAAG;AAAA;AAAA,OACN;AAAA,MACC,KAAA,oBACC,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,GAAA;AAAA,UACH,EAAA,EAAI,GAAG,EAAE,CAAA,MAAA,CAAA;AAAA,UACT,IAAA,EAAK,OAAA;AAAA,UACL,OAAA,EAAQ,IAAA;AAAA,UACR,SAAA,EAAW,gBAAA;AAAA,UAEV,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,MAED,CAAC,KAAA,IAAS,IAAA,oBACT,GAAA,CAAC,YAAS,EAAA,EAAG,GAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAE,CAAA,KAAA,CAAA,EAAS,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAW,iBACxD,QAAA,EAAA,IAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-IY452YEX.js","sourcesContent":["import { RichText } from '@components';\nimport { cn } from '@utils';\nimport type { VariantProps } from 'class-variance-authority';\nimport { forwardRef, useId, type InputHTMLAttributes } from 'react';\nimport { inputErrorStyles, inputHintStyles, inputLabelStyles, inputStyles } from './Input.styles';\n\nexport type InputProps = InputHTMLAttributes<HTMLInputElement> &\n VariantProps<typeof inputStyles> & {\n label?: string;\n hint?: string;\n error?: string;\n };\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, state, inputSize, label, hint, error, id: idProp, ...props }, ref) => {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const resolvedState = error ? 'error' : state;\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n {label && (\n <label htmlFor={id}>\n <RichText as=\"span\" variant=\"p3\" className={inputLabelStyles}>\n {label}\n </RichText>\n </label>\n )}\n <input\n ref={ref}\n id={id}\n aria-describedby={error ? `${id}-error` : hint ? `${id}-hint` : undefined}\n aria-invalid={error ? 'true' : undefined}\n className={cn(inputStyles({ state: resolvedState, inputSize }), className)}\n {...props}\n />\n {error && (\n <RichText\n as=\"p\"\n id={`${id}-error`}\n role=\"alert\"\n variant=\"p4\"\n className={inputErrorStyles}\n >\n {error}\n </RichText>\n )}\n {!error && hint && (\n <RichText as=\"p\" id={`${id}-hint`} variant=\"p4\" className={inputHintStyles}>\n {hint}\n </RichText>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = 'Input';\n"]}
@@ -3,7 +3,7 @@ import { useScrollLock } from './chunk-53YMHM24.js';
3
3
  import { useDismissableLayer } from './chunk-JCJP427C.js';
4
4
  import { useDelayedUnmount } from './chunk-BNEEI7S5.js';
5
5
  import { useMergedRef } from './chunk-P4Z7HH66.js';
6
- import { RichText } from './chunk-P4CV2EPR.js';
6
+ import { RichText } from './chunk-SPDOYFCU.js';
7
7
  import { cn } from './chunk-6LLGTBM6.js';
8
8
  import { forwardRef, useRef, useId } from 'react';
9
9
  import { cva } from 'class-variance-authority';
@@ -11,7 +11,7 @@ import { jsx, jsxs } from 'react/jsx-runtime';
11
11
 
12
12
  var modalOverlayStyles = cva(
13
13
  [
14
- "fixed inset-0 z-50 flex items-center justify-center bg-[var(--surface-overlay)] p-4",
14
+ "fixed inset-0 z-50 flex items-center justify-center bg-[var(--surface-overlay)]",
15
15
  "transition-opacity duration-200 ease-out"
16
16
  ],
17
17
  {
@@ -28,7 +28,9 @@ var modalOverlayStyles = cva(
28
28
  );
29
29
  var modalPanelStyles = cva(
30
30
  [
31
- "w-full max-w-md rounded-xl border border-[var(--border-default)] bg-[var(--surface-secondary)] p-6 shadow-lg",
31
+ // Every dialog: 90% of the viewport's width up to 768px, as tall as its content up to the
32
+ // `maxHeight` limit; beyond that the body scrolls. Pixels, so a site's root font size can't shrink it.
33
+ "flex w-[90vw] max-w-[768px] flex-col rounded-xl border border-[var(--border-default)] bg-[var(--surface-secondary)] p-6 shadow-lg",
32
34
  "transition-all duration-200 ease-out"
33
35
  ],
34
36
  {
@@ -36,18 +38,34 @@ var modalPanelStyles = cva(
36
38
  visible: {
37
39
  true: "scale-100 opacity-100",
38
40
  false: "scale-95 opacity-0"
41
+ },
42
+ maxHeight: {
43
+ default: "max-h-[80dvh]",
44
+ tall: "max-h-[90dvh]"
39
45
  }
40
46
  },
41
47
  defaultVariants: {
42
- visible: false
48
+ visible: false,
49
+ maxHeight: "default"
43
50
  }
44
51
  }
45
52
  );
46
- var modalTitleStyles = "mb-4 text-lg font-semibold text-[var(--text-primary)]";
47
- var modalFooterStyles = "mt-6 flex items-center justify-end gap-2";
53
+ var modalTitleStyles = "mb-4 shrink-0 text-lg font-semibold text-[var(--text-primary)]";
54
+ var modalBodyStyles = "min-h-0 flex-1 overflow-y-auto";
55
+ var modalFooterStyles = "mt-6 flex shrink-0 flex-wrap items-center justify-end gap-2";
48
56
  var EXIT_DURATION_MS = 200;
49
57
  var Modal = forwardRef(
50
- ({ open, onClose, title, footer, closeOnBackdropClick = true, className, children, ...props }, ref) => {
58
+ ({
59
+ open,
60
+ onClose,
61
+ title,
62
+ footer,
63
+ closeOnBackdropClick = true,
64
+ maxHeight = "default",
65
+ className,
66
+ children,
67
+ ...props
68
+ }, ref) => {
51
69
  const panelRef = useRef(null);
52
70
  const setPanelRef = useMergedRef(ref, panelRef);
53
71
  const titleId = useId();
@@ -66,11 +84,11 @@ var Modal = forwardRef(
66
84
  "aria-modal": "true",
67
85
  "aria-labelledby": title ? titleId : void 0,
68
86
  tabIndex: -1,
69
- className: cn(modalPanelStyles({ visible }), className),
87
+ className: cn(modalPanelStyles({ visible, maxHeight }), className),
70
88
  ...props,
71
89
  children: [
72
90
  title && /* @__PURE__ */ jsx(RichText, { as: "h2", id: titleId, variant: "s1", className: modalTitleStyles, children: title }),
73
- children,
91
+ /* @__PURE__ */ jsx("div", { className: modalBodyStyles, children }),
74
92
  footer && /* @__PURE__ */ jsx("div", { className: modalFooterStyles, children: footer })
75
93
  ]
76
94
  }
@@ -80,5 +98,5 @@ var Modal = forwardRef(
80
98
  Modal.displayName = "Modal";
81
99
 
82
100
  export { Modal };
83
- //# sourceMappingURL=chunk-4CY55XM3.js.map
84
- //# sourceMappingURL=chunk-4CY55XM3.js.map
101
+ //# sourceMappingURL=chunk-J7X6NLSR.js.map
102
+ //# sourceMappingURL=chunk-J7X6NLSR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/molecules/Modal/Modal.styles.ts","../src/components/molecules/Modal/Modal.tsx"],"names":[],"mappings":"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","file":"chunk-J7X6NLSR.js","sourcesContent":["import { cva } from 'class-variance-authority';\n\nexport const modalOverlayStyles = cva(\n [\n 'fixed inset-0 z-50 flex items-center justify-center bg-[var(--surface-overlay)]',\n 'transition-opacity duration-200 ease-out',\n ],\n {\n variants: {\n visible: {\n true: 'opacity-100',\n false: 'opacity-0',\n },\n },\n defaultVariants: {\n visible: false,\n },\n },\n);\n\nexport const modalPanelStyles = cva(\n [\n // Every dialog: 90% of the viewport's width up to 768px, as tall as its content up to the\n // `maxHeight` limit; beyond that the body scrolls. Pixels, so a site's root font size can't shrink it.\n 'flex w-[90vw] max-w-[768px] flex-col rounded-xl border border-[var(--border-default)] bg-[var(--surface-secondary)] p-6 shadow-lg',\n 'transition-all duration-200 ease-out',\n ],\n {\n variants: {\n visible: {\n true: 'scale-100 opacity-100',\n false: 'scale-95 opacity-0',\n },\n maxHeight: {\n default: 'max-h-[80dvh]',\n tall: 'max-h-[90dvh]',\n },\n },\n defaultVariants: {\n visible: false,\n maxHeight: 'default',\n },\n },\n);\n\nexport const modalTitleStyles = 'mb-4 shrink-0 text-lg font-semibold text-[var(--text-primary)]';\n\nexport const modalBodyStyles = 'min-h-0 flex-1 overflow-y-auto';\n\nexport const modalFooterStyles = 'mt-6 flex shrink-0 flex-wrap items-center justify-end gap-2';\n","import { RichText } from '@components';\nimport {\n useDelayedUnmount,\n useDismissableLayer,\n useFocusTrap,\n useMergedRef,\n useScrollLock,\n} from '@hooks';\nimport { cn } from '@utils';\nimport { forwardRef, useId, useRef, type HTMLAttributes, type ReactNode } from 'react';\nimport {\n modalBodyStyles,\n modalFooterStyles,\n modalOverlayStyles,\n modalPanelStyles,\n modalTitleStyles,\n} from './Modal.styles';\n\nconst EXIT_DURATION_MS = 200;\n\nexport type ModalProps = Omit<HTMLAttributes<HTMLDivElement>, 'title'> & {\n open: boolean;\n onClose: () => void;\n title?: ReactNode;\n footer?: ReactNode;\n closeOnBackdropClick?: boolean;\n /** Height limit before the body scrolls: 80% of the viewport (`default`) or 90% (`tall`). */\n maxHeight?: 'default' | 'tall';\n};\n\nexport const Modal = forwardRef<HTMLDivElement, ModalProps>(\n (\n {\n open,\n onClose,\n title,\n footer,\n closeOnBackdropClick = true,\n maxHeight = 'default',\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const panelRef = useRef<HTMLDivElement | null>(null);\n const setPanelRef = useMergedRef(ref, panelRef);\n const titleId = useId();\n const { mounted, visible } = useDelayedUnmount(open, EXIT_DURATION_MS);\n\n useDismissableLayer(open, onClose, panelRef, closeOnBackdropClick);\n // The panel mounts one render after `open` flips, so the trap starts once it exists.\n useFocusTrap(open && mounted, panelRef);\n useScrollLock(open);\n\n if (!mounted) {\n return null;\n }\n\n return (\n <div className={modalOverlayStyles({ visible })}>\n <div\n ref={setPanelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n tabIndex={-1}\n className={cn(modalPanelStyles({ visible, maxHeight }), className)}\n {...props}\n >\n {title && (\n <RichText as=\"h2\" id={titleId} variant=\"s1\" className={modalTitleStyles}>\n {title}\n </RichText>\n )}\n <div className={modalBodyStyles}>{children}</div>\n {footer && <div className={modalFooterStyles}>{footer}</div>}\n </div>\n </div>\n );\n },\n);\n\nModal.displayName = 'Modal';\n"]}
@@ -36,5 +36,5 @@ var Image = forwardRef(
36
36
  Image.displayName = "Image";
37
37
 
38
38
  export { Image };
39
- //# sourceMappingURL=chunk-5IHM2545.js.map
40
- //# sourceMappingURL=chunk-5IHM2545.js.map
39
+ //# sourceMappingURL=chunk-KAU7S3D4.js.map
40
+ //# sourceMappingURL=chunk-KAU7S3D4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/atoms/Image/Image.styles.ts","../src/components/atoms/Image/Image.tsx"],"names":[],"mappings":";;;;;AAEO,IAAM,WAAA,GAAc,IAAI,kBAAA,EAAoB;AAAA,EACjD,QAAA,EAAU;AAAA,IACR,GAAA,EAAK;AAAA,MACH,KAAA,EAAO,cAAA;AAAA,MACP,OAAA,EAAS,gBAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACR;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,EAAA;AAAA,MACN,EAAA,EAAI,YAAA;AAAA,MACJ,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,GAAA,EAAK,OAAA;AAAA,IACL,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;ACRM,IAAM,KAAA,GAAQ,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,GAAA,EAAK,OAAA,EAAS,IAAA,GAAO,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,GAAG,KAAA,EAAM,EAAG,GAAA,qBACjE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,GAAA;AAAA,MACA,OAAA,EAAS,OAAA,KAAY,IAAA,GAAO,MAAA,GAAS,OAAA,CAAA;AAAA,MACrC,SAAA,EAAW,GAAG,WAAA,CAAY,EAAE,KAAK,OAAA,EAAS,GAAG,SAAS,CAAA;AAAA,MACrD,GAAG;AAAA;AAAA;AAGV;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-5IHM2545.js","sourcesContent":["import { cva } from 'class-variance-authority';\n\nexport const imageStyles = cva('block max-w-full', {\n variants: {\n fit: {\n cover: 'object-cover',\n contain: 'object-contain',\n fill: 'object-fill',\n },\n rounded: {\n none: '',\n md: 'rounded-md',\n full: 'rounded-full',\n },\n },\n defaultVariants: {\n fit: 'cover',\n rounded: 'none',\n },\n});\n","import type { VariantProps } from 'class-variance-authority';\nimport { forwardRef, type ImgHTMLAttributes } from 'react';\nimport { cn } from '@utils';\nimport { imageStyles } from './Image.styles';\n\nexport type ImageProps = Omit<ImgHTMLAttributes<HTMLImageElement>, 'alt'> &\n VariantProps<typeof imageStyles> & {\n alt: string;\n lazy?: boolean;\n };\n\nexport const Image = forwardRef<HTMLImageElement, ImageProps>(\n ({ className, fit, rounded, lazy = true, loading, alt, ...props }, ref) => (\n <img\n ref={ref}\n alt={alt}\n loading={loading ?? (lazy ? 'lazy' : 'eager')}\n className={cn(imageStyles({ fit, rounded }), className)}\n {...props}\n />\n ),\n);\n\nImage.displayName = 'Image';\n"]}
1
+ {"version":3,"sources":["../src/components/atoms/Image/Image.styles.ts","../src/components/atoms/Image/Image.tsx"],"names":[],"mappings":";;;;;AAEO,IAAM,WAAA,GAAc,IAAI,kBAAA,EAAoB;AAAA,EACjD,QAAA,EAAU;AAAA,IACR,GAAA,EAAK;AAAA,MACH,KAAA,EAAO,cAAA;AAAA,MACP,OAAA,EAAS,gBAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACR;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,EAAA;AAAA,MACN,EAAA,EAAI,YAAA;AAAA,MACJ,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,GAAA,EAAK,OAAA;AAAA,IACL,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;ACRM,IAAM,KAAA,GAAQ,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,GAAA,EAAK,OAAA,EAAS,IAAA,GAAO,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,GAAG,KAAA,EAAM,EAAG,GAAA,qBACjE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,GAAA;AAAA,MACA,OAAA,EAAS,OAAA,KAAY,IAAA,GAAO,MAAA,GAAS,OAAA,CAAA;AAAA,MACrC,SAAA,EAAW,GAAG,WAAA,CAAY,EAAE,KAAK,OAAA,EAAS,GAAG,SAAS,CAAA;AAAA,MACrD,GAAG;AAAA;AAAA;AAGV;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-KAU7S3D4.js","sourcesContent":["import { cva } from 'class-variance-authority';\n\nexport const imageStyles = cva('block max-w-full', {\n variants: {\n fit: {\n cover: 'object-cover',\n contain: 'object-contain',\n fill: 'object-fill',\n },\n rounded: {\n none: '',\n md: 'rounded-md',\n full: 'rounded-full',\n },\n },\n defaultVariants: {\n fit: 'cover',\n rounded: 'none',\n },\n});\n","import { cn } from '@utils';\nimport type { VariantProps } from 'class-variance-authority';\nimport { forwardRef, type ImgHTMLAttributes } from 'react';\nimport { imageStyles } from './Image.styles';\n\nexport type ImageProps = Omit<ImgHTMLAttributes<HTMLImageElement>, 'alt'> &\n VariantProps<typeof imageStyles> & {\n alt: string;\n lazy?: boolean;\n };\n\nexport const Image = forwardRef<HTMLImageElement, ImageProps>(\n ({ className, fit, rounded, lazy = true, loading, alt, ...props }, ref) => (\n <img\n ref={ref}\n alt={alt}\n loading={loading ?? (lazy ? 'lazy' : 'eager')}\n className={cn(imageStyles({ fit, rounded }), className)}\n {...props}\n />\n ),\n);\n\nImage.displayName = 'Image';\n"]}
@@ -1,4 +1,4 @@
1
- import { RichText } from './chunk-P4CV2EPR.js';
1
+ import { RichText } from './chunk-SPDOYFCU.js';
2
2
  import { cn } from './chunk-6LLGTBM6.js';
3
3
  import { forwardRef, useId } from 'react';
4
4
  import { cva } from 'class-variance-authority';
@@ -70,5 +70,5 @@ var Switch = forwardRef(
70
70
  Switch.displayName = "Switch";
71
71
 
72
72
  export { Switch };
73
- //# sourceMappingURL=chunk-ZABQF65Z.js.map
74
- //# sourceMappingURL=chunk-ZABQF65Z.js.map
73
+ //# sourceMappingURL=chunk-KSNAVEJP.js.map
74
+ //# sourceMappingURL=chunk-KSNAVEJP.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/atoms/Switch/Switch.styles.ts","../src/components/atoms/Switch/Switch.tsx"],"names":[],"mappings":";;;;;;AAEO,IAAM,iBAAA,GAAoB,gCAAA;AAE1B,IAAM,yBAAA,GAA4B,oBAAA;AAElC,IAAM,wBAAA,GAA2B,wCAAA;AAEjC,IAAM,iBAAA,GAAoB,cAAA;AAE1B,IAAM,qBAAA,GAAwB,oCAAA;AAE9B,IAAM,iBAAA,GAAoB,GAAA;AAAA,EAC/B;AAAA,IACE,0EAAA;AAAA,IACA,0GAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,4BAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS;AAAA;AACX;AAEJ,CAAA;AAEO,IAAM,iBAAA,GAAoB,GAAA;AAAA,EAC/B,iHAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,eAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS;AAAA;AACX;AAEJ,CAAA;ACtBO,IAAM,MAAA,GAAS,UAAA;AAAA,EACpB,CAAC,EAAE,OAAA,EAAS,eAAA,EAAiB,QAAA,EAAU,SAAA,EAAW,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACvF,IAAA,MAAM,cAAc,KAAA,EAAM;AAC1B,IAAA,MAAM,KAAK,MAAA,IAAU,WAAA;AAErB,IAAA,uBACE,IAAA,CAAC,WAAM,OAAA,EAAS,EAAA,EAAI,WAAW,EAAA,CAAG,iBAAA,EAAmB,QAAA,IAAY,yBAAyB,CAAA,EACxF,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAW,wBAAA,EACf,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,EAAA;AAAA,YACA,IAAA,EAAK,UAAA;AAAA,YACL,IAAA,EAAK,QAAA;AAAA,YACL,OAAA;AAAA,YACA,QAAA;AAAA,YACA,UAAU,CAAC,KAAA,KAAU,eAAA,CAAgB,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,YACzD,SAAA,EAAW,iBAAA;AAAA,YACV,GAAG;AAAA;AAAA,SACN;AAAA,wBACA,GAAA,CAAC,UAAK,aAAA,EAAW,IAAA,EAAC,WAAW,EAAA,CAAG,iBAAA,CAAkB,EAAE,OAAA,EAAS,GAAG,SAAS,CAAA,EACvE,8BAAC,MAAA,EAAA,EAAK,SAAA,EAAW,kBAAkB,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA,EACnD;AAAA,OAAA,EACF,CAAA;AAAA,MACC,KAAA,wBACE,QAAA,EAAA,EAAS,EAAA,EAAG,QAAO,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAW,qBAAA,EACzC,QAAA,EAAA,KAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-ZABQF65Z.js","sourcesContent":["import { cva } from 'class-variance-authority';\n\nexport const switchLabelStyles = 'inline-flex items-center gap-2';\n\nexport const switchLabelDisabledStyles = 'cursor-not-allowed';\n\nexport const switchTrackWrapperStyles = 'relative inline-flex h-6 w-11 shrink-0';\n\nexport const switchInputStyles = 'peer sr-only';\n\nexport const switchLabelTextStyles = 'text-sm text-[var(--text-primary)]';\n\nexport const switchTrackStyles = cva(\n [\n 'absolute inset-0 rounded-full transition-colors duration-150 ease-in-out',\n 'peer-focus-visible:ring-2 peer-focus-visible:ring-[var(--border-focus)] peer-focus-visible:ring-offset-2',\n 'peer-disabled:cursor-not-allowed peer-disabled:opacity-50',\n ],\n {\n variants: {\n checked: {\n true: 'bg-[var(--btn-primary-bg)]',\n false: 'bg-[var(--border-strong)]',\n },\n },\n defaultVariants: {\n checked: false,\n },\n },\n);\n\nexport const switchThumbStyles = cva(\n 'absolute left-0.5 top-0.5 h-5 w-5 rounded-full bg-white shadow-sm transition-transform duration-150 ease-in-out',\n {\n variants: {\n checked: {\n true: 'translate-x-5',\n false: '',\n },\n },\n defaultVariants: {\n checked: false,\n },\n },\n);\n","import { forwardRef, useId, type InputHTMLAttributes } from 'react';\nimport { RichText } from '@components';\nimport { cn } from '@utils';\nimport {\n switchInputStyles,\n switchLabelDisabledStyles,\n switchLabelStyles,\n switchLabelTextStyles,\n switchThumbStyles,\n switchTrackStyles,\n switchTrackWrapperStyles,\n} from './Switch.styles';\n\nexport type SwitchProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'size' | 'onChange' | 'checked'\n> & {\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n label?: string;\n};\n\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(\n ({ checked, onCheckedChange, disabled, className, id: idProp, label, ...props }, ref) => {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n\n return (\n <label htmlFor={id} className={cn(switchLabelStyles, disabled && switchLabelDisabledStyles)}>\n <span className={switchTrackWrapperStyles}>\n <input\n ref={ref}\n id={id}\n type=\"checkbox\"\n role=\"switch\"\n checked={checked}\n disabled={disabled}\n onChange={(event) => onCheckedChange(event.target.checked)}\n className={switchInputStyles}\n {...props}\n />\n <span aria-hidden className={cn(switchTrackStyles({ checked }), className)}>\n <span className={switchThumbStyles({ checked })} />\n </span>\n </span>\n {label && (\n <RichText as=\"span\" variant=\"p3\" className={switchLabelTextStyles}>\n {label}\n </RichText>\n )}\n </label>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n"]}
1
+ {"version":3,"sources":["../src/components/atoms/Switch/Switch.styles.ts","../src/components/atoms/Switch/Switch.tsx"],"names":[],"mappings":";;;;;;AAEO,IAAM,iBAAA,GAAoB,gCAAA;AAE1B,IAAM,yBAAA,GAA4B,oBAAA;AAElC,IAAM,wBAAA,GAA2B,wCAAA;AAEjC,IAAM,iBAAA,GAAoB,cAAA;AAE1B,IAAM,qBAAA,GAAwB,oCAAA;AAE9B,IAAM,iBAAA,GAAoB,GAAA;AAAA,EAC/B;AAAA,IACE,0EAAA;AAAA,IACA,0GAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,4BAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS;AAAA;AACX;AAEJ,CAAA;AAEO,IAAM,iBAAA,GAAoB,GAAA;AAAA,EAC/B,iHAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,eAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS;AAAA;AACX;AAEJ,CAAA;ACtBO,IAAM,MAAA,GAAS,UAAA;AAAA,EACpB,CAAC,EAAE,OAAA,EAAS,eAAA,EAAiB,QAAA,EAAU,SAAA,EAAW,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACvF,IAAA,MAAM,cAAc,KAAA,EAAM;AAC1B,IAAA,MAAM,KAAK,MAAA,IAAU,WAAA;AAErB,IAAA,uBACE,IAAA,CAAC,WAAM,OAAA,EAAS,EAAA,EAAI,WAAW,EAAA,CAAG,iBAAA,EAAmB,QAAA,IAAY,yBAAyB,CAAA,EACxF,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAW,wBAAA,EACf,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,EAAA;AAAA,YACA,IAAA,EAAK,UAAA;AAAA,YACL,IAAA,EAAK,QAAA;AAAA,YACL,OAAA;AAAA,YACA,QAAA;AAAA,YACA,UAAU,CAAC,KAAA,KAAU,eAAA,CAAgB,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,YACzD,SAAA,EAAW,iBAAA;AAAA,YACV,GAAG;AAAA;AAAA,SACN;AAAA,wBACA,GAAA,CAAC,UAAK,aAAA,EAAW,IAAA,EAAC,WAAW,EAAA,CAAG,iBAAA,CAAkB,EAAE,OAAA,EAAS,GAAG,SAAS,CAAA,EACvE,8BAAC,MAAA,EAAA,EAAK,SAAA,EAAW,kBAAkB,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA,EACnD;AAAA,OAAA,EACF,CAAA;AAAA,MACC,KAAA,wBACE,QAAA,EAAA,EAAS,EAAA,EAAG,QAAO,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAW,qBAAA,EACzC,QAAA,EAAA,KAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-KSNAVEJP.js","sourcesContent":["import { cva } from 'class-variance-authority';\n\nexport const switchLabelStyles = 'inline-flex items-center gap-2';\n\nexport const switchLabelDisabledStyles = 'cursor-not-allowed';\n\nexport const switchTrackWrapperStyles = 'relative inline-flex h-6 w-11 shrink-0';\n\nexport const switchInputStyles = 'peer sr-only';\n\nexport const switchLabelTextStyles = 'text-sm text-[var(--text-primary)]';\n\nexport const switchTrackStyles = cva(\n [\n 'absolute inset-0 rounded-full transition-colors duration-150 ease-in-out',\n 'peer-focus-visible:ring-2 peer-focus-visible:ring-[var(--border-focus)] peer-focus-visible:ring-offset-2',\n 'peer-disabled:cursor-not-allowed peer-disabled:opacity-50',\n ],\n {\n variants: {\n checked: {\n true: 'bg-[var(--btn-primary-bg)]',\n false: 'bg-[var(--border-strong)]',\n },\n },\n defaultVariants: {\n checked: false,\n },\n },\n);\n\nexport const switchThumbStyles = cva(\n 'absolute left-0.5 top-0.5 h-5 w-5 rounded-full bg-white shadow-sm transition-transform duration-150 ease-in-out',\n {\n variants: {\n checked: {\n true: 'translate-x-5',\n false: '',\n },\n },\n defaultVariants: {\n checked: false,\n },\n },\n);\n","import { RichText } from '@components';\nimport { cn } from '@utils';\nimport { forwardRef, useId, type InputHTMLAttributes } from 'react';\nimport {\n switchInputStyles,\n switchLabelDisabledStyles,\n switchLabelStyles,\n switchLabelTextStyles,\n switchThumbStyles,\n switchTrackStyles,\n switchTrackWrapperStyles,\n} from './Switch.styles';\n\nexport type SwitchProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'size' | 'onChange' | 'checked'\n> & {\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n label?: string;\n};\n\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(\n ({ checked, onCheckedChange, disabled, className, id: idProp, label, ...props }, ref) => {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n\n return (\n <label htmlFor={id} className={cn(switchLabelStyles, disabled && switchLabelDisabledStyles)}>\n <span className={switchTrackWrapperStyles}>\n <input\n ref={ref}\n id={id}\n type=\"checkbox\"\n role=\"switch\"\n checked={checked}\n disabled={disabled}\n onChange={(event) => onCheckedChange(event.target.checked)}\n className={switchInputStyles}\n {...props}\n />\n <span aria-hidden className={cn(switchTrackStyles({ checked }), className)}>\n <span className={switchThumbStyles({ checked })} />\n </span>\n </span>\n {label && (\n <RichText as=\"span\" variant=\"p3\" className={switchLabelTextStyles}>\n {label}\n </RichText>\n )}\n </label>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n"]}
@@ -0,0 +1,184 @@
1
+ import { useMediaQuery } from './chunk-2HCMNEIQ.js';
2
+ import { Button } from './chunk-KL6I2JFC.js';
3
+ import { cn } from './chunk-6LLGTBM6.js';
4
+ import { forwardRef, useRef, useState, Children, useCallback, useEffect } from 'react';
5
+ import { cva } from 'class-variance-authority';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ var carouselStyles = "relative flex flex-col gap-3";
9
+ var carouselTrackStyles = [
10
+ "flex snap-x snap-mandatory gap-4 overflow-x-auto scroll-px-1 px-1 pb-2",
11
+ "[scrollbar-width:none] [&::-webkit-scrollbar]:hidden"
12
+ ].join(" ");
13
+ var carouselSlideStyles = "shrink-0 snap-start";
14
+ var carouselSlideWidthStyles = "w-[80%] sm:w-[45%] lg:w-[31%]";
15
+ var carouselControlsStyles = "flex items-center justify-center gap-3";
16
+ var carouselIndicatorsStyles = "flex flex-wrap items-center justify-center gap-1";
17
+ var carouselIndicatorStyles = [
18
+ "flex h-6 min-w-6 items-center justify-center rounded-full",
19
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--border-focus)]"
20
+ ].join(" ");
21
+ var carouselDotStyles = cva(
22
+ "block h-2 rounded-full transition-all duration-200 motion-reduce:transition-none",
23
+ {
24
+ variants: {
25
+ active: {
26
+ true: "w-6 bg-[var(--btn-primary-bg)]",
27
+ false: "w-2 bg-[var(--border-strong)] hover:bg-[var(--text-secondary)]"
28
+ }
29
+ },
30
+ defaultVariants: {
31
+ active: false
32
+ }
33
+ }
34
+ );
35
+ var EDGE_TOLERANCE_PX = 4;
36
+ var Carousel = forwardRef(
37
+ ({
38
+ label,
39
+ children,
40
+ previousLabel,
41
+ nextLabel,
42
+ slideLabel = (index, total) => `${index + 1} / ${total}`,
43
+ goToLabel = (index) => `Go to slide ${index + 1}`,
44
+ indicatorsLabel,
45
+ indicators = true,
46
+ header,
47
+ slideClassName,
48
+ buttonIds = {},
49
+ className,
50
+ ...props
51
+ }, ref) => {
52
+ const trackRef = useRef(null);
53
+ const slideRefs = useRef([]);
54
+ const reducedMotion = useMediaQuery("(prefers-reduced-motion: reduce)");
55
+ const [edges, setEdges] = useState({ start: true, end: false });
56
+ const [active, setActive] = useState(0);
57
+ const slides = Children.toArray(children);
58
+ const behavior = reducedMotion ? "auto" : "smooth";
59
+ const offsetOf = (index) => (slideRefs.current[index]?.offsetLeft ?? 0) - (slideRefs.current[0]?.offsetLeft ?? 0);
60
+ const update = useCallback(() => {
61
+ const track = trackRef.current;
62
+ if (!track) {
63
+ return;
64
+ }
65
+ const max = track.scrollWidth - track.clientWidth;
66
+ const atEnd = track.scrollLeft >= max - EDGE_TOLERANCE_PX;
67
+ setEdges({ start: track.scrollLeft <= EDGE_TOLERANCE_PX, end: atEnd });
68
+ const offsets = slideRefs.current.map(
69
+ (slide) => slide ? slide.offsetLeft - (slideRefs.current[0]?.offsetLeft ?? 0) : 0
70
+ );
71
+ const nearest = offsets.reduce(
72
+ (best, offset, index) => Math.abs(offset - track.scrollLeft) < Math.abs((offsets[best] ?? 0) - track.scrollLeft) ? index : best,
73
+ 0
74
+ );
75
+ setActive(atEnd && max > 0 ? offsets.length - 1 : nearest);
76
+ }, []);
77
+ useEffect(() => {
78
+ update();
79
+ const track = trackRef.current;
80
+ if (!track || typeof ResizeObserver === "undefined") {
81
+ return void 0;
82
+ }
83
+ const observer = new ResizeObserver(update);
84
+ observer.observe(track);
85
+ return () => observer.disconnect();
86
+ }, [update, slides.length]);
87
+ const scrollByPage = (direction) => {
88
+ trackRef.current?.scrollBy({
89
+ left: direction * trackRef.current.clientWidth * 0.9,
90
+ behavior
91
+ });
92
+ };
93
+ const goTo = (index) => {
94
+ trackRef.current?.scrollTo({ left: offsetOf(index), behavior });
95
+ };
96
+ return /* @__PURE__ */ jsxs(
97
+ "section",
98
+ {
99
+ ref,
100
+ "aria-roledescription": "carousel",
101
+ "aria-label": label,
102
+ className: cn(carouselStyles, className),
103
+ ...props,
104
+ children: [
105
+ header,
106
+ /* @__PURE__ */ jsx(
107
+ "div",
108
+ {
109
+ ref: trackRef,
110
+ className: carouselTrackStyles,
111
+ "data-carousel-track": "",
112
+ onScroll: update,
113
+ children: slides.map((slide, index) => /* @__PURE__ */ jsx(
114
+ "div",
115
+ {
116
+ ref: (node) => {
117
+ slideRefs.current[index] = node;
118
+ },
119
+ role: "group",
120
+ "aria-roledescription": "slide",
121
+ "aria-label": slideLabel(index, slides.length),
122
+ className: cn(carouselSlideStyles, carouselSlideWidthStyles, slideClassName),
123
+ children: slide
124
+ },
125
+ index
126
+ ))
127
+ }
128
+ ),
129
+ /* @__PURE__ */ jsxs("div", { className: carouselControlsStyles, children: [
130
+ /* @__PURE__ */ jsx(
131
+ Button,
132
+ {
133
+ id: buttonIds.previous,
134
+ type: "button",
135
+ variant: "secondary",
136
+ size: "icon",
137
+ "aria-label": previousLabel,
138
+ disabled: edges.start,
139
+ onClick: () => scrollByPage(-1),
140
+ children: /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\u2039" })
141
+ }
142
+ ),
143
+ indicators && slides.length > 1 && /* @__PURE__ */ jsx("div", { role: "group", "aria-label": indicatorsLabel, className: carouselIndicatorsStyles, children: slides.map((_, index) => /* @__PURE__ */ jsx(
144
+ "button",
145
+ {
146
+ type: "button",
147
+ "aria-label": goToLabel(index, slides.length),
148
+ "aria-current": index === active ? "true" : void 0,
149
+ className: carouselIndicatorStyles,
150
+ onClick: () => goTo(index),
151
+ children: /* @__PURE__ */ jsx(
152
+ "span",
153
+ {
154
+ "aria-hidden": "true",
155
+ className: carouselDotStyles({ active: index === active })
156
+ }
157
+ )
158
+ },
159
+ index
160
+ )) }),
161
+ /* @__PURE__ */ jsx(
162
+ Button,
163
+ {
164
+ id: buttonIds.next,
165
+ type: "button",
166
+ variant: "secondary",
167
+ size: "icon",
168
+ "aria-label": nextLabel,
169
+ disabled: edges.end,
170
+ onClick: () => scrollByPage(1),
171
+ children: /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\u203A" })
172
+ }
173
+ )
174
+ ] })
175
+ ]
176
+ }
177
+ );
178
+ }
179
+ );
180
+ Carousel.displayName = "Carousel";
181
+
182
+ export { Carousel };
183
+ //# sourceMappingURL=chunk-LLJXVAR6.js.map
184
+ //# sourceMappingURL=chunk-LLJXVAR6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/molecules/Carousel/Carousel.styles.ts","../src/components/molecules/Carousel/Carousel.tsx"],"names":[],"mappings":"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","file":"chunk-LLJXVAR6.js","sourcesContent":["import { cva } from 'class-variance-authority';\n\nexport const carouselStyles = 'relative flex flex-col gap-3';\n\nexport const carouselTrackStyles = [\n 'flex snap-x snap-mandatory gap-4 overflow-x-auto scroll-px-1 px-1 pb-2',\n '[scrollbar-width:none] [&::-webkit-scrollbar]:hidden',\n].join(' ');\n\nexport const carouselSlideStyles = 'shrink-0 snap-start';\n\n/** Default slide widths: most of the screen on mobile, two on tablets, three on desktop. */\nexport const carouselSlideWidthStyles = 'w-[80%] sm:w-[45%] lg:w-[31%]';\n\n/** Previous · indicators · next, centered under the cards. */\nexport const carouselControlsStyles = 'flex items-center justify-center gap-3';\n\nexport const carouselIndicatorsStyles = 'flex flex-wrap items-center justify-center gap-1';\n\n/** 24px hit area around a small dot, so the indicators are easy to tap. */\nexport const carouselIndicatorStyles = [\n 'flex h-6 min-w-6 items-center justify-center rounded-full',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--border-focus)]',\n].join(' ');\n\nexport const carouselDotStyles = cva(\n 'block h-2 rounded-full transition-all duration-200 motion-reduce:transition-none',\n {\n variants: {\n active: {\n true: 'w-6 bg-[var(--btn-primary-bg)]',\n false: 'w-2 bg-[var(--border-strong)] hover:bg-[var(--text-secondary)]',\n },\n },\n defaultVariants: {\n active: false,\n },\n },\n);\n","import { Button } from '@components';\nimport { useMediaQuery } from '@hooks';\nimport { cn } from '@utils';\nimport {\n Children,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport {\n carouselControlsStyles,\n carouselDotStyles,\n carouselIndicatorsStyles,\n carouselIndicatorStyles,\n carouselSlideStyles,\n carouselSlideWidthStyles,\n carouselStyles,\n carouselTrackStyles,\n} from './Carousel.styles';\n\nexport type CarouselProps = Omit<HTMLAttributes<HTMLElement>, 'children'> & {\n /** Accessible name of the carousel, e.g. \"Featured recipes\". */\n label: string;\n /** One child per slide. */\n children: ReactNode;\n previousLabel: string;\n nextLabel: string;\n /** Accessible name of each slide; defaults to \"1 / 6\". */\n slideLabel?: (index: number, total: number) => string;\n /** Accessible name of each indicator; defaults to \"Go to slide 3\". */\n goToLabel?: (index: number, total: number) => string;\n /** Accessible name of the indicators group, e.g. \"Choose a recipe\". */\n indicatorsLabel?: string;\n /** Show the indicators between the buttons (default `true`). */\n indicators?: boolean;\n /** Optional visible heading or \"See all\" link above the cards. */\n header?: ReactNode;\n /** Width classes for each slide (defaults: 80% mobile, 45% tablet, 31% desktop). */\n slideClassName?: string;\n /** Stable ids for the buttons, e.g. for analytics click triggers. */\n buttonIds?: { previous?: string; next?: string };\n};\n\nconst EDGE_TOLERANCE_PX = 4;\n\n/**\n * Horizontal carousel of cards: native scroll with snap (touch and trackpad drag work as usual),\n * and below the cards previous/next buttons around indicators that show the current card and jump\n * to any of them. Tabbing to a card scrolls it into view. No autoplay; the smooth scroll is turned\n * off when the person prefers reduced motion.\n */\nexport const Carousel = forwardRef<HTMLElement, CarouselProps>(\n (\n {\n label,\n children,\n previousLabel,\n nextLabel,\n slideLabel = (index, total) => `${index + 1} / ${total}`,\n goToLabel = (index) => `Go to slide ${index + 1}`,\n indicatorsLabel,\n indicators = true,\n header,\n slideClassName,\n buttonIds = {},\n className,\n ...props\n },\n ref,\n ) => {\n const trackRef = useRef<HTMLDivElement | null>(null);\n const slideRefs = useRef<Array<HTMLDivElement | null>>([]);\n const reducedMotion = useMediaQuery('(prefers-reduced-motion: reduce)');\n const [edges, setEdges] = useState({ start: true, end: false });\n const [active, setActive] = useState(0);\n const slides = Children.toArray(children);\n const behavior = reducedMotion ? 'auto' : 'smooth';\n\n /** Offset of a slide from the start of the track's content. */\n const offsetOf = (index: number) =>\n (slideRefs.current[index]?.offsetLeft ?? 0) - (slideRefs.current[0]?.offsetLeft ?? 0);\n\n const update = useCallback(() => {\n const track = trackRef.current;\n if (!track) {\n return;\n }\n const max = track.scrollWidth - track.clientWidth;\n const atEnd = track.scrollLeft >= max - EDGE_TOLERANCE_PX;\n setEdges({ start: track.scrollLeft <= EDGE_TOLERANCE_PX, end: atEnd });\n const offsets = slideRefs.current.map((slide) =>\n slide ? slide.offsetLeft - (slideRefs.current[0]?.offsetLeft ?? 0) : 0,\n );\n const nearest = offsets.reduce(\n (best, offset, index) =>\n Math.abs(offset - track.scrollLeft) < Math.abs((offsets[best] ?? 0) - track.scrollLeft)\n ? index\n : best,\n 0,\n );\n setActive(atEnd && max > 0 ? offsets.length - 1 : nearest);\n }, []);\n\n useEffect(() => {\n update();\n const track = trackRef.current;\n if (!track || typeof ResizeObserver === 'undefined') {\n return undefined;\n }\n const observer = new ResizeObserver(update);\n observer.observe(track);\n return () => observer.disconnect();\n }, [update, slides.length]);\n\n const scrollByPage = (direction: 1 | -1) => {\n trackRef.current?.scrollBy({\n left: direction * trackRef.current.clientWidth * 0.9,\n behavior,\n });\n };\n\n const goTo = (index: number) => {\n trackRef.current?.scrollTo({ left: offsetOf(index), behavior });\n };\n\n return (\n <section\n ref={ref}\n aria-roledescription=\"carousel\"\n aria-label={label}\n className={cn(carouselStyles, className)}\n {...props}\n >\n {header}\n <div\n ref={trackRef}\n className={carouselTrackStyles}\n data-carousel-track=\"\"\n onScroll={update}\n >\n {slides.map((slide, index) => (\n <div\n key={index}\n ref={(node) => {\n slideRefs.current[index] = node;\n }}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={slideLabel(index, slides.length)}\n className={cn(carouselSlideStyles, carouselSlideWidthStyles, slideClassName)}\n >\n {slide}\n </div>\n ))}\n </div>\n <div className={carouselControlsStyles}>\n <Button\n id={buttonIds.previous}\n type=\"button\"\n variant=\"secondary\"\n size=\"icon\"\n aria-label={previousLabel}\n disabled={edges.start}\n onClick={() => scrollByPage(-1)}\n >\n <span aria-hidden=\"true\">‹</span>\n </Button>\n {indicators && slides.length > 1 && (\n <div role=\"group\" aria-label={indicatorsLabel} className={carouselIndicatorsStyles}>\n {slides.map((_, index) => (\n <button\n key={index}\n type=\"button\"\n aria-label={goToLabel(index, slides.length)}\n aria-current={index === active ? 'true' : undefined}\n className={carouselIndicatorStyles}\n onClick={() => goTo(index)}\n >\n <span\n aria-hidden=\"true\"\n className={carouselDotStyles({ active: index === active })}\n />\n </button>\n ))}\n </div>\n )}\n <Button\n id={buttonIds.next}\n type=\"button\"\n variant=\"secondary\"\n size=\"icon\"\n aria-label={nextLabel}\n disabled={edges.end}\n onClick={() => scrollByPage(1)}\n >\n <span aria-hidden=\"true\">›</span>\n </Button>\n </div>\n </section>\n );\n },\n);\n\nCarousel.displayName = 'Carousel';\n"]}