@vite-mf-monorepo/ui 0.4.7 → 0.4.9

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 (133) hide show
  1. package/dist/Avatar/Avatar.js +1 -61
  2. package/dist/Avatar/Avatar.js.map +1 -1
  3. package/dist/Avatar/index.js +1 -4
  4. package/dist/Avatar/index.js.map +1 -1
  5. package/dist/Badge/Badge.js +1 -47
  6. package/dist/Badge/Badge.js.map +1 -1
  7. package/dist/Badge/index.js +1 -4
  8. package/dist/Badge/index.js.map +1 -1
  9. package/dist/Button/Button.utils.js +1 -43
  10. package/dist/Button/Button.utils.js.map +1 -1
  11. package/dist/Button/index.js +1 -4
  12. package/dist/Button/index.js.map +1 -1
  13. package/dist/Card/Card.js +1 -20
  14. package/dist/Card/Card.js.map +1 -1
  15. package/dist/Card/index.js +1 -4
  16. package/dist/Card/index.js.map +1 -1
  17. package/dist/Carousel/Carousel.js +1 -267
  18. package/dist/Carousel/Carousel.js.map +1 -1
  19. package/dist/Carousel/CarouselCounter.js +1 -27
  20. package/dist/Carousel/CarouselCounter.js.map +1 -1
  21. package/dist/Carousel/CarouselError.js +1 -17
  22. package/dist/Carousel/CarouselError.js.map +1 -1
  23. package/dist/Carousel/CarouselItem.js +1 -27
  24. package/dist/Carousel/CarouselItem.js.map +1 -1
  25. package/dist/Carousel/CarouselLoading.js +1 -62
  26. package/dist/Carousel/CarouselLoading.js.map +1 -1
  27. package/dist/Carousel/CarouselNavigation.js +1 -96
  28. package/dist/Carousel/CarouselNavigation.js.map +1 -1
  29. package/dist/Carousel/CarouselPagination.js +1 -28
  30. package/dist/Carousel/CarouselPagination.js.map +1 -1
  31. package/dist/Carousel/index.js +1 -14
  32. package/dist/Carousel/index.js.map +1 -1
  33. package/dist/HeroImage/HeroImage.js +1 -46
  34. package/dist/HeroImage/HeroImage.js.map +1 -1
  35. package/dist/HeroImage/index.js +1 -4
  36. package/dist/HeroImage/index.js.map +1 -1
  37. package/dist/Icon/Icon.js +1 -203
  38. package/dist/Icon/Icon.js.map +1 -1
  39. package/dist/Icon/index.js +1 -4
  40. package/dist/Icon/index.js.map +1 -1
  41. package/dist/IconButton/IconButton.js +1 -43
  42. package/dist/IconButton/IconButton.js.map +1 -1
  43. package/dist/IconButton/index.js +1 -4
  44. package/dist/IconButton/index.js.map +1 -1
  45. package/dist/Image/Image.js +1 -124
  46. package/dist/Image/Image.js.map +1 -1
  47. package/dist/Image/index.js +1 -4
  48. package/dist/Image/index.js.map +1 -1
  49. package/dist/Modal/Modal.js +1 -54
  50. package/dist/Modal/Modal.js.map +1 -1
  51. package/dist/Modal/index.js +1 -4
  52. package/dist/Modal/index.js.map +1 -1
  53. package/dist/MovieCard/MovieCard.utils.js +1 -19
  54. package/dist/MovieCard/MovieCard.utils.js.map +1 -1
  55. package/dist/MovieCard/MovieCardContent.js +1 -74
  56. package/dist/MovieCard/MovieCardContent.js.map +1 -1
  57. package/dist/MovieCard/index.js +1 -4
  58. package/dist/MovieCard/index.js.map +1 -1
  59. package/dist/Rating/CircleRating.js +1 -74
  60. package/dist/Rating/CircleRating.js.map +1 -1
  61. package/dist/Rating/Rating.js +1 -40
  62. package/dist/Rating/Rating.js.map +1 -1
  63. package/dist/Rating/StarsRating.js +1 -46
  64. package/dist/Rating/StarsRating.js.map +1 -1
  65. package/dist/Rating/index.js +1 -4
  66. package/dist/Rating/index.js.map +1 -1
  67. package/dist/Skeleton/Skeleton.js +1 -35
  68. package/dist/Skeleton/Skeleton.js.map +1 -1
  69. package/dist/Skeleton/index.js +1 -4
  70. package/dist/Skeleton/index.js.map +1 -1
  71. package/dist/Spinner/Spinner.js +1 -19
  72. package/dist/Spinner/Spinner.js.map +1 -1
  73. package/dist/Spinner/index.js +1 -4
  74. package/dist/Spinner/index.js.map +1 -1
  75. package/dist/Tabs/Tabs.js +1 -46
  76. package/dist/Tabs/Tabs.js.map +1 -1
  77. package/dist/Tabs/TabsContext.js +1 -15
  78. package/dist/Tabs/TabsContext.js.map +1 -1
  79. package/dist/Tabs/TabsList.js +1 -50
  80. package/dist/Tabs/TabsList.js.map +1 -1
  81. package/dist/Tabs/TabsListContext.js +1 -15
  82. package/dist/Tabs/TabsListContext.js.map +1 -1
  83. package/dist/Tabs/TabsPanel.js +1 -25
  84. package/dist/Tabs/TabsPanel.js.map +1 -1
  85. package/dist/Tabs/TabsTrigger.js +1 -123
  86. package/dist/Tabs/TabsTrigger.js.map +1 -1
  87. package/dist/Tabs/index.js +1 -4
  88. package/dist/Tabs/index.js.map +1 -1
  89. package/dist/Talent/Talent.js +1 -68
  90. package/dist/Talent/Talent.js.map +1 -1
  91. package/dist/Talent/index.js +1 -4
  92. package/dist/Talent/index.js.map +1 -1
  93. package/dist/TrailerCard/TrailerCard.js +1 -85
  94. package/dist/TrailerCard/TrailerCard.js.map +1 -1
  95. package/dist/TrailerCard/index.js +1 -4
  96. package/dist/TrailerCard/index.js.map +1 -1
  97. package/dist/Typography/Typography.js +1 -54
  98. package/dist/Typography/Typography.js.map +1 -1
  99. package/dist/Typography/index.js +1 -4
  100. package/dist/Typography/index.js.map +1 -1
  101. package/dist/index.js +1 -51
  102. package/dist/index.js.map +1 -1
  103. package/dist/next/Button/Button.js +1 -51
  104. package/dist/next/Button/Button.js.map +1 -1
  105. package/dist/next/Button/index.js +1 -4
  106. package/dist/next/Button/index.js.map +1 -1
  107. package/dist/next/HeroImage/HeroImage.js +1 -43
  108. package/dist/next/HeroImage/HeroImage.js.map +1 -1
  109. package/dist/next/HeroImage/index.js +1 -4
  110. package/dist/next/HeroImage/index.js.map +1 -1
  111. package/dist/next/Image/NextImage.js +1 -83
  112. package/dist/next/Image/NextImage.js.map +1 -1
  113. package/dist/next/Image/index.js +1 -4
  114. package/dist/next/Image/index.js.map +1 -1
  115. package/dist/next/MovieCard/MovieCard.js +1 -43
  116. package/dist/next/MovieCard/MovieCard.js.map +1 -1
  117. package/dist/next/MovieCard/MovieCardContent.js +1 -78
  118. package/dist/next/MovieCard/MovieCardContent.js.map +1 -1
  119. package/dist/next/MovieCard/index.js +1 -4
  120. package/dist/next/MovieCard/index.js.map +1 -1
  121. package/dist/next/index.js +1 -10
  122. package/dist/next/index.js.map +1 -1
  123. package/dist/react-router/Button/Button.js +1 -51
  124. package/dist/react-router/Button/Button.js.map +1 -1
  125. package/dist/react-router/Button/index.js +1 -4
  126. package/dist/react-router/Button/index.js.map +1 -1
  127. package/dist/react-router/MovieCard/MovieCard.js +1 -41
  128. package/dist/react-router/MovieCard/MovieCard.js.map +1 -1
  129. package/dist/react-router/MovieCard/index.js +1 -4
  130. package/dist/react-router/MovieCard/index.js.map +1 -1
  131. package/dist/react-router/index.js +1 -6
  132. package/dist/react-router/index.js.map +1 -1
  133. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Tabs/TabsContext.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\n\nimport type { TabsVariant } from './Tabs'\n\ninterface TabsContextValue {\n /** Currently active tab value */\n value: string\n /** Change active tab */\n onValueChange: (value: string) => void\n /** Visual variant */\n variant: TabsVariant\n /** Optional prefix for ID generation */\n prefix?: string\n}\n\nexport const TabsContext = createContext<TabsContextValue | undefined>(\n undefined\n)\n\nexport const useTabsContext = () => {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error('Tabs compound components must be used within <Tabs>')\n }\n return context\n}\n"],"mappings":"AAAA,SAAS,eAAe,kBAAkB;AAenC,MAAM,cAAc;AAAA,EACzB;AACF;AAEO,MAAM,iBAAiB,MAAM;AAClC,QAAM,UAAU,WAAW,WAAW;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/Tabs/TabsContext.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\n\nimport type { TabsVariant } from './Tabs'\n\ninterface TabsContextValue {\n /** Currently active tab value */\n value: string\n /** Change active tab */\n onValueChange: (value: string) => void\n /** Visual variant */\n variant: TabsVariant\n /** Optional prefix for ID generation */\n prefix?: string\n}\n\nexport const TabsContext = createContext<TabsContextValue | undefined>(\n undefined\n)\n\nexport const useTabsContext = () => {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error('Tabs compound components must be used within <Tabs>')\n }\n return context\n}\n"],"mappings":"AAAA,OAAS,iBAAAA,EAAe,cAAAC,MAAkB,QAenC,MAAMC,EAAcF,EACzB,MACF,EAEaG,EAAiB,IAAM,CAClC,MAAMC,EAAUH,EAAWC,CAAW,EACtC,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,qDAAqD,EAEvE,OAAOA,CACT","names":["createContext","useContext","TabsContext","useTabsContext","context"]}
