@vite-mf-monorepo/ui 0.4.4 → 0.4.6

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 (228) hide show
  1. package/dist/Avatar/Avatar.d.ts +19 -0
  2. package/dist/Avatar/Avatar.js +62 -0
  3. package/dist/Avatar/Avatar.js.map +1 -0
  4. package/dist/Avatar/index.d.ts +3 -0
  5. package/dist/Avatar/index.js +5 -0
  6. package/dist/Avatar/index.js.map +1 -0
  7. package/dist/Badge/Badge.d.ts +23 -0
  8. package/dist/Badge/Badge.js +48 -0
  9. package/dist/Badge/Badge.js.map +1 -0
  10. package/dist/Badge/index.d.ts +4 -0
  11. package/dist/Badge/index.js +5 -0
  12. package/dist/Badge/index.js.map +1 -0
  13. package/dist/Button/Button.utils.d.ts +23 -0
  14. package/dist/{chunk-IUGKH376.js → Button/Button.utils.js} +8 -7
  15. package/dist/Button/Button.utils.js.map +1 -0
  16. package/dist/Button/index.d.ts +6 -26
  17. package/dist/Button/index.js +4 -5
  18. package/dist/Button/index.js.map +1 -1
  19. package/dist/Card/Card.d.ts +11 -0
  20. package/dist/{chunk-RZU2FFBW.js → Card/Card.js} +7 -8
  21. package/dist/Card/Card.js.map +1 -0
  22. package/dist/Card/index.d.ts +3 -11
  23. package/dist/Card/index.js +4 -2
  24. package/dist/Card/index.js.map +1 -1
  25. package/dist/Carousel/Carousel.d.ts +65 -0
  26. package/dist/Carousel/Carousel.js +268 -0
  27. package/dist/Carousel/Carousel.js.map +1 -0
  28. package/dist/Carousel/CarouselCounter.d.ts +17 -0
  29. package/dist/Carousel/CarouselCounter.js +28 -0
  30. package/dist/Carousel/CarouselCounter.js.map +1 -0
  31. package/dist/Carousel/CarouselError.d.ts +8 -0
  32. package/dist/Carousel/CarouselError.js +18 -0
  33. package/dist/Carousel/CarouselError.js.map +1 -0
  34. package/dist/Carousel/CarouselItem.d.ts +16 -0
  35. package/dist/Carousel/CarouselItem.js +28 -0
  36. package/dist/Carousel/CarouselItem.js.map +1 -0
  37. package/dist/Carousel/CarouselLoading.d.ts +25 -0
  38. package/dist/Carousel/CarouselLoading.js +63 -0
  39. package/dist/Carousel/CarouselLoading.js.map +1 -0
  40. package/dist/Carousel/CarouselNavigation.d.ts +31 -0
  41. package/dist/Carousel/CarouselNavigation.js +97 -0
  42. package/dist/Carousel/CarouselNavigation.js.map +1 -0
  43. package/dist/Carousel/CarouselPagination.d.ts +20 -0
  44. package/dist/Carousel/CarouselPagination.js +29 -0
  45. package/dist/Carousel/CarouselPagination.js.map +1 -0
  46. package/dist/Carousel/index.d.ts +8 -0
  47. package/dist/Carousel/index.js +15 -0
  48. package/dist/Carousel/index.js.map +1 -0
  49. package/dist/HeroImage/HeroImage.d.ts +15 -0
  50. package/dist/HeroImage/HeroImage.js +47 -0
  51. package/dist/HeroImage/HeroImage.js.map +1 -0
  52. package/dist/HeroImage/index.d.ts +2 -0
  53. package/dist/HeroImage/index.js +5 -0
  54. package/dist/HeroImage/index.js.map +1 -0
  55. package/dist/Icon/Icon.d.ts +14 -0
  56. package/dist/Icon/Icon.js +204 -0
  57. package/dist/Icon/Icon.js.map +1 -0
  58. package/dist/Icon/index.d.ts +3 -14
  59. package/dist/Icon/index.js +4 -2
  60. package/dist/Icon/index.js.map +1 -1
  61. package/dist/IconButton/IconButton.d.ts +17 -0
  62. package/dist/IconButton/IconButton.js +44 -0
  63. package/dist/IconButton/IconButton.js.map +1 -0
  64. package/dist/IconButton/index.d.ts +4 -0
  65. package/dist/IconButton/index.js +5 -0
  66. package/dist/IconButton/index.js.map +1 -0
  67. package/dist/{MovieCard.utils-D8i4d7qA.d.ts → Image/Image.d.ts} +1 -28
  68. package/dist/Image/Image.js +125 -0
  69. package/dist/Image/Image.js.map +1 -0
  70. package/dist/Image/index.d.ts +3 -0
  71. package/dist/Image/index.js +5 -0
  72. package/dist/Image/index.js.map +1 -0
  73. package/dist/Modal/Modal.d.ts +20 -0
  74. package/dist/Modal/Modal.js +55 -0
  75. package/dist/Modal/Modal.js.map +1 -0
  76. package/dist/Modal/index.d.ts +3 -0
  77. package/dist/Modal/index.js +5 -0
  78. package/dist/Modal/index.js.map +1 -0
  79. package/dist/MovieCard/MovieCard.utils.d.ts +34 -0
  80. package/dist/MovieCard/MovieCard.utils.js +20 -0
  81. package/dist/MovieCard/MovieCard.utils.js.map +1 -0
  82. package/dist/MovieCard/MovieCardContent.d.ts +18 -0
  83. package/dist/MovieCard/MovieCardContent.js +75 -0
  84. package/dist/MovieCard/MovieCardContent.js.map +1 -0
  85. package/dist/MovieCard/index.d.ts +6 -0
  86. package/dist/MovieCard/index.js +5 -0
  87. package/dist/MovieCard/index.js.map +1 -0
  88. package/dist/Rating/CircleRating.d.ts +20 -0
  89. package/dist/Rating/CircleRating.js +75 -0
  90. package/dist/Rating/CircleRating.js.map +1 -0
  91. package/dist/Rating/Rating.d.ts +23 -0
  92. package/dist/Rating/Rating.js +41 -0
  93. package/dist/Rating/Rating.js.map +1 -0
  94. package/dist/Rating/StarsRating.d.ts +18 -0
  95. package/dist/Rating/StarsRating.js +47 -0
  96. package/dist/Rating/StarsRating.js.map +1 -0
  97. package/dist/Rating/index.d.ts +2 -0
  98. package/dist/Rating/index.js +5 -0
  99. package/dist/Rating/index.js.map +1 -0
  100. package/dist/Skeleton/Skeleton.d.ts +23 -0
  101. package/dist/{chunk-FJZK3PY6.js → Skeleton/Skeleton.js} +6 -7
  102. package/dist/Skeleton/Skeleton.js.map +1 -0
  103. package/dist/Skeleton/index.d.ts +3 -0
  104. package/dist/Skeleton/index.js +5 -0
  105. package/dist/Skeleton/index.js.map +1 -0
  106. package/dist/Spinner/Spinner.d.ts +8 -0
  107. package/dist/Spinner/Spinner.js +20 -0
  108. package/dist/Spinner/Spinner.js.map +1 -0
  109. package/dist/Spinner/index.d.ts +2 -0
  110. package/dist/Spinner/index.js +5 -0
  111. package/dist/Spinner/index.js.map +1 -0
  112. package/dist/Tabs/Tabs.d.ts +34 -0
  113. package/dist/Tabs/Tabs.js +47 -0
  114. package/dist/Tabs/Tabs.js.map +1 -0
  115. package/dist/Tabs/TabsContext.d.ts +21 -0
  116. package/dist/Tabs/TabsContext.js +16 -0
  117. package/dist/Tabs/TabsContext.js.map +1 -0
  118. package/dist/Tabs/TabsList.d.ts +7 -0
  119. package/dist/Tabs/TabsList.js +51 -0
  120. package/dist/Tabs/TabsList.js.map +1 -0
  121. package/dist/Tabs/TabsListContext.d.ts +16 -0
  122. package/dist/Tabs/TabsListContext.js +16 -0
  123. package/dist/Tabs/TabsListContext.js.map +1 -0
  124. package/dist/Tabs/TabsPanel.d.ts +17 -0
  125. package/dist/Tabs/TabsPanel.js +26 -0
  126. package/dist/Tabs/TabsPanel.js.map +1 -0
  127. package/dist/Tabs/TabsTrigger.d.ts +12 -0
  128. package/dist/Tabs/TabsTrigger.js +124 -0
  129. package/dist/Tabs/TabsTrigger.js.map +1 -0
  130. package/dist/Tabs/index.d.ts +6 -0
  131. package/dist/Tabs/index.js +5 -0
  132. package/dist/Tabs/index.js.map +1 -0
  133. package/dist/Talent/Talent.d.ts +19 -0
  134. package/dist/Talent/Talent.js +69 -0
  135. package/dist/Talent/Talent.js.map +1 -0
  136. package/dist/Talent/index.d.ts +4 -0
  137. package/dist/Talent/index.js +5 -0
  138. package/dist/Talent/index.js.map +1 -0
  139. package/dist/TrailerCard/TrailerCard.d.ts +15 -0
  140. package/dist/TrailerCard/TrailerCard.js +86 -0
  141. package/dist/TrailerCard/TrailerCard.js.map +1 -0
  142. package/dist/TrailerCard/index.d.ts +2 -0
  143. package/dist/TrailerCard/index.js +5 -0
  144. package/dist/TrailerCard/index.js.map +1 -0
  145. package/dist/Typography/Typography.d.ts +17 -0
  146. package/dist/Typography/Typography.js +55 -0
  147. package/dist/Typography/Typography.js.map +1 -0
  148. package/dist/Typography/index.d.ts +2 -0
  149. package/dist/Typography/index.js +5 -0
  150. package/dist/Typography/index.js.map +1 -0
  151. package/dist/index.d.ts +31 -372
  152. package/dist/index.js +50 -1099
  153. package/dist/index.js.map +1 -1
  154. package/dist/next/Button/Button.d.ts +9 -0
  155. package/dist/{chunk-ZTQU4GMY.js → next/Button/Button.js} +13 -10
  156. package/dist/next/Button/Button.js.map +1 -0
  157. package/dist/next/Button/Button.types.d.ts +26 -0
  158. package/dist/next/Button/Button.types.js +1 -0
  159. package/dist/next/Button/Button.types.js.map +1 -0
  160. package/dist/next/Button/index.d.ts +6 -0
  161. package/dist/next/Button/index.js +5 -0
  162. package/dist/next/Button/index.js.map +1 -0
  163. package/dist/next/HeroImage/HeroImage.d.ts +11 -0
  164. package/dist/next/HeroImage/HeroImage.js +44 -0
  165. package/dist/next/HeroImage/HeroImage.js.map +1 -0
  166. package/dist/next/HeroImage/index.d.ts +2 -0
  167. package/dist/next/HeroImage/index.js +5 -0
  168. package/dist/next/HeroImage/index.js.map +1 -0
  169. package/dist/next/Image/NextImage.d.ts +8 -0
  170. package/dist/next/Image/NextImage.js +84 -0
  171. package/dist/next/Image/NextImage.js.map +1 -0
  172. package/dist/next/Image/NextImage.types.d.ts +13 -0
  173. package/dist/next/Image/NextImage.types.js +1 -0
  174. package/dist/next/Image/NextImage.types.js.map +1 -0
  175. package/dist/next/Image/index.d.ts +5 -0
  176. package/dist/next/Image/index.js +5 -0
  177. package/dist/next/Image/index.js.map +1 -0
  178. package/dist/next/MovieCard/MovieCard.d.ts +9 -0
  179. package/dist/next/MovieCard/MovieCard.js +44 -0
  180. package/dist/next/MovieCard/MovieCard.js.map +1 -0
  181. package/dist/next/MovieCard/MovieCard.types.d.ts +15 -0
  182. package/dist/next/MovieCard/MovieCard.types.js +1 -0
  183. package/dist/next/MovieCard/MovieCard.types.js.map +1 -0
  184. package/dist/next/MovieCard/MovieCardContent.d.ts +19 -0
  185. package/dist/next/MovieCard/MovieCardContent.js +79 -0
  186. package/dist/next/MovieCard/MovieCardContent.js.map +1 -0
  187. package/dist/next/MovieCard/index.d.ts +6 -0
  188. package/dist/next/MovieCard/index.js +5 -0
  189. package/dist/next/MovieCard/index.js.map +1 -0
  190. package/dist/next/index.d.ts +14 -60
  191. package/dist/next/index.js +10 -270
  192. package/dist/next/index.js.map +1 -1
  193. package/dist/react-router/Button/Button.d.ts +9 -0
  194. package/dist/react-router/Button/Button.js +52 -0
  195. package/dist/react-router/Button/Button.js.map +1 -0
  196. package/dist/react-router/Button/Button.types.d.ts +24 -0
  197. package/dist/react-router/Button/Button.types.js +1 -0
  198. package/dist/react-router/Button/Button.types.js.map +1 -0
  199. package/dist/react-router/Button/index.d.ts +6 -0
  200. package/dist/react-router/Button/index.js +5 -0
  201. package/dist/react-router/Button/index.js.map +1 -0
  202. package/dist/react-router/MovieCard/MovieCard.d.ts +9 -0
  203. package/dist/react-router/MovieCard/MovieCard.js +42 -0
  204. package/dist/react-router/MovieCard/MovieCard.js.map +1 -0
  205. package/dist/react-router/MovieCard/MovieCard.types.d.ts +15 -0
  206. package/dist/react-router/MovieCard/MovieCard.types.js +1 -0
  207. package/dist/react-router/MovieCard/MovieCard.types.js.map +1 -0
  208. package/dist/react-router/MovieCard/index.d.ts +6 -0
  209. package/dist/react-router/MovieCard/index.js +5 -0
  210. package/dist/react-router/MovieCard/index.js.map +1 -0
  211. package/dist/react-router/index.d.ts +8 -17
  212. package/dist/react-router/index.js +6 -7
  213. package/dist/react-router/index.js.map +1 -1
  214. package/package.json +1 -1
  215. package/dist/chunk-6DP3KZQG.js +0 -214
  216. package/dist/chunk-6DP3KZQG.js.map +0 -1
  217. package/dist/chunk-6FBMTGXQ.js +0 -119
  218. package/dist/chunk-6FBMTGXQ.js.map +0 -1
  219. package/dist/chunk-7IAJQE27.js +0 -228
  220. package/dist/chunk-7IAJQE27.js.map +0 -1
  221. package/dist/chunk-DGJI4VNO.js +0 -3
  222. package/dist/chunk-DGJI4VNO.js.map +0 -1
  223. package/dist/chunk-FJZK3PY6.js.map +0 -1
  224. package/dist/chunk-IUGKH376.js.map +0 -1
  225. package/dist/chunk-RZU2FFBW.js.map +0 -1
  226. package/dist/chunk-ZTQU4GMY.js.map +0 -1
  227. package/dist/index.css +0 -1313
  228. package/dist/index.css.map +0 -1
