@inzumer/ui-library 0.1.2 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/LICENSE +21 -0
  2. package/dist/chunk-2HCMNEIQ.js +25 -0
  3. package/dist/chunk-2HCMNEIQ.js.map +1 -0
  4. package/dist/chunk-5IHM2545.js +40 -0
  5. package/dist/chunk-5IHM2545.js.map +1 -0
  6. package/dist/chunk-6LLGTBM6.js +9 -0
  7. package/dist/chunk-6LLGTBM6.js.map +1 -0
  8. package/dist/chunk-7HQFLM4A.js +31 -0
  9. package/dist/chunk-7HQFLM4A.js.map +1 -0
  10. package/dist/chunk-BKPP4D3Q.js +62 -0
  11. package/dist/chunk-BKPP4D3Q.js.map +1 -0
  12. package/dist/chunk-BNEEI7S5.js +28 -0
  13. package/dist/chunk-BNEEI7S5.js.map +1 -0
  14. package/dist/chunk-D4I5OF3C.js +43 -0
  15. package/dist/chunk-D4I5OF3C.js.map +1 -0
  16. package/dist/chunk-HCLY7B4H.js +90 -0
  17. package/dist/chunk-HCLY7B4H.js.map +1 -0
  18. package/dist/chunk-JCJP427C.js +31 -0
  19. package/dist/chunk-JCJP427C.js.map +1 -0
  20. package/dist/chunk-K35XIA25.js +81 -0
  21. package/dist/chunk-K35XIA25.js.map +1 -0
  22. package/dist/chunk-KWSZ2S34.js +76 -0
  23. package/dist/chunk-KWSZ2S34.js.map +1 -0
  24. package/dist/chunk-LK2EJ4H6.js +78 -0
  25. package/dist/chunk-LK2EJ4H6.js.map +1 -0
  26. package/dist/chunk-N5CLCKR3.js +71 -0
  27. package/dist/chunk-N5CLCKR3.js.map +1 -0
  28. package/dist/chunk-P4CV2EPR.js +72 -0
  29. package/dist/chunk-P4CV2EPR.js.map +1 -0
  30. package/dist/chunk-P4Z7HH66.js +14 -0
  31. package/dist/chunk-P4Z7HH66.js.map +1 -0
  32. package/dist/chunk-PE6XEC7Y.js +27 -0
  33. package/dist/chunk-PE6XEC7Y.js.map +1 -0
  34. package/dist/chunk-PVDRNAYK.js +68 -0
  35. package/dist/chunk-PVDRNAYK.js.map +1 -0
  36. package/dist/chunk-UL33H4AD.js +24 -0
  37. package/dist/chunk-UL33H4AD.js.map +1 -0
  38. package/dist/chunk-ZABQF65Z.js +74 -0
  39. package/dist/chunk-ZABQF65Z.js.map +1 -0
  40. package/dist/components/atoms/Button/index.d.ts +23 -0
  41. package/dist/components/atoms/Button/index.js +4 -0
  42. package/dist/components/atoms/Button/index.js.map +1 -0
  43. package/dist/components/atoms/Icon/index.d.ts +19 -0
  44. package/dist/components/atoms/Icon/index.js +4 -0
  45. package/dist/components/atoms/Icon/index.js.map +1 -0
  46. package/dist/components/atoms/Image/index.d.ts +23 -0
  47. package/dist/components/atoms/Image/index.js +4 -0
  48. package/dist/components/atoms/Image/index.js.map +1 -0
  49. package/dist/components/atoms/Input/index.d.ts +25 -0
  50. package/dist/components/atoms/Input/index.js +5 -0
  51. package/dist/components/atoms/Input/index.js.map +1 -0
  52. package/dist/components/atoms/Link/index.d.ts +21 -0
  53. package/dist/components/atoms/Link/index.js +4 -0
  54. package/dist/components/atoms/Link/index.js.map +1 -0
  55. package/dist/components/atoms/RichText/index.d.ts +25 -0
  56. package/dist/components/atoms/RichText/index.js +4 -0
  57. package/dist/components/atoms/RichText/index.js.map +1 -0
  58. package/dist/components/atoms/Switch/index.d.ts +15 -0
  59. package/dist/components/atoms/Switch/index.js +5 -0
  60. package/dist/components/atoms/Switch/index.js.map +1 -0
  61. package/dist/components/molecules/BottomSheet/index.d.ts +19 -0
  62. package/dist/components/molecules/BottomSheet/index.js +8 -0
  63. package/dist/components/molecules/BottomSheet/index.js.map +1 -0
  64. package/dist/components/molecules/Breadcrumbs/index.d.ts +20 -0
  65. package/dist/components/molecules/Breadcrumbs/index.js +6 -0
  66. package/dist/components/molecules/Breadcrumbs/index.js.map +1 -0
  67. package/dist/components/molecules/Card/index.d.ts +25 -0
  68. package/dist/components/molecules/Card/index.js +5 -0
  69. package/dist/components/molecules/Card/index.js.map +1 -0
  70. package/dist/components/molecules/Language/index.d.ts +19 -0
  71. package/dist/components/molecules/Language/index.js +4 -0
  72. package/dist/components/molecules/Language/index.js.map +1 -0
  73. package/dist/components/molecules/Modal/index.d.ts +19 -0
  74. package/dist/components/molecules/Modal/index.js +8 -0
  75. package/dist/components/molecules/Modal/index.js.map +1 -0
  76. package/dist/components/molecules/Snackbar/index.d.ts +27 -0
  77. package/dist/components/molecules/Snackbar/index.js +5 -0
  78. package/dist/components/molecules/Snackbar/index.js.map +1 -0
  79. package/dist/components/molecules/Timeline/index.d.ts +16 -0
  80. package/dist/components/molecules/Timeline/index.js +5 -0
  81. package/dist/components/molecules/Timeline/index.js.map +1 -0
  82. package/dist/hooks/useDelayedUnmount/index.d.ts +10 -0
  83. package/dist/hooks/useDelayedUnmount/index.js +3 -0
  84. package/dist/hooks/useDelayedUnmount/index.js.map +1 -0
  85. package/dist/hooks/useDismissableLayer/index.d.ts +6 -0
  86. package/dist/hooks/useDismissableLayer/index.js +3 -0
  87. package/dist/hooks/useDismissableLayer/index.js.map +1 -0
  88. package/dist/hooks/useMediaQuery/index.d.ts +3 -0
  89. package/dist/hooks/useMediaQuery/index.js +3 -0
  90. package/dist/hooks/useMediaQuery/index.js.map +1 -0
  91. package/dist/hooks/useMergedRef/index.d.ts +6 -0
  92. package/dist/hooks/useMergedRef/index.js +3 -0
  93. package/dist/hooks/useMergedRef/index.js.map +1 -0
  94. package/dist/index.d.ts +24 -0
  95. package/dist/index.js +21 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/utils/cn/index.d.ts +5 -0
  98. package/dist/utils/cn/index.js +3 -0
  99. package/dist/utils/cn/index.js.map +1 -0
  100. package/package.json +117 -72
  101. package/README.md +0 -133
  102. package/dist/cjs/index.js +0 -2
  103. package/dist/cjs/index.js.map +0 -1
  104. package/dist/es/components/atoms/Button/Button.js +0 -54
  105. package/dist/es/components/atoms/Button/Button.js.map +0 -1
  106. package/dist/es/components/atoms/Button/Button.styles.js +0 -54
  107. package/dist/es/components/atoms/Button/Button.styles.js.map +0 -1
  108. package/dist/es/index.js +0 -17
  109. package/dist/es/index.js.map +0 -1
  110. package/dist/es/tokens/colors.js +0 -40
  111. package/dist/es/tokens/colors.js.map +0 -1
  112. package/dist/es/tokens/motion.js +0 -15
  113. package/dist/es/tokens/motion.js.map +0 -1
  114. package/dist/es/tokens/radius.js +0 -10
  115. package/dist/es/tokens/radius.js.map +0 -1
  116. package/dist/es/tokens/spacing.js +0 -12
  117. package/dist/es/tokens/spacing.js.map +0 -1
  118. package/dist/es/tokens/typography.js +0 -24
  119. package/dist/es/tokens/typography.js.map +0 -1
  120. package/dist/es/tokens/z-index.js +0 -12
  121. package/dist/es/tokens/z-index.js.map +0 -1
  122. package/dist/es/utils/cn.js +0 -9
  123. package/dist/es/utils/cn.js.map +0 -1
  124. package/dist/globals.css +0 -1
  125. 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,9 @@