@@ -1,51 +1,2 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import clsx from "clsx";
3
- import { useRef } from "react";
4
- import { useTabsContext } from "./TabsContext";
5
- import { TabsListContext } from "./TabsListContext";
6
- function TabsList({ className, children, ...rest }) {
7
- const { variant } = useTabsContext();
8
- const triggersRef = useRef([]);
9
- const disabledRef = useRef(/* @__PURE__ */ new Set());
10
- const registerTrigger = (value, disabled) => {
11
- if (!triggersRef.current.includes(value)) {
12
- triggersRef.current.push(value);
13
- }
14
- if (disabled) {
15
- disabledRef.current.add(value);
16
- } else {
17
- disabledRef.current.delete(value);
18
- }
19
- };
20
- const unregisterTrigger = (value) => {
21
- triggersRef.current = triggersRef.current.filter((v) => v !== value);
22
- disabledRef.current.delete(value);
23
- };
24
- const getTriggers = () => triggersRef.current;
25
- const isDisabled = (value) => disabledRef.current.has(value);
26
- return /* @__PURE__ */ jsx(
27
- TabsListContext.Provider,
28
- {
29
- value: { registerTrigger, unregisterTrigger, getTriggers, isDisabled },
30
- children: /* @__PURE__ */ jsx(
31
- "div",
32
- {
33
- className: clsx(
34
- "ui:flex ui:gap-1",
35
- variant === "underline" && "ui:border-b ui:border-border",
36
- variant === "pills" && "ui:[.media-section:nth-of-type(odd)_&]:bg-white ui:bg-muted ui:p-1 ui:rounded-lg ui:w-fit",
37
- className
38
- ),
39
- role: "tablist",
40
- ...rest,
41
- children
42
- }
43
- )
44
- }
45
- );
46
- }
47
- var TabsList_default = TabsList;
48
- export {
49
- TabsList_default as default
50
- };
1
+ import{jsx as o}from"react/jsx-runtime";import f from"clsx";import{useRef as n}from"react";import{useTabsContext as p}from"./TabsContext";import{TabsListContext as m}from"./TabsListContext";function T({className:u,children:d,...c}){const{variant:s}=p(),r=n([]),e=n(new Set),g=(t,i)=>{r.current.includes(t)||r.current.push(t),i?e.current.add(t):e.current.delete(t)},b=t=>{r.current=r.current.filter(i=>i!==t),e.current.delete(t)},a=()=>r.current,l=t=>e.current.has(t);return o(m.Provider,{value:{registerTrigger:g,unregisterTrigger:b,getTriggers:a,isDisabled:l},children:o("div",{className:f("ui:flex ui:gap-1",s==="underline"&&"ui:border-b ui:border-border",s==="pills"&&"ui:[.media-section:nth-of-type(odd)_&]:bg-white ui:bg-muted ui:p-1 ui:rounded-lg ui:w-fit",u),role:"tablist",...c,children:d})})}var P=T;export{P as default};
51
2
  //# sourceMappingURL=TabsList.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Tabs/TabsList.tsx"],"sourcesContent":["import clsx from 'clsx'\nimport { useRef } from 'react'\n\nimport { useTabsContext } from './TabsContext'\nimport { TabsListContext } from './TabsListContext'\n\nimport type { HTMLAttributes } from 'react'\n\nexport type TabsListProps = HTMLAttributes<HTMLDivElement>\n\nfunction TabsList({ className, children, ...rest }: Readonly<TabsListProps>) {\n const { variant } = useTabsContext()\n const triggersRef = useRef<string[]>([])\n const disabledRef = useRef<Set<string>>(new Set())\n\n const registerTrigger = (value: string, disabled?: boolean) => {\n if (!triggersRef.current.includes(value)) {\n triggersRef.current.push(value)\n }\n if (disabled) {\n disabledRef.current.add(value)\n } else {\n disabledRef.current.delete(value)\n }\n }\n\n const unregisterTrigger = (value: string) => {\n triggersRef.current = triggersRef.current.filter((v) => v !== value)\n disabledRef.current.delete(value)\n }\n\n const getTriggers = () => triggersRef.current\n const isDisabled = (value: string) => disabledRef.current.has(value)\n\n return (\n <TabsListContext.Provider\n value={{ registerTrigger, unregisterTrigger, getTriggers, isDisabled }}\n >\n <div\n className={clsx(\n 'ui:flex ui:gap-1',\n variant === 'underline' && 'ui:border-b ui:border-border',\n variant === 'pills' &&\n 'ui:[.media-section:nth-of-type(odd)_&]:bg-white ui:bg-muted ui:p-1 ui:rounded-lg ui:w-fit',\n className\n )}\n role=\"tablist\"\n {...rest}\n >\n {children}\n </div>\n </TabsListContext.Provider>\n )\n}\n\nexport default TabsList\n"],"mappings":"AAsCM;AAtCN,OAAO,UAAU;AACjB,SAAS,cAAc;AAEvB,SAAS,sBAAsB;AAC/B,SAAS,uBAAuB;AAMhC,SAAS,SAAS,EAAE,WAAW,UAAU,GAAG,KAAK,GAA4B;AAC3E,QAAM,EAAE,QAAQ,IAAI,eAAe;AACnC,QAAM,cAAc,OAAiB,CAAC,CAAC;AACvC,QAAM,cAAc,OAAoB,oBAAI,IAAI,CAAC;AAEjD,QAAM,kBAAkB,CAAC,OAAe,aAAuB;AAC7D,QAAI,CAAC,YAAY,QAAQ,SAAS,KAAK,GAAG;AACxC,kBAAY,QAAQ,KAAK,KAAK;AAAA,IAChC;AACA,QAAI,UAAU;AACZ,kBAAY,QAAQ,IAAI,KAAK;AAAA,IAC/B,OAAO;AACL,kBAAY,QAAQ,OAAO,KAAK;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,oBAAoB,CAAC,UAAkB;AAC3C,gBAAY,UAAU,YAAY,QAAQ,OAAO,CAAC,MAAM,MAAM,KAAK;AACnE,gBAAY,QAAQ,OAAO,KAAK;AAAA,EAClC;AAEA,QAAM,cAAc,MAAM,YAAY;AACtC,QAAM,aAAa,CAAC,UAAkB,YAAY,QAAQ,IAAI,KAAK;AAEnE,SACE;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,OAAO,EAAE,iBAAiB,mBAAmB,aAAa,WAAW;AAAA,MAErE;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,YAAY,eAAe;AAAA,YAC3B,YAAY,WACV;AAAA,YACF;AAAA,UACF;AAAA,UACA,MAAK;AAAA,UACJ,GAAG;AAAA,UAEH;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,mBAAQ;","names":[]}
1
+ {"version":3,"sources":["../../src/Tabs/TabsList.tsx"],"sourcesContent":["import clsx from 'clsx'\nimport { useRef } from 'react'\n\nimport { useTabsContext } from './TabsContext'\nimport { TabsListContext } from './TabsListContext'\n\nimport type { HTMLAttributes } from 'react'\n\nexport type TabsListProps = HTMLAttributes<HTMLDivElement>\n\nfunction TabsList({ className, children, ...rest }: Readonly<TabsListProps>) {\n const { variant } = useTabsContext()\n const triggersRef = useRef<string[]>([])\n const disabledRef = useRef<Set<string>>(new Set())\n\n const registerTrigger = (value: string, disabled?: boolean) => {\n if (!triggersRef.current.includes(value)) {\n triggersRef.current.push(value)\n }\n if (disabled) {\n disabledRef.current.add(value)\n } else {\n disabledRef.current.delete(value)\n }\n }\n\n const unregisterTrigger = (value: string) => {\n triggersRef.current = triggersRef.current.filter((v) => v !== value)\n disabledRef.current.delete(value)\n }\n\n const getTriggers = () => triggersRef.current\n const isDisabled = (value: string) => disabledRef.current.has(value)\n\n return (\n <TabsListContext.Provider\n value={{ registerTrigger, unregisterTrigger, getTriggers, isDisabled }}\n >\n <div\n className={clsx(\n 'ui:flex ui:gap-1',\n variant === 'underline' && 'ui:border-b ui:border-border',\n variant === 'pills' &&\n 'ui:[.media-section:nth-of-type(odd)_&]:bg-white ui:bg-muted ui:p-1 ui:rounded-lg ui:w-fit',\n className\n )}\n role=\"tablist\"\n {...rest}\n >\n {children}\n </div>\n </TabsListContext.Provider>\n )\n}\n\nexport default TabsList\n"],"mappings":"AAsCM,cAAAA,MAAA,oBAtCN,OAAOC,MAAU,OACjB,OAAS,UAAAC,MAAc,QAEvB,OAAS,kBAAAC,MAAsB,gBAC/B,OAAS,mBAAAC,MAAuB,oBAMhC,SAASC,EAAS,CAAE,UAAAC,EAAW,SAAAC,EAAU,GAAGC,CAAK,EAA4B,CAC3E,KAAM,CAAE,QAAAC,CAAQ,EAAIN,EAAe,EAC7BO,EAAcR,EAAiB,CAAC,CAAC,EACjCS,EAAcT,EAAoB,IAAI,GAAK,EAE3CU,EAAkB,CAACC,EAAeC,IAAuB,CACxDJ,EAAY,QAAQ,SAASG,CAAK,GACrCH,EAAY,QAAQ,KAAKG,CAAK,EAE5BC,EACFH,EAAY,QAAQ,IAAIE,CAAK,EAE7BF,EAAY,QAAQ,OAAOE,CAAK,CAEpC,EAEME,EAAqBF,GAAkB,CAC3CH,EAAY,QAAUA,EAAY,QAAQ,OAAQM,GAAMA,IAAMH,CAAK,EACnEF,EAAY,QAAQ,OAAOE,CAAK,CAClC,EAEMI,EAAc,IAAMP,EAAY,QAChCQ,EAAcL,GAAkBF,EAAY,QAAQ,IAAIE,CAAK,EAEnE,OACEb,EAACI,EAAgB,SAAhB,CACC,MAAO,CAAE,gBAAAQ,EAAiB,kBAAAG,EAAmB,YAAAE,EAAa,WAAAC,CAAW,EAErE,SAAAlB,EAAC,OACC,UAAWC,EACT,mBACAQ,IAAY,aAAe,+BAC3BA,IAAY,SACV,4FACFH,CACF,EACA,KAAK,UACJ,GAAGE,EAEH,SAAAD,EACH,EACF,CAEJ,CAEA,IAAOY,EAAQd","names":["jsx","clsx","useRef","useTabsContext","TabsListContext","TabsList","className","children","rest","variant","triggersRef","disabledRef","registerTrigger","value","disabled","unregisterTrigger","v","getTriggers","isDisabled","TabsList_default"]}
@@ -1,16 +1,2 @@
1
- import { createContext, useContext } from "react";
2
- const TabsListContext = createContext(
3
- void 0
4
- );
5
- const useTabsListContext = () => {
6
- const context = useContext(TabsListContext);
7
- if (!context) {
8
- throw new Error("TabsTrigger must be used within <Tabs.List>");
9
- }
10
- return context;
11
- };
12
- export {
13
- TabsListContext,
14
- useTabsListContext
15
- };
1
+ import{createContext as t,useContext as r}from"react";const s=t(void 0),n=()=>{const e=r(s);if(!e)throw new Error("TabsTrigger must be used within <Tabs.List>");return e};export{s as TabsListContext,n as useTabsListContext};
16
2
  //# sourceMappingURL=TabsListContext.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Tabs/TabsListContext.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\n\ninterface TabsListContextValue {\n /** Register a trigger with its value and disabled state */\n registerTrigger: (value: string, disabled?: boolean) => void\n /** Unregister a trigger */\n unregisterTrigger: (value: string) => void\n /** Get all registered trigger values */\n getTriggers: () => string[]\n /** Check if a trigger is disabled */\n isDisabled: (value: string) => boolean\n}\n\nexport const TabsListContext = createContext<TabsListContextValue | undefined>(\n undefined\n)\n\nexport const useTabsListContext = () => {\n const context = useContext(TabsListContext)\n if (!context) {\n throw new Error('TabsTrigger must be used within <Tabs.List>')\n }\n return context\n}\n"],"mappings":"AAAA,SAAS,eAAe,kBAAkB;AAanC,MAAM,kBAAkB;AAAA,EAC7B;AACF;AAEO,MAAM,qBAAqB,MAAM;AACtC,QAAM,UAAU,WAAW,eAAe;AAC1C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/Tabs/TabsListContext.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\n\ninterface TabsListContextValue {\n /** Register a trigger with its value and disabled state */\n registerTrigger: (value: string, disabled?: boolean) => void\n /** Unregister a trigger */\n unregisterTrigger: (value: string) => void\n /** Get all registered trigger values */\n getTriggers: () => string[]\n /** Check if a trigger is disabled */\n isDisabled: (value: string) => boolean\n}\n\nexport const TabsListContext = createContext<TabsListContextValue | undefined>(\n undefined\n)\n\nexport const useTabsListContext = () => {\n const context = useContext(TabsListContext)\n if (!context) {\n throw new Error('TabsTrigger must be used within <Tabs.List>')\n }\n return context\n}\n"],"mappings":"AAAA,OAAS,iBAAAA,EAAe,cAAAC,MAAkB,QAanC,MAAMC,EAAkBF,EAC7B,MACF,EAEaG,EAAqB,IAAM,CACtC,MAAMC,EAAUH,EAAWC,CAAe,EAC1C,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,6CAA6C,EAE/D,OAAOA,CACT","names":["createContext","useContext","TabsListContext","useTabsListContext","context"]}