package/dist/index.js CHANGED
@@ -1,1101 +1,52 @@
1
- import './chunk-DGJI4VNO.js';
2
- import { Skeleton_default } from './chunk-FJZK3PY6.js';
3
- export { Skeleton_default as Skeleton } from './chunk-FJZK3PY6.js';
4
- export { Image_default as Image, MovieCard_default as MovieCard } from './chunk-7IAJQE27.js';
5
- import { Button_default } from './chunk-ZTQU4GMY.js';
6
- export { Button_default as Button } from './chunk-ZTQU4GMY.js';
7
- import { Typography_default } from './chunk-6DP3KZQG.js';
8
- export { Rating_default as Rating, Typography_default as Typography } from './chunk-6DP3KZQG.js';
9
- import './chunk-IUGKH376.js';
10
- export { Card_default as Card } from './chunk-RZU2FFBW.js';
11
- import { Icon_default } from './chunk-6FBMTGXQ.js';
12
- export { Icon_default as Icon } from './chunk-6FBMTGXQ.js';
13
- import clsx8 from 'clsx';
14
- import { createContext, useState, useRef, useEffect, useCallback, useLayoutEffect, useContext } from 'react';
15
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
16
- import { getOptimizedImageUrl } from '@vite-mf-monorepo/shared';
17
-
18
- var sizeMap = {
19
- xs: { container: "ui:h-6 ui:w-6", icon: 12, text: "ui:text-xs" },
20
- sm: { container: "ui:h-8 ui:w-8", icon: 16, text: "ui:text-sm" },
21
- md: { container: "ui:h-10 ui:w-10", icon: 20, text: "ui:text-base" },
22
- lg: { container: "ui:h-12 ui:w-12", icon: 24, text: "ui:text-lg" },
23
- xl: { container: "ui:h-16 ui:w-16", icon: 32, text: "ui:text-xl" },
24
- "2xl": { container: "ui:h-24 ui:w-24", icon: 48, text: "ui:text-2xl" },
25
- "3xl": { container: "ui:h-32 ui:w-32", icon: 64, text: "ui:text-3xl" }
1
+ import "./styles.css";
2
+ import { Avatar } from "./Avatar";
3
+ import { Badge } from "./Badge";
4
+ import { Button } from "./Button";
5
+ import { Card } from "./Card";
6
+ import { Icon } from "./Icon";
7
+ import { IconButton } from "./IconButton";
8
+ import { Image } from "./Image";
9
+ import { HeroImage } from "./HeroImage";
10
+ import { Modal } from "./Modal";
11
+ import { Rating } from "./Rating";
12
+ import { MovieCard } from "./MovieCard";
13
+ import { TrailerCard } from "./TrailerCard";
14
+ import {
15
+ Carousel,
16
+ CarouselCounter,
17
+ CarouselItem,
18
+ CarouselLoading,
19
+ CarouselNavigation,
20
+ CarouselPagination
21
+ } from "./Carousel";
22
+ import { Tabs } from "./Tabs";
23
+ import { Skeleton } from "./Skeleton";
24
+ import { Talent } from "./Talent";
25
+ import { Typography } from "./Typography";
26
+ import { Spinner } from "./Spinner";
27
+ export {
28
+ Avatar,
29
+ Badge,
30
+ Button,
31
+ Card,
32
+ Carousel,
33
+ CarouselCounter,
34
+ CarouselItem,
35
+ CarouselLoading,
36
+ CarouselNavigation,
37
+ CarouselPagination,
38
+ HeroImage,
39
+ Icon,
40
+ IconButton,
41
+ Image,
42
+ Modal,
43
+ MovieCard,
44
+ Rating,
45
+ Skeleton,
46
+ Spinner,
47
+ Tabs,
48
+ Talent,
49
+ TrailerCard,
50
+ Typography
26
51
  };
27
- function Avatar({
28
- className,
29
- src,
30
- alt,
31
- size = "md",
32
- initials,
33
- testId,
34
- ...rest
35
- }) {
36
- const [hasError, setHasError] = useState(false);
37
- const { container, icon, text } = sizeMap[size];
38
- const showImage = src && !hasError;
39
- const showInitials = !showImage && initials;
40
- const showFallback = !showImage && !initials;
41
- const handleError = () => {
42
- setHasError(true);
43
- };
44
- return /* @__PURE__ */ jsxs(
45
- "div",
46
- {
47
- className: clsx8(
48
- "ui:relative ui:inline-flex ui:items-center ui:justify-center ui:overflow-hidden ui:rounded-full",
49
- "ui:bg-muted ui:text-muted-foreground",
50
- container,
51
- className
52
- ),
53
- children: [
54
- showImage && /* @__PURE__ */ jsx(
55
- "img",
56
- {
57
- src,
58
- alt,
59
- onError: handleError,
60
- className: "ui:h-full ui:w-full ui:object-cover",
61
- "data-testid": testId,
62
- ...rest
63
- }
64
- ),
65
- showInitials && /* @__PURE__ */ jsx("span", { className: clsx8("ui:font-medium ui:uppercase", text), children: initials.slice(0, 2) }),
66
- showFallback && /* @__PURE__ */ jsx(Icon_default, { name: "User", size: icon })
67
- ]
68
- }
69
- );
70
- }
71
- var Avatar_default = Avatar;
72
- var sizeMap2 = {
73
- sm: { padding: "ui:px-2 ui:py-0.5", text: "ui:text-xs", iconSize: 16 },
74
- md: { padding: "ui:px-2.5 ui:py-0.5", text: "ui:text-sm", iconSize: 16 },
75
- lg: { padding: "ui:px-3 ui:py-1", text: "ui:text-sm", iconSize: 16 }
76
- };
77
- function Badge({
78
- children,
79
- variant = "default",
80
- size = "md",
81
- icon,
82
- textClassName,
83
- className
84
- }) {
85
- const { padding, text, iconSize } = sizeMap2[size];
86
- return /* @__PURE__ */ jsxs(
87
- "span",
88
- {
89
- className: clsx8(
90
- "ui:inline-flex ui:items-center ui:gap-1 ui:rounded-full ui:font-medium",
91
- padding,
92
- text,
93
- {
94
- "ui:bg-primary": variant === "default",
95
- "ui:text-primary-foreground": variant === "default" && !textClassName,
96
- "ui:bg-secondary": variant === "secondary",
97
- "ui:text-secondary-foreground": variant === "secondary" && !textClassName,
98
- "ui:border ui:border-input ui:bg-transparent": variant === "outline",
99
- "ui:bg-destructive": variant === "destructive",
100
- "ui:text-destructive-foreground": variant === "destructive" && !textClassName
101
- },
102
- textClassName,
103
- className
104
- ),
105
- children: [
106
- icon && /* @__PURE__ */ jsx(Icon_default, { name: icon, size: iconSize }),
107
- children
108
- ]
109
- }
110
- );
111
- }
112
- var Badge_default = Badge;
113
- var sizeMap3 = {
114
- sm: { button: "ui:h-8 ui:w-8", icon: 16 },
115
- md: { button: "ui:h-10 ui:w-10", icon: 20 },
116
- lg: { button: "ui:h-12 ui:w-12", icon: 24 }
117
- };
118
- function IconButton({
119
- className,
120
- icon,
121
- variant = "ghost",
122
- size = "md",
123
- disabled,
124
- ...rest
125
- }) {
126
- const { button: buttonSize, icon: iconSize } = sizeMap3[size];
127
- return /* @__PURE__ */ jsx(
128
- "button",
129
- {
130
- className: clsx8(
131
- "ui:inline-flex ui:items-center ui:justify-center ui:cursor-pointer ui:rounded-full ui:transition-colors",
132
- "ui:focus:outline-none ui:focus:ring-2 ui:focus:ring-ring ui:focus:ring-offset-2",
133
- "ui:disabled:pointer-events-none ui:disabled:opacity-50",
134
- {
135
- "ui:bg-primary ui:text-primary-foreground ui:hover:bg-primary/90": variant === "primary",
136
- "ui:bg-secondary ui:text-secondary-foreground ui:hover:bg-secondary/80": variant === "secondary",
137
- "ui:hover:bg-accent ui:hover:text-accent-foreground": variant === "ghost",
138
- "ui:border ui:border-input ui:bg-background ui:hover:bg-accent ui:hover:text-accent-foreground": variant === "outline"
139
- },
140
- buttonSize,
141
- className
142
- ),
143
- disabled,
144
- ...rest,
145
- children: /* @__PURE__ */ jsx(Icon_default, { name: icon, size: iconSize })
146
- }
147
- );
148
- }
149
- var IconButton_default = IconButton;
150
- function HeroImage({ backdropPath, title }) {
151
- const [loading, setLoading] = useState(true);
152
- const backdropPathMobile = backdropPath ? getOptimizedImageUrl(backdropPath, "w300", 60) : void 0;
153
- const backdropPathTablet = backdropPath ? getOptimizedImageUrl(backdropPath, "w300", 60) : void 0;
154
- const backdropPathDesktop = backdropPath ? getOptimizedImageUrl(backdropPath, "w780", 60) : void 0;
155
- const backdropPathUltraWide = backdropPath ? getOptimizedImageUrl(backdropPath, "w1280", 60) : void 0;
156
- return /* @__PURE__ */ jsxs(Fragment, { children: [
157
- loading && /* @__PURE__ */ jsx(
158
- Skeleton_default,
159
- {
160
- "data-testid": "hero-image-skeleton",
161
- variant: "rectangle",
162
- width: "ui:relative ui:w-full ui:h-full ui:hero-height ui:z-0",
163
- aspectRatio: "21/9",
164
- rounded: false
165
- }
166
- ),
167
- /* @__PURE__ */ jsxs("picture", { children: [
168
- backdropPathMobile && /* @__PURE__ */ jsx("source", { media: "(max-width: 639px)", srcSet: backdropPathMobile }),
169
- backdropPathTablet && /* @__PURE__ */ jsx("source", { media: "(max-width: 1023px)", srcSet: backdropPathTablet }),
170
- backdropPathDesktop && /* @__PURE__ */ jsx("source", { media: "(max-width: 1535px)", srcSet: backdropPathDesktop }),
171
- backdropPathUltraWide && /* @__PURE__ */ jsx("source", { media: "(min-width: 1536px)", srcSet: backdropPathUltraWide }),
172
- backdropPathMobile && /* @__PURE__ */ jsx(
173
- "img",
174
- {
175
- src: backdropPathMobile,
176
- fetchPriority: "high",
177
- onLoad: () => {
178
- setLoading(false);
179
- },
180
- alt: title ?? "Unknown",
181
- className: "ui:relative ui:h-full ui:w-full ui:object-cover ui:object-center ui:z-0"
182
- }
183
- )
184
- ] }),
185
- /* @__PURE__ */ jsx("div", { className: "ui:absolute ui:inset-0 ui:bg-gradient-to-t ui:from-black/80 ui:via-black/40 ui:to-transparent ui:z-1 ui:top-0 ui:left-0 ui:right-0 ui:bottom-0" })
186
- ] });
187
- }
188
- var HeroImage_default = HeroImage;
189
- function Modal({
190
- isOpen,
191
- onClose,
192
- children,
193
- "aria-label": ariaLabel,
194
- className,
195
- onOverlayClick
196
- }) {
197
- const ref = useRef(null);
198
- useEffect(() => {
199
- const dialog = ref.current;
200
- if (!dialog) return;
201
- if (isOpen) {
202
- dialog.showModal();
203
- document.body.style.overflow = "hidden";
204
- } else {
205
- dialog.close();
206
- document.body.style.overflow = "";
207
- }
208
- return () => {
209
- document.body.style.overflow = "";
210
- };
211
- }, [isOpen]);
212
- const handleClick = (e) => {
213
- if (e.target === ref.current) (onOverlayClick ?? onClose)();
214
- };
215
- const handleClose = () => {
216
- onClose();
217
- };
218
- return /* @__PURE__ */ jsx(
219
- "dialog",
220
- {
221
- ref,
222
- "aria-label": ariaLabel,
223
- "aria-modal": "true",
224
- onClick: handleClick,
225
- onClose: handleClose,
226
- className: clsx8(
227
- "ui:backdrop:bg-black/80",
228
- "ui:bg-transparent ui:border-0 ui:p-0",
229
- "ui:max-w-none ui:max-h-none ui:w-full ui:h-full",
230
- className
231
- ),
232
- children
233
- }
234
- );
235
- }
236
- var Modal_default = Modal;
237
- function TrailerCard({
238
- videoKey,
239
- title,
240
- type = "Trailer",
241
- className
242
- }) {
243
- const [isPlaying, setIsPlaying] = useState(false);
244
- const thumbnailUrl = `https://img.youtube.com/vi/${videoKey}/hqdefault.jpg`;
245
- return /* @__PURE__ */ jsxs(Fragment, { children: [
246
- /* @__PURE__ */ jsxs(
247
- "button",
248
- {
249
- className: clsx8(
250
- "ui:group ui:relative ui:flex ui:aspect-video ui:w-full ui:cursor-pointer ui:overflow-hidden ui:rounded-lg ui:bg-gray-200",
251
- "ui:transition-transform ui:duration-200 hover:ui:scale-[1.02]",
252
- className
253
- ),
254
- onClick: () => {
255
- setIsPlaying(true);
256
- },
257
- tabIndex: 0,
258
- "aria-label": `Play ${title}`,
259
- children: [
260
- /* @__PURE__ */ jsx(
261
- "img",
262
- {
263
- src: thumbnailUrl,
264
- alt: title,
265
- className: "ui:h-full ui:w-full ui:object-cover",
266
- loading: "lazy"
267
- }
268
- ),
269
- /* @__PURE__ */ jsx("div", { className: "ui:absolute ui:inset-0 ui:flex ui:items-center ui:justify-center ui:bg-black/30 ui:opacity-0 ui:transition-opacity ui:duration-200 group-hover:ui:opacity-100", children: /* @__PURE__ */ jsx("div", { className: "ui:flex ui:items-center ui:justify-center ui:h-16 ui:w-16 ui:rounded-full ui:bg-white/90", children: /* @__PURE__ */ jsx("span", { className: "ui:text-2xl ui:ml-1", children: "\u25B6" }) }) }),
270
- type && /* @__PURE__ */ jsx("div", { className: "ui:absolute ui:bottom-2 ui:left-2 ui:rounded ui:bg-black/80 ui:px-2 ui:py-1 ui:text-xs ui:font-semibold ui:text-white", children: type })
271
- ]
272
- }
273
- ),
274
- /* @__PURE__ */ jsx(
275
- Modal_default,
276
- {
277
- isOpen: isPlaying,
278
- onClose: () => {
279
- setIsPlaying(false);
280
- },
281
- "aria-label": `Play ${title}`,
282
- children: /* @__PURE__ */ jsxs("div", { className: "ui:flex ui:h-full ui:w-full ui:items-center ui:justify-center ui:p-4", children: [
283
- /* @__PURE__ */ jsx(
284
- Button_default,
285
- {
286
- icon: "XMark",
287
- size: "sm",
288
- variant: "ghost",
289
- iconPosition: "left",
290
- onClick: () => {
291
- setIsPlaying(false);
292
- },
293
- className: "ui:absolute ui:top-4 ui:right-4 ui:text-white hover:ui:bg-white/10 ui:z-10 ui:focus:border-none",
294
- "aria-label": "Close video",
295
- children: "Close video"
296
- }
297
- ),
298
- isPlaying && /* @__PURE__ */ jsx(
299
- "iframe",
300
- {
301
- className: "ui:w-full ui:max-w-4xl ui:aspect-video ui:rounded-lg",
302
- src: `https://www.youtube.com/embed/${videoKey}`,
303
- title,
304
- allow: "accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
305
- allowFullScreen: true
306
- }
307
- )
308
- ] })
309
- }
310
- )
311
- ] });
312
- }
313
- var TrailerCard_default = TrailerCard;
314
- function CarouselCounter({
315
- current,
316
- total,
317
- className
318
- }) {
319
- return /* @__PURE__ */ jsxs(
320
- "div",
321
- {
322
- className: clsx8(
323
- "ui:bg-black/50 ui:rounded-full ui:px-3 ui:py-1",
324
- "ui:text-white/90 ui:text-sm ui:font-medium ui:tabular-nums",
325
- className
326
- ),
327
- children: [
328
- current + 1,
329
- " / ",
330
- total
331
- ]
332
- }
333
- );
334
- }
335
- var CarouselCounter_default = CarouselCounter;
336
- function CarouselError({
337
- message = "Failed to load data"
338
- }) {
339
- return /* @__PURE__ */ jsxs("div", { className: "ui:flex ui:flex-col ui:items-center ui:justify-center ui:gap-3 ui:rounded-lg ui:border ui:border-red-200 ui:bg-red-50 ui:p-8 ui:text-center", children: [
340
- /* @__PURE__ */ jsx(Icon_default, { name: "ExclamationTriangle", size: 48, className: "ui:text-red-500" }),
341
- /* @__PURE__ */ jsxs("div", { className: "ui:flex ui:flex-col ui:gap-1", children: [
342
- /* @__PURE__ */ jsx("p", { className: "ui:text-sm ui:font-semibold ui:text-red-900", children: "Failed to fetch data" }),
343
- /* @__PURE__ */ jsx("p", { className: "ui:text-sm ui:text-red-700", children: message })
344
- ] })
345
- ] });
346
- }
347
- var CarouselError_default = CarouselError;
348
- function CarouselNavigation({
349
- onPrev,
350
- onNext,
351
- canPrev,
352
- canNext,
353
- size = "sm",
354
- position = "inline",
355
- iconVariant = "secondary",
356
- className
357
- }) {
358
- if (position === "sides") {
359
- return /* @__PURE__ */ jsxs(Fragment, { children: [
360
- /* @__PURE__ */ jsx("div", { className: "ui:absolute ui:left-0 ui:top-1/2 ui:-translate-x-1/2 ui:-translate-y-1/2", children: /* @__PURE__ */ jsx(
361
- IconButton_default,
362
- {
363
- icon: "ChevronLeft",
364
- variant: iconVariant,
365
- size,
366
- onClick: onPrev,
367
- disabled: !canPrev,
368
- "aria-label": "Previous"
369
- }
370
- ) }),
371
- /* @__PURE__ */ jsx("div", { className: "ui:absolute ui:right-0 ui:top-1/2 ui:-translate-y-1/2 ui:translate-x-1/2", children: /* @__PURE__ */ jsx(
372
- IconButton_default,
373
- {
374
- icon: "ChevronRight",
375
- variant: iconVariant,
376
- size,
377
- onClick: onNext,
378
- disabled: !canNext,
379
- "aria-label": "Next"
380
- }
381
- ) })
382
- ] });
383
- }
384
- if (position === "sides-inset") {
385
- return /* @__PURE__ */ jsxs(Fragment, { children: [
386
- /* @__PURE__ */ jsx("div", { className: "ui:absolute ui:left-4 ui:top-1/2 ui:-translate-y-1/2 ui:z-10 ui:text-white", children: /* @__PURE__ */ jsx(
387
- IconButton_default,
388
- {
389
- icon: "ChevronLeft",
390
- variant: iconVariant,
391
- size,
392
- onClick: onPrev,
393
- disabled: !canPrev,
394
- "aria-label": "Previous",
395
- className: "ui:bg-white/20 ui:hover:bg-white/55"
396
- }
397
- ) }),
398
- /* @__PURE__ */ jsx("div", { className: "ui:absolute ui:right-4 ui:top-1/2 ui:-translate-y-1/2 ui:z-10 ui:text-white", children: /* @__PURE__ */ jsx(
399
- IconButton_default,
400
- {
401
- icon: "ChevronRight",
402
- variant: iconVariant,
403
- size,
404
- onClick: onNext,
405
- disabled: !canNext,
406
- "aria-label": "Next",
407
- className: "ui:bg-white/20 ui:hover:bg-white/55"
408
- }
409
- ) })
410
- ] });
411
- }
412
- return /* @__PURE__ */ jsxs("div", { className: clsx8("ui:flex ui:gap-2", className), children: [
413
- /* @__PURE__ */ jsx(
414
- IconButton_default,
415
- {
416
- icon: "ChevronLeft",
417
- variant: iconVariant,
418
- size,
419
- onClick: onPrev,
420
- disabled: !canPrev,
421
- "aria-label": "Previous"
422
- }
423
- ),
424
- /* @__PURE__ */ jsx(
425
- IconButton_default,
426
- {
427
- icon: "ChevronRight",
428
- variant: iconVariant,
429
- size,
430
- onClick: onNext,
431
- disabled: !canNext,
432
- "aria-label": "Next"
433
- }
434
- )
435
- ] });
436
- }
437
- var CarouselNavigation_default = CarouselNavigation;
438
- function CarouselPagination({
439
- total,
440
- current,
441
- light = false,
442
- className
443
- }) {
444
- if (total === 0) return null;
445
- return /* @__PURE__ */ jsx("div", { className: clsx8("ui:flex ui:items-center ui:gap-2", className), children: Array.from({ length: total }).map((_, index) => /* @__PURE__ */ jsx(
446
- "div",
447
- {
448
- "aria-hidden": "true",
449
- className: clsx8(
450
- "ui:rounded-full ui:transition-all ui:duration-300",
451
- index === current ? clsx8("ui:h-2 ui:w-6", light ? "ui:bg-white" : "ui:bg-primary") : clsx8(
452
- "ui:h-2 ui:w-2",
453
- light ? "ui:bg-white/50 hover:ui:bg-white/70" : "ui:bg-gray-400 hover:ui:bg-gray-500"
454
- )
455
- )
456
- },
457
- index
458
- )) });
459
- }
460
- var CarouselPagination_default = CarouselPagination;
461
- function Carousel({
462
- children,
463
- variant = "standard",
464
- showPagination = true,
465
- showArrows = true,
466
- arrowPosition = "sides",
467
- gap = 16,
468
- className,
469
- heroControlsClassName,
470
- errorMessage,
471
- rounded = true,
472
- initialIndex,
473
- onPrev,
474
- onNext,
475
- disableAnimation = false,
476
- disableScroll = false
477
- }) {
478
- const scrollRef = useRef(null);
479
- const [totalPositions, setTotalPositions] = useState(1);
480
- const [scrollIndex, setScrollIndex] = useState(initialIndex ?? 0);
481
- const currentIndex = disableScroll ? initialIndex ?? 0 : scrollIndex;
482
- const isHero = variant === "hero";
483
- const isLightbox = variant === "lightbox";
484
- const isFullWidth = isHero || isLightbox;
485
- const calculatePositions = useCallback(() => {
486
- const container = scrollRef.current;
487
- if (!container) return;
488
- const items = container.children;
489
- if (isFullWidth) {
490
- setTotalPositions(items.length);
491
- return;
492
- }
493
- const firstItem = items[0];
494
- if (!firstItem) {
495
- setTotalPositions(1);
496
- return;
497
- }
498
- const itemWidth = firstItem.offsetWidth;
499
- const maxScrollLeft = container.scrollWidth - container.offsetWidth;
500
- if (maxScrollLeft <= 0) {
501
- setTotalPositions(1);
502
- } else if (itemWidth > 0) {
503
- const positions = Math.round(maxScrollLeft / (itemWidth + gap)) + 1;
504
- setTotalPositions(Math.max(1, positions));
505
- }
506
- }, [gap, isFullWidth]);
507
- useEffect(() => {
508
- calculatePositions();
509
- }, [children, calculatePositions]);
510
- useEffect(() => {
511
- const container = scrollRef.current;
512
- if (!container) return;
513
- const resizeObserver = new ResizeObserver(() => {
514
- calculatePositions();
515
- });
516
- resizeObserver.observe(container);
517
- return () => {
518
- resizeObserver.disconnect();
519
- };
520
- }, [calculatePositions]);
521
- const initialScrollRef = useRef({
522
- index: initialIndex ?? 0,
523
- isFullWidth,
524
- gap
525
- });
526
- useLayoutEffect(() => {
527
- const { index, isFullWidth: fw, gap: g } = initialScrollRef.current;
528
- if (index <= 0) return;
529
- const container = scrollRef.current;
530
- if (!container) return;
531
- const firstItem = container.children[0];
532
- const itemWidth = fw ? container.offsetWidth : firstItem?.offsetWidth ?? 0;
533
- container.style.scrollBehavior = "auto";
534
- container.scrollLeft = index * (itemWidth + (fw ? 0 : g));
535
- container.style.scrollBehavior = "";
536
- }, []);
537
- const handleScroll = useCallback(() => {
538
- const container = scrollRef.current;
539
- if (!container) return;
540
- const scrollLeft = container.scrollLeft;
541
- const firstItem = container.children[0];
542
- const itemWidth = isFullWidth ? container.offsetWidth : firstItem?.offsetWidth ?? 0;
543
- if (itemWidth > 0) {
544
- const index = Math.round(scrollLeft / (itemWidth + gap));
545
- setScrollIndex(Math.min(index, totalPositions - 1));
546
- }
547
- }, [gap, isFullWidth, totalPositions]);
548
- useEffect(() => {
549
- if (disableScroll) return;
550
- const container = scrollRef.current;
551
- if (!container) return;
552
- container.addEventListener("scroll", handleScroll);
553
- return () => {
554
- container.removeEventListener("scroll", handleScroll);
555
- };
556
- }, [disableScroll, handleScroll]);
557
- useEffect(() => {
558
- if (!disableScroll) return;
559
- const container = scrollRef.current;
560
- if (!container) return;
561
- const preventScroll = (e) => {
562
- e.preventDefault();
563
- };
564
- container.addEventListener("wheel", preventScroll, { passive: false });
565
- return () => {
566
- container.removeEventListener("wheel", preventScroll);
567
- };
568
- }, [disableScroll]);
569
- const scrollTo = useCallback(
570
- (index) => {
571
- const container = scrollRef.current;
572
- if (!container) return;
573
- const firstItem = container.children[0];
574
- const itemWidth = isFullWidth ? container.offsetWidth : firstItem?.offsetWidth ?? 0;
575
- const isLastPosition = index === totalPositions - 1;
576
- const scrollLeft = isLastPosition ? container.scrollWidth - container.offsetWidth : index * (itemWidth + gap);
577
- container.scrollTo({
578
- left: scrollLeft,
579
- behavior: disableAnimation ? "auto" : "smooth"
580
- });
581
- },
582
- [gap, isFullWidth, totalPositions, disableAnimation]
583
- );
584
- const scrollPrev = useCallback(() => {
585
- if (currentIndex > 0) {
586
- scrollTo(currentIndex - 1);
587
- }
588
- }, [currentIndex, scrollTo]);
589
- const scrollNext = useCallback(() => {
590
- if (currentIndex < totalPositions - 1) {
591
- scrollTo(currentIndex + 1);
592
- }
593
- }, [currentIndex, totalPositions, scrollTo]);
594
- const handlePrev = onPrev ?? scrollPrev;
595
- const handleNext = onNext ?? scrollNext;
596
- const handlePrevRef = useRef(handlePrev);
597
- const handleNextRef = useRef(handleNext);
598
- useEffect(() => {
599
- handlePrevRef.current = handlePrev;
600
- handleNextRef.current = handleNext;
601
- });
602
- useEffect(() => {
603
- const handleKeyDown = (e) => {
604
- if (e.key === "ArrowLeft") handlePrevRef.current();
605
- if (e.key === "ArrowRight") handleNextRef.current();
606
- };
607
- document.addEventListener("keydown", handleKeyDown);
608
- return () => {
609
- document.removeEventListener("keydown", handleKeyDown);
610
- };
611
- }, []);
612
- if (errorMessage) {
613
- return /* @__PURE__ */ jsx(CarouselError_default, { message: errorMessage });
614
- }
615
- const canScrollPrev = currentIndex > 0;
616
- const canScrollNext = currentIndex < totalPositions - 1;
617
- const showControls = totalPositions > 1;
618
- return /* @__PURE__ */ jsxs("div", { className: clsx8("ui:relative", isLightbox && "ui:h-full", className), children: [
619
- /* @__PURE__ */ jsx(
620
- "div",
621
- {
622
- ref: scrollRef,
623
- className: clsx8(
624
- "ui:flex ui:overflow-x-auto ui:scroll-smooth ui:scrollbar-none",
625
- isFullWidth && "ui:snap-x ui:snap-mandatory",
626
- isLightbox && "ui:h-full",
627
- rounded && "ui:rounded-lg ui:overflow-hidden"
628
- ),
629
- style: { gap: `${String(gap)}px` },
630
- children
631
- }
632
- ),
633
- showControls && showArrows && arrowPosition === "sides" && !isHero && !isLightbox && /* @__PURE__ */ jsx(
634
- CarouselNavigation_default,
635
- {
636
- onPrev: handlePrev,
637
- onNext: handleNext,
638
- canPrev: canScrollPrev,
639
- canNext: canScrollNext,
640
- size: "md",
641
- position: "sides"
642
- }
643
- ),
644
- showControls && isHero && (showPagination || showArrows) && /* @__PURE__ */ jsxs(
645
- "div",
646
- {
647
- className: clsx8(
648
- "ui:absolute ui:bottom-4 ui:left-1/2 ui:-translate-x-1/2 ui:w-full ui:z-10 ui:flex ui:items-end",
649
- heroControlsClassName
650
- ),
651
- children: [
652
- /* @__PURE__ */ jsx("div", { className: "ui:flex-1" }),
653
- showPagination && /* @__PURE__ */ jsx(
654
- CarouselPagination_default,
655
- {
656
- total: totalPositions,
657
- current: currentIndex,
658
- light: true
659
- }
660
- ),
661
- /* @__PURE__ */ jsx("div", { className: "ui:flex-1 ui:flex ui:justify-end", children: showArrows && /* @__PURE__ */ jsx(
662
- CarouselNavigation_default,
663
- {
664
- onPrev: handlePrev,
665
- onNext: handleNext,
666
- canPrev: canScrollPrev,
667
- canNext: canScrollNext,
668
- size: "sm"
669
- }
670
- ) })
671
- ]
672
- }
673
- ),
674
- showControls && !isHero && !isLightbox && (showArrows && arrowPosition === "bottom-right" || showPagination) ? /* @__PURE__ */ jsxs(
675
- "div",
676
- {
677
- className: clsx8(
678
- "ui:mt-4 ui:flex ui:items-center",
679
- arrowPosition === "bottom-right" ? "ui:justify-end ui:gap-4" : "ui:justify-center"
680
- ),
681
- children: [
682
- showPagination && /* @__PURE__ */ jsx(CarouselPagination_default, { total: totalPositions, current: currentIndex }),
683
- showArrows && arrowPosition === "bottom-right" && /* @__PURE__ */ jsx(
684
- CarouselNavigation_default,
685
- {
686
- onPrev: handlePrev,
687
- onNext: handleNext,
688
- canPrev: canScrollPrev,
689
- canNext: canScrollNext,
690
- size: "sm"
691
- }
692
- )
693
- ]
694
- }
695
- ) : null,
696
- showControls && isLightbox && /* @__PURE__ */ jsx("div", { className: "ui:absolute ui:top-4 ui:right-4 ui:z-10", children: /* @__PURE__ */ jsx(CarouselCounter_default, { current: currentIndex, total: totalPositions }) }),
697
- showControls && isLightbox && showArrows && /* @__PURE__ */ jsx(
698
- CarouselNavigation_default,
699
- {
700
- onPrev: handlePrev,
701
- onNext: handleNext,
702
- canPrev: canScrollPrev,
703
- canNext: canScrollNext,
704
- size: "md",
705
- position: "sides-inset",
706
- iconVariant: "ghost"
707
- }
708
- )
709
- ] });
710
- }
711
- var Carousel_default = Carousel;
712
- function CarouselItem({
713
- children,
714
- isHero = false,
715
- isLightbox = false,
716
- className,
717
- ...rest
718
- }) {
719
- return /* @__PURE__ */ jsx(
720
- "div",
721
- {
722
- className: clsx8(
723
- "ui:flex-shrink-0",
724
- (isHero || isLightbox) && "ui:w-full ui:snap-center",
725
- isLightbox && "ui:flex ui:items-center ui:justify-center ui:h-full",
726
- className
727
- ),
728
- ...rest,
729
- children
730
- }
731
- );
732
- }
733
- var CarouselItem_default = CarouselItem;
734
- function CarouselLoading({
735
- count = 6,
736
- cardWidth = 150,
737
- cardHeight = 225,
738
- showTitle = true,
739
- showSubtitle = true,
740
- rounded = true
741
- }) {
742
- return /* @__PURE__ */ jsx("div", { className: "ui:overflow-x-auto ui:flex ui:gap-4", children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsxs(
743
- "div",
744
- {
745
- style: { width: cardWidth, minWidth: cardWidth, maxWidth: cardWidth },
746
- children: [
747
- /* @__PURE__ */ jsx("div", { style: { width: cardWidth, height: cardHeight }, children: /* @__PURE__ */ jsx(
748
- Skeleton_default,
749
- {
750
- variant: "rectangle",
751
- width: "ui:w-full",
752
- height: "ui:h-full",
753
- rounded
754
- }
755
- ) }),
756
- (showTitle || showSubtitle) && /* @__PURE__ */ jsxs(
757
- "div",
758
- {
759
- style: {
760
- marginTop: 8,
761
- display: "flex",
762
- flexDirection: "column",
763
- gap: 8
764
- },
765
- children: [
766
- showTitle && /* @__PURE__ */ jsx("div", { style: { width: cardWidth, height: 16 }, children: /* @__PURE__ */ jsx(
767
- Skeleton_default,
768
- {
769
- variant: "line",
770
- width: "ui:w-full",
771
- height: "ui:h-full"
772
- }
773
- ) }),
774
- showSubtitle && /* @__PURE__ */ jsx("div", { style: { width: cardWidth * 0.75, height: 12 }, children: /* @__PURE__ */ jsx(
775
- Skeleton_default,
776
- {
777
- variant: "line",
778
- width: "ui:w-full",
779
- height: "ui:h-full"
780
- }
781
- ) })
782
- ]
783
- }
784
- )
785
- ]
786
- },
787
- i
788
- )) });
789
- }
790
- var CarouselLoading_default = CarouselLoading;
791
- var TabsContext = createContext(
792
- void 0
793
- );
794
- var useTabsContext = () => {
795
- const context = useContext(TabsContext);
796
- if (!context) {
797
- throw new Error("Tabs compound components must be used within <Tabs>");
798
- }
799
- return context;
800
- };
801
- var TabsListContext = createContext(
802
- void 0
803
- );
804
- var useTabsListContext = () => {
805
- const context = useContext(TabsListContext);
806
- if (!context) {
807
- throw new Error("TabsTrigger must be used within <Tabs.List>");
808
- }
809
- return context;
810
- };
811
- function TabsList({ className, children, ...rest }) {
812
- const { variant } = useTabsContext();
813
- const triggersRef = useRef([]);
814
- const disabledRef = useRef(/* @__PURE__ */ new Set());
815
- const registerTrigger = (value, disabled) => {
816
- if (!triggersRef.current.includes(value)) {
817
- triggersRef.current.push(value);
818
- }
819
- if (disabled) {
820
- disabledRef.current.add(value);
821
- } else {
822
- disabledRef.current.delete(value);
823
- }
824
- };
825
- const unregisterTrigger = (value) => {
826
- triggersRef.current = triggersRef.current.filter((v) => v !== value);
827
- disabledRef.current.delete(value);
828
- };
829
- const getTriggers = () => triggersRef.current;
830
- const isDisabled = (value) => disabledRef.current.has(value);
831
- return /* @__PURE__ */ jsx(
832
- TabsListContext.Provider,
833
- {
834
- value: { registerTrigger, unregisterTrigger, getTriggers, isDisabled },
835
- children: /* @__PURE__ */ jsx(
836
- "div",
837
- {
838
- className: clsx8(
839
- "ui:flex ui:gap-1",
840
- variant === "underline" && "ui:border-b ui:border-border",
841
- variant === "pills" && "ui:[.media-section:nth-of-type(odd)_&]:bg-white ui:bg-muted ui:p-1 ui:rounded-lg ui:w-fit",
842
- className
843
- ),
844
- role: "tablist",
845
- ...rest,
846
- children
847
- }
848
- )
849
- }
850
- );
851
- }
852
- var TabsList_default = TabsList;
853
- function TabsPanel({ value, children, ...rest }) {
854
- const { value: activeValue, prefix } = useTabsContext();
855
- const isActive = value === activeValue;
856
- const getTabId = (val) => prefix ? `tab-${prefix}-${val}` : `tab-${val}`;
857
- const getTabPanelId = (val) => prefix ? `tabpanel-${prefix}-${val}` : `tabpanel-${val}`;
858
- return /* @__PURE__ */ jsx(
859
- "div",
860
- {
861
- role: "tabpanel",
862
- id: getTabPanelId(value),
863
- "aria-labelledby": getTabId(value),
864
- hidden: !isActive,
865
- ...rest,
866
- className: clsx8("ui:mt-4", rest.className),
867
- children
868
- }
869
- );
870
- }
871
- var TabsPanel_default = TabsPanel;
872
- function TabsTrigger({
873
- value,
874
- icon,
875
- disabled,
876
- className,
877
- children,
878
- ...rest
879
- }) {
880
- const {
881
- value: activeValue,
882
- onValueChange,
883
- variant,
884
- prefix
885
- } = useTabsContext();
886
- const { registerTrigger, unregisterTrigger, getTriggers, isDisabled } = useTabsListContext();
887
- const isActive = value === activeValue;
888
- const getTabId = (val) => prefix ? `tab-${prefix}-${val}` : `tab-${val}`;
889
- const getTabPanelId = (val) => prefix ? `tabpanel-${prefix}-${val}` : `tabpanel-${val}`;
890
- useEffect(() => {
891
- registerTrigger(value, disabled);
892
- return () => {
893
- unregisterTrigger(value);
894
- };
895
- }, [value, disabled, registerTrigger, unregisterTrigger]);
896
- const handleClick = () => {
897
- if (!disabled) {
898
- onValueChange(value);
899
- }
900
- };
901
- const findNextEnabledTab = (triggers, startIndex, direction) => {
902
- const length = triggers.length;
903
- let index = startIndex;
904
- for (let i = 0; i < length; i++) {
905
- index = (index + direction + length) % length;
906
- if (!isDisabled(triggers[index])) {
907
- return index;
908
- }
909
- }
910
- return startIndex;
911
- };
912
- const handleKeyDown = (event) => {
913
- if (disabled) return;
914
- const triggers = getTriggers();
915
- const currentIndex = triggers.indexOf(value);
916
- let newIndex = currentIndex;
917
- switch (event.key) {
918
- case "ArrowLeft":
919
- event.preventDefault();
920
- newIndex = findNextEnabledTab(triggers, currentIndex, -1);
921
- break;
922
- case "ArrowRight":
923
- event.preventDefault();
924
- newIndex = findNextEnabledTab(triggers, currentIndex, 1);
925
- break;
926
- case "Home":
927
- event.preventDefault();
928
- newIndex = 0;
929
- while (newIndex < triggers.length && isDisabled(triggers[newIndex])) {
930
- newIndex++;
931
- }
932
- break;
933
- case "End":
934
- event.preventDefault();
935
- newIndex = triggers.length - 1;
936
- while (newIndex >= 0 && isDisabled(triggers[newIndex])) {
937
- newIndex--;
938
- }
939
- break;
940
- default:
941
- return;
942
- }
943
- const newValue = triggers[newIndex];
944
- if (newValue && newValue !== value) {
945
- onValueChange(newValue);
946
- }
947
- };
948
- return /* @__PURE__ */ jsxs(
949
- "button",
950
- {
951
- type: "button",
952
- role: "tab",
953
- "aria-selected": isActive ? "true" : "false",
954
- "aria-controls": getTabPanelId(value),
955
- id: getTabId(value),
956
- tabIndex: isActive ? 0 : -1,
957
- disabled,
958
- className: clsx8(
959
- "ui:px-4 ui:py-2 ui:font-roboto ui:text-sm ui:font-medium",
960
- "ui:flex ui:items-center ui:gap-2",
961
- "ui:transition-colors ui:duration-200",
962
- "focus-visible:ui:outline-none focus-visible:ui:ring-2 focus-visible:ui:ring-ring focus-visible:ui:ring-offset-2",
963
- !disabled && "ui:cursor-pointer",
964
- variant === "underline" && [
965
- "ui:relative ui:border-b-2 ui:border-transparent ui:-mb-px",
966
- isActive ? "ui:text-primary ui:border-primary" : "ui:text-foreground hover:ui:text-foreground",
967
- disabled && "ui:text-muted-foreground/50 ui:cursor-not-allowed hover:ui:text-muted-foreground/50"
968
- ],
969
- variant === "pills" && [
970
- "ui:rounded-md",
971
- isActive ? "ui:bg-primary ui:shadow-sm" : "ui:text-foreground hover:ui:text-foreground",
972
- disabled && "ui:text-muted-foreground/50 ui:cursor-not-allowed hover:ui:text-muted-foreground/50"
973
- ],
974
- className
975
- ),
976
- onClick: handleClick,
977
- onKeyDown: handleKeyDown,
978
- ...rest,
979
- children: [
980
- icon && icon,
981
- children
982
- ]
983
- }
984
- );
985
- }
986
- var TabsTrigger_default = TabsTrigger;
987
- function Tabs({
988
- defaultValue = "",
989
- value,
990
- onValueChange,
991
- variant = "underline",
992
- prefix,
993
- className,
994
- children,
995
- ...rest
996
- }) {
997
- const [internalValue, setInternalValue] = useState(defaultValue);
998
- const activeValue = value ?? internalValue;
999
- const isControlled = value !== void 0;
1000
- const handleValueChange = (newValue) => {
1001
- if (!isControlled) {
1002
- setInternalValue(newValue);
1003
- }
1004
- onValueChange?.(newValue);
1005
- };
1006
- return /* @__PURE__ */ jsx(
1007
- TabsContext.Provider,
1008
- {
1009
- value: {
1010
- value: activeValue,
1011
- onValueChange: handleValueChange,
1012
- variant,
1013
- prefix
1014
- },
1015
- children: /* @__PURE__ */ jsx("div", { className: clsx8("ui:w-full", className), ...rest, children })
1016
- }
1017
- );
1018
- }
1019
- Tabs.List = TabsList_default;
1020
- Tabs.Trigger = TabsTrigger_default;
1021
- Tabs.Panel = TabsPanel_default;
1022
- var Tabs_default = Tabs;
1023
- function Talent({
1024
- name,
1025
- role,
1026
- imageSrc,
1027
- variant = "vertical",
1028
- size = "lg",
1029
- className,
1030
- ...rest
1031
- }) {
1032
- return /* @__PURE__ */ jsxs(
1033
- "div",
1034
- {
1035
- className: clsx8(
1036
- "ui:flex ui:items-center",
1037
- {
1038
- "ui:flex-col ui:text-center ui:gap-3": variant === "vertical",
1039
- "ui:flex-row ui:gap-4": variant === "horizontal"
1040
- },
1041
- className
1042
- ),
1043
- "data-testid": "talent",
1044
- ...rest,
1045
- children: [
1046
- /* @__PURE__ */ jsx(
1047
- Avatar_default,
1048
- {
1049
- testId: "avatar",
1050
- src: imageSrc,
1051
- alt: name ?? "Unknown",
1052
- size
1053
- }
1054
- ),
1055
- /* @__PURE__ */ jsxs(
1056
- "div",
1057
- {
1058
- className: clsx8({ "ui:flex ui:flex-col": variant === "horizontal" }),
1059
- children: [
1060
- /* @__PURE__ */ jsx(
1061
- Typography_default,
1062
- {
1063
- variant: "body",
1064
- className: "ui:font-semibold ui:text-foreground",
1065
- children: name ?? "Unknown"
1066
- }
1067
- ),
1068
- /* @__PURE__ */ jsx(
1069
- Typography_default,
1070
- {
1071
- variant: "caption",
1072
- className: "ui:text-muted-foreground ui:[.media-section:nth-of-type(odd)_&]:text-badge-foreground",
1073
- children: role ?? "N/A"
1074
- }
1075
- )
1076
- ]
1077
- }
1078
- )
1079
- ]
1080
- }
1081
- );
1082
- }
1083
- var Talent_default = Talent;
1084
- function Spinner({ className }) {
1085
- return /* @__PURE__ */ jsx(
1086
- "div",
1087
- {
1088
- role: "status",
1089
- "aria-label": "Loading",
1090
- className: clsx8(
1091
- "ui:size-12 ui:rounded-full ui:border-4 ui:border-white/20 ui:border-t-white ui:animate-spin",
1092
- className
1093
- )
1094
- }
1095
- );
1096
- }
1097
- var Spinner_default = Spinner;
1098
-
1099
- export { Avatar_default as Avatar, Badge_default as Badge, Carousel_default as Carousel, CarouselCounter_default as CarouselCounter, CarouselItem_default as CarouselItem, CarouselLoading_default as CarouselLoading, CarouselNavigation_default as CarouselNavigation, CarouselPagination_default as CarouselPagination, HeroImage_default as HeroImage, IconButton_default as IconButton, Modal_default as Modal, Spinner_default as Spinner, Tabs_default as Tabs, Talent_default as Talent, TrailerCard_default as TrailerCard };
1100
- //# sourceMappingURL=index.js.map
1101
52
  //# sourceMappingURL=index.js.map