1
+ import { clsx } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+
4
+ // src/utils/cn/cn.ts
5
+ var cn = (...inputs) => twMerge(clsx(inputs));
6
+
7
+ export { cn };
8
+ //# sourceMappingURL=chunk-6LLGTBM6.js.map
9
+ //# sourceMappingURL=chunk-6LLGTBM6.js.map
@@ -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,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"]}
@@ -0,0 +1,76 @@
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 buttonStyles = cva(
7
+ [
8
+ "inline-flex items-center justify-center gap-2",
9
+ "font-medium text-sm leading-none",
10
+ "rounded-md",
11
+ "transition-colors duration-150 ease-in-out",
12
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--border-focus)] focus-visible:ring-offset-2",
13
+ "disabled:pointer-events-none disabled:opacity-50",
14
+ "select-none"
15
+ ],
16
+ {
17
+ variants: {
18
+ variant: {
19
+ primary: [
20
+ "bg-[var(--btn-primary-bg)] text-[var(--btn-primary-text)]",
21
+ "border border-[var(--btn-primary-border)]",
22
+ "hover:bg-[var(--btn-primary-bg-hover)]",
23
+ "active:bg-[var(--btn-primary-bg-active)]"
24
+ ],
25
+ secondary: [
26
+ "bg-[var(--btn-secondary-bg)] text-[var(--btn-secondary-text)]",
27
+ "border border-[var(--btn-secondary-border)]",
28
+ "hover:bg-[var(--btn-secondary-bg-hover)]",
29
+ "active:bg-[var(--btn-secondary-bg-active)]"
30
+ ],
31
+ ghost: [
32
+ "bg-[var(--btn-ghost-bg)] text-[var(--btn-ghost-text)]",
33
+ "border border-[var(--btn-ghost-border)]",
34
+ "hover:bg-[var(--btn-ghost-bg-hover)]",
35
+ "active:bg-[var(--btn-ghost-bg-active)]"
36
+ ],
37
+ destructive: [
38
+ "bg-[var(--btn-destructive-bg)] text-[var(--btn-destructive-text)]",
39
+ "border border-[var(--btn-destructive-border)]",
40
+ "hover:bg-[var(--btn-destructive-bg-hover)]",
41
+ "active:bg-[var(--btn-destructive-bg-active)]"
42
+ ]
43
+ },
44
+ size: {
45
+ sm: "h-8 px-3 text-xs",
46
+ md: "h-10 px-4 text-sm",
47
+ lg: "h-12 px-6 text-base",
48
+ icon: "h-10 w-10"
49
+ },
50
+ fullWidth: {
51
+ true: "w-full"
52
+ }
53
+ },
54
+ defaultVariants: {
55
+ variant: "primary",
56
+ size: "md"
57
+ }
58
+ }
59
+ );
60
+ var Button = forwardRef(
61
+ ({ className, variant, size, fullWidth, ...props }, ref) => {
62
+ return /* @__PURE__ */ jsx(
63
+ "button",
64
+ {
65
+ ref,
66
+ className: cn(buttonStyles({ variant, size, fullWidth }), className),
67
+ ...props
68
+ }
69
+ );
70
+ }
71
+ );
72
+ Button.displayName = "Button";
73
+
74
+ export { Button };
75
+ //# sourceMappingURL=chunk-KWSZ2S34.js.map
76
+ //# sourceMappingURL=chunk-KWSZ2S34.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/atoms/Button/Button.styles.ts","../src/components/atoms/Button/Button.tsx"],"names":[],"mappings":";;;;;AAEO,IAAM,YAAA,GAAe,GAAA;AAAA,EAC1B;AAAA,IACE,+CAAA;AAAA,IACA,kCAAA;AAAA,IACA,YAAA;AAAA,IACA,4CAAA;AAAA,IACA,sHAAA;AAAA,IACA,kDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS;AAAA,UACP,2DAAA;AAAA,UACA,2CAAA;AAAA,UACA,wCAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,SAAA,EAAW;AAAA,UACT,+DAAA;AAAA,UACA,6CAAA;AAAA,UACA,0CAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,KAAA,EAAO;AAAA,UACL,uDAAA;AAAA,UACA,yCAAA;AAAA,UACA,sCAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa;AAAA,UACX,mEAAA;AAAA,UACA,+CAAA;AAAA,UACA,4CAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,kBAAA;AAAA,QACJ,EAAA,EAAI,mBAAA;AAAA,QACJ,EAAA,EAAI,qBAAA;AAAA,QACJ,IAAA,EAAM;AAAA,OACR;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AC7CO,IAAM,MAAA,GAAS,UAAA;AAAA,EACpB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,MAAM,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC1D,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,GAAG,YAAA,CAAa,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA;AAAA,QAClE,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-KWSZ2S34.js","sourcesContent":["import { cva } from 'class-variance-authority';\n\nexport const buttonStyles = cva(\n [\n 'inline-flex items-center justify-center gap-2',\n 'font-medium text-sm leading-none',\n 'rounded-md',\n 'transition-colors duration-150 ease-in-out',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--border-focus)] focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'select-none',\n ],\n {\n variants: {\n variant: {\n primary: [\n 'bg-[var(--btn-primary-bg)] text-[var(--btn-primary-text)]',\n 'border border-[var(--btn-primary-border)]',\n 'hover:bg-[var(--btn-primary-bg-hover)]',\n 'active:bg-[var(--btn-primary-bg-active)]',\n ],\n secondary: [\n 'bg-[var(--btn-secondary-bg)] text-[var(--btn-secondary-text)]',\n 'border border-[var(--btn-secondary-border)]',\n 'hover:bg-[var(--btn-secondary-bg-hover)]',\n 'active:bg-[var(--btn-secondary-bg-active)]',\n ],\n ghost: [\n 'bg-[var(--btn-ghost-bg)] text-[var(--btn-ghost-text)]',\n 'border border-[var(--btn-ghost-border)]',\n 'hover:bg-[var(--btn-ghost-bg-hover)]',\n 'active:bg-[var(--btn-ghost-bg-active)]',\n ],\n destructive: [\n 'bg-[var(--btn-destructive-bg)] text-[var(--btn-destructive-text)]',\n 'border border-[var(--btn-destructive-border)]',\n 'hover:bg-[var(--btn-destructive-bg-hover)]',\n 'active:bg-[var(--btn-destructive-bg-active)]',\n ],\n },\n size: {\n sm: 'h-8 px-3 text-xs',\n md: 'h-10 px-4 text-sm',\n lg: 'h-12 px-6 text-base',\n icon: 'h-10 w-10',\n },\n fullWidth: {\n true: 'w-full',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n },\n);\n","import type { VariantProps } from 'class-variance-authority';\nimport { forwardRef, type ButtonHTMLAttributes } from 'react';\nimport { cn } from '@utils';\nimport { buttonStyles } from './Button.styles';\n\nexport type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> &\n VariantProps<typeof buttonStyles> & {\n asChild?: boolean;\n };\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, fullWidth, ...props }, ref) => {\n return (\n <button\n ref={ref}\n className={cn(buttonStyles({ variant, size, fullWidth }), className)}\n {...props}\n />\n );\n },\n);\n\nButton.displayName = 'Button';\n"]}