@@ -1,26 +1,2 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import clsx from "clsx";
3
- import { useTabsContext } from "./TabsContext";
4
- function TabsPanel({ value, children, ...rest }) {
5
- const { value: activeValue, prefix } = useTabsContext();
6
- const isActive = value === activeValue;
7
- const getTabId = (val) => prefix ? `tab-${prefix}-${val}` : `tab-${val}`;
8
- const getTabPanelId = (val) => prefix ? `tabpanel-${prefix}-${val}` : `tabpanel-${val}`;
9
- return /* @__PURE__ */ jsx(
10
- "div",
11
- {
12
- role: "tabpanel",
13
- id: getTabPanelId(value),
14
- "aria-labelledby": getTabId(value),
15
- hidden: !isActive,
16
- ...rest,
17
- className: clsx("ui:mt-4", rest.className),
18
- children
19
- }
20
- );
21
- }
22
- var TabsPanel_default = TabsPanel;
23
- export {
24
- TabsPanel_default as default
25
- };
1
+ import{jsx as c}from"react/jsx-runtime";import l from"clsx";import{useTabsContext as b}from"./TabsContext";function d({value:a,children:i,...n}){const{value:s,prefix:t}=b(),o=a===s,r=e=>t?`tab-${t}-${e}`:`tab-${e}`;return c("div",{role:"tabpanel",id:(e=>t?`tabpanel-${t}-${e}`:`tabpanel-${e}`)(a),"aria-labelledby":r(a),hidden:!o,...n,className:l("ui:mt-4",n.className),children:i})}var f=d;export{f as default};
26
2
  //# sourceMappingURL=TabsPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Tabs/TabsPanel.tsx"],"sourcesContent":["import clsx from 'clsx'\n\nimport { useTabsContext } from './TabsContext'\n\nimport type { HTMLAttributes, ReactNode } from 'react'\n\nexport interface TabsPanelProps extends HTMLAttributes<HTMLDivElement> {\n /** Value that identifies this panel (must match a Tabs.Trigger value) */\n value: string\n /** Panel content */\n children: ReactNode\n}\n\n/**\n * Tabpanel for Tabs component.\n * Automatically hidden/shown based on active tab value.\n * Provides proper ARIA attributes for accessibility.\n */\nfunction TabsPanel({ value, children, ...rest }: Readonly<TabsPanelProps>) {\n const { value: activeValue, prefix } = useTabsContext()\n const isActive = value === activeValue\n\n const getTabId = (val: string) =>\n prefix ? `tab-${prefix}-${val}` : `tab-${val}`\n const getTabPanelId = (val: string) =>\n prefix ? `tabpanel-${prefix}-${val}` : `tabpanel-${val}`\n\n return (\n <div\n role=\"tabpanel\"\n id={getTabPanelId(value)}\n aria-labelledby={getTabId(value)}\n hidden={!isActive}\n {...rest}\n className={clsx('ui:mt-4', rest.className)}\n >\n {children}\n </div>\n )\n}\n\nexport default TabsPanel\n"],"mappings":"AA4BI;AA5BJ,OAAO,UAAU;AAEjB,SAAS,sBAAsB;AAgB/B,SAAS,UAAU,EAAE,OAAO,UAAU,GAAG,KAAK,GAA6B;AACzE,QAAM,EAAE,OAAO,aAAa,OAAO,IAAI,eAAe;AACtD,QAAM,WAAW,UAAU;AAE3B,QAAM,WAAW,CAAC,QAChB,SAAS,OAAO,MAAM,IAAI,GAAG,KAAK,OAAO,GAAG;AAC9C,QAAM,gBAAgB,CAAC,QACrB,SAAS,YAAY,MAAM,IAAI,GAAG,KAAK,YAAY,GAAG;AAExD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,IAAI,cAAc,KAAK;AAAA,MACvB,mBAAiB,SAAS,KAAK;AAAA,MAC/B,QAAQ,CAAC;AAAA,MACR,GAAG;AAAA,MACJ,WAAW,KAAK,WAAW,KAAK,SAAS;AAAA,MAExC;AAAA;AAAA,EACH;AAEJ;AAEA,IAAO,oBAAQ;","names":[]}
