@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.
- package/dist/{chunk-BKPP4D3Q.js → chunk-27HTTVFO.js} +2 -2
- package/dist/{chunk-BKPP4D3Q.js.map → chunk-27HTTVFO.js.map} +1 -1
- package/dist/chunk-4TPQTZSR.js +76 -0
- package/dist/chunk-4TPQTZSR.js.map +1 -0
- package/dist/{chunk-D4I5OF3C.js → chunk-5LKLTY55.js} +2 -2
- package/dist/{chunk-D4I5OF3C.js.map → chunk-5LKLTY55.js.map} +1 -1
- package/dist/{chunk-YYNW2PXL.js → chunk-DIA7L6IA.js} +3 -3
- package/dist/{chunk-YYNW2PXL.js.map → chunk-DIA7L6IA.js.map} +1 -1
- package/dist/{chunk-DP274HDM.js → chunk-IY452YEX.js} +14 -4
- package/dist/chunk-IY452YEX.js.map +1 -0
- package/dist/{chunk-4CY55XM3.js → chunk-J7X6NLSR.js} +29 -11
- package/dist/chunk-J7X6NLSR.js.map +1 -0
- package/dist/{chunk-5IHM2545.js → chunk-KAU7S3D4.js} +2 -2
- package/dist/{chunk-5IHM2545.js.map → chunk-KAU7S3D4.js.map} +1 -1
- package/dist/{chunk-ZABQF65Z.js → chunk-KSNAVEJP.js} +3 -3
- package/dist/{chunk-ZABQF65Z.js.map → chunk-KSNAVEJP.js.map} +1 -1
- package/dist/chunk-LLJXVAR6.js +184 -0
- package/dist/chunk-LLJXVAR6.js.map +1 -0
- package/dist/{chunk-7HQFLM4A.js → chunk-NA7YKEO4.js} +2 -2
- package/dist/{chunk-7HQFLM4A.js.map → chunk-NA7YKEO4.js.map} +1 -1
- package/dist/{chunk-L4BPQAXU.js → chunk-NTXFFBL6.js} +3 -3
- package/dist/{chunk-L4BPQAXU.js.map → chunk-NTXFFBL6.js.map} +1 -1
- package/dist/{chunk-P4CV2EPR.js → chunk-SPDOYFCU.js} +2 -2
- package/dist/{chunk-P4CV2EPR.js.map → chunk-SPDOYFCU.js.map} +1 -1
- package/dist/{chunk-42G4RRCZ.js → chunk-TO3FF6FR.js} +3 -3
- package/dist/{chunk-42G4RRCZ.js.map → chunk-TO3FF6FR.js.map} +1 -1
- package/dist/{chunk-UL33H4AD.js → chunk-TRLFK626.js} +24 -4
- package/dist/chunk-TRLFK626.js.map +1 -0
- package/dist/{chunk-3YRDRHO3.js → chunk-UUW7L2AV.js} +3 -3
- package/dist/{chunk-3YRDRHO3.js.map → chunk-UUW7L2AV.js.map} +1 -1
- package/dist/{chunk-PE6XEC7Y.js → chunk-VCJN4FS2.js} +4 -4
- package/dist/{chunk-PE6XEC7Y.js.map → chunk-VCJN4FS2.js.map} +1 -1
- package/dist/chunk-VK24YOIC.js +184 -0
- package/dist/chunk-VK24YOIC.js.map +1 -0
- package/dist/{chunk-BGUNAALU.js → chunk-XUGSIK2P.js} +3 -3
- package/dist/{chunk-BGUNAALU.js.map → chunk-XUGSIK2P.js.map} +1 -1
- package/dist/{chunk-N5CLCKR3.js → chunk-ZH2EDGW6.js} +3 -3
- package/dist/{chunk-N5CLCKR3.js.map → chunk-ZH2EDGW6.js.map} +1 -1
- package/dist/components/atoms/Icon/index.js +1 -1
- package/dist/components/atoms/Image/index.js +1 -1
- package/dist/components/atoms/Input/index.js +2 -2
- package/dist/components/atoms/Link/index.js +1 -1
- package/dist/components/atoms/RichText/index.js +1 -1
- package/dist/components/atoms/Select/index.js +2 -2
- package/dist/components/atoms/Switch/index.js +2 -2
- package/dist/components/atoms/Textarea/index.js +2 -2
- package/dist/components/molecules/BottomSheet/index.js +2 -2
- package/dist/components/molecules/Breadcrumbs/index.js +3 -3
- package/dist/components/molecules/Card/index.js +2 -2
- package/dist/components/molecules/Carousel/index.d.ts +61 -0
- package/dist/components/molecules/{CookieBanner → Carousel}/index.js +2 -2
- package/dist/components/molecules/Drawer/index.js +2 -2
- package/dist/components/molecules/Dropdown/index.js +2 -2
- package/dist/components/molecules/MediaCard/index.d.ts +56 -0
- package/dist/components/molecules/MediaCard/index.js +6 -0
- package/dist/components/molecules/Modal/index.d.ts +4 -0
- package/dist/components/molecules/Modal/index.js +2 -2
- package/dist/components/molecules/Snackbar/index.js +1 -1
- package/dist/components/molecules/Timeline/index.d.ts +7 -0
- package/dist/components/molecules/Timeline/index.js +3 -2
- package/dist/components/organisms/CookieConsent/index.d.ts +59 -0
- package/dist/components/{molecules/CookiePreferences → organisms/CookieConsent}/index.js +4 -4
- package/dist/components/organisms/CookieConsent/index.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +20 -19
- package/package.json +13 -9
- package/dist/chunk-4CY55XM3.js.map +0 -1
- package/dist/chunk-DP274HDM.js.map +0 -1
- package/dist/chunk-LSWJBAM6.js +0 -79
- package/dist/chunk-LSWJBAM6.js.map +0 -1
- package/dist/chunk-TR7XKJCO.js +0 -85
- package/dist/chunk-TR7XKJCO.js.map +0 -1
- package/dist/chunk-UL33H4AD.js.map +0 -1
- package/dist/components/molecules/CookieBanner/index.d.ts +0 -46
- package/dist/components/molecules/CookiePreferences/index.d.ts +0 -34
- /package/dist/components/molecules/{CookieBanner → Carousel}/index.js.map +0 -0
- /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-
|
|
62
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
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"]}
|
|
@@ -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-
|
|
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-
|
|
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-
|
|
62
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
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-
|
|
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(
|
|
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-
|
|
34
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
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)]
|
|
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
|
-
|
|
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
|
|
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
|
-
({
|
|
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-
|
|
84
|
-
//# sourceMappingURL=chunk-
|
|
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"]}
|
|
@@ -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-
|
|
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-
|
|
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-
|
|
74
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
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"]}
|