@inzumer/ui-library 0.1.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/chunk-2HCMNEIQ.js +25 -0
- package/dist/chunk-2HCMNEIQ.js.map +1 -0
- package/dist/chunk-5IHM2545.js +40 -0
- package/dist/chunk-5IHM2545.js.map +1 -0
- package/dist/chunk-6LLGTBM6.js +9 -0
- package/dist/chunk-6LLGTBM6.js.map +1 -0
- package/dist/chunk-7HQFLM4A.js +31 -0
- package/dist/chunk-7HQFLM4A.js.map +1 -0
- package/dist/chunk-BKPP4D3Q.js +62 -0
- package/dist/chunk-BKPP4D3Q.js.map +1 -0
- package/dist/chunk-BNEEI7S5.js +28 -0
- package/dist/chunk-BNEEI7S5.js.map +1 -0
- package/dist/chunk-D4I5OF3C.js +43 -0
- package/dist/chunk-D4I5OF3C.js.map +1 -0
- package/dist/chunk-GLXUQI5P.js +24 -0
- package/dist/chunk-GLXUQI5P.js.map +1 -0
- package/dist/chunk-HCLY7B4H.js +90 -0
- package/dist/chunk-HCLY7B4H.js.map +1 -0
- package/dist/chunk-JCJP427C.js +31 -0
- package/dist/chunk-JCJP427C.js.map +1 -0
- package/dist/chunk-K35XIA25.js +81 -0
- package/dist/chunk-K35XIA25.js.map +1 -0
- package/dist/chunk-KWSZ2S34.js +76 -0
- package/dist/chunk-KWSZ2S34.js.map +1 -0
- package/dist/chunk-LK2EJ4H6.js +78 -0
- package/dist/chunk-LK2EJ4H6.js.map +1 -0
- package/dist/chunk-N5CLCKR3.js +71 -0
- package/dist/chunk-N5CLCKR3.js.map +1 -0
- package/dist/chunk-P4CV2EPR.js +72 -0
- package/dist/chunk-P4CV2EPR.js.map +1 -0
- package/dist/chunk-P4Z7HH66.js +14 -0
- package/dist/chunk-P4Z7HH66.js.map +1 -0
- package/dist/chunk-PE6XEC7Y.js +27 -0
- package/dist/chunk-PE6XEC7Y.js.map +1 -0
- package/dist/chunk-PVDRNAYK.js +68 -0
- package/dist/chunk-PVDRNAYK.js.map +1 -0
- package/dist/chunk-ZABQF65Z.js +74 -0
- package/dist/chunk-ZABQF65Z.js.map +1 -0
- package/dist/components/atoms/Button/index.d.ts +23 -0
- package/dist/components/atoms/Button/index.js +4 -0
- package/dist/components/atoms/Button/index.js.map +1 -0
- package/dist/components/atoms/Icon/index.d.ts +19 -0
- package/dist/components/atoms/Icon/index.js +4 -0
- package/dist/components/atoms/Icon/index.js.map +1 -0
- package/dist/components/atoms/Image/index.d.ts +23 -0
- package/dist/components/atoms/Image/index.js +4 -0
- package/dist/components/atoms/Image/index.js.map +1 -0
- package/dist/components/atoms/Input/index.d.ts +25 -0
- package/dist/components/atoms/Input/index.js +5 -0
- package/dist/components/atoms/Input/index.js.map +1 -0
- package/dist/components/atoms/Link/index.d.ts +21 -0
- package/dist/components/atoms/Link/index.js +4 -0
- package/dist/components/atoms/Link/index.js.map +1 -0
- package/dist/components/atoms/RichText/index.d.ts +25 -0
- package/dist/components/atoms/RichText/index.js +4 -0
- package/dist/components/atoms/RichText/index.js.map +1 -0
- package/dist/components/atoms/Switch/index.d.ts +15 -0
- package/dist/components/atoms/Switch/index.js +5 -0
- package/dist/components/atoms/Switch/index.js.map +1 -0
- package/dist/components/molecules/BottomSheet/index.d.ts +19 -0
- package/dist/components/molecules/BottomSheet/index.js +8 -0
- package/dist/components/molecules/BottomSheet/index.js.map +1 -0
- package/dist/components/molecules/Breadcrumbs/index.d.ts +20 -0
- package/dist/components/molecules/Breadcrumbs/index.js +6 -0
- package/dist/components/molecules/Breadcrumbs/index.js.map +1 -0
- package/dist/components/molecules/Card/index.d.ts +25 -0
- package/dist/components/molecules/Card/index.js +5 -0
- package/dist/components/molecules/Card/index.js.map +1 -0
- package/dist/components/molecules/Language/index.d.ts +19 -0
- package/dist/components/molecules/Language/index.js +4 -0
- package/dist/components/molecules/Language/index.js.map +1 -0
- package/dist/components/molecules/Modal/index.d.ts +19 -0
- package/dist/components/molecules/Modal/index.js +8 -0
- package/dist/components/molecules/Modal/index.js.map +1 -0
- package/dist/components/molecules/Snackbar/index.d.ts +27 -0
- package/dist/components/molecules/Snackbar/index.js +5 -0
- package/dist/components/molecules/Snackbar/index.js.map +1 -0
- package/dist/components/molecules/Timeline/index.d.ts +16 -0
- package/dist/components/molecules/Timeline/index.js +5 -0
- package/dist/components/molecules/Timeline/index.js.map +1 -0
- package/dist/hooks/useDelayedUnmount/index.d.ts +10 -0
- package/dist/hooks/useDelayedUnmount/index.js +3 -0
- package/dist/hooks/useDelayedUnmount/index.js.map +1 -0
- package/dist/hooks/useDismissableLayer/index.d.ts +6 -0
- package/dist/hooks/useDismissableLayer/index.js +3 -0
- package/dist/hooks/useDismissableLayer/index.js.map +1 -0
- package/dist/hooks/useMediaQuery/index.d.ts +3 -0
- package/dist/hooks/useMediaQuery/index.js +3 -0
- package/dist/hooks/useMediaQuery/index.js.map +1 -0
- package/dist/hooks/useMergedRef/index.d.ts +6 -0
- package/dist/hooks/useMergedRef/index.js +3 -0
- package/dist/hooks/useMergedRef/index.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/cn/index.d.ts +5 -0
- package/dist/utils/cn/index.js +3 -0
- package/dist/utils/cn/index.js.map +1 -0
- package/package.json +117 -72
- package/README.md +0 -133
- package/dist/cjs/index.js +0 -2
- package/dist/cjs/index.js.map +0 -1
- package/dist/es/components/atoms/Button/Button.js +0 -54
- package/dist/es/components/atoms/Button/Button.js.map +0 -1
- package/dist/es/components/atoms/Button/Button.styles.js +0 -54
- package/dist/es/components/atoms/Button/Button.styles.js.map +0 -1
- package/dist/es/index.js +0 -17
- package/dist/es/index.js.map +0 -1
- package/dist/es/tokens/colors.js +0 -40
- package/dist/es/tokens/colors.js.map +0 -1
- package/dist/es/tokens/motion.js +0 -15
- package/dist/es/tokens/motion.js.map +0 -1
- package/dist/es/tokens/radius.js +0 -10
- package/dist/es/tokens/radius.js.map +0 -1
- package/dist/es/tokens/spacing.js +0 -12
- package/dist/es/tokens/spacing.js.map +0 -1
- package/dist/es/tokens/typography.js +0 -24
- package/dist/es/tokens/typography.js.map +0 -1
- package/dist/es/tokens/z-index.js +0 -12
- package/dist/es/tokens/z-index.js.map +0 -1
- package/dist/es/utils/cn.js +0 -9
- package/dist/es/utils/cn.js.map +0 -1
- package/dist/globals.css +0 -1
- package/dist/types/index.d.ts +0 -122
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Nahuel Zamuner
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/hooks/useMediaQuery/useMediaQuery.ts
|
|
4
|
+
var useMediaQuery = (query) => {
|
|
5
|
+
const [matches, setMatches] = useState(() => {
|
|
6
|
+
if (typeof window === "undefined") {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
return window.matchMedia(query).matches;
|
|
10
|
+
});
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
const mediaQueryList = window.matchMedia(query);
|
|
13
|
+
const handleChange = (event) => {
|
|
14
|
+
setMatches(event.matches);
|
|
15
|
+
};
|
|
16
|
+
setMatches(mediaQueryList.matches);
|
|
17
|
+
mediaQueryList.addEventListener("change", handleChange);
|
|
18
|
+
return () => mediaQueryList.removeEventListener("change", handleChange);
|
|
19
|
+
}, [query]);
|
|
20
|
+
return matches;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export { useMediaQuery };
|
|
24
|
+
//# sourceMappingURL=chunk-2HCMNEIQ.js.map
|
|
25
|
+
//# sourceMappingURL=chunk-2HCMNEIQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useMediaQuery/useMediaQuery.ts"],"names":[],"mappings":";;;AAEO,IAAM,aAAA,GAAgB,CAAC,KAAA,KAA2B;AACvD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,MAAM;AAC3C,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA,CAAE,OAAA;AAAA,EAClC,CAAC,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AAE9C,IAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAA+B;AACnD,MAAA,UAAA,CAAW,MAAM,OAAO,CAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,UAAA,CAAW,eAAe,OAAO,CAAA;AACjC,IAAA,cAAA,CAAe,gBAAA,CAAiB,UAAU,YAAY,CAAA;AACtD,IAAA,OAAO,MAAM,cAAA,CAAe,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,EACxE,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,OAAO,OAAA;AACT","file":"chunk-2HCMNEIQ.js","sourcesContent":["import { useEffect, useState } from 'react';\n\nexport const useMediaQuery = (query: string): boolean => {\n const [matches, setMatches] = useState(() => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n return window.matchMedia(query).matches;\n });\n\n useEffect(() => {\n const mediaQueryList = window.matchMedia(query);\n\n const handleChange = (event: MediaQueryListEvent) => {\n setMatches(event.matches);\n };\n\n setMatches(mediaQueryList.matches);\n mediaQueryList.addEventListener('change', handleChange);\n return () => mediaQueryList.removeEventListener('change', handleChange);\n }, [query]);\n\n return matches;\n};\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { cn } from './chunk-6LLGTBM6.js';
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var imageStyles = cva("block max-w-full", {
|
|
7
|
+
variants: {
|
|
8
|
+
fit: {
|
|
9
|
+
cover: "object-cover",
|
|
10
|
+
contain: "object-contain",
|
|
11
|
+
fill: "object-fill"
|
|
12
|
+
},
|
|
13
|
+
rounded: {
|
|
14
|
+
none: "",
|
|
15
|
+
md: "rounded-md",
|
|
16
|
+
full: "rounded-full"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: {
|
|
20
|
+
fit: "cover",
|
|
21
|
+
rounded: "none"
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
var Image = forwardRef(
|
|
25
|
+
({ className, fit, rounded, lazy = true, loading, alt, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
26
|
+
"img",
|
|
27
|
+
{
|
|
28
|
+
ref,
|
|
29
|
+
alt,
|
|
30
|
+
loading: loading ?? (lazy ? "lazy" : "eager"),
|
|
31
|
+
className: cn(imageStyles({ fit, rounded }), className),
|
|
32
|
+
...props
|
|
33
|
+
}
|
|
34
|
+
)
|
|
35
|
+
);
|
|
36
|
+
Image.displayName = "Image";
|
|
37
|
+
|
|
38
|
+
export { Image };
|
|
39
|
+
//# sourceMappingURL=chunk-5IHM2545.js.map
|
|
40
|
+
//# sourceMappingURL=chunk-5IHM2545.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/cn/cn.ts"],"names":[],"mappings":";;;;AAGO,IAAM,KAAK,CAAA,GAAI,MAAA,KAAiC,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC","file":"chunk-6LLGTBM6.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport const cn = (...inputs: ClassValue[]): string => twMerge(clsx(inputs));\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { cn } from './chunk-6LLGTBM6.js';
|
|
2
|
+
import { cva } from 'class-variance-authority';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var iconStyles = cva("inline-block shrink-0", {
|
|
6
|
+
variants: {
|
|
7
|
+
size: {
|
|
8
|
+
sm: "h-4 w-4",
|
|
9
|
+
md: "h-5 w-5",
|
|
10
|
+
lg: "h-6 w-6"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
defaultVariants: {
|
|
14
|
+
size: "md"
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
var Icon = ({ icon: IconComponent, size, className, label, ...props }) => /* @__PURE__ */ jsx(
|
|
18
|
+
IconComponent,
|
|
19
|
+
{
|
|
20
|
+
className: cn(iconStyles({ size }), className),
|
|
21
|
+
role: label ? "img" : void 0,
|
|
22
|
+
"aria-label": label,
|
|
23
|
+
"aria-hidden": label ? void 0 : true,
|
|
24
|
+
...props
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
Icon.displayName = "Icon";
|
|
28
|
+
|
|
29
|
+
export { Icon };
|
|
30
|
+
//# sourceMappingURL=chunk-7HQFLM4A.js.map
|
|
31
|
+
//# sourceMappingURL=chunk-7HQFLM4A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/atoms/Icon/Icon.styles.ts","../src/components/atoms/Icon/Icon.tsx"],"names":[],"mappings":";;;;AAEO,IAAM,UAAA,GAAa,IAAI,uBAAA,EAAyB;AAAA,EACrD,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,SAAA;AAAA,MACJ,EAAA,EAAI,SAAA;AAAA,MACJ,EAAA,EAAI;AAAA;AACN,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM;AAAA;AAEV,CAAC,CAAA;ACFM,IAAM,IAAA,GAAO,CAAC,EAAE,IAAA,EAAM,aAAA,EAAe,MAAM,SAAA,EAAW,KAAA,EAAO,GAAG,KAAA,EAAM,qBAC3E,GAAA;AAAA,EAAC,aAAA;AAAA,EAAA;AAAA,IACC,WAAW,EAAA,CAAG,UAAA,CAAW,EAAE,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,IAC7C,IAAA,EAAM,QAAQ,KAAA,GAAQ,MAAA;AAAA,IACtB,YAAA,EAAY,KAAA;AAAA,IACZ,aAAA,EAAa,QAAQ,MAAA,GAAY,IAAA;AAAA,IAChC,GAAG;AAAA;AACN;AAGF,IAAA,CAAK,WAAA,GAAc,MAAA","file":"chunk-7HQFLM4A.js","sourcesContent":["import { cva } from 'class-variance-authority';\n\nexport const iconStyles = cva('inline-block shrink-0', {\n variants: {\n size: {\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-6 w-6',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n","import type { VariantProps } from 'class-variance-authority';\nimport type { ComponentType, SVGProps } from 'react';\nimport { cn } from '@utils';\nimport { iconStyles } from './Icon.styles';\n\nexport type IconProps = Omit<SVGProps<SVGSVGElement>, 'children'> &\n VariantProps<typeof iconStyles> & {\n icon: ComponentType<SVGProps<SVGSVGElement>>;\n label?: string;\n };\n\nexport const Icon = ({ icon: IconComponent, size, className, label, ...props }: IconProps) => (\n <IconComponent\n className={cn(iconStyles({ size }), className)}\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n {...props}\n />\n);\n\nIcon.displayName = 'Icon';\n"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { useDelayedUnmount } from './chunk-BNEEI7S5.js';
|
|
2
|
+
import { cn } from './chunk-6LLGTBM6.js';
|
|
3
|
+
import { forwardRef, useEffect } from 'react';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
import { jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var snackbarWrapperStyles = "pointer-events-none fixed inset-x-0 bottom-4 z-50 flex justify-center px-4";
|
|
8
|
+
var snackbarStyles = cva(
|
|
9
|
+
[
|
|
10
|
+
"pointer-events-auto rounded-md border px-4 py-3 text-sm shadow-lg",
|
|
11
|
+
"transition-all duration-200 ease-out"
|
|
12
|
+
],
|
|
13
|
+
{
|
|
14
|
+
variants: {
|
|
15
|
+
status: {
|
|
16
|
+
info: "border-transparent bg-[var(--surface-inverse)] text-[var(--text-inverse)]",
|
|
17
|
+
success: "border-transparent bg-[rgb(var(--color-success-600))] text-white",
|
|
18
|
+
error: "border-transparent bg-[rgb(var(--color-danger-600))] text-white",
|
|
19
|
+
warning: "border-transparent bg-[rgb(var(--color-warning-500))] text-[rgb(var(--color-neutral-900))]"
|
|
20
|
+
},
|
|
21
|
+
visible: {
|
|
22
|
+
true: "translate-y-0 opacity-100",
|
|
23
|
+
false: "translate-y-2 opacity-0"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
defaultVariants: {
|
|
27
|
+
status: "info",
|
|
28
|
+
visible: false
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
var EXIT_DURATION_MS = 200;
|
|
33
|
+
var Snackbar = forwardRef(
|
|
34
|
+
({ open, onClose, message, status, duration = 4e3, className, ...props }, ref) => {
|
|
35
|
+
const { mounted, visible } = useDelayedUnmount(open, EXIT_DURATION_MS);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
if (!open || !duration) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const timeoutId = setTimeout(onClose, duration);
|
|
41
|
+
return () => clearTimeout(timeoutId);
|
|
42
|
+
}, [open, duration, onClose]);
|
|
43
|
+
if (!mounted) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
return /* @__PURE__ */ jsx("div", { className: snackbarWrapperStyles, children: /* @__PURE__ */ jsx(
|
|
47
|
+
"div",
|
|
48
|
+
{
|
|
49
|
+
ref,
|
|
50
|
+
role: status === "error" ? "alert" : "status",
|
|
51
|
+
className: cn(snackbarStyles({ status, visible }), className),
|
|
52
|
+
...props,
|
|
53
|
+
children: message
|
|
54
|
+
}
|
|
55
|
+
) });
|
|
56
|
+
}
|
|
57
|
+
);
|
|
58
|
+
Snackbar.displayName = "Snackbar";
|
|
59
|
+
|
|
60
|
+
export { Snackbar };
|
|
61
|
+
//# sourceMappingURL=chunk-BKPP4D3Q.js.map
|
|
62
|
+
//# sourceMappingURL=chunk-BKPP4D3Q.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/hooks/useDelayedUnmount/useDelayedUnmount.ts
|
|
4
|
+
var useDelayedUnmount = (open, exitDurationMs) => {
|
|
5
|
+
const [mounted, setMounted] = useState(open);
|
|
6
|
+
const [visible, setVisible] = useState(open);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
if (open) {
|
|
9
|
+
setMounted(true);
|
|
10
|
+
let innerRafId = 0;
|
|
11
|
+
const outerRafId = requestAnimationFrame(() => {
|
|
12
|
+
innerRafId = requestAnimationFrame(() => setVisible(true));
|
|
13
|
+
});
|
|
14
|
+
return () => {
|
|
15
|
+
cancelAnimationFrame(outerRafId);
|
|
16
|
+
cancelAnimationFrame(innerRafId);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
setVisible(false);
|
|
20
|
+
const timeoutId = setTimeout(() => setMounted(false), exitDurationMs);
|
|
21
|
+
return () => clearTimeout(timeoutId);
|
|
22
|
+
}, [open, exitDurationMs]);
|
|
23
|
+
return { mounted, visible };
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { useDelayedUnmount };
|
|
27
|
+
//# sourceMappingURL=chunk-BNEEI7S5.js.map
|
|
28
|
+
//# sourceMappingURL=chunk-BNEEI7S5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useDelayedUnmount/useDelayedUnmount.ts"],"names":[],"mappings":";;;AAMO,IAAM,iBAAA,GAAoB,CAAC,IAAA,EAAe,cAAA,KAA2B;AAC1E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAE3C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,UAAA,CAAW,IAAI,CAAA;AAMf,MAAA,IAAI,UAAA,GAAa,CAAA;AACjB,MAAA,MAAM,UAAA,GAAa,sBAAsB,MAAM;AAC7C,QAAA,UAAA,GAAa,qBAAA,CAAsB,MAAM,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,MAC3D,CAAC,CAAA;AACD,MAAA,OAAO,MAAM;AACX,QAAA,oBAAA,CAAqB,UAAU,CAAA;AAC/B,QAAA,oBAAA,CAAqB,UAAU,CAAA;AAAA,MACjC,CAAA;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAK,GAAG,cAAc,CAAA;AACpE,IAAA,OAAO,MAAM,aAAa,SAAS,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,IAAA,EAAM,cAAc,CAAC,CAAA;AAEzB,EAAA,OAAO,EAAE,SAAS,OAAA,EAAQ;AAC5B","file":"chunk-BNEEI7S5.js","sourcesContent":["import { useEffect, useState } from 'react';\n\n/**\n * Keeps a node mounted for `exitDurationMs` after `open` flips to false, so a CSS exit\n * transition has time to play before the node is actually removed from the DOM.\n */\nexport const useDelayedUnmount = (open: boolean, exitDurationMs: number) => {\n const [mounted, setMounted] = useState(open);\n const [visible, setVisible] = useState(open);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n\n // A single rAF can still land in the same paint as the \"closed\" styles that were\n // just committed, so the transition has no starting frame to animate from and the\n // element just snaps open. Nesting a second rAF guarantees the closed state has\n // actually been painted first.\n let innerRafId = 0;\n const outerRafId = requestAnimationFrame(() => {\n innerRafId = requestAnimationFrame(() => setVisible(true));\n });\n return () => {\n cancelAnimationFrame(outerRafId);\n cancelAnimationFrame(innerRafId);\n };\n }\n\n setVisible(false);\n const timeoutId = setTimeout(() => setMounted(false), exitDurationMs);\n return () => clearTimeout(timeoutId);\n }, [open, exitDurationMs]);\n\n return { mounted, visible };\n};\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { cn } from './chunk-6LLGTBM6.js';
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var linkStyles = cva(
|
|
7
|
+
[
|
|
8
|
+
"text-[var(--text-link)] transition-colors duration-150 ease-in-out",
|
|
9
|
+
"hover:text-[var(--text-link-hover)]"
|
|
10
|
+
],
|
|
11
|
+
{
|
|
12
|
+
variants: {
|
|
13
|
+
underline: {
|
|
14
|
+
always: "underline underline-offset-4",
|
|
15
|
+
hover: "underline-offset-4 hover:underline",
|
|
16
|
+
none: "no-underline"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: {
|
|
20
|
+
underline: "hover"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
var Link = forwardRef(
|
|
25
|
+
({ as: Component = "a", external, underline, className, target, rel, ...props }, ref) => {
|
|
26
|
+
const isExternal = external ?? target === "_blank";
|
|
27
|
+
return /* @__PURE__ */ jsx(
|
|
28
|
+
Component,
|
|
29
|
+
{
|
|
30
|
+
ref,
|
|
31
|
+
target: isExternal ? "_blank" : target,
|
|
32
|
+
rel: isExternal ? "noopener noreferrer" : rel,
|
|
33
|
+
className: cn(linkStyles({ underline }), className),
|
|
34
|
+
...props
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
Link.displayName = "Link";
|
|
40
|
+
|
|
41
|
+
export { Link };
|
|
42
|
+
//# sourceMappingURL=chunk-D4I5OF3C.js.map
|
|
43
|
+
//# sourceMappingURL=chunk-D4I5OF3C.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { RichText } from './chunk-P4CV2EPR.js';
|
|
2
|
+
import { cn } from './chunk-6LLGTBM6.js';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// src/components/molecules/Timeline/Timeline.styles.ts
|
|
7
|
+
var timelineStyles = "flex flex-col gap-8 border-l border-[var(--border-default)] pl-6";
|
|
8
|
+
var timelineItemStyles = "relative";
|
|
9
|
+
var timelineNodeStyles = "absolute -left-[1.6rem] top-1.5 h-2.5 w-2.5 rounded-full bg-[var(--btn-primary-bg)]";
|
|
10
|
+
var timelineTitleStyles = "text-base font-bold text-[var(--text-primary)]";
|
|
11
|
+
var timelineDescriptionListStyles = "mt-1 flex flex-col gap-1";
|
|
12
|
+
var timelineDescriptionStyles = "text-sm text-[var(--text-secondary)]";
|
|
13
|
+
var Timeline = forwardRef(
|
|
14
|
+
({ items, className, ...props }, ref) => /* @__PURE__ */ jsx("ul", { ref, className: cn(timelineStyles, className), ...props, children: items.map((item, index) => /* @__PURE__ */ jsxs("li", { className: timelineItemStyles, children: [
|
|
15
|
+
/* @__PURE__ */ jsx("span", { className: timelineNodeStyles }),
|
|
16
|
+
/* @__PURE__ */ jsx(RichText, { as: "p", variant: "p2", className: timelineTitleStyles, children: item.title }),
|
|
17
|
+
/* @__PURE__ */ jsx("div", { className: timelineDescriptionListStyles, children: item.description.map((description, descriptionIndex) => /* @__PURE__ */ jsx(RichText, { as: "p", variant: "p3", className: timelineDescriptionStyles, children: description }, descriptionIndex)) })
|
|
18
|
+
] }, item.id ?? index)) })
|
|
19
|
+
);
|
|
20
|
+
Timeline.displayName = "Timeline";
|
|
21
|
+
|
|
22
|
+
export { Timeline };
|
|
23
|
+
//# sourceMappingURL=chunk-GLXUQI5P.js.map
|
|
24
|
+
//# sourceMappingURL=chunk-GLXUQI5P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/molecules/Timeline/Timeline.styles.ts","../src/components/molecules/Timeline/Timeline.tsx"],"names":[],"mappings":";;;;;;AAAO,IAAM,cAAA,GAAiB,kEAAA;AAEvB,IAAM,kBAAA,GAAqB,UAAA;AAE3B,IAAM,kBAAA,GACX,qFAAA;AAEK,IAAM,mBAAA,GAAsB,gDAAA;AAE5B,IAAM,6BAAA,GAAgC,0BAAA;AAEtC,IAAM,yBAAA,GAA4B,sCAAA;ACWlC,IAAM,QAAA,GAAW,UAAA;AAAA,EACtB,CAAC,EAAE,KAAA,EAAO,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC/B,GAAA,CAAC,IAAA,EAAA,EAAG,GAAA,EAAU,SAAA,EAAW,EAAA,CAAG,gBAAgB,SAAS,CAAA,EAAI,GAAG,KAAA,EACzD,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBAChB,IAAA,CAAC,IAAA,EAAA,EAA0B,SAAA,EAAW,kBAAA,EACpC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAW,kBAAA,EAAoB,CAAA;AAAA,oBACrC,GAAA,CAAC,YAAS,EAAA,EAAG,GAAA,EAAI,SAAQ,IAAA,EAAK,SAAA,EAAW,mBAAA,EACtC,QAAA,EAAA,IAAA,CAAK,KAAA,EACR,CAAA;AAAA,oBACA,GAAA,CAAC,SAAI,SAAA,EAAW,6BAAA,EACb,eAAK,WAAA,CAAY,GAAA,CAAI,CAAC,WAAA,EAAa,gBAAA,yBACjC,QAAA,EAAA,EAAgC,EAAA,EAAG,KAAI,OAAA,EAAQ,IAAA,EAAK,WAAW,yBAAA,EAC7D,QAAA,EAAA,WAAA,EAAA,EADY,gBAEf,CACD,CAAA,EACH;AAAA,GAAA,EAAA,EAXO,IAAA,CAAK,EAAA,IAAM,KAYpB,CACD,CAAA,EACH;AAEJ;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-GLXUQI5P.js","sourcesContent":["export const timelineStyles = 'flex flex-col gap-8 border-l border-[var(--border-default)] pl-6';\n\nexport const timelineItemStyles = 'relative';\n\nexport const timelineNodeStyles =\n 'absolute -left-[1.6rem] top-1.5 h-2.5 w-2.5 rounded-full bg-[var(--btn-primary-bg)]';\n\nexport const timelineTitleStyles = 'text-base font-bold text-[var(--text-primary)]';\n\nexport const timelineDescriptionListStyles = 'mt-1 flex flex-col gap-1';\n\nexport const timelineDescriptionStyles = 'text-sm text-[var(--text-secondary)]';\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { RichText } from '@components';\nimport { cn } from '@utils';\nimport {\n timelineDescriptionListStyles,\n timelineDescriptionStyles,\n timelineItemStyles,\n timelineNodeStyles,\n timelineStyles,\n timelineTitleStyles,\n} from './Timeline.styles';\n\nexport interface TimelineItem {\n id?: string;\n title: ReactNode;\n description: ReactNode[];\n}\n\nexport type TimelineProps = HTMLAttributes<HTMLUListElement> & {\n items: TimelineItem[];\n};\n\nexport const Timeline = forwardRef<HTMLUListElement, TimelineProps>(\n ({ items, className, ...props }, ref) => (\n <ul ref={ref} className={cn(timelineStyles, className)} {...props}>\n {items.map((item, index) => (\n <li key={item.id ?? index} className={timelineItemStyles}>\n <span className={timelineNodeStyles} />\n <RichText as=\"p\" variant=\"p2\" className={timelineTitleStyles}>\n {item.title}\n </RichText>\n <div className={timelineDescriptionListStyles}>\n {item.description.map((description, descriptionIndex) => (\n <RichText key={descriptionIndex} as=\"p\" variant=\"p3\" className={timelineDescriptionStyles}>\n {description}\n </RichText>\n ))}\n </div>\n </li>\n ))}\n </ul>\n ),\n);\n\nTimeline.displayName = 'Timeline';\n"]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { cn } from './chunk-6LLGTBM6.js';
|
|
2
|
+
import { forwardRef, useRef, useState, useLayoutEffect } from 'react';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var languageStyles = "relative inline-flex items-center gap-1 rounded-md border border-[var(--border-default)] bg-[var(--surface-secondary)] p-1";
|
|
7
|
+
var languageIndicatorStyles = "absolute left-0 top-0 rounded bg-[var(--btn-primary-bg)] transition-[transform,width,height] duration-200 ease-out";
|
|
8
|
+
var languageOptionStyles = cva(
|
|
9
|
+
"relative z-10 rounded px-2.5 py-1 text-xs font-semibold uppercase transition-colors duration-200 ease-out",
|
|
10
|
+
{
|
|
11
|
+
variants: {
|
|
12
|
+
selected: {
|
|
13
|
+
true: "text-[var(--btn-primary-text)]",
|
|
14
|
+
false: "text-[var(--text-secondary)] hover:text-[var(--text-primary)]"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
defaultVariants: {
|
|
18
|
+
selected: false
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
var Language = forwardRef(
|
|
23
|
+
({ options, value, onChange, className, ...props }, ref) => {
|
|
24
|
+
const buttonRefs = useRef(/* @__PURE__ */ new Map());
|
|
25
|
+
const [indicator, setIndicator] = useState(null);
|
|
26
|
+
useLayoutEffect(() => {
|
|
27
|
+
const activeButton = buttonRefs.current.get(value);
|
|
28
|
+
if (!activeButton) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
setIndicator({
|
|
32
|
+
left: activeButton.offsetLeft,
|
|
33
|
+
top: activeButton.offsetTop,
|
|
34
|
+
width: activeButton.offsetWidth,
|
|
35
|
+
height: activeButton.offsetHeight
|
|
36
|
+
});
|
|
37
|
+
}, [value, options]);
|
|
38
|
+
return /* @__PURE__ */ jsxs(
|
|
39
|
+
"div",
|
|
40
|
+
{
|
|
41
|
+
ref,
|
|
42
|
+
role: "listbox",
|
|
43
|
+
"aria-label": "Language selector",
|
|
44
|
+
className: cn(languageStyles, className),
|
|
45
|
+
...props,
|
|
46
|
+
children: [
|
|
47
|
+
indicator && /* @__PURE__ */ jsx(
|
|
48
|
+
"span",
|
|
49
|
+
{
|
|
50
|
+
"aria-hidden": true,
|
|
51
|
+
className: languageIndicatorStyles,
|
|
52
|
+
style: {
|
|
53
|
+
width: indicator.width,
|
|
54
|
+
height: indicator.height,
|
|
55
|
+
transform: `translate(${indicator.left}px, ${indicator.top}px)`
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
),
|
|
59
|
+
options.map((option) => {
|
|
60
|
+
const selected = option.value === value;
|
|
61
|
+
return /* @__PURE__ */ jsx(
|
|
62
|
+
"button",
|
|
63
|
+
{
|
|
64
|
+
ref: (node) => {
|
|
65
|
+
if (node) {
|
|
66
|
+
buttonRefs.current.set(option.value, node);
|
|
67
|
+
} else {
|
|
68
|
+
buttonRefs.current.delete(option.value);
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
type: "button",
|
|
72
|
+
role: "option",
|
|
73
|
+
"aria-selected": selected,
|
|
74
|
+
onClick: () => onChange(option.value),
|
|
75
|
+
className: languageOptionStyles({ selected }),
|
|
76
|
+
children: option.label
|
|
77
|
+
},
|
|
78
|
+
option.value
|
|
79
|
+
);
|
|
80
|
+
})
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
Language.displayName = "Language";
|
|
87
|
+
|
|
88
|
+
export { Language };
|
|
89
|
+
//# sourceMappingURL=chunk-HCLY7B4H.js.map
|
|
90
|
+
//# sourceMappingURL=chunk-HCLY7B4H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/molecules/Language/Language.styles.ts","../src/components/molecules/Language/Language.tsx"],"names":[],"mappings":";;;;;AAEO,IAAM,cAAA,GACX,4HAAA;AAEK,IAAM,uBAAA,GACX,oHAAA;AAEK,IAAM,oBAAA,GAAuB,GAAA;AAAA,EAClC,2GAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,gCAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,QAAA,EAAU;AAAA;AACZ;AAEJ,CAAA;ACAO,IAAM,QAAA,GAAW,UAAA;AAAA,EACtB,CAAC,EAAE,OAAA,EAAS,KAAA,EAAO,UAAU,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC1D,IAAA,MAAM,UAAA,GAAa,MAAA,iBAAO,IAAI,GAAA,EAAgC,CAAA;AAC9D,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAA+B,IAAI,CAAA;AAErE,IAAA,eAAA,CAAgB,MAAM;AACpB,MAAA,MAAM,YAAA,GAAe,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AACjD,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,YAAA,CAAa;AAAA,QACX,MAAM,YAAA,CAAa,UAAA;AAAA,QACnB,KAAK,YAAA,CAAa,SAAA;AAAA,QAClB,OAAO,YAAA,CAAa,WAAA;AAAA,QACpB,QAAQ,YAAA,CAAa;AAAA,OACtB,CAAA;AAAA,IACH,CAAA,EAAG,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA;AAEnB,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,SAAA;AAAA,QACL,YAAA,EAAW,mBAAA;AAAA,QACX,SAAA,EAAW,EAAA,CAAG,cAAA,EAAgB,SAAS,CAAA;AAAA,QACtC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,SAAA,oBACC,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,SAAA,EAAW,uBAAA;AAAA,cACX,KAAA,EAAO;AAAA,gBACL,OAAO,SAAA,CAAU,KAAA;AAAA,gBACjB,QAAQ,SAAA,CAAU,MAAA;AAAA,gBAClB,WAAW,CAAA,UAAA,EAAa,SAAA,CAAU,IAAI,CAAA,IAAA,EAAO,UAAU,GAAG,CAAA,GAAA;AAAA;AAC5D;AAAA,WACF;AAAA,UAED,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,YAAA,MAAM,QAAA,GAAW,OAAO,KAAA,KAAU,KAAA;AAElC,YAAA,uBACE,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,kBAAA,IAAI,IAAA,EAAM;AACR,oBAAA,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,IAAI,CAAA;AAAA,kBAC3C,CAAA,MAAO;AACL,oBAAA,UAAA,CAAW,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA,kBACxC;AAAA,gBACF,CAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,QAAA;AAAA,gBACL,eAAA,EAAe,QAAA;AAAA,gBACf,OAAA,EAAS,MAAM,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAAA,gBACpC,SAAA,EAAW,oBAAA,CAAqB,EAAE,QAAA,EAAU,CAAA;AAAA,gBAE3C,QAAA,EAAA,MAAA,CAAO;AAAA,eAAA;AAAA,cAdH,MAAA,CAAO;AAAA,aAed;AAAA,UAEJ,CAAC;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-HCLY7B4H.js","sourcesContent":["import { cva } from 'class-variance-authority';\n\nexport const languageStyles =\n 'relative inline-flex items-center gap-1 rounded-md border border-[var(--border-default)] bg-[var(--surface-secondary)] p-1';\n\nexport const languageIndicatorStyles =\n 'absolute left-0 top-0 rounded bg-[var(--btn-primary-bg)] transition-[transform,width,height] duration-200 ease-out';\n\nexport const languageOptionStyles = cva(\n 'relative z-10 rounded px-2.5 py-1 text-xs font-semibold uppercase transition-colors duration-200 ease-out',\n {\n variants: {\n selected: {\n true: 'text-[var(--btn-primary-text)]',\n false: 'text-[var(--text-secondary)] hover:text-[var(--text-primary)]',\n },\n },\n defaultVariants: {\n selected: false,\n },\n },\n);\n","import { forwardRef, useLayoutEffect, useRef, useState, type HTMLAttributes } from 'react';\nimport { cn } from '@utils';\nimport {\n languageIndicatorStyles,\n languageOptionStyles,\n languageStyles,\n} from './Language.styles';\n\nexport interface LanguageOption {\n value: string;\n label: string;\n}\n\nexport type LanguageProps = Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> & {\n options: LanguageOption[];\n value: string;\n onChange: (value: string) => void;\n};\n\ntype IndicatorRect = { left: number; top: number; width: number; height: number };\n\nexport const Language = forwardRef<HTMLDivElement, LanguageProps>(\n ({ options, value, onChange, className, ...props }, ref) => {\n const buttonRefs = useRef(new Map<string, HTMLButtonElement>());\n const [indicator, setIndicator] = useState<IndicatorRect | null>(null);\n\n useLayoutEffect(() => {\n const activeButton = buttonRefs.current.get(value);\n if (!activeButton) {\n return;\n }\n\n setIndicator({\n left: activeButton.offsetLeft,\n top: activeButton.offsetTop,\n width: activeButton.offsetWidth,\n height: activeButton.offsetHeight,\n });\n }, [value, options]);\n\n return (\n <div\n ref={ref}\n role=\"listbox\"\n aria-label=\"Language selector\"\n className={cn(languageStyles, className)}\n {...props}\n >\n {indicator && (\n <span\n aria-hidden\n className={languageIndicatorStyles}\n style={{\n width: indicator.width,\n height: indicator.height,\n transform: `translate(${indicator.left}px, ${indicator.top}px)`,\n }}\n />\n )}\n {options.map((option) => {\n const selected = option.value === value;\n\n return (\n <button\n key={option.value}\n ref={(node) => {\n if (node) {\n buttonRefs.current.set(option.value, node);\n } else {\n buttonRefs.current.delete(option.value);\n }\n }}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n onClick={() => onChange(option.value)}\n className={languageOptionStyles({ selected })}\n >\n {option.label}\n </button>\n );\n })}\n </div>\n );\n },\n);\n\nLanguage.displayName = 'Language';\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/hooks/useDismissableLayer/useDismissableLayer.ts
|
|
4
|
+
var useDismissableLayer = (open, onClose, panelRef, closeOnBackdropClick = true) => {
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
if (!open) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const handleKeyDown = (event) => {
|
|
10
|
+
if (event.key === "Escape") {
|
|
11
|
+
onClose();
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
const handlePointerDown = (event) => {
|
|
15
|
+
const clickedOutside = !panelRef.current || !panelRef.current.contains(event.target);
|
|
16
|
+
if (closeOnBackdropClick && clickedOutside) {
|
|
17
|
+
onClose();
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
21
|
+
document.addEventListener("pointerdown", handlePointerDown);
|
|
22
|
+
return () => {
|
|
23
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
24
|
+
document.removeEventListener("pointerdown", handlePointerDown);
|
|
25
|
+
};
|
|
26
|
+
}, [open, onClose, closeOnBackdropClick, panelRef]);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export { useDismissableLayer };
|
|
30
|
+
//# sourceMappingURL=chunk-JCJP427C.js.map
|
|
31
|
+
//# sourceMappingURL=chunk-JCJP427C.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useDismissableLayer/useDismissableLayer.ts"],"names":[],"mappings":";;;AAGO,IAAM,sBAAsB,CACjC,IAAA,EACA,OAAA,EACA,QAAA,EACA,uBAAuB,IAAA,KACpB;AACH,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAyB;AAC9C,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAAwB;AACjD,MAAA,MAAM,cAAA,GAAiB,CAAC,QAAA,CAAS,OAAA,IAAW,CAAC,QAAA,CAAS,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA;AAC3F,MAAA,IAAI,wBAAwB,cAAA,EAAgB;AAC1C,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,QAAA,CAAS,gBAAA,CAAiB,eAAe,iBAAiB,CAAA;AAC1D,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,aAAa,CAAA;AACrD,MAAA,QAAA,CAAS,mBAAA,CAAoB,eAAe,iBAAiB,CAAA;AAAA,IAC/D,CAAA;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,OAAA,EAAS,oBAAA,EAAsB,QAAQ,CAAC,CAAA;AACpD","file":"chunk-JCJP427C.js","sourcesContent":["import { useEffect, type RefObject } from 'react';\n\n/** Closes an overlay (dialog, sheet, ...) on Escape or on pointerdown outside `panelRef`. */\nexport const useDismissableLayer = (\n open: boolean,\n onClose: () => void,\n panelRef: RefObject<HTMLElement | null>,\n closeOnBackdropClick = true,\n) => {\n useEffect(() => {\n if (!open) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n const handlePointerDown = (event: PointerEvent) => {\n const clickedOutside = !panelRef.current || !panelRef.current.contains(event.target as Node);\n if (closeOnBackdropClick && clickedOutside) {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n document.addEventListener('pointerdown', handlePointerDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n document.removeEventListener('pointerdown', handlePointerDown);\n };\n }, [open, onClose, closeOnBackdropClick, panelRef]);\n};\n"]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { useDismissableLayer } from './chunk-JCJP427C.js';
|
|
2
|
+
import { useMergedRef } from './chunk-P4Z7HH66.js';
|
|
3
|
+
import { useDelayedUnmount } from './chunk-BNEEI7S5.js';
|
|
4
|
+
import { RichText } from './chunk-P4CV2EPR.js';
|
|
5
|
+
import { cn } from './chunk-6LLGTBM6.js';
|
|
6
|
+
import { forwardRef, useRef } from 'react';
|
|
7
|
+
import { cva } from 'class-variance-authority';
|
|
8
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
9
|
+
|
|
10
|
+
var bottomSheetOverlayStyles = cva(
|
|
11
|
+
[
|
|
12
|
+
"fixed inset-0 z-50 flex items-end justify-center bg-[var(--surface-overlay)]",
|
|
13
|
+
"transition-opacity duration-200 ease-out"
|
|
14
|
+
],
|
|
15
|
+
{
|
|
16
|
+
variants: {
|
|
17
|
+
visible: {
|
|
18
|
+
true: "opacity-100",
|
|
19
|
+
false: "opacity-0"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
defaultVariants: {
|
|
23
|
+
visible: false
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
var bottomSheetPanelStyles = cva(
|
|
28
|
+
[
|
|
29
|
+
"w-full max-w-md rounded-t-xl border border-b-0 border-[var(--border-default)]",
|
|
30
|
+
"bg-[var(--surface-secondary)] p-6 shadow-lg",
|
|
31
|
+
"transition-transform duration-200 ease-out"
|
|
32
|
+
],
|
|
33
|
+
{
|
|
34
|
+
variants: {
|
|
35
|
+
visible: {
|
|
36
|
+
true: "translate-y-0",
|
|
37
|
+
false: "translate-y-full"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
defaultVariants: {
|
|
41
|
+
visible: false
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
var bottomSheetHandleStyles = "mx-auto mb-4 h-1.5 w-10 rounded-full bg-[var(--border-strong)]";
|
|
46
|
+
var bottomSheetTitleStyles = "mb-4 text-lg font-semibold text-[var(--text-primary)]";
|
|
47
|
+
var bottomSheetFooterStyles = "mt-6 flex items-center justify-end gap-2";
|
|
48
|
+
var EXIT_DURATION_MS = 200;
|
|
49
|
+
var BottomSheet = forwardRef(
|
|
50
|
+
({ open, onClose, title, footer, closeOnBackdropClick = true, className, children, ...props }, ref) => {
|
|
51
|
+
const panelRef = useRef(null);
|
|
52
|
+
const setPanelRef = useMergedRef(ref, panelRef);
|
|
53
|
+
const { mounted, visible } = useDelayedUnmount(open, EXIT_DURATION_MS);
|
|
54
|
+
useDismissableLayer(open, onClose, panelRef, closeOnBackdropClick);
|
|
55
|
+
if (!mounted) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
return /* @__PURE__ */ jsx("div", { className: bottomSheetOverlayStyles({ visible }), children: /* @__PURE__ */ jsxs(
|
|
59
|
+
"div",
|
|
60
|
+
{
|
|
61
|
+
ref: setPanelRef,
|
|
62
|
+
role: "dialog",
|
|
63
|
+
"aria-modal": "true",
|
|
64
|
+
"aria-labelledby": title ? "bottom-sheet-title" : void 0,
|
|
65
|
+
className: cn(bottomSheetPanelStyles({ visible }), className),
|
|
66
|
+
...props,
|
|
67
|
+
children: [
|
|
68
|
+
/* @__PURE__ */ jsx("div", { "aria-hidden": true, className: bottomSheetHandleStyles }),
|
|
69
|
+
title && /* @__PURE__ */ jsx(RichText, { as: "h2", id: "bottom-sheet-title", variant: "s1", className: bottomSheetTitleStyles, children: title }),
|
|
70
|
+
children,
|
|
71
|
+
footer && /* @__PURE__ */ jsx("div", { className: bottomSheetFooterStyles, children: footer })
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
) });
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
BottomSheet.displayName = "BottomSheet";
|
|
78
|
+
|
|
79
|
+
export { BottomSheet };
|
|
80
|
+
//# sourceMappingURL=chunk-K35XIA25.js.map
|
|
81
|
+
//# sourceMappingURL=chunk-K35XIA25.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/molecules/BottomSheet/BottomSheet.styles.ts","../src/components/molecules/BottomSheet/BottomSheet.tsx"],"names":[],"mappings":";;;;;;;;;AAEO,IAAM,wBAAA,GAA2B,GAAA;AAAA,EACtC;AAAA,IACE,8EAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS;AAAA;AACX;AAEJ,CAAA;AAEO,IAAM,sBAAA,GAAyB,GAAA;AAAA,EACpC;AAAA,IACE,+EAAA;AAAA,IACA,6CAAA;AAAA,IACA;AAAA,GACF;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;AAEO,IAAM,uBAAA,GACX,gEAAA;AAEK,IAAM,sBAAA,GAAyB,uDAAA;AAE/B,IAAM,uBAAA,GAA0B,0CAAA;AChCvC,IAAM,gBAAA,GAAmB,GAAA;AAUlB,IAAM,WAAA,GAAc,UAAA;AAAA,EACzB,CACE,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,oBAAA,GAAuB,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,GAAG,KAAA,IACrF,GAAA,KACG;AACH,IAAA,MAAM,QAAA,GAAW,OAA8B,IAAI,CAAA;AACnD,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,GAAA,EAAK,QAAQ,CAAA;AAC9C,IAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,iBAAA,CAAkB,MAAM,gBAAgB,CAAA;AAErE,IAAA,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,oBAAoB,CAAA;AAEjE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAW,yBAAyB,EAAE,OAAA,EAAS,CAAA,EAClD,QAAA,kBAAA,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,WAAA;AAAA,QACL,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,MAAA;AAAA,QACX,iBAAA,EAAiB,QAAQ,oBAAA,GAAuB,MAAA;AAAA,QAChD,WAAW,EAAA,CAAG,sBAAA,CAAuB,EAAE,OAAA,EAAS,GAAG,SAAS,CAAA;AAAA,QAC3D,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAW,IAAA,EAAC,SAAA,EAAW,uBAAA,EAAyB,CAAA;AAAA,UACpD,KAAA,oBACC,GAAA,CAAC,QAAA,EAAA,EAAS,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,oBAAA,EAAqB,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAW,sBAAA,EAC/D,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,UAED,QAAA;AAAA,UACA,MAAA,oBAAU,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,yBAA0B,QAAA,EAAA,MAAA,EAAO;AAAA;AAAA;AAAA,KAC9D,EACF,CAAA;AAAA,EAEJ;AACF;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA","file":"chunk-K35XIA25.js","sourcesContent":["import { cva } from 'class-variance-authority';\n\nexport const bottomSheetOverlayStyles = cva(\n [\n 'fixed inset-0 z-50 flex items-end 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 bottomSheetPanelStyles = cva(\n [\n 'w-full max-w-md rounded-t-xl border border-b-0 border-[var(--border-default)]',\n 'bg-[var(--surface-secondary)] p-6 shadow-lg',\n 'transition-transform duration-200 ease-out',\n ],\n {\n variants: {\n visible: {\n true: 'translate-y-0',\n false: 'translate-y-full',\n },\n },\n defaultVariants: {\n visible: false,\n },\n },\n);\n\nexport const bottomSheetHandleStyles =\n 'mx-auto mb-4 h-1.5 w-10 rounded-full bg-[var(--border-strong)]';\n\nexport const bottomSheetTitleStyles = 'mb-4 text-lg font-semibold text-[var(--text-primary)]';\n\nexport const bottomSheetFooterStyles = 'mt-6 flex items-center justify-end gap-2';\n","import { forwardRef, useRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { RichText } from '@components';\nimport { useDelayedUnmount, useDismissableLayer, useMergedRef } from '@hooks';\nimport { cn } from '@utils';\nimport {\n bottomSheetFooterStyles,\n bottomSheetHandleStyles,\n bottomSheetOverlayStyles,\n bottomSheetPanelStyles,\n bottomSheetTitleStyles,\n} from './BottomSheet.styles';\n\nconst EXIT_DURATION_MS = 200;\n\nexport type BottomSheetProps = Omit<HTMLAttributes<HTMLDivElement>, 'title'> & {\n open: boolean;\n onClose: () => void;\n title?: ReactNode;\n footer?: ReactNode;\n closeOnBackdropClick?: boolean;\n};\n\nexport const BottomSheet = forwardRef<HTMLDivElement, BottomSheetProps>(\n (\n { open, onClose, title, footer, closeOnBackdropClick = true, className, children, ...props },\n ref,\n ) => {\n const panelRef = useRef<HTMLDivElement | null>(null);\n const setPanelRef = useMergedRef(ref, panelRef);\n const { mounted, visible } = useDelayedUnmount(open, EXIT_DURATION_MS);\n\n useDismissableLayer(open, onClose, panelRef, closeOnBackdropClick);\n\n if (!mounted) {\n return null;\n }\n\n return (\n <div className={bottomSheetOverlayStyles({ visible })}>\n <div\n ref={setPanelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'bottom-sheet-title' : undefined}\n className={cn(bottomSheetPanelStyles({ visible }), className)}\n {...props}\n >\n <div aria-hidden className={bottomSheetHandleStyles} />\n {title && (\n <RichText as=\"h2\" id=\"bottom-sheet-title\" variant=\"s1\" className={bottomSheetTitleStyles}>\n {title}\n </RichText>\n )}\n {children}\n {footer && <div className={bottomSheetFooterStyles}>{footer}</div>}\n </div>\n </div>\n );\n },\n);\n\nBottomSheet.displayName = 'BottomSheet';\n"]}
|