1
+ {"version":3,"sources":["../../src/Tabs/TabsPanel.tsx"],"sourcesContent":["import clsx from 'clsx'\n\nimport { useTabsContext } from './TabsContext'\n\nimport type { HTMLAttributes, ReactNode } from 'react'\n\nexport interface TabsPanelProps extends HTMLAttributes<HTMLDivElement> {\n /** Value that identifies this panel (must match a Tabs.Trigger value) */\n value: string\n /** Panel content */\n children: ReactNode\n}\n\n/**\n * Tabpanel for Tabs component.\n * Automatically hidden/shown based on active tab value.\n * Provides proper ARIA attributes for accessibility.\n */\nfunction TabsPanel({ value, children, ...rest }: Readonly<TabsPanelProps>) {\n const { value: activeValue, prefix } = useTabsContext()\n const isActive = value === activeValue\n\n const getTabId = (val: string) =>\n prefix ? `tab-${prefix}-${val}` : `tab-${val}`\n const getTabPanelId = (val: string) =>\n prefix ? `tabpanel-${prefix}-${val}` : `tabpanel-${val}`\n\n return (\n <div\n role=\"tabpanel\"\n id={getTabPanelId(value)}\n aria-labelledby={getTabId(value)}\n hidden={!isActive}\n {...rest}\n className={clsx('ui:mt-4', rest.className)}\n >\n {children}\n </div>\n )\n}\n\nexport default TabsPanel\n"],"mappings":"AA4BI,cAAAA,MAAA,oBA5BJ,OAAOC,MAAU,OAEjB,OAAS,kBAAAC,MAAsB,gBAgB/B,SAASC,EAAU,CAAE,MAAAC,EAAO,SAAAC,EAAU,GAAGC,CAAK,EAA6B,CACzE,KAAM,CAAE,MAAOC,EAAa,OAAAC,CAAO,EAAIN,EAAe,EAChDO,EAAWL,IAAUG,EAErBG,EAAYC,GAChBH,EAAS,OAAOA,CAAM,IAAIG,CAAG,GAAK,OAAOA,CAAG,GAI9C,OACEX,EAAC,OACC,KAAK,WACL,IANmBW,GACrBH,EAAS,YAAYA,CAAM,IAAIG,CAAG,GAAK,YAAYA,CAAG,IAKlCP,CAAK,EACvB,kBAAiBM,EAASN,CAAK,EAC/B,OAAQ,CAACK,EACR,GAAGH,EACJ,UAAWL,EAAK,UAAWK,EAAK,SAAS,EAExC,SAAAD,EACH,CAEJ,CAEA,IAAOO,EAAQT","names":["jsx","clsx","useTabsContext","TabsPanel","value","children","rest","activeValue","prefix","isActive","getTabId","val","TabsPanel_default"]}
@@ -1,124 +1,2 @@
1
- import { jsxs } from "react/jsx-runtime";
2
- import clsx from "clsx";
3
- import { useEffect } from "react";
4
- import { useTabsContext } from "./TabsContext";
5
- import { useTabsListContext } from "./TabsListContext";
6
- function TabsTrigger({
7
- value,
8
- icon,
9
- disabled,
10
- className,
11
- children,
12
- ...rest
13
- }) {
14
- const {
15
- value: activeValue,
16
- onValueChange,
17
- variant,
18
- prefix
19
- } = useTabsContext();
20
- const { registerTrigger, unregisterTrigger, getTriggers, isDisabled } = useTabsListContext();
21
- const isActive = value === activeValue;
22
- const getTabId = (val) => prefix ? `tab-${prefix}-${val}` : `tab-${val}`;
23
- const getTabPanelId = (val) => prefix ? `tabpanel-${prefix}-${val}` : `tabpanel-${val}`;
24
- useEffect(() => {
25
- registerTrigger(value, disabled);
26
- return () => {
27
- unregisterTrigger(value);
28
- };
29
- }, [value, disabled, registerTrigger, unregisterTrigger]);
30
- const handleClick = () => {
31
- if (!disabled) {
32
- onValueChange(value);
33
- }
34
- };
35
- const findNextEnabledTab = (triggers, startIndex, direction) => {
36
- const length = triggers.length;
37
- let index = startIndex;
38
- for (let i = 0; i < length; i++) {
39
- index = (index + direction + length) % length;
40
- if (!isDisabled(triggers[index])) {
41
- return index;
42
- }
43
- }
44
- return startIndex;
45
- };
46
- const handleKeyDown = (event) => {
47
- if (disabled) return;
48
- const triggers = getTriggers();
49
- const currentIndex = triggers.indexOf(value);
50
- let newIndex = currentIndex;
51
- switch (event.key) {
52
- case "ArrowLeft":
53
- event.preventDefault();
54
- newIndex = findNextEnabledTab(triggers, currentIndex, -1);
55
- break;
56
- case "ArrowRight":
57
- event.preventDefault();
58
- newIndex = findNextEnabledTab(triggers, currentIndex, 1);
59
- break;
60
- case "Home":
61
- event.preventDefault();
62
- newIndex = 0;
63
- while (newIndex < triggers.length && isDisabled(triggers[newIndex])) {
64
- newIndex++;
65
- }
66
- break;
67
- case "End":
68
- event.preventDefault();
69
- newIndex = triggers.length - 1;
70
- while (newIndex >= 0 && isDisabled(triggers[newIndex])) {
71
- newIndex--;
72
- }
73
- break;
74
- default:
75
- return;
76
- }
77
- const newValue = triggers[newIndex];
78
- if (newValue && newValue !== value) {
79
- onValueChange(newValue);
80
- }
81
- };
82
- return /* @__PURE__ */ jsxs(
83
- "button",
84
- {
85
- type: "button",
86
- role: "tab",
87
- "aria-selected": isActive ? "true" : "false",
88
- "aria-controls": getTabPanelId(value),
89
- id: getTabId(value),
90
- tabIndex: isActive ? 0 : -1,
91
- disabled,
92
- className: clsx(
93
- "ui:px-4 ui:py-2 ui:font-roboto ui:text-sm ui:font-medium",
94
- "ui:flex ui:items-center ui:gap-2",
95
- "ui:transition-colors ui:duration-200",
96
- "focus-visible:ui:outline-none focus-visible:ui:ring-2 focus-visible:ui:ring-ring focus-visible:ui:ring-offset-2",
97
- !disabled && "ui:cursor-pointer",
98
- variant === "underline" && [
99
- "ui:relative ui:border-b-2 ui:border-transparent ui:-mb-px",
100
- isActive ? "ui:text-primary ui:border-primary" : "ui:text-foreground hover:ui:text-foreground",
101
- disabled && "ui:text-muted-foreground/50 ui:cursor-not-allowed hover:ui:text-muted-foreground/50"
102
- ],
103
- variant === "pills" && [
104
- "ui:rounded-md",
105
- isActive ? "ui:bg-primary ui:shadow-sm" : "ui:text-foreground hover:ui:text-foreground",
106
- disabled && "ui:text-muted-foreground/50 ui:cursor-not-allowed hover:ui:text-muted-foreground/50"
107
- ],
108
- className
109
- ),
110
- onClick: handleClick,
111
- onKeyDown: handleKeyDown,
112
- ...rest,
113
- children: [
114
- icon && icon,
115
- children
116
- ]
117
- }
118
- );
119
- }
120
- var TabsTrigger_default = TabsTrigger;
121
- export {
122
- TabsTrigger_default as default
123
- };
1
+ import{jsxs as B}from"react/jsx-runtime";import L from"clsx";import{useEffect as $}from"react";import{useTabsContext as A}from"./TabsContext";import{useTabsListContext as C}from"./TabsListContext";function H({value:o,icon:g,disabled:i,className:x,children:T,...h}){const{value:w,onValueChange:c,variant:l,prefix:s}=A(),{registerTrigger:b,unregisterTrigger:d,getTriggers:y,isDisabled:f}=C(),a=o===w,k=t=>s?`tab-${s}-${t}`:`tab-${t}`,D=t=>s?`tabpanel-${s}-${t}`:`tabpanel-${t}`;$(()=>(b(o,i),()=>{d(o)}),[o,i,b,d]);const E=()=>{i||c(o)},m=(t,r,u)=>{const e=t.length;let n=r;for(let p=0;p<e;p++)if(n=(n+u+e)%e,!f(t[n]))return n;return r},v=t=>{if(i)return;const r=y(),u=r.indexOf(o);let e=u;switch(t.key){case"ArrowLeft":t.preventDefault(),e=m(r,u,-1);break;case"ArrowRight":t.preventDefault(),e=m(r,u,1);break;case"Home":for(t.preventDefault(),e=0;e<r.length&&f(r[e]);)e++;break;case"End":for(t.preventDefault(),e=r.length-1;e>=0&&f(r[e]);)e--;break;default:return}const n=r[e];n&&n!==o&&c(n)};return B("button",{type:"button",role:"tab","aria-selected":a?"true":"false","aria-controls":D(o),id:k(o),tabIndex:a?0:-1,disabled:i,className:L("ui:px-4 ui:py-2 ui:font-roboto ui:text-sm ui:font-medium","ui:flex ui:items-center ui:gap-2","ui:transition-colors ui:duration-200","focus-visible:ui:outline-none focus-visible:ui:ring-2 focus-visible:ui:ring-ring focus-visible:ui:ring-offset-2",!i&&"ui:cursor-pointer",l==="underline"&&["ui:relative ui:border-b-2 ui:border-transparent ui:-mb-px",a?"ui:text-primary ui:border-primary":"ui:text-foreground hover:ui:text-foreground",i&&"ui:text-muted-foreground/50 ui:cursor-not-allowed hover:ui:text-muted-foreground/50"],l==="pills"&&["ui:rounded-md",a?"ui:bg-primary ui:shadow-sm":"ui:text-foreground hover:ui:text-foreground",i&&"ui:text-muted-foreground/50 ui:cursor-not-allowed hover:ui:text-muted-foreground/50"],x),onClick:E,onKeyDown:v,...h,children:[g&&g,T]})}var R=H;export{R as default};
124
2
  //# sourceMappingURL=TabsTrigger.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Tabs/TabsTrigger.tsx"],"sourcesContent":["import clsx from 'clsx'\nimport { useEffect } from 'react'\n\nimport { useTabsContext } from './TabsContext'\nimport { useTabsListContext } from './TabsListContext'\n\nimport type { ButtonHTMLAttributes, KeyboardEvent, ReactNode } from 'react'\n\nexport interface TabsTriggerProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Value that identifies this tab */\n value: string\n /** Optional icon component */\n icon?: ReactNode\n}\n\nfunction TabsTrigger({\n value,\n icon,\n disabled,\n className,\n children,\n ...rest\n}: Readonly<TabsTriggerProps>) {\n const {\n value: activeValue,\n onValueChange,\n variant,\n prefix,\n } = useTabsContext()\n const { registerTrigger, unregisterTrigger, getTriggers, isDisabled } =\n useTabsListContext()\n\n const isActive = value === activeValue\n\n const getTabId = (val: string) =>\n prefix ? `tab-${prefix}-${val}` : `tab-${val}`\n const getTabPanelId = (val: string) =>\n prefix ? `tabpanel-${prefix}-${val}` : `tabpanel-${val}`\n\n useEffect(() => {\n registerTrigger(value, disabled)\n return () => {\n unregisterTrigger(value)\n }\n }, [value, disabled, registerTrigger, unregisterTrigger])\n\n const handleClick = () => {\n if (!disabled) {\n onValueChange(value)\n }\n }\n\n const findNextEnabledTab = (\n triggers: string[],\n startIndex: number,\n direction: 1 | -1\n ): number => {\n const length = triggers.length\n let index = startIndex\n\n for (let i = 0; i < length; i++) {\n index = (index + direction + length) % length\n if (!isDisabled(triggers[index])) {\n return index\n }\n }\n return startIndex\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return\n\n const triggers = getTriggers()\n const currentIndex = triggers.indexOf(value)\n let newIndex = currentIndex\n\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault()\n newIndex = findNextEnabledTab(triggers, currentIndex, -1)\n break\n case 'ArrowRight':\n event.preventDefault()\n newIndex = findNextEnabledTab(triggers, currentIndex, 1)\n break\n case 'Home':\n event.preventDefault()\n newIndex = 0\n while (newIndex < triggers.length && isDisabled(triggers[newIndex])) {\n newIndex++\n }\n break\n case 'End':\n event.preventDefault()\n newIndex = triggers.length - 1\n while (newIndex >= 0 && isDisabled(triggers[newIndex])) {\n newIndex--\n }\n break\n default:\n return\n }\n\n const newValue = triggers[newIndex]\n if (newValue && newValue !== value) {\n onValueChange(newValue)\n }\n }\n\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive ? 'true' : 'false'}\n aria-controls={getTabPanelId(value)}\n id={getTabId(value)}\n tabIndex={isActive ? 0 : -1}\n disabled={disabled}\n className={clsx(\n 'ui:px-4 ui:py-2 ui:font-roboto ui:text-sm ui:font-medium',\n 'ui:flex ui:items-center ui:gap-2',\n 'ui:transition-colors ui:duration-200',\n 'focus-visible:ui:outline-none focus-visible:ui:ring-2 focus-visible:ui:ring-ring focus-visible:ui:ring-offset-2',\n !disabled && 'ui:cursor-pointer',\n variant === 'underline' && [\n 'ui:relative ui:border-b-2 ui:border-transparent ui:-mb-px',\n isActive\n ? 'ui:text-primary ui:border-primary'\n : 'ui:text-foreground hover:ui:text-foreground',\n disabled &&\n 'ui:text-muted-foreground/50 ui:cursor-not-allowed hover:ui:text-muted-foreground/50',\n ],\n variant === 'pills' && [\n 'ui:rounded-md',\n isActive\n ? 'ui:bg-primary ui:shadow-sm'\n : 'ui:text-foreground hover:ui:text-foreground',\n disabled &&\n 'ui:text-muted-foreground/50 ui:cursor-not-allowed hover:ui:text-muted-foreground/50',\n ],\n className\n )}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {icon && icon}\n {children}\n </button>\n )\n}\n\nexport default TabsTrigger\n"],"mappings":"AA+GI;AA/GJ,OAAO,UAAU;AACjB,SAAS,iBAAiB;AAE1B,SAAS,sBAAsB;AAC/B,SAAS,0BAA0B;AAYnC,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA+B;AAC7B,QAAM;AAAA,IACJ,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,eAAe;AACnB,QAAM,EAAE,iBAAiB,mBAAmB,aAAa,WAAW,IAClE,mBAAmB;AAErB,QAAM,WAAW,UAAU;AAE3B,QAAM,WAAW,CAAC,QAChB,SAAS,OAAO,MAAM,IAAI,GAAG,KAAK,OAAO,GAAG;AAC9C,QAAM,gBAAgB,CAAC,QACrB,SAAS,YAAY,MAAM,IAAI,GAAG,KAAK,YAAY,GAAG;AAExD,YAAU,MAAM;AACd,oBAAgB,OAAO,QAAQ;AAC/B,WAAO,MAAM;AACX,wBAAkB,KAAK;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,OAAO,UAAU,iBAAiB,iBAAiB,CAAC;AAExD,QAAM,cAAc,MAAM;AACxB,QAAI,CAAC,UAAU;AACb,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,qBAAqB,CACzB,UACA,YACA,cACW;AACX,UAAM,SAAS,SAAS;AACxB,QAAI,QAAQ;AAEZ,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,eAAS,QAAQ,YAAY,UAAU;AACvC,UAAI,CAAC,WAAW,SAAS,KAAK,CAAC,GAAG;AAChC,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,CAAC,UAA4C;AACjE,QAAI,SAAU;AAEd,UAAM,WAAW,YAAY;AAC7B,UAAM,eAAe,SAAS,QAAQ,KAAK;AAC3C,QAAI,WAAW;AAEf,YAAQ,MAAM,KAAK;AAAA,MACjB,KAAK;AACH,cAAM,eAAe;AACrB,mBAAW,mBAAmB,UAAU,cAAc,EAAE;AACxD;AAAA,MACF,KAAK;AACH,cAAM,eAAe;AACrB,mBAAW,mBAAmB,UAAU,cAAc,CAAC;AACvD;AAAA,MACF,KAAK;AACH,cAAM,eAAe;AACrB,mBAAW;AACX,eAAO,WAAW,SAAS,UAAU,WAAW,SAAS,QAAQ,CAAC,GAAG;AACnE;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,cAAM,eAAe;AACrB,mBAAW,SAAS,SAAS;AAC7B,eAAO,YAAY,KAAK,WAAW,SAAS,QAAQ,CAAC,GAAG;AACtD;AAAA,QACF;AACA;AAAA,MACF;AACE;AAAA,IACJ;AAEA,UAAM,WAAW,SAAS,QAAQ;AAClC,QAAI,YAAY,aAAa,OAAO;AAClC,oBAAc,QAAQ;AAAA,IACxB;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,MAAK;AAAA,MACL,iBAAe,WAAW,SAAS;AAAA,MACnC,iBAAe,cAAc,KAAK;AAAA,MAClC,IAAI,SAAS,KAAK;AAAA,MAClB,UAAU,WAAW,IAAI;AAAA,MACzB;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC,YAAY;AAAA,QACb,YAAY,eAAe;AAAA,UACzB;AAAA,UACA,WACI,sCACA;AAAA,UACJ,YACE;AAAA,QACJ;AAAA,QACA,YAAY,WAAW;AAAA,UACrB;AAAA,UACA,WACI,+BACA;AAAA,UACJ,YACE;AAAA,QACJ;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS;AAAA,MACT,WAAW;AAAA,MACV,GAAG;AAAA,MAEH;AAAA,gBAAQ;AAAA,QACR;AAAA;AAAA;AAAA,EACH;AAEJ;AAEA,IAAO,sBAAQ;","names":[]}
1
+ {"version":3,"sources":["../../src/Tabs/TabsTrigger.tsx"],"sourcesContent":["import clsx from 'clsx'\nimport { useEffect } from 'react'\n\nimport { useTabsContext } from './TabsContext'\nimport { useTabsListContext } from './TabsListContext'\n\nimport type { ButtonHTMLAttributes, KeyboardEvent, ReactNode } from 'react'\n\nexport interface TabsTriggerProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Value that identifies this tab */\n value: string\n /** Optional icon component */\n icon?: ReactNode\n}\n\nfunction TabsTrigger({\n value,\n icon,\n disabled,\n className,\n children,\n ...rest\n}: Readonly<TabsTriggerProps>) {\n const {\n value: activeValue,\n onValueChange,\n variant,\n prefix,\n } = useTabsContext()\n const { registerTrigger, unregisterTrigger, getTriggers, isDisabled } =\n useTabsListContext()\n\n const isActive = value === activeValue\n\n const getTabId = (val: string) =>\n prefix ? `tab-${prefix}-${val}` : `tab-${val}`\n const getTabPanelId = (val: string) =>\n prefix ? `tabpanel-${prefix}-${val}` : `tabpanel-${val}`\n\n useEffect(() => {\n registerTrigger(value, disabled)\n return () => {\n unregisterTrigger(value)\n }\n }, [value, disabled, registerTrigger, unregisterTrigger])\n\n const handleClick = () => {\n if (!disabled) {\n onValueChange(value)\n }\n }\n\n const findNextEnabledTab = (\n triggers: string[],\n startIndex: number,\n direction: 1 | -1\n ): number => {\n const length = triggers.length\n let index = startIndex\n\n for (let i = 0; i < length; i++) {\n index = (index + direction + length) % length\n if (!isDisabled(triggers[index])) {\n return index\n }\n }\n return startIndex\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return\n\n const triggers = getTriggers()\n const currentIndex = triggers.indexOf(value)\n let newIndex = currentIndex\n\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault()\n newIndex = findNextEnabledTab(triggers, currentIndex, -1)\n break\n case 'ArrowRight':\n event.preventDefault()\n newIndex = findNextEnabledTab(triggers, currentIndex, 1)\n break\n case 'Home':\n event.preventDefault()\n newIndex = 0\n while (newIndex < triggers.length && isDisabled(triggers[newIndex])) {\n newIndex++\n }\n break\n case 'End':\n event.preventDefault()\n newIndex = triggers.length - 1\n while (newIndex >= 0 && isDisabled(triggers[newIndex])) {\n newIndex--\n }\n break\n default:\n return\n }\n\n const newValue = triggers[newIndex]\n if (newValue && newValue !== value) {\n onValueChange(newValue)\n }\n }\n\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive ? 'true' : 'false'}\n aria-controls={getTabPanelId(value)}\n id={getTabId(value)}\n tabIndex={isActive ? 0 : -1}\n disabled={disabled}\n className={clsx(\n 'ui:px-4 ui:py-2 ui:font-roboto ui:text-sm ui:font-medium',\n 'ui:flex ui:items-center ui:gap-2',\n 'ui:transition-colors ui:duration-200',\n 'focus-visible:ui:outline-none focus-visible:ui:ring-2 focus-visible:ui:ring-ring focus-visible:ui:ring-offset-2',\n !disabled && 'ui:cursor-pointer',\n variant === 'underline' && [\n 'ui:relative ui:border-b-2 ui:border-transparent ui:-mb-px',\n isActive\n ? 'ui:text-primary ui:border-primary'\n : 'ui:text-foreground hover:ui:text-foreground',\n disabled &&\n 'ui:text-muted-foreground/50 ui:cursor-not-allowed hover:ui:text-muted-foreground/50',\n ],\n variant === 'pills' && [\n 'ui:rounded-md',\n isActive\n ? 'ui:bg-primary ui:shadow-sm'\n : 'ui:text-foreground hover:ui:text-foreground',\n disabled &&\n 'ui:text-muted-foreground/50 ui:cursor-not-allowed hover:ui:text-muted-foreground/50',\n ],\n className\n )}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {icon && icon}\n {children}\n </button>\n )\n}\n\nexport default TabsTrigger\n"],"mappings":"AA+GI,eAAAA,MAAA,oBA/GJ,OAAOC,MAAU,OACjB,OAAS,aAAAC,MAAiB,QAE1B,OAAS,kBAAAC,MAAsB,gBAC/B,OAAS,sBAAAC,MAA0B,oBAYnC,SAASC,EAAY,CACnB,MAAAC,EACA,KAAAC,EACA,SAAAC,EACA,UAAAC,EACA,SAAAC,EACA,GAAGC,CACL,EAA+B,CAC7B,KAAM,CACJ,MAAOC,EACP,cAAAC,EACA,QAAAC,EACA,OAAAC,CACF,EAAIZ,EAAe,EACb,CAAE,gBAAAa,EAAiB,kBAAAC,EAAmB,YAAAC,EAAa,WAAAC,CAAW,EAClEf,EAAmB,EAEfgB,EAAWd,IAAUM,EAErBS,EAAYC,GAChBP,EAAS,OAAOA,CAAM,IAAIO,CAAG,GAAK,OAAOA,CAAG,GACxCC,EAAiBD,GACrBP,EAAS,YAAYA,CAAM,IAAIO,CAAG,GAAK,YAAYA,CAAG,GAExDpB,EAAU,KACRc,EAAgBV,EAAOE,CAAQ,EACxB,IAAM,CACXS,EAAkBX,CAAK,CACzB,GACC,CAACA,EAAOE,EAAUQ,EAAiBC,CAAiB,CAAC,EAExD,MAAMO,EAAc,IAAM,CACnBhB,GACHK,EAAcP,CAAK,CAEvB,EAEMmB,EAAqB,CACzBC,EACAC,EACAC,IACW,CACX,MAAMC,EAASH,EAAS,OACxB,IAAII,EAAQH,EAEZ,QAASI,EAAI,EAAGA,EAAIF,EAAQE,IAE1B,GADAD,GAASA,EAAQF,EAAYC,GAAUA,EACnC,CAACV,EAAWO,EAASI,CAAK,CAAC,EAC7B,OAAOA,EAGX,OAAOH,CACT,EAEMK,EAAiBC,GAA4C,CACjE,GAAIzB,EAAU,OAEd,MAAMkB,EAAWR,EAAY,EACvBgB,EAAeR,EAAS,QAAQpB,CAAK,EAC3C,IAAI6B,EAAWD,EAEf,OAAQD,EAAM,IAAK,CACjB,IAAK,YACHA,EAAM,eAAe,EACrBE,EAAWV,EAAmBC,EAAUQ,EAAc,EAAE,EACxD,MACF,IAAK,aACHD,EAAM,eAAe,EACrBE,EAAWV,EAAmBC,EAAUQ,EAAc,CAAC,EACvD,MACF,IAAK,OAGH,IAFAD,EAAM,eAAe,EACrBE,EAAW,EACJA,EAAWT,EAAS,QAAUP,EAAWO,EAASS,CAAQ,CAAC,GAChEA,IAEF,MACF,IAAK,MAGH,IAFAF,EAAM,eAAe,EACrBE,EAAWT,EAAS,OAAS,EACtBS,GAAY,GAAKhB,EAAWO,EAASS,CAAQ,CAAC,GACnDA,IAEF,MACF,QACE,MACJ,CAEA,MAAMC,EAAWV,EAASS,CAAQ,EAC9BC,GAAYA,IAAa9B,GAC3BO,EAAcuB,CAAQ,CAE1B,EAEA,OACEpC,EAAC,UACC,KAAK,SACL,KAAK,MACL,gBAAeoB,EAAW,OAAS,QACnC,gBAAeG,EAAcjB,CAAK,EAClC,GAAIe,EAASf,CAAK,EAClB,SAAUc,EAAW,EAAI,GACzB,SAAUZ,EACV,UAAWP,EACT,2DACA,mCACA,uCACA,kHACA,CAACO,GAAY,oBACbM,IAAY,aAAe,CACzB,4DACAM,EACI,oCACA,8CACJZ,GACE,qFACJ,EACAM,IAAY,SAAW,CACrB,gBACAM,EACI,6BACA,8CACJZ,GACE,qFACJ,EACAC,CACF,EACA,QAASe,EACT,UAAWQ,EACV,GAAGrB,EAEH,UAAAJ,GAAQA,EACRG,GACH,CAEJ,CAEA,IAAO2B,EAAQhC","names":["jsxs","clsx","useEffect","useTabsContext","useTabsListContext","TabsTrigger","value","icon","disabled","className","children","rest","activeValue","onValueChange","variant","prefix","registerTrigger","unregisterTrigger","getTriggers","isDisabled","isActive","getTabId","val","getTabPanelId","handleClick","findNextEnabledTab","triggers","startIndex","direction","length","index","i","handleKeyDown","event","currentIndex","newIndex","newValue","TabsTrigger_default"]}
@@ -1,5 +1,2 @@
1
- import { default as default2 } from "./Tabs";
2
- export {
3
- default2 as Tabs
4
- };
1
+ import{default as a}from"./Tabs";export{a as Tabs};
5
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Tabs/index.ts"],"sourcesContent":["export { default as Tabs } from './Tabs'\nexport type { TabsProps, TabsVariant } from './Tabs'\nexport type { TabsListProps } from './TabsList'\nexport type { TabsTriggerProps } from './TabsTrigger'\nexport type { TabsPanelProps } from './TabsPanel'\n"],"mappings":"AAAA,SAAoB,WAAXA,gBAAuB;","names":["default"]}
1
+ {"version":3,"sources":["../../src/Tabs/index.ts"],"sourcesContent":["export { default as Tabs } from './Tabs'\nexport type { TabsProps, TabsVariant } from './Tabs'\nexport type { TabsListProps } from './TabsList'\nexport type { TabsTriggerProps } from './TabsTrigger'\nexport type { TabsPanelProps } from './TabsPanel'\n"],"mappings":"AAAA,OAAoB,WAAXA,MAAuB","names":["default"]}
@@ -1,69 +1,2 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- import clsx from "clsx";
3
- import { Avatar } from "../Avatar";
4
- import { Typography } from "../Typography";
5
- function Talent({
6
- name,
7
- role,
8
- imageSrc,
9
- variant = "vertical",
10
- size = "lg",
11
- className,
12
- ...rest
13
- }) {
14
- return /* @__PURE__ */ jsxs(
15
- "div",
16
- {
17
- className: clsx(
18
- "ui:flex ui:items-center",
19
- {
20
- "ui:flex-col ui:text-center ui:gap-3": variant === "vertical",
21
- "ui:flex-row ui:gap-4": variant === "horizontal"
22
- },
23
- className
24
- ),
25
- "data-testid": "talent",
26
- ...rest,
27
- children: [
28
- /* @__PURE__ */ jsx(
29
- Avatar,
30
- {
31
- testId: "avatar",
32
- src: imageSrc,
33
- alt: name ?? "Unknown",
34
- size
35
- }
36
- ),
37
- /* @__PURE__ */ jsxs(
38
- "div",
39
- {
40
- className: clsx({ "ui:flex ui:flex-col": variant === "horizontal" }),
41
- children: [
42
- /* @__PURE__ */ jsx(
43
- Typography,
44
- {
45
- variant: "body",
46
- className: "ui:font-semibold ui:text-foreground",
47
- children: name ?? "Unknown"
48
- }
49
- ),
50
- /* @__PURE__ */ jsx(
51
- Typography,
52
- {
53
- variant: "caption",
54
- className: "ui:text-muted-foreground ui:[.media-section:nth-of-type(odd)_&]:text-badge-foreground",
55
- children: role ?? "N/A"
56
- }
57
- )
58
- ]
59
- }
60
- )
61
- ]
62
- }
63
- );
64
- }
65
- var Talent_default = Talent;
66
- export {
67
- Talent_default as default
68
- };
1
+ import{jsx as e,jsxs as o}from"react/jsx-runtime";import i from"clsx";import{Avatar as d}from"../Avatar";import{Typography as a}from"../Typography";function m({name:r,role:n,imageSrc:l,variant:t="vertical",size:s="lg",className:p,...u}){return o("div",{className:i("ui:flex ui:items-center",{"ui:flex-col ui:text-center ui:gap-3":t==="vertical","ui:flex-row ui:gap-4":t==="horizontal"},p),"data-testid":"talent",...u,children:[e(d,{testId:"avatar",src:l,alt:r??"Unknown",size:s}),o("div",{className:i({"ui:flex ui:flex-col":t==="horizontal"}),children:[e(a,{variant:"body",className:"ui:font-semibold ui:text-foreground",children:r??"Unknown"}),e(a,{variant:"caption",className:"ui:text-muted-foreground ui:[.media-section:nth-of-type(odd)_&]:text-badge-foreground",children:n??"N/A"})]})]})}var v=m;export{v as default};
69
2
  //# sourceMappingURL=Talent.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Talent/Talent.tsx"],"sourcesContent":["import clsx from 'clsx'\n\nimport { Avatar } from '../Avatar'\nimport { Typography } from '../Typography'\n\nimport type { AvatarSize } from '../Avatar'\nimport type { HTMLAttributes } from 'react'\n\nexport interface TalentProps extends HTMLAttributes<HTMLDivElement> {\n /** Full name of the talent (actor, director, writer, etc.) */\n name?: string\n /** Role or job title (e.g., \"Director\", \"Screenplay\", \"Character Name\") */\n role?: string\n /** Optional profile image URL */\n imageSrc?: string\n /** Layout variant - vertical for crew/cast cards, horizontal for lists */\n variant?: 'vertical' | 'horizontal'\n /** Avatar size */\n size?: AvatarSize\n}\n\nfunction Talent({\n name,\n role,\n imageSrc,\n variant = 'vertical',\n size = 'lg',\n className,\n ...rest\n}: Readonly<TalentProps>) {\n return (\n <div\n className={clsx(\n 'ui:flex ui:items-center',\n {\n 'ui:flex-col ui:text-center ui:gap-3': variant === 'vertical',\n 'ui:flex-row ui:gap-4': variant === 'horizontal',\n },\n className\n )}\n data-testid=\"talent\"\n {...rest}\n >\n <Avatar\n testId=\"avatar\"\n src={imageSrc}\n alt={name ?? 'Unknown'}\n size={size}\n />\n <div\n className={clsx({ 'ui:flex ui:flex-col': variant === 'horizontal' })}\n >\n <Typography\n variant=\"body\"\n className=\"ui:font-semibold ui:text-foreground\"\n >\n {name ?? 'Unknown'}\n </Typography>\n <Typography\n variant=\"caption\"\n className=\"ui:text-muted-foreground ui:[.media-section:nth-of-type(odd)_&]:text-badge-foreground\"\n >\n {role ?? 'N/A'}\n </Typography>\n </div>\n </div>\n )\n}\n\nexport default Talent\n"],"mappings":"AA2CM,cAMA,YANA;AA3CN,OAAO,UAAU;AAEjB,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAkB3B,SAAS,OAAO;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA,GAAG;AACL,GAA0B;AACxB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,UACE,uCAAuC,YAAY;AAAA,UACnD,wBAAwB,YAAY;AAAA,QACtC;AAAA,QACA;AAAA,MACF;AAAA,MACA,eAAY;AAAA,MACX,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAO;AAAA,YACP,KAAK;AAAA,YACL,KAAK,QAAQ;AAAA,YACb;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,KAAK,EAAE,uBAAuB,YAAY,aAAa,CAAC;AAAA,YAEnE;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,WAAU;AAAA,kBAET,kBAAQ;AAAA;AAAA,cACX;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,WAAU;AAAA,kBAET,kBAAQ;AAAA;AAAA,cACX;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,iBAAQ;","names":[]}
1
+ {"version":3,"sources":["../../src/Talent/Talent.tsx"],"sourcesContent":["import clsx from 'clsx'\n\nimport { Avatar } from '../Avatar'\nimport { Typography } from '../Typography'\n\nimport type { AvatarSize } from '../Avatar'\nimport type { HTMLAttributes } from 'react'\n\nexport interface TalentProps extends HTMLAttributes<HTMLDivElement> {\n /** Full name of the talent (actor, director, writer, etc.) */\n name?: string\n /** Role or job title (e.g., \"Director\", \"Screenplay\", \"Character Name\") */\n role?: string\n /** Optional profile image URL */\n imageSrc?: string\n /** Layout variant - vertical for crew/cast cards, horizontal for lists */\n variant?: 'vertical' | 'horizontal'\n /** Avatar size */\n size?: AvatarSize\n}\n\nfunction Talent({\n name,\n role,\n imageSrc,\n variant = 'vertical',\n size = 'lg',\n className,\n ...rest\n}: Readonly<TalentProps>) {\n return (\n <div\n className={clsx(\n 'ui:flex ui:items-center',\n {\n 'ui:flex-col ui:text-center ui:gap-3': variant === 'vertical',\n 'ui:flex-row ui:gap-4': variant === 'horizontal',\n },\n className\n )}\n data-testid=\"talent\"\n {...rest}\n >\n <Avatar\n testId=\"avatar\"\n src={imageSrc}\n alt={name ?? 'Unknown'}\n size={size}\n />\n <div\n className={clsx({ 'ui:flex ui:flex-col': variant === 'horizontal' })}\n >\n <Typography\n variant=\"body\"\n className=\"ui:font-semibold ui:text-foreground\"\n >\n {name ?? 'Unknown'}\n </Typography>\n <Typography\n variant=\"caption\"\n className=\"ui:text-muted-foreground ui:[.media-section:nth-of-type(odd)_&]:text-badge-foreground\"\n >\n {role ?? 'N/A'}\n </Typography>\n </div>\n </div>\n )\n}\n\nexport default Talent\n"],"mappings":"AA2CM,cAAAA,EAMA,QAAAC,MANA,oBA3CN,OAAOC,MAAU,OAEjB,OAAS,UAAAC,MAAc,YACvB,OAAS,cAAAC,MAAkB,gBAkB3B,SAASC,EAAO,CACd,KAAAC,EACA,KAAAC,EACA,SAAAC,EACA,QAAAC,EAAU,WACV,KAAAC,EAAO,KACP,UAAAC,EACA,GAAGC,CACL,EAA0B,CACxB,OACEX,EAAC,OACC,UAAWC,EACT,0BACA,CACE,sCAAuCO,IAAY,WACnD,uBAAwBA,IAAY,YACtC,EACAE,CACF,EACA,cAAY,SACX,GAAGC,EAEJ,UAAAZ,EAACG,EAAA,CACC,OAAO,SACP,IAAKK,EACL,IAAKF,GAAQ,UACb,KAAMI,EACR,EACAT,EAAC,OACC,UAAWC,EAAK,CAAE,sBAAuBO,IAAY,YAAa,CAAC,EAEnE,UAAAT,EAACI,EAAA,CACC,QAAQ,OACR,UAAU,sCAET,SAAAE,GAAQ,UACX,EACAN,EAACI,EAAA,CACC,QAAQ,UACR,UAAU,wFAET,SAAAG,GAAQ,MACX,GACF,GACF,CAEJ,CAEA,IAAOM,EAAQR","names":["jsx","jsxs","clsx","Avatar","Typography","Talent","name","role","imageSrc","variant","size","className","rest","Talent_default"]}
@@ -1,5 +1,2 @@
1
- import { default as default2 } from "./Talent";
2
- export {
3
- default2 as Talent
4
- };
1
+ import{default as a}from"./Talent";export{a as Talent};
5
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Talent/index.ts"],"sourcesContent":["export { default as Talent } from './Talent'\nexport type { TalentProps } from './Talent'\n"],"mappings":"AAAA,SAAoB,WAAXA,gBAAyB;","names":["default"]}
1
+ {"version":3,"sources":["../../src/Talent/index.ts"],"sourcesContent":["export { default as Talent } from './Talent'\nexport type { TalentProps } from './Talent'\n"],"mappings":"AAAA,OAAoB,WAAXA,MAAyB","names":["default"]}
@@ -1,86 +1,2 @@
1
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
- import clsx from "clsx";
3
- import { useState } from "react";
4
- import { Button } from "../Button";
5
- import { Modal } from "../Modal";
6
- function TrailerCard({
7
- videoKey,
8
- title,
9
- type = "Trailer",
10
- className
11
- }) {
12
- const [isPlaying, setIsPlaying] = useState(false);
13
- const thumbnailUrl = `https://img.youtube.com/vi/${videoKey}/hqdefault.jpg`;
14
- return /* @__PURE__ */ jsxs(Fragment, { children: [
15
- /* @__PURE__ */ jsxs(
16
- "button",
17
- {
18
- className: clsx(
19
- "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",
20
- "ui:transition-transform ui:duration-200 hover:ui:scale-[1.02]",
21
- className
22
- ),
23
- onClick: () => {
24
- setIsPlaying(true);
25
- },
26
- tabIndex: 0,
27
- "aria-label": `Play ${title}`,
28
- children: [
29
- /* @__PURE__ */ jsx(
30
- "img",
31
- {
32
- src: thumbnailUrl,
33
- alt: title,
34
- className: "ui:h-full ui:w-full ui:object-cover",
35
- loading: "lazy"
36
- }
37
- ),
38
- /* @__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" }) }) }),
39
- 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 })
40
- ]
41
- }
42
- ),
43
- /* @__PURE__ */ jsx(
44
- Modal,
45
- {
46
- isOpen: isPlaying,
47
- onClose: () => {
48
- setIsPlaying(false);
49
- },
50
- "aria-label": `Play ${title}`,
51
- children: /* @__PURE__ */ jsxs("div", { className: "ui:flex ui:h-full ui:w-full ui:items-center ui:justify-center ui:p-4", children: [
52
- /* @__PURE__ */ jsx(
53
- Button,
54
- {
55
- icon: "XMark",
56
- size: "sm",
57
- variant: "ghost",
58
- iconPosition: "left",
59
- onClick: () => {
60
- setIsPlaying(false);
61
- },
62
- className: "ui:absolute ui:top-4 ui:right-4 ui:text-white hover:ui:bg-white/10 ui:z-10 ui:focus:border-none",
63
- "aria-label": "Close video",
64
- children: "Close video"
65
- }
66
- ),
67
- isPlaying && /* @__PURE__ */ jsx(
68
- "iframe",
69
- {
70
- className: "ui:w-full ui:max-w-4xl ui:aspect-video ui:rounded-lg",
71
- src: `https://www.youtube.com/embed/${videoKey}`,
72
- title,
73
- allow: "accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
74
- allowFullScreen: true
75
- }
76
- )
77
- ] })
78
- }
79
- )
80
- ] });
81
- }
82
- var TrailerCard_default = TrailerCard;
83
- export {
84
- TrailerCard_default as default
85
- };
1
+ import{Fragment as p,jsx as i,jsxs as t}from"react/jsx-runtime";import n from"clsx";import{useState as c}from"react";import{Button as d}from"../Button";import{Modal as m}from"../Modal";function f({videoKey:a,title:e,type:l="Trailer",className:r}){const[o,u]=c(!1),s=`https://img.youtube.com/vi/${a}/hqdefault.jpg`;return t(p,{children:[t("button",{className:n("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","ui:transition-transform ui:duration-200 hover:ui:scale-[1.02]",r),onClick:()=>{u(!0)},tabIndex:0,"aria-label":`Play ${e}`,children:[i("img",{src:s,alt:e,className:"ui:h-full ui:w-full ui:object-cover",loading:"lazy"}),i("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:i("div",{className:"ui:flex ui:items-center ui:justify-center ui:h-16 ui:w-16 ui:rounded-full ui:bg-white/90",children:i("span",{className:"ui:text-2xl ui:ml-1",children:"\u25B6"})})}),l&&i("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:l})]}),i(m,{isOpen:o,onClose:()=>{u(!1)},"aria-label":`Play ${e}`,children:t("div",{className:"ui:flex ui:h-full ui:w-full ui:items-center ui:justify-center ui:p-4",children:[i(d,{icon:"XMark",size:"sm",variant:"ghost",iconPosition:"left",onClick:()=>{u(!1)},className:"ui:absolute ui:top-4 ui:right-4 ui:text-white hover:ui:bg-white/10 ui:z-10 ui:focus:border-none","aria-label":"Close video",children:"Close video"}),o&&i("iframe",{className:"ui:w-full ui:max-w-4xl ui:aspect-video ui:rounded-lg",src:`https://www.youtube.com/embed/${a}`,title:e,allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})]})})]})}var h=f;export{h as default};
86
2
  //# sourceMappingURL=TrailerCard.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/TrailerCard/TrailerCard.tsx"],"sourcesContent":["import clsx from 'clsx'\nimport { useState } from 'react'\n\nimport { Button } from '../Button'\nimport { Modal } from '../Modal'\n\nexport interface TrailerCardProps {\n /** YouTube video ID */\n videoKey: string\n /** Trailer title/name */\n title: string\n /** Video type (Trailer, Clip, Featurette, etc.) */\n type?: string\n /** Additional className for the card */\n className?: string\n}\n\nfunction TrailerCard({\n videoKey,\n title,\n type = 'Trailer',\n className,\n}: Readonly<TrailerCardProps>) {\n const [isPlaying, setIsPlaying] = useState(false)\n\n const thumbnailUrl = `https://img.youtube.com/vi/${videoKey}/hqdefault.jpg`\n\n return (\n <>\n {/* Thumbnail card with play button overlay */}\n <button\n className={clsx(\n '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',\n 'ui:transition-transform ui:duration-200 hover:ui:scale-[1.02]',\n className\n )}\n onClick={() => {\n setIsPlaying(true)\n }}\n tabIndex={0}\n aria-label={`Play ${title}`}\n >\n {/* Thumbnail image */}\n <img\n src={thumbnailUrl}\n alt={title}\n className=\"ui:h-full ui:w-full ui:object-cover\"\n loading=\"lazy\"\n />\n\n {/* Play button overlay */}\n <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\">\n <div className=\"ui:flex ui:items-center ui:justify-center ui:h-16 ui:w-16 ui:rounded-full ui:bg-white/90\">\n <span className=\"ui:text-2xl ui:ml-1\">▶</span>\n </div>\n </div>\n\n {/* Type badge */}\n {type && (\n <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\">\n {type}\n </div>\n )}\n </button>\n\n {/* Modal with YouTube embed */}\n <Modal\n isOpen={isPlaying}\n onClose={() => {\n setIsPlaying(false)\n }}\n aria-label={`Play ${title}`}\n >\n {/* Inner wrapper: flex centering — must NOT be on <dialog> itself to preserve display:none when closed */}\n <div className=\"ui:flex ui:h-full ui:w-full ui:items-center ui:justify-center ui:p-4\">\n {/* Close button */}\n <Button\n icon=\"XMark\"\n size=\"sm\"\n variant=\"ghost\"\n iconPosition=\"left\"\n onClick={() => {\n setIsPlaying(false)\n }}\n className=\"ui:absolute ui:top-4 ui:right-4 ui:text-white hover:ui:bg-white/10 ui:z-10 ui:focus:border-none\"\n aria-label=\"Close video\"\n >\n Close video\n </Button>\n\n {/* Responsive 16:9 iframe container */}\n {isPlaying && (\n <iframe\n className=\"ui:w-full ui:max-w-4xl ui:aspect-video ui:rounded-lg\"\n src={`https://www.youtube.com/embed/${videoKey}`}\n title={title}\n allow=\"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n />\n )}\n </div>\n </Modal>\n </>\n )\n}\n\nexport default TrailerCard\n"],"mappings":"AA4BI,mBAeI,KAbF,YAFF;AA5BJ,OAAO,UAAU;AACjB,SAAS,gBAAgB;AAEzB,SAAS,cAAc;AACvB,SAAS,aAAa;AAatB,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AACF,GAA+B;AAC7B,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,QAAM,eAAe,8BAA8B,QAAQ;AAE3D,SACE,iCAEE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,SAAS,MAAM;AACb,uBAAa,IAAI;AAAA,QACnB;AAAA,QACA,UAAU;AAAA,QACV,cAAY,QAAQ,KAAK;AAAA,QAGzB;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAQ;AAAA;AAAA,UACV;AAAA,UAGA,oBAAC,SAAI,WAAU,iKACb,8BAAC,SAAI,WAAU,4FACb,8BAAC,UAAK,WAAU,uBAAsB,oBAAC,GACzC,GACF;AAAA,UAGC,QACC,oBAAC,SAAI,WAAU,yHACZ,gBACH;AAAA;AAAA;AAAA,IAEJ;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,MAAM;AACb,uBAAa,KAAK;AAAA,QACpB;AAAA,QACA,cAAY,QAAQ,KAAK;AAAA,QAGzB,+BAAC,SAAI,WAAU,wEAEb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,cAAa;AAAA,cACb,SAAS,MAAM;AACb,6BAAa,KAAK;AAAA,cACpB;AAAA,cACA,WAAU;AAAA,cACV,cAAW;AAAA,cACZ;AAAA;AAAA,UAED;AAAA,UAGC,aACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,KAAK,iCAAiC,QAAQ;AAAA,cAC9C;AAAA,cACA,OAAM;AAAA,cACN,iBAAe;AAAA;AAAA,UACjB;AAAA,WAEJ;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,IAAO,sBAAQ;","names":[]}
1
+ {"version":3,"sources":["../../src/TrailerCard/TrailerCard.tsx"],"sourcesContent":["import clsx from 'clsx'\nimport { useState } from 'react'\n\nimport { Button } from '../Button'\nimport { Modal } from '../Modal'\n\nexport interface TrailerCardProps {\n /** YouTube video ID */\n videoKey: string\n /** Trailer title/name */\n title: string\n /** Video type (Trailer, Clip, Featurette, etc.) */\n type?: string\n /** Additional className for the card */\n className?: string\n}\n\nfunction TrailerCard({\n videoKey,\n title,\n type = 'Trailer',\n className,\n}: Readonly<TrailerCardProps>) {\n const [isPlaying, setIsPlaying] = useState(false)\n\n const thumbnailUrl = `https://img.youtube.com/vi/${videoKey}/hqdefault.jpg`\n\n return (\n <>\n {/* Thumbnail card with play button overlay */}\n <button\n className={clsx(\n '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',\n 'ui:transition-transform ui:duration-200 hover:ui:scale-[1.02]',\n className\n )}\n onClick={() => {\n setIsPlaying(true)\n }}\n tabIndex={0}\n aria-label={`Play ${title}`}\n >\n {/* Thumbnail image */}\n <img\n src={thumbnailUrl}\n alt={title}\n className=\"ui:h-full ui:w-full ui:object-cover\"\n loading=\"lazy\"\n />\n\n {/* Play button overlay */}\n <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\">\n <div className=\"ui:flex ui:items-center ui:justify-center ui:h-16 ui:w-16 ui:rounded-full ui:bg-white/90\">\n <span className=\"ui:text-2xl ui:ml-1\">▶</span>\n </div>\n </div>\n\n {/* Type badge */}\n {type && (\n <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\">\n {type}\n </div>\n )}\n </button>\n\n {/* Modal with YouTube embed */}\n <Modal\n isOpen={isPlaying}\n onClose={() => {\n setIsPlaying(false)\n }}\n aria-label={`Play ${title}`}\n >\n {/* Inner wrapper: flex centering — must NOT be on <dialog> itself to preserve display:none when closed */}\n <div className=\"ui:flex ui:h-full ui:w-full ui:items-center ui:justify-center ui:p-4\">\n {/* Close button */}\n <Button\n icon=\"XMark\"\n size=\"sm\"\n variant=\"ghost\"\n iconPosition=\"left\"\n onClick={() => {\n setIsPlaying(false)\n }}\n className=\"ui:absolute ui:top-4 ui:right-4 ui:text-white hover:ui:bg-white/10 ui:z-10 ui:focus:border-none\"\n aria-label=\"Close video\"\n >\n Close video\n </Button>\n\n {/* Responsive 16:9 iframe container */}\n {isPlaying && (\n <iframe\n className=\"ui:w-full ui:max-w-4xl ui:aspect-video ui:rounded-lg\"\n src={`https://www.youtube.com/embed/${videoKey}`}\n title={title}\n allow=\"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n />\n )}\n </div>\n </Modal>\n </>\n )\n}\n\nexport default TrailerCard\n"],"mappings":"AA4BI,mBAAAA,EAeI,OAAAC,EAbF,QAAAC,MAFF,oBA5BJ,OAAOC,MAAU,OACjB,OAAS,YAAAC,MAAgB,QAEzB,OAAS,UAAAC,MAAc,YACvB,OAAS,SAAAC,MAAa,WAatB,SAASC,EAAY,CACnB,SAAAC,EACA,MAAAC,EACA,KAAAC,EAAO,UACP,UAAAC,CACF,EAA+B,CAC7B,KAAM,CAACC,EAAWC,CAAY,EAAIT,EAAS,EAAK,EAE1CU,EAAe,8BAA8BN,CAAQ,iBAE3D,OACEN,EAAAF,EAAA,CAEE,UAAAE,EAAC,UACC,UAAWC,EACT,2HACA,gEACAQ,CACF,EACA,QAAS,IAAM,CACbE,EAAa,EAAI,CACnB,EACA,SAAU,EACV,aAAY,QAAQJ,CAAK,GAGzB,UAAAR,EAAC,OACC,IAAKa,EACL,IAAKL,EACL,UAAU,sCACV,QAAQ,OACV,EAGAR,EAAC,OAAI,UAAU,gKACb,SAAAA,EAAC,OAAI,UAAU,2FACb,SAAAA,EAAC,QAAK,UAAU,sBAAsB,kBAAC,EACzC,EACF,EAGCS,GACCT,EAAC,OAAI,UAAU,wHACZ,SAAAS,EACH,GAEJ,EAGAT,EAACK,EAAA,CACC,OAAQM,EACR,QAAS,IAAM,CACbC,EAAa,EAAK,CACpB,EACA,aAAY,QAAQJ,CAAK,GAGzB,SAAAP,EAAC,OAAI,UAAU,uEAEb,UAAAD,EAACI,EAAA,CACC,KAAK,QACL,KAAK,KACL,QAAQ,QACR,aAAa,OACb,QAAS,IAAM,CACbQ,EAAa,EAAK,CACpB,EACA,UAAU,kGACV,aAAW,cACZ,uBAED,EAGCD,GACCX,EAAC,UACC,UAAU,uDACV,IAAK,iCAAiCO,CAAQ,GAC9C,MAAOC,EACP,MAAM,iFACN,gBAAe,GACjB,GAEJ,EACF,GACF,CAEJ,CAEA,IAAOM,EAAQR","names":["Fragment","jsx","jsxs","clsx","useState","Button","Modal","TrailerCard","videoKey","title","type","className","isPlaying","setIsPlaying","thumbnailUrl","TrailerCard_default"]}
@@ -1,5 +1,2 @@
1
- import { default as default2 } from "./TrailerCard";
2
- export {
3
- default2 as TrailerCard
4
- };
1
+ import{default as e}from"./TrailerCard";export{e as TrailerCard};
5
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/TrailerCard/index.ts"],"sourcesContent":["export { default as TrailerCard } from './TrailerCard'\nexport type { TrailerCardProps } from './TrailerCard'\n"],"mappings":"AAAA,SAAoB,WAAXA,gBAA8B;","names":["default"]}
1
+ {"version":3,"sources":["../../src/TrailerCard/index.ts"],"sourcesContent":["export { default as TrailerCard } from './TrailerCard'\nexport type { TrailerCardProps } from './TrailerCard'\n"],"mappings":"AAAA,OAAoB,WAAXA,MAA8B","names":["default"]}