@tribepad/themis 1.0.11 → 1.0.13

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 (224) hide show
  1. package/dist/elements/Accordion/Accordion.types.d.ts +44 -4
  2. package/dist/elements/Accordion/Accordion.types.d.ts.map +1 -1
  3. package/dist/elements/Accordion/index.js +1 -1
  4. package/dist/elements/Accordion/index.js.map +1 -1
  5. package/dist/elements/Accordion/index.mjs +1 -1
  6. package/dist/elements/Accordion/index.mjs.map +1 -1
  7. package/dist/elements/AlertDialog/AlertDialog.types.d.ts +19 -2
  8. package/dist/elements/AlertDialog/AlertDialog.types.d.ts.map +1 -1
  9. package/dist/elements/AlertDialog/index.js +1 -1
  10. package/dist/elements/AlertDialog/index.js.map +1 -1
  11. package/dist/elements/AlertDialog/index.mjs +1 -1
  12. package/dist/elements/AlertDialog/index.mjs.map +1 -1
  13. package/dist/elements/Avatar/Avatar.d.ts +1 -21
  14. package/dist/elements/Avatar/Avatar.d.ts.map +1 -1
  15. package/dist/elements/Avatar/Avatar.types.d.ts +30 -11
  16. package/dist/elements/Avatar/Avatar.types.d.ts.map +1 -1
  17. package/dist/elements/Avatar/AvatarGroup.d.ts +1 -17
  18. package/dist/elements/Avatar/AvatarGroup.d.ts.map +1 -1
  19. package/dist/elements/Avatar/index.js +1 -1
  20. package/dist/elements/Avatar/index.js.map +1 -1
  21. package/dist/elements/Avatar/index.mjs +1 -1
  22. package/dist/elements/Avatar/index.mjs.map +1 -1
  23. package/dist/elements/Badge/Badge.types.d.ts +16 -9
  24. package/dist/elements/Badge/Badge.types.d.ts.map +1 -1
  25. package/dist/elements/Badge/index.js +1 -1
  26. package/dist/elements/Badge/index.js.map +1 -1
  27. package/dist/elements/Badge/index.mjs +1 -1
  28. package/dist/elements/Badge/index.mjs.map +1 -1
  29. package/dist/elements/Breadcrumbs/Breadcrumbs.d.ts +2 -34
  30. package/dist/elements/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  31. package/dist/elements/Breadcrumbs/Breadcrumbs.types.d.ts +25 -2
  32. package/dist/elements/Breadcrumbs/Breadcrumbs.types.d.ts.map +1 -1
  33. package/dist/elements/Breadcrumbs/index.js +1 -1
  34. package/dist/elements/Breadcrumbs/index.js.map +1 -1
  35. package/dist/elements/Breadcrumbs/index.mjs +1 -1
  36. package/dist/elements/Breadcrumbs/index.mjs.map +1 -1
  37. package/dist/elements/Button/Button.d.ts +1 -24
  38. package/dist/elements/Button/Button.d.ts.map +1 -1
  39. package/dist/elements/Button/Button.types.d.ts +28 -7
  40. package/dist/elements/Button/Button.types.d.ts.map +1 -1
  41. package/dist/elements/ButtonGroup/ButtonGroup.d.ts +3 -14
  42. package/dist/elements/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  43. package/dist/elements/ButtonGroup/ButtonGroup.types.d.ts +14 -5
  44. package/dist/elements/ButtonGroup/ButtonGroup.types.d.ts.map +1 -1
  45. package/dist/elements/ButtonGroup/index.js +1 -1
  46. package/dist/elements/ButtonGroup/index.js.map +1 -1
  47. package/dist/elements/ButtonGroup/index.mjs +1 -1
  48. package/dist/elements/ButtonGroup/index.mjs.map +1 -1
  49. package/dist/elements/Carousel/Carousel.types.d.ts +26 -7
  50. package/dist/elements/Carousel/Carousel.types.d.ts.map +1 -1
  51. package/dist/elements/Chart/Chart.d.ts +2 -40
  52. package/dist/elements/Chart/Chart.d.ts.map +1 -1
  53. package/dist/elements/Chart/Chart.types.d.ts +25 -10
  54. package/dist/elements/Chart/Chart.types.d.ts.map +1 -1
  55. package/dist/elements/Chart/index.js +1 -1
  56. package/dist/elements/Chart/index.js.map +1 -1
  57. package/dist/elements/Chart/index.mjs +1 -1
  58. package/dist/elements/Chart/index.mjs.map +1 -1
  59. package/dist/elements/Checkbox/Checkbox.d.ts +1 -31
  60. package/dist/elements/Checkbox/Checkbox.d.ts.map +1 -1
  61. package/dist/elements/Checkbox/Checkbox.types.d.ts +33 -1
  62. package/dist/elements/Checkbox/Checkbox.types.d.ts.map +1 -1
  63. package/dist/elements/Checkbox/index.js +1 -1
  64. package/dist/elements/Checkbox/index.js.map +1 -1
  65. package/dist/elements/Checkbox/index.mjs +1 -1
  66. package/dist/elements/Checkbox/index.mjs.map +1 -1
  67. package/dist/elements/CheckboxGroup/CheckboxGroup.d.ts +1 -26
  68. package/dist/elements/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
  69. package/dist/elements/CheckboxGroup/CheckboxGroup.types.d.ts +48 -4
  70. package/dist/elements/CheckboxGroup/CheckboxGroup.types.d.ts.map +1 -1
  71. package/dist/elements/CheckboxGroup/index.js +1 -1
  72. package/dist/elements/CheckboxGroup/index.js.map +1 -1
  73. package/dist/elements/CheckboxGroup/index.mjs +1 -1
  74. package/dist/elements/CheckboxGroup/index.mjs.map +1 -1
  75. package/dist/elements/Combobox/Combobox.d.ts +1 -30
  76. package/dist/elements/Combobox/Combobox.d.ts.map +1 -1
  77. package/dist/elements/Combobox/Combobox.types.d.ts +38 -4
  78. package/dist/elements/Combobox/Combobox.types.d.ts.map +1 -1
  79. package/dist/elements/Combobox/index.js +1 -1
  80. package/dist/elements/Combobox/index.js.map +1 -1
  81. package/dist/elements/Combobox/index.mjs +1 -1
  82. package/dist/elements/Combobox/index.mjs.map +1 -1
  83. package/dist/elements/Dropdown/Dropdown.d.ts +10 -124
  84. package/dist/elements/Dropdown/Dropdown.d.ts.map +1 -1
  85. package/dist/elements/Dropdown/Dropdown.types.d.ts +53 -8
  86. package/dist/elements/Dropdown/Dropdown.types.d.ts.map +1 -1
  87. package/dist/elements/FileField/FileField.d.ts +2 -39
  88. package/dist/elements/FileField/FileField.d.ts.map +1 -1
  89. package/dist/elements/FileField/FileField.types.d.ts +31 -13
  90. package/dist/elements/FileField/FileField.types.d.ts.map +1 -1
  91. package/dist/elements/FileField/index.js +1 -1
  92. package/dist/elements/FileField/index.js.map +1 -1
  93. package/dist/elements/FileField/index.mjs +1 -1
  94. package/dist/elements/FileField/index.mjs.map +1 -1
  95. package/dist/elements/FormLayout/FormLayout.d.ts +2 -37
  96. package/dist/elements/FormLayout/FormLayout.d.ts.map +1 -1
  97. package/dist/elements/FormLayout/FormLayout.types.d.ts +19 -3
  98. package/dist/elements/FormLayout/FormLayout.types.d.ts.map +1 -1
  99. package/dist/elements/MatrixGrid/MatrixGrid.d.ts +2 -29
  100. package/dist/elements/MatrixGrid/MatrixGrid.d.ts.map +1 -1
  101. package/dist/elements/MatrixGrid/MatrixGrid.types.d.ts +22 -1
  102. package/dist/elements/MatrixGrid/MatrixGrid.types.d.ts.map +1 -1
  103. package/dist/elements/MatrixGrid/index.js +1 -1
  104. package/dist/elements/MatrixGrid/index.js.map +1 -1
  105. package/dist/elements/MatrixGrid/index.mjs +1 -1
  106. package/dist/elements/MatrixGrid/index.mjs.map +1 -1
  107. package/dist/elements/Modal/Modal.types.d.ts +69 -9
  108. package/dist/elements/Modal/Modal.types.d.ts.map +1 -1
  109. package/dist/elements/Pagination/Pagination.d.ts +2 -28
  110. package/dist/elements/Pagination/Pagination.d.ts.map +1 -1
  111. package/dist/elements/Pagination/Pagination.types.d.ts +26 -1
  112. package/dist/elements/Pagination/Pagination.types.d.ts.map +1 -1
  113. package/dist/elements/Pagination/index.js +1 -1
  114. package/dist/elements/Pagination/index.js.map +1 -1
  115. package/dist/elements/Pagination/index.mjs +1 -1
  116. package/dist/elements/Pagination/index.mjs.map +1 -1
  117. package/dist/elements/Panel/Panel.types.d.ts +67 -9
  118. package/dist/elements/Panel/Panel.types.d.ts.map +1 -1
  119. package/dist/elements/PasswordField/PasswordField.d.ts +2 -26
  120. package/dist/elements/PasswordField/PasswordField.d.ts.map +1 -1
  121. package/dist/elements/PasswordField/PasswordField.types.d.ts +27 -2
  122. package/dist/elements/PasswordField/PasswordField.types.d.ts.map +1 -1
  123. package/dist/elements/PasswordField/index.js +1 -1
  124. package/dist/elements/PasswordField/index.js.map +1 -1
  125. package/dist/elements/PasswordField/index.mjs +1 -1
  126. package/dist/elements/PasswordField/index.mjs.map +1 -1
  127. package/dist/elements/RadioGroup/RadioGroup.d.ts +1 -26
  128. package/dist/elements/RadioGroup/RadioGroup.d.ts.map +1 -1
  129. package/dist/elements/RadioGroup/RadioGroup.types.d.ts +43 -4
  130. package/dist/elements/RadioGroup/RadioGroup.types.d.ts.map +1 -1
  131. package/dist/elements/RadioGroup/index.js +1 -1
  132. package/dist/elements/RadioGroup/index.js.map +1 -1
  133. package/dist/elements/RadioGroup/index.mjs +1 -1
  134. package/dist/elements/RadioGroup/index.mjs.map +1 -1
  135. package/dist/elements/RatingScale/RatingScale.d.ts +2 -30
  136. package/dist/elements/RatingScale/RatingScale.d.ts.map +1 -1
  137. package/dist/elements/RatingScale/RatingScale.types.d.ts +29 -1
  138. package/dist/elements/RatingScale/RatingScale.types.d.ts.map +1 -1
  139. package/dist/elements/RatingScale/index.js +1 -1
  140. package/dist/elements/RatingScale/index.js.map +1 -1
  141. package/dist/elements/RatingScale/index.mjs +1 -1
  142. package/dist/elements/RatingScale/index.mjs.map +1 -1
  143. package/dist/elements/SearchField/SearchField.d.ts +2 -26
  144. package/dist/elements/SearchField/SearchField.d.ts.map +1 -1
  145. package/dist/elements/SearchField/SearchField.types.d.ts +26 -2
  146. package/dist/elements/SearchField/SearchField.types.d.ts.map +1 -1
  147. package/dist/elements/SearchField/index.js +1 -1
  148. package/dist/elements/SearchField/index.js.map +1 -1
  149. package/dist/elements/SearchField/index.mjs +1 -1
  150. package/dist/elements/SearchField/index.mjs.map +1 -1
  151. package/dist/elements/Select/Select.d.ts +3 -61
  152. package/dist/elements/Select/Select.d.ts.map +1 -1
  153. package/dist/elements/Select/Select.types.d.ts +52 -4
  154. package/dist/elements/Select/Select.types.d.ts.map +1 -1
  155. package/dist/elements/Select/index.js +1 -1
  156. package/dist/elements/Select/index.js.map +1 -1
  157. package/dist/elements/Select/index.mjs +1 -1
  158. package/dist/elements/Select/index.mjs.map +1 -1
  159. package/dist/elements/SituationalJudgement/SituationalJudgement.d.ts +2 -28
  160. package/dist/elements/SituationalJudgement/SituationalJudgement.d.ts.map +1 -1
  161. package/dist/elements/SituationalJudgement/SituationalJudgement.types.d.ts +23 -1
  162. package/dist/elements/SituationalJudgement/SituationalJudgement.types.d.ts.map +1 -1
  163. package/dist/elements/SituationalJudgement/index.js +1 -1
  164. package/dist/elements/SituationalJudgement/index.js.map +1 -1
  165. package/dist/elements/SituationalJudgement/index.mjs +1 -1
  166. package/dist/elements/SituationalJudgement/index.mjs.map +1 -1
  167. package/dist/elements/Skeleton/Skeleton.types.d.ts +11 -6
  168. package/dist/elements/Skeleton/Skeleton.types.d.ts.map +1 -1
  169. package/dist/elements/Skeleton/index.js +1 -1
  170. package/dist/elements/Skeleton/index.js.map +1 -1
  171. package/dist/elements/Skeleton/index.mjs +1 -1
  172. package/dist/elements/Skeleton/index.mjs.map +1 -1
  173. package/dist/elements/Switch/Switch.types.d.ts +31 -7
  174. package/dist/elements/Switch/Switch.types.d.ts.map +1 -1
  175. package/dist/elements/Switch/index.js +1 -1
  176. package/dist/elements/Switch/index.js.map +1 -1
  177. package/dist/elements/Switch/index.mjs +1 -1
  178. package/dist/elements/Switch/index.mjs.map +1 -1
  179. package/dist/elements/Table/Table.d.ts +7 -79
  180. package/dist/elements/Table/Table.d.ts.map +1 -1
  181. package/dist/elements/Table/Table.types.d.ts +82 -17
  182. package/dist/elements/Table/Table.types.d.ts.map +1 -1
  183. package/dist/elements/Table/index.js +1 -1
  184. package/dist/elements/Table/index.js.map +1 -1
  185. package/dist/elements/Table/index.mjs +1 -1
  186. package/dist/elements/Table/index.mjs.map +1 -1
  187. package/dist/elements/Tabs/Tabs.d.ts.map +1 -1
  188. package/dist/elements/Tabs/Tabs.types.d.ts +61 -5
  189. package/dist/elements/Tabs/Tabs.types.d.ts.map +1 -1
  190. package/dist/elements/Tabs/index.js +1 -1
  191. package/dist/elements/Tabs/index.js.map +1 -1
  192. package/dist/elements/Tabs/index.mjs +1 -1
  193. package/dist/elements/Tabs/index.mjs.map +1 -1
  194. package/dist/elements/TextField/TextField.d.ts +6 -71
  195. package/dist/elements/TextField/TextField.d.ts.map +1 -1
  196. package/dist/elements/TextField/TextField.types.d.ts +76 -12
  197. package/dist/elements/TextField/TextField.types.d.ts.map +1 -1
  198. package/dist/elements/TextField/index.js +1 -1
  199. package/dist/elements/TextField/index.js.map +1 -1
  200. package/dist/elements/TextField/index.mjs +1 -1
  201. package/dist/elements/TextField/index.mjs.map +1 -1
  202. package/dist/elements/Toast/Toast.types.d.ts +12 -20
  203. package/dist/elements/Toast/Toast.types.d.ts.map +1 -1
  204. package/dist/elements/Toast/Toaster.d.ts +2 -5
  205. package/dist/elements/Toast/Toaster.d.ts.map +1 -1
  206. package/dist/elements/Toast/index.js +1 -1
  207. package/dist/elements/Toast/index.js.map +1 -1
  208. package/dist/elements/Toast/index.mjs +1 -1
  209. package/dist/elements/Toast/index.mjs.map +1 -1
  210. package/dist/elements/Tooltip/Tooltip.types.d.ts +39 -4
  211. package/dist/elements/Tooltip/Tooltip.types.d.ts.map +1 -1
  212. package/dist/elements/Tooltip/index.js +1 -1
  213. package/dist/elements/Tooltip/index.js.map +1 -1
  214. package/dist/elements/Tooltip/index.mjs +1 -1
  215. package/dist/elements/Tooltip/index.mjs.map +1 -1
  216. package/dist/elements/index.js +1 -1
  217. package/dist/elements/index.js.map +1 -1
  218. package/dist/elements/index.mjs +1 -1
  219. package/dist/elements/index.mjs.map +1 -1
  220. package/dist/index.js +2 -2
  221. package/dist/index.js.map +1 -1
  222. package/dist/index.mjs +2 -2
  223. package/dist/index.mjs.map +1 -1
  224. package/package.json +1 -1
@@ -63,7 +63,24 @@ export declare const AccordionPropsSchema: z.ZodObject<{
63
63
  disabledKeys: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
64
64
  children: z.ZodCustom<ReactNode, ReactNode>;
65
65
  }, z.core.$strip>;
66
- export type AccordionProps = z.infer<typeof AccordionPropsSchema>;
66
+ export interface AccordionProps {
67
+ className?: string;
68
+ children?: ReactNode;
69
+ id?: string;
70
+ 'aria-label'?: string;
71
+ 'aria-labelledby'?: string;
72
+ 'aria-describedby'?: string;
73
+ 'aria-live'?: 'off' | 'polite' | 'assertive';
74
+ 'aria-hidden'?: boolean;
75
+ 'data-testid'?: string;
76
+ type?: AccordionType;
77
+ collapsible?: boolean;
78
+ expandedKeys?: Set<Key>;
79
+ defaultExpandedKeys?: (string | number)[];
80
+ onExpandedChange?: (keys: Set<Key>) => void;
81
+ isDisabled?: boolean;
82
+ disabledKeys?: (string | number)[];
83
+ }
67
84
  /**
68
85
  * AccordionItem component props schema
69
86
  *
@@ -85,7 +102,15 @@ export declare const AccordionItemPropsSchema: z.ZodObject<{
85
102
  isDisabled: z.ZodOptional<z.ZodBoolean>;
86
103
  children: z.ZodCustom<ReactNode, ReactNode>;
87
104
  }, z.core.$strip>;
88
- export type AccordionItemProps = z.infer<typeof AccordionItemPropsSchema>;
105
+ export interface AccordionItemProps {
106
+ className?: string;
107
+ children?: ReactNode;
108
+ id: string | number;
109
+ 'aria-label'?: string;
110
+ 'aria-labelledby'?: string;
111
+ 'data-testid'?: string;
112
+ isDisabled?: boolean;
113
+ }
89
114
  /**
90
115
  * AccordionTrigger component props schema
91
116
  *
@@ -116,7 +141,16 @@ export declare const AccordionTriggerPropsSchema: z.ZodObject<{
116
141
  hideIcon: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
117
142
  children: z.ZodCustom<ReactNode, ReactNode>;
118
143
  }, z.core.$strip>;
119
- export type AccordionTriggerProps = z.infer<typeof AccordionTriggerPropsSchema>;
144
+ export interface AccordionTriggerProps {
145
+ className?: string;
146
+ children?: ReactNode;
147
+ id?: string;
148
+ 'aria-label'?: string;
149
+ 'data-testid'?: string;
150
+ as?: HeadingLevel;
151
+ icon?: ReactNode;
152
+ hideIcon?: boolean;
153
+ }
120
154
  /**
121
155
  * AccordionContent component props schema
122
156
  *
@@ -139,5 +173,11 @@ export declare const AccordionContentPropsSchema: z.ZodObject<{
139
173
  preserveState: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
140
174
  children: z.ZodCustom<ReactNode, ReactNode>;
141
175
  }, z.core.$strip>;
142
- export type AccordionContentProps = z.infer<typeof AccordionContentPropsSchema>;
176
+ export interface AccordionContentProps {
177
+ className?: string;
178
+ children?: ReactNode;
179
+ id?: string;
180
+ 'data-testid'?: string;
181
+ preserveState?: boolean;
182
+ }
143
183
  //# sourceMappingURL=Accordion.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion.types.d.ts","sourceRoot":"","sources":["../../../src/elements/Accordion/Accordion.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB;;;EAAiC,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;;;;;EAA+C,CAAC;AAC/E,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,SAAS,iDAAoC,CAAC;AAE3D;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;uDAeG,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,SAAjB,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI;;;;iBAUnD,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;iBASnC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E;;;;GAIG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;iBAYtC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;iBAQtC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC"}
1
+ {"version":3,"file":"Accordion.types.d.ts","sourceRoot":"","sources":["../../../src/elements/Accordion/Accordion.types.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- 'use strict';var react=require('react'),reactAriaComponents=require('react-aria-components'),classVarianceAuthority=require('class-variance-authority'),lucideReact=require('lucide-react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime'),zod=require('zod');function d(...e){return tailwindMerge.twMerge(clsx.clsx(e))}var J=react.Activity??function({children:n,mode:r}){return jsxRuntime.jsx("div",{"data-activity-mode":r,children:n})},P=react.createContext({}),C=classVarianceAuthority.cva("w-full",{variants:{},defaultVariants:{}}),S=classVarianceAuthority.cva(["border-b border-[var(--border)]","last:border-b-0"].join(" "),{variants:{},defaultVariants:{}}),I=classVarianceAuthority.cva(["flex flex-1 items-center justify-between py-4 font-medium w-full","text-sm text-[var(--content-foreground)]","hover:underline","focus-visible:outline-none focus-visible:ring-2","focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2","focus-visible:ring-offset-[var(--content-background)]","min-h-[44px]","data-[disabled]:pointer-events-none data-[disabled]:opacity-50","transition-all"].join(" "),{variants:{},defaultVariants:{}}),V=classVarianceAuthority.cva(["h-4 w-4 shrink-0","text-[var(--menu-muted)]","transition-transform duration-200 ease-out","motion-reduce:transition-none"].join(" "),{variants:{isExpanded:{true:"rotate-180",false:"rotate-0"}},defaultVariants:{isExpanded:false}}),N=classVarianceAuthority.cva(["overflow-hidden","text-sm text-[var(--menu-muted)]"].join(" "),{variants:{},defaultVariants:{}}),g=classVarianceAuthority.cva("pb-4 pt-0",{variants:{},defaultVariants:{}});function Z(e){return {h1:1,h2:2,h3:3,h4:4,h5:5,h6:6}[e]}function _(e){let n=react.Children.toArray(e);for(let r of n)if(react.isValidElement(r)){let t=r.props;if(t&&typeof t=="object"&&"id"in t)return t.id}}function T({type:e="single",collapsible:n=false,expandedKeys:r,defaultExpandedKeys:t,onExpandedChange:c,isDisabled:l=false,disabledKeys:m,className:u,children:s,...w}){let z=e==="multiple",L=react.useMemo(()=>{if(!n&&e==="single"&&!t&&!r){let v=_(s);return v?[v]:void 0}return t},[n,e,t,r,s]),j=react.useMemo(()=>({disabledKeys:m}),[m]);return jsxRuntime.jsx(P.Provider,{value:j,children:jsxRuntime.jsx(reactAriaComponents.DisclosureGroup,{allowsMultipleExpanded:z,expandedKeys:r,defaultExpandedKeys:L,onExpandedChange:c,isDisabled:l,className:d(C(),u),...w,children:s})})}T.displayName="Accordion";function D({id:e,isDisabled:n,className:r,children:t,...c}){let{disabledKeys:l}=react.useContext(P),m=l?.includes(e)??false;return jsxRuntime.jsx(reactAriaComponents.Disclosure,{id:e,isDisabled:n||m,className:reactAriaComponents.composeRenderProps(r,s=>d(S(),s)),...c,children:t})}D.displayName="AccordionItem";function R({as:e="h3",icon:n,hideIcon:r=false,className:t,children:c,...l}){let u=react.useContext(reactAriaComponents.DisclosureStateContext)?.isExpanded??false;return jsxRuntime.jsx(reactAriaComponents.Heading,{level:Z(e),children:jsxRuntime.jsxs(reactAriaComponents.Button,{slot:"trigger",className:reactAriaComponents.composeRenderProps(t,s=>d(I(),s)),...l,children:[jsxRuntime.jsx("span",{className:"flex-1 text-left",children:c}),!r&&(n??jsxRuntime.jsx(lucideReact.ChevronDown,{"aria-hidden":"true",className:d(V({isExpanded:u}))}))]})})}R.displayName="AccordionTrigger";function $({preserveState:e,children:n}){let t=react.useContext(reactAriaComponents.DisclosureStateContext)?.isExpanded??false;return e?jsxRuntime.jsx(J,{mode:t?"visible":"hidden",children:jsxRuntime.jsx("div",{className:g(),children:n})}):jsxRuntime.jsx("div",{className:g(),children:n})}function K({preserveState:e=false,className:n,children:r,...t}){return jsxRuntime.jsx(reactAriaComponents.DisclosurePanel,{className:reactAriaComponents.composeRenderProps(n,c=>d(N(),"animate-accordion",c)),...t,children:jsxRuntime.jsx($,{preserveState:e,children:r})})}K.displayName="AccordionContent";var ee=T,oe=D,ne=R,te=K;var f=zod.z.object({className:zod.z.string().optional(),children:zod.z.any().optional(),id:zod.z.string().optional(),"aria-label":zod.z.string().optional(),"aria-labelledby":zod.z.string().optional(),"aria-describedby":zod.z.string().optional(),"aria-live":zod.z.enum(["off","polite","assertive"]).optional(),"aria-hidden":zod.z.boolean().optional(),"data-testid":zod.z.string().optional()});var E=zod.z.enum(["single","multiple"]),H=zod.z.enum(["h1","h2","h3","h4","h5","h6"]),A=zod.z.union([zod.z.string(),zod.z.number()]),ie=f.extend({type:E.optional().default("single"),collapsible:zod.z.boolean().optional().default(false),expandedKeys:zod.z.custom().optional(),defaultExpandedKeys:zod.z.array(A).optional(),onExpandedChange:zod.z.custom().optional(),isDisabled:zod.z.boolean().optional().default(false),disabledKeys:zod.z.array(A).optional(),children:zod.z.custom()}),ae=f.extend({id:A,isDisabled:zod.z.boolean().optional(),children:zod.z.custom()}),ce=f.extend({as:H.optional().default("h3"),icon:zod.z.custom().optional(),hideIcon:zod.z.boolean().optional().default(false),children:zod.z.custom()}),se=f.extend({preserveState:zod.z.boolean().optional().default(false),children:zod.z.custom()});exports.Accordion=ee;exports.AccordionContent=te;exports.AccordionContentPropsSchema=se;exports.AccordionItem=oe;exports.AccordionItemPropsSchema=ae;exports.AccordionPropsSchema=ie;exports.AccordionTrigger=ne;exports.AccordionTriggerPropsSchema=ce;exports.AccordionTypeSchema=E;exports.HeadingLevelSchema=H;exports.KeySchema=A;exports.accordionChevronVariants=V;exports.accordionContentInnerVariants=g;exports.accordionContentVariants=N;exports.accordionItemVariants=S;exports.accordionTriggerVariants=I;exports.accordionVariants=C;//# sourceMappingURL=index.js.map
2
+ 'use strict';var react=require('react'),reactAriaComponents=require('react-aria-components'),classVarianceAuthority=require('class-variance-authority'),lucideReact=require('lucide-react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime'),zod=require('zod');function d(...e){return tailwindMerge.twMerge(clsx.clsx(e))}var J=react.Activity??function({children:n,mode:r}){return jsxRuntime.jsx("div",{"data-activity-mode":r,children:n})},C=react.createContext({}),P=classVarianceAuthority.cva("w-full",{variants:{},defaultVariants:{}}),N=classVarianceAuthority.cva(["border-b border-[var(--border)]","last:border-b-0"].join(" "),{variants:{},defaultVariants:{}}),S=classVarianceAuthority.cva(["flex flex-1 items-center justify-between py-4 font-medium w-full","text-sm text-[var(--content-foreground)]","hover:underline","focus-visible:outline-none focus-visible:ring-2","focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2","focus-visible:ring-offset-[var(--content-background)]","min-h-[44px]","data-[disabled]:pointer-events-none data-[disabled]:opacity-50","transition-all"].join(" "),{variants:{},defaultVariants:{}}),I=classVarianceAuthority.cva(["h-4 w-4 shrink-0","text-[var(--menu-muted)]","transition-transform duration-200 ease-out","motion-reduce:transition-none"].join(" "),{variants:{isExpanded:{true:"rotate-180",false:"rotate-0"}},defaultVariants:{isExpanded:false}}),V=classVarianceAuthority.cva(["overflow-hidden","text-sm text-[var(--menu-muted)]"].join(" "),{variants:{},defaultVariants:{}}),A=classVarianceAuthority.cva("pb-4 pt-0",{variants:{},defaultVariants:{}});function Z(e){return {h1:1,h2:2,h3:3,h4:4,h5:5,h6:6}[e]}function _(e){let n=react.Children.toArray(e);for(let r of n)if(react.isValidElement(r)){let t=r.props;if(t&&typeof t=="object"&&"id"in t)return t.id}}function R({type:e="single",collapsible:n=false,expandedKeys:r,defaultExpandedKeys:t,onExpandedChange:s,isDisabled:p=false,disabledKeys:m,className:f,children:c,...w}){let L=e==="multiple",k=react.useMemo(()=>{if(!n&&e==="single"&&!t&&!r){let x=_(c);return x?[x]:void 0}return t},[n,e,t,r,c]),j=react.useMemo(()=>({disabledKeys:m}),[m]);return jsxRuntime.jsx(C.Provider,{value:j,children:jsxRuntime.jsx(reactAriaComponents.DisclosureGroup,{allowsMultipleExpanded:L,expandedKeys:r,defaultExpandedKeys:k,onExpandedChange:s,isDisabled:p,className:d(P(),f),...w,children:c})})}R.displayName="Accordion";function K({id:e,isDisabled:n,className:r,children:t,...s}){let{disabledKeys:p}=react.useContext(C),m=p?.includes(e)??false;return jsxRuntime.jsx(reactAriaComponents.Disclosure,{id:e,isDisabled:n||m,className:reactAriaComponents.composeRenderProps(r,c=>d(N(),c)),...s,children:t})}K.displayName="AccordionItem";function D({as:e="h3",icon:n,hideIcon:r=false,className:t,children:s,...p}){let f=react.useContext(reactAriaComponents.DisclosureStateContext)?.isExpanded??false;return jsxRuntime.jsx(reactAriaComponents.Heading,{level:Z(e),children:jsxRuntime.jsxs(reactAriaComponents.Button,{slot:"trigger",className:reactAriaComponents.composeRenderProps(t,c=>d(S(),c)),...p,children:[jsxRuntime.jsx("span",{className:"flex-1 text-left",children:s}),!r&&(n??jsxRuntime.jsx(lucideReact.ChevronDown,{"aria-hidden":"true",className:d(I({isExpanded:f}))}))]})})}D.displayName="AccordionTrigger";function $({preserveState:e,children:n}){let t=react.useContext(reactAriaComponents.DisclosureStateContext)?.isExpanded??false;return e?jsxRuntime.jsx(J,{mode:t?"visible":"hidden",children:jsxRuntime.jsx("div",{className:A(),children:n})}):jsxRuntime.jsx("div",{className:A(),children:n})}function T({preserveState:e=false,className:n,children:r,...t}){return jsxRuntime.jsx(reactAriaComponents.DisclosurePanel,{className:reactAriaComponents.composeRenderProps(n,s=>d(V(),"animate-accordion",s)),...t,children:jsxRuntime.jsx($,{preserveState:e,children:r})})}T.displayName="AccordionContent";var ee=R,oe=K,ne=D,te=T;var u=zod.z.object({className:zod.z.string().optional(),children:zod.z.any().optional(),id:zod.z.string().optional(),"aria-label":zod.z.string().optional(),"aria-labelledby":zod.z.string().optional(),"aria-describedby":zod.z.string().optional(),"aria-live":zod.z.enum(["off","polite","assertive"]).optional(),"aria-hidden":zod.z.boolean().optional(),"data-testid":zod.z.string().optional()});var E=zod.z.enum(["single","multiple"]),H=zod.z.enum(["h1","h2","h3","h4","h5","h6"]),g=zod.z.union([zod.z.string(),zod.z.number()]),ie=u.extend({type:E.optional().default("single"),collapsible:zod.z.boolean().optional().default(false),expandedKeys:zod.z.custom().optional(),defaultExpandedKeys:zod.z.array(g).optional(),onExpandedChange:zod.z.custom().optional(),isDisabled:zod.z.boolean().optional().default(false),disabledKeys:zod.z.array(g).optional(),children:zod.z.custom()}),ae=u.extend({id:g,isDisabled:zod.z.boolean().optional(),children:zod.z.custom()}),se=u.extend({as:H.optional().default("h3"),icon:zod.z.custom().optional(),hideIcon:zod.z.boolean().optional().default(false),children:zod.z.custom()}),ce=u.extend({preserveState:zod.z.boolean().optional().default(false),children:zod.z.custom()});exports.Accordion=ee;exports.AccordionContent=te;exports.AccordionContentPropsSchema=ce;exports.AccordionItem=oe;exports.AccordionItemPropsSchema=ae;exports.AccordionPropsSchema=ie;exports.AccordionTrigger=ne;exports.AccordionTriggerPropsSchema=se;exports.AccordionTypeSchema=E;exports.HeadingLevelSchema=H;exports.KeySchema=g;exports.accordionChevronVariants=I;exports.accordionContentInnerVariants=A;exports.accordionContentVariants=V;exports.accordionItemVariants=N;exports.accordionTriggerVariants=S;exports.accordionVariants=P;//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/elements/Accordion/Accordion.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/Accordion/Accordion.types.ts"],"names":["cn","inputs","twMerge","clsx","Activity","ReactActivity","children","mode","jsx","AccordionContext","createContext","accordionVariants","cva","accordionItemVariants","accordionTriggerVariants","accordionChevronVariants","accordionContentVariants","accordionContentInnerVariants","getHeadingLevel","level","getFirstAccordionItemId","childArray","Children","child","isValidElement","childProps","AccordionRoot","type","collapsible","expandedKeys","defaultExpandedKeys","onExpandedChange","isDisabled","disabledKeys","className","props","allowsMultipleExpanded","effectiveDefaultExpandedKeys","useMemo","firstItemId","contextValue","DisclosureGroup","AccordionItemComponent","id","isDisabledProp","useContext","isDisabledFromKeys","Disclosure","composeRenderProps","AccordionTriggerComponent","headingLevel","icon","hideIcon","isExpanded","DisclosureStateContext","Heading","jsxs","Button","ChevronDown","AccordionContentInner","preserveState","AccordionContentComponent","DisclosurePanel","Accordion","AccordionItem","AccordionTrigger","AccordionContent","BaseComponentPropsSchema","z","AccordionTypeSchema","HeadingLevelSchema","KeySchema","AccordionPropsSchema","AccordionItemPropsSchema","AccordionTriggerPropsSchema","AccordionContentPropsSchema"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\n/**\n * Accordion Component - Implementation\n *\n * Accessible accordion/disclosure group component combining React Aria primitives with CVA styling.\n * Follows Themis library patterns with compound component structure and direct named exports.\n *\n * Key Features:\n * - React Aria DisclosureGroup for full accessibility (WCAG 2.2 AAA)\n * - CVA variants for consistent styling\n * - React 19.2 Activity API for state preservation (preserveState prop)\n * - Single/Multiple expansion modes\n * - Controlled and uncontrolled state management\n * - Configurable heading levels for document structure\n * - Custom icon support\n *\n * @see accordion-prd.md (Full requirements)\n * @see Accordion.types.ts (Zod schemas)\n * @see plan.md (Implementation approach)\n */\n\n// React 19.2 Activity API - may not be available in all builds\n// Import conditionally to support environments where Activity is unavailable\nimport {\n Activity as ReactActivity,\n type ReactNode,\n type ReactElement,\n useMemo,\n useContext,\n createContext,\n Children,\n isValidElement,\n} from 'react';\n\n// Activity component with fallback for environments where it's not available\n// The fallback simply renders children directly - no state preservation when Activity unavailable\nconst Activity = ReactActivity ?? function ActivityFallback({\n children,\n mode,\n}: {\n children: ReactNode;\n mode: 'visible' | 'hidden';\n}): ReactElement {\n return <div data-activity-mode={mode}>{children}</div>;\n};\n\nimport {\n DisclosureGroup,\n Disclosure,\n DisclosurePanel,\n Heading,\n Button,\n composeRenderProps,\n DisclosureStateContext,\n type Key as AriaKey,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { ChevronDown } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n HeadingLevel,\n} from './Accordion.types';\n\n// ============================================================================\n// Context for disabledKeys\n// ============================================================================\n\n/**\n * Context to pass disabledKeys from Accordion to AccordionItem\n * Since DisclosureGroup doesn't support disabledKeys directly, we handle it via context\n */\ninterface AccordionContextValue {\n disabledKeys?: (string | number)[];\n}\n\nconst AccordionContext = createContext<AccordionContextValue>({});\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * Accordion root CVA variants\n *\n * @see accordion-prd.md FR-001 (Accordion Root)\n */\nexport const accordionVariants = cva('w-full', {\n variants: {},\n defaultVariants: {},\n});\n\n/**\n * AccordionItem CVA variants\n *\n * @see accordion-prd.md FR-002 (AccordionItem)\n * @see accordion-prd.md DS-001 (Visual Design - borders)\n */\nexport const accordionItemVariants = cva(\n [\n 'border-b border-[var(--border)]',\n // Last item has no border (handled by last:border-b-0)\n 'last:border-b-0',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * AccordionTrigger CVA variants\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger)\n * @see accordion-prd.md AR-006 (Touch Target Size - 44x44px)\n * @see accordion-prd.md DS-002 (Typography)\n */\nexport const accordionTriggerVariants = cva(\n [\n // Layout\n 'flex flex-1 items-center justify-between py-4 font-medium w-full',\n // Text styling\n 'text-sm text-[var(--content-foreground)]',\n // Hover state\n 'hover:underline',\n // Focus visible ring (WCAG 2.4.13)\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n 'focus-visible:ring-offset-[var(--content-background)]',\n // WCAG 2.2 AAA: 44px minimum touch target\n 'min-h-[44px]',\n // Disabled state\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n // Transition for smooth interactions\n 'transition-all',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * Chevron icon CVA variants\n *\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const accordionChevronVariants = cva(\n [\n 'h-4 w-4 shrink-0',\n 'text-[var(--menu-muted)]',\n // Smooth rotation transition\n 'transition-transform duration-200 ease-out',\n // Reduced motion support\n 'motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n isExpanded: {\n true: 'rotate-180',\n false: 'rotate-0',\n },\n },\n defaultVariants: {\n isExpanded: false,\n },\n }\n);\n\n/**\n * AccordionContent CVA variants\n *\n * @see accordion-prd.md FR-004 (AccordionContent)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const accordionContentVariants = cva(\n [\n 'overflow-hidden',\n 'text-sm text-[var(--menu-muted)]',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * AccordionContent inner wrapper CVA variants\n */\nexport const accordionContentInnerVariants = cva('pb-4 pt-0', {\n variants: {},\n defaultVariants: {},\n});\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Convert heading level string to number for React Aria Heading\n */\nfunction getHeadingLevel(level: HeadingLevel): 1 | 2 | 3 | 4 | 5 | 6 {\n const levelMap: Record<HeadingLevel, 1 | 2 | 3 | 4 | 5 | 6> = {\n h1: 1,\n h2: 2,\n h3: 3,\n h4: 4,\n h5: 5,\n h6: 6,\n };\n return levelMap[level];\n}\n\n/**\n * Get the first AccordionItem id from children\n * Used for auto-expanding first item when collapsible={false}\n */\nfunction getFirstAccordionItemId(children: ReactNode): AriaKey | undefined {\n const childArray = Children.toArray(children);\n for (const child of childArray) {\n if (isValidElement(child)) {\n const childProps = child.props as Record<string, unknown>;\n if (childProps && typeof childProps === 'object' && 'id' in childProps) {\n return childProps.id as AriaKey;\n }\n }\n }\n return undefined;\n}\n\n// ============================================================================\n// Components\n// ============================================================================\n\n/**\n * Accordion Root Component\n *\n * Container for accordion items. Manages expansion state and provides\n * context to child components.\n *\n * @see accordion-prd.md FR-001 (Accordion Root Component)\n * @see accordion-prd.md FR-005 (Single Expansion Mode)\n * @see accordion-prd.md FR-006 (Multiple Expansion Mode)\n * @see accordion-prd.md FR-007 (Controlled Mode)\n * @see accordion-prd.md FR-008 (Uncontrolled Mode)\n *\n * @example\n * // Uncontrolled single mode\n * <Accordion type=\"single\" collapsible>\n * <AccordionItem id=\"item-1\">\n * <AccordionTrigger>Section 1</AccordionTrigger>\n * <AccordionContent>Content 1</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n *\n * @example\n * // Controlled multiple mode\n * <Accordion\n * type=\"multiple\"\n * expandedKeys={expandedKeys}\n * onExpandedChange={setExpandedKeys}\n * >\n * ...\n * </Accordion>\n */\nfunction AccordionRoot({\n type = 'single',\n collapsible = false,\n expandedKeys,\n defaultExpandedKeys,\n onExpandedChange,\n isDisabled = false,\n disabledKeys,\n className,\n children,\n ...props\n}: AccordionProps) {\n // Map type prop to React Aria's allowsMultipleExpanded\n const allowsMultipleExpanded = type === 'multiple';\n\n // Auto-expand first item when collapsible={false} and no default provided\n // This ensures one item is always expanded in non-collapsible single mode\n const effectiveDefaultExpandedKeys = useMemo(() => {\n if (!collapsible && type === 'single' && !defaultExpandedKeys && !expandedKeys) {\n const firstItemId = getFirstAccordionItemId(children);\n return firstItemId ? [firstItemId] : undefined;\n }\n return defaultExpandedKeys;\n }, [collapsible, type, defaultExpandedKeys, expandedKeys, children]);\n\n // Context value for passing disabledKeys to AccordionItem\n const contextValue = useMemo(\n () => ({ disabledKeys }),\n [disabledKeys]\n );\n\n return (\n <AccordionContext.Provider value={contextValue}>\n <DisclosureGroup\n allowsMultipleExpanded={allowsMultipleExpanded}\n expandedKeys={expandedKeys as Set<AriaKey> | undefined}\n defaultExpandedKeys={effectiveDefaultExpandedKeys as Iterable<AriaKey> | undefined}\n onExpandedChange={onExpandedChange as ((keys: Set<AriaKey>) => void) | undefined}\n isDisabled={isDisabled}\n className={cn(accordionVariants(), className)}\n {...props}\n >\n {children}\n </DisclosureGroup>\n </AccordionContext.Provider>\n );\n}\n\nAccordionRoot.displayName = 'Accordion';\n\n/**\n * AccordionItem Component\n *\n * Wrapper for each expandable disclosure section.\n *\n * @see accordion-prd.md FR-002 (AccordionItem Component)\n *\n * @example\n * <AccordionItem id=\"faq-1\" isDisabled={!isAuthenticated}>\n * <AccordionTrigger>Members-only FAQ</AccordionTrigger>\n * <AccordionContent>This content is for members only.</AccordionContent>\n * </AccordionItem>\n */\nfunction AccordionItemComponent({\n id,\n isDisabled: isDisabledProp,\n className,\n children,\n ...props\n}: AccordionItemProps) {\n // Check if this item is in the disabledKeys array\n const { disabledKeys } = useContext(AccordionContext);\n const isDisabledFromKeys = disabledKeys?.includes(id as string | number) ?? false;\n const isDisabled = isDisabledProp || isDisabledFromKeys;\n\n return (\n <Disclosure\n id={id}\n isDisabled={isDisabled}\n className={composeRenderProps(className, (className) =>\n cn(accordionItemVariants(), className)\n )}\n {...props}\n >\n {children}\n </Disclosure>\n );\n}\n\nAccordionItemComponent.displayName = 'AccordionItem';\n\n/**\n * AccordionTrigger Component\n *\n * Clickable button that toggles accordion content visibility.\n * Wrapped in a Heading for proper document structure.\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger Component)\n * @see accordion-prd.md AR-002 (ARIA Attributes)\n * @see accordion-prd.md AR-003 (Keyboard Navigation)\n *\n * @example\n * // Default with chevron\n * <AccordionTrigger>Is it accessible?</AccordionTrigger>\n *\n * @example\n * // Custom heading level\n * <AccordionTrigger as=\"h2\">Important Section</AccordionTrigger>\n *\n * @example\n * // Custom icon\n * <AccordionTrigger icon={<PlusIcon className=\"h-4 w-4\" />}>\n * Click to expand\n * </AccordionTrigger>\n */\nfunction AccordionTriggerComponent({\n as: headingLevel = 'h3',\n icon,\n hideIcon = false,\n className,\n children,\n ...props\n}: AccordionTriggerProps) {\n // Access disclosure state from context\n const state = useContext(DisclosureStateContext);\n const isExpanded = state?.isExpanded ?? false;\n\n return (\n <Heading level={getHeadingLevel(headingLevel)}>\n <Button\n slot=\"trigger\"\n className={composeRenderProps(className, (className) =>\n cn(accordionTriggerVariants(), className)\n )}\n {...props}\n >\n <span className=\"flex-1 text-left\">{children}</span>\n {!hideIcon && (\n icon ?? (\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(accordionChevronVariants({ isExpanded }))}\n />\n )\n )}\n </Button>\n </Heading>\n );\n}\n\nAccordionTriggerComponent.displayName = 'AccordionTrigger';\n\n/**\n * AccordionContent Component\n *\n * Expandable container for accordion content.\n * Supports animated height transitions and React Activity state preservation.\n *\n * @see accordion-prd.md FR-004 (AccordionContent Component)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n *\n * @example\n * // Standard content\n * <AccordionContent>\n * Yes. It adheres to the WAI-ARIA design pattern.\n * </AccordionContent>\n *\n * @example\n * // With state preservation\n * <AccordionContent preserveState>\n * <form>\n * <input name=\"email\" />\n * </form>\n * </AccordionContent>\n */\n/**\n * Inner component for AccordionContent with state preservation\n * Uses DisclosureStateContext to get isExpanded state\n */\nfunction AccordionContentInner({\n preserveState,\n children,\n}: {\n preserveState: boolean;\n children: ReactNode;\n}) {\n const state = useContext(DisclosureStateContext);\n const isExpanded = state?.isExpanded ?? false;\n\n if (preserveState) {\n return (\n <Activity mode={isExpanded ? 'visible' : 'hidden'}>\n <div className={accordionContentInnerVariants()}>{children}</div>\n </Activity>\n );\n }\n\n return <div className={accordionContentInnerVariants()}>{children}</div>;\n}\n\nfunction AccordionContentComponent({\n preserveState = false,\n className,\n children,\n ...props\n}: AccordionContentProps) {\n return (\n <DisclosurePanel\n className={composeRenderProps(className, (className) =>\n cn(accordionContentVariants(), 'animate-accordion', className)\n )}\n {...props}\n >\n <AccordionContentInner preserveState={preserveState}>\n {children}\n </AccordionContentInner>\n </DisclosurePanel>\n );\n}\n\nAccordionContentComponent.displayName = 'AccordionContent';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\n/**\n * Direct named exports (not Object.assign compound pattern)\n *\n * Accordion follows React Aria's direct export pattern because:\n * - Simpler structure (only 4 components)\n * - Better tree-shaking with named exports\n * - Clearer imports: import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from '...'\n */\nexport const Accordion = AccordionRoot;\nexport const AccordionItem = AccordionItemComponent;\nexport const AccordionTrigger = AccordionTriggerComponent;\nexport const AccordionContent = AccordionContentComponent;\n\n// Re-export types for convenience\nexport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n};\n","import { z } from 'zod';\n\n/**\n * Base props schema for all Themis components\n * Ensures consistent accessibility and styling APIs across the library\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements)\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\nexport const BaseComponentPropsSchema = z.object({\n // Styling\n className: z.string().optional(),\n\n // React\n children: z.any().optional(), // ReactNode not directly supported by Zod\n id: z.string().optional(),\n\n // Accessibility (WCAG 2.2 AA requirements)\n 'aria-label': z.string().optional(),\n 'aria-labelledby': z.string().optional(),\n 'aria-describedby': z.string().optional(),\n 'aria-live': z.enum(['off', 'polite', 'assertive']).optional(),\n 'aria-hidden': z.boolean().optional(),\n\n // Testing & Development\n 'data-testid': z.string().optional(),\n});\n\nexport type BaseComponentProps = z.infer<typeof BaseComponentPropsSchema>;\n","import { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\nimport type { ReactNode, Key } from 'react';\n\n/**\n * Accordion Type Schema\n * Defines expansion mode: single (one item at a time) or multiple (any number)\n *\n * @see accordion-prd.md FR-005, FR-006 (Expansion Modes)\n */\nexport const AccordionTypeSchema = z.enum(['single', 'multiple']);\nexport type AccordionType = z.infer<typeof AccordionTypeSchema>;\n\n/**\n * Heading Level Schema\n * Configurable heading level for document structure (h1-h6)\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger with as prop)\n */\nexport const HeadingLevelSchema = z.enum(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']);\nexport type HeadingLevel = z.infer<typeof HeadingLevelSchema>;\n\n/**\n * Key Schema for item identification\n * Supports both string and number keys per React Aria convention\n */\nexport const KeySchema = z.union([z.string(), z.number()]);\n\n/**\n * Accordion root component props schema\n *\n * @see accordion-prd.md FR-001 (Accordion Root Component)\n * @see accordion-prd.md FR-007 (Controlled Mode)\n * @see accordion-prd.md FR-008 (Uncontrolled Mode)\n */\nexport const AccordionPropsSchema = BaseComponentPropsSchema.extend({\n // Expansion mode: 'single' (one at a time) or 'multiple' (any number)\n type: AccordionTypeSchema.optional().default('single'),\n\n // Allow all items to be collapsed (only applies to type=\"single\")\n // When false, one item must always be expanded\n collapsible: z.boolean().optional().default(false),\n\n // Controlled mode: currently expanded keys\n expandedKeys: z.custom<Set<Key>>().optional(),\n\n // Uncontrolled mode: initial expanded keys\n defaultExpandedKeys: z.array(KeySchema).optional(),\n\n // Expansion change handler\n onExpandedChange: z.custom<(keys: Set<Key>) => void>().optional(),\n\n // Disable all items\n isDisabled: z.boolean().optional().default(false),\n\n // Keys of items to disable individually\n disabledKeys: z.array(KeySchema).optional(),\n\n // Children: AccordionItem components\n children: z.custom<ReactNode>(),\n});\n\nexport type AccordionProps = z.infer<typeof AccordionPropsSchema>;\n\n/**\n * AccordionItem component props schema\n *\n * @see accordion-prd.md FR-002 (AccordionItem Component)\n */\nexport const AccordionItemPropsSchema = BaseComponentPropsSchema.extend({\n // Unique identifier (required)\n id: KeySchema,\n\n // Disable this specific item\n isDisabled: z.boolean().optional(),\n\n // Children: AccordionTrigger + AccordionContent\n children: z.custom<ReactNode>(),\n});\n\nexport type AccordionItemProps = z.infer<typeof AccordionItemPropsSchema>;\n\n/**\n * AccordionTrigger component props schema\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger Component)\n */\nexport const AccordionTriggerPropsSchema = BaseComponentPropsSchema.extend({\n // Heading level for proper document structure (default: h3)\n as: HeadingLevelSchema.optional().default('h3'),\n\n // Custom icon to replace default chevron\n icon: z.custom<ReactNode>().optional(),\n\n // Hide the expand/collapse icon entirely\n hideIcon: z.boolean().optional().default(false),\n\n // Trigger content (text, icons, custom content)\n children: z.custom<ReactNode>(),\n});\n\nexport type AccordionTriggerProps = z.infer<typeof AccordionTriggerPropsSchema>;\n\n/**\n * AccordionContent component props schema\n *\n * @see accordion-prd.md FR-004 (AccordionContent Component)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const AccordionContentPropsSchema = BaseComponentPropsSchema.extend({\n // Preserve component state when collapsed using React Activity API\n // When true, wraps content in <Activity> component\n // Effects are cleaned up when hidden, restored when visible\n preserveState: z.boolean().optional().default(false),\n\n // Panel content\n children: z.custom<ReactNode>(),\n});\n\nexport type AccordionContentProps = z.infer<typeof AccordionContentPropsSchema>;\n"]}
1
+ {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/elements/Accordion/Accordion.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/Accordion/Accordion.types.ts"],"names":["cn","inputs","twMerge","clsx","Activity","ReactActivity","children","mode","jsx","AccordionContext","createContext","accordionVariants","cva","accordionItemVariants","accordionTriggerVariants","accordionChevronVariants","accordionContentVariants","accordionContentInnerVariants","getHeadingLevel","level","getFirstAccordionItemId","childArray","Children","child","isValidElement","childProps","AccordionRoot","type","collapsible","expandedKeys","defaultExpandedKeys","onExpandedChange","isDisabled","disabledKeys","className","props","allowsMultipleExpanded","effectiveDefaultExpandedKeys","useMemo","firstItemId","contextValue","DisclosureGroup","AccordionItemComponent","id","isDisabledProp","useContext","isDisabledFromKeys","Disclosure","composeRenderProps","AccordionTriggerComponent","headingLevel","icon","hideIcon","isExpanded","DisclosureStateContext","Heading","jsxs","Button","ChevronDown","AccordionContentInner","preserveState","AccordionContentComponent","DisclosurePanel","Accordion","AccordionItem","AccordionTrigger","AccordionContent","BaseComponentPropsSchema","z","AccordionTypeSchema","HeadingLevelSchema","KeySchema","AccordionPropsSchema","AccordionItemPropsSchema","AccordionTriggerPropsSchema","AccordionContentPropsSchema"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\n/**\n * Accordion Component - Implementation\n *\n * Accessible accordion/disclosure group component combining React Aria primitives with CVA styling.\n * Follows Themis library patterns with compound component structure and direct named exports.\n *\n * Key Features:\n * - React Aria DisclosureGroup for full accessibility (WCAG 2.2 AAA)\n * - CVA variants for consistent styling\n * - React 19.2 Activity API for state preservation (preserveState prop)\n * - Single/Multiple expansion modes\n * - Controlled and uncontrolled state management\n * - Configurable heading levels for document structure\n * - Custom icon support\n *\n * @see accordion-prd.md (Full requirements)\n * @see Accordion.types.ts (Zod schemas)\n * @see plan.md (Implementation approach)\n */\n\n// React 19.2 Activity API - may not be available in all builds\n// Import conditionally to support environments where Activity is unavailable\nimport {\n Activity as ReactActivity,\n type ReactNode,\n type ReactElement,\n useMemo,\n useContext,\n createContext,\n Children,\n isValidElement,\n} from 'react';\n\n// Activity component with fallback for environments where it's not available\n// The fallback simply renders children directly - no state preservation when Activity unavailable\nconst Activity = ReactActivity ?? function ActivityFallback({\n children,\n mode,\n}: {\n children: ReactNode;\n mode: 'visible' | 'hidden';\n}): ReactElement {\n return <div data-activity-mode={mode}>{children}</div>;\n};\n\nimport {\n DisclosureGroup,\n Disclosure,\n DisclosurePanel,\n Heading,\n Button,\n composeRenderProps,\n DisclosureStateContext,\n type Key as AriaKey,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { ChevronDown } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n HeadingLevel,\n} from './Accordion.types';\n\n// ============================================================================\n// Context for disabledKeys\n// ============================================================================\n\n/**\n * Context to pass disabledKeys from Accordion to AccordionItem\n * Since DisclosureGroup doesn't support disabledKeys directly, we handle it via context\n */\ninterface AccordionContextValue {\n disabledKeys?: (string | number)[];\n}\n\nconst AccordionContext = createContext<AccordionContextValue>({});\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * Accordion root CVA variants\n *\n * @see accordion-prd.md FR-001 (Accordion Root)\n */\nexport const accordionVariants = cva('w-full', {\n variants: {},\n defaultVariants: {},\n});\n\n/**\n * AccordionItem CVA variants\n *\n * @see accordion-prd.md FR-002 (AccordionItem)\n * @see accordion-prd.md DS-001 (Visual Design - borders)\n */\nexport const accordionItemVariants = cva(\n [\n 'border-b border-[var(--border)]',\n // Last item has no border (handled by last:border-b-0)\n 'last:border-b-0',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * AccordionTrigger CVA variants\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger)\n * @see accordion-prd.md AR-006 (Touch Target Size - 44x44px)\n * @see accordion-prd.md DS-002 (Typography)\n */\nexport const accordionTriggerVariants = cva(\n [\n // Layout\n 'flex flex-1 items-center justify-between py-4 font-medium w-full',\n // Text styling\n 'text-sm text-[var(--content-foreground)]',\n // Hover state\n 'hover:underline',\n // Focus visible ring (WCAG 2.4.13)\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n 'focus-visible:ring-offset-[var(--content-background)]',\n // WCAG 2.2 AAA: 44px minimum touch target\n 'min-h-[44px]',\n // Disabled state\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n // Transition for smooth interactions\n 'transition-all',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * Chevron icon CVA variants\n *\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const accordionChevronVariants = cva(\n [\n 'h-4 w-4 shrink-0',\n 'text-[var(--menu-muted)]',\n // Smooth rotation transition\n 'transition-transform duration-200 ease-out',\n // Reduced motion support\n 'motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n isExpanded: {\n true: 'rotate-180',\n false: 'rotate-0',\n },\n },\n defaultVariants: {\n isExpanded: false,\n },\n }\n);\n\n/**\n * AccordionContent CVA variants\n *\n * @see accordion-prd.md FR-004 (AccordionContent)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const accordionContentVariants = cva(\n [\n 'overflow-hidden',\n 'text-sm text-[var(--menu-muted)]',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * AccordionContent inner wrapper CVA variants\n */\nexport const accordionContentInnerVariants = cva('pb-4 pt-0', {\n variants: {},\n defaultVariants: {},\n});\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Convert heading level string to number for React Aria Heading\n */\nfunction getHeadingLevel(level: HeadingLevel): 1 | 2 | 3 | 4 | 5 | 6 {\n const levelMap: Record<HeadingLevel, 1 | 2 | 3 | 4 | 5 | 6> = {\n h1: 1,\n h2: 2,\n h3: 3,\n h4: 4,\n h5: 5,\n h6: 6,\n };\n return levelMap[level];\n}\n\n/**\n * Get the first AccordionItem id from children\n * Used for auto-expanding first item when collapsible={false}\n */\nfunction getFirstAccordionItemId(children: ReactNode): AriaKey | undefined {\n const childArray = Children.toArray(children);\n for (const child of childArray) {\n if (isValidElement(child)) {\n const childProps = child.props as Record<string, unknown>;\n if (childProps && typeof childProps === 'object' && 'id' in childProps) {\n return childProps.id as AriaKey;\n }\n }\n }\n return undefined;\n}\n\n// ============================================================================\n// Components\n// ============================================================================\n\n/**\n * Accordion Root Component\n *\n * Container for accordion items. Manages expansion state and provides\n * context to child components.\n *\n * @see accordion-prd.md FR-001 (Accordion Root Component)\n * @see accordion-prd.md FR-005 (Single Expansion Mode)\n * @see accordion-prd.md FR-006 (Multiple Expansion Mode)\n * @see accordion-prd.md FR-007 (Controlled Mode)\n * @see accordion-prd.md FR-008 (Uncontrolled Mode)\n *\n * @example\n * // Uncontrolled single mode\n * <Accordion type=\"single\" collapsible>\n * <AccordionItem id=\"item-1\">\n * <AccordionTrigger>Section 1</AccordionTrigger>\n * <AccordionContent>Content 1</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n *\n * @example\n * // Controlled multiple mode\n * <Accordion\n * type=\"multiple\"\n * expandedKeys={expandedKeys}\n * onExpandedChange={setExpandedKeys}\n * >\n * ...\n * </Accordion>\n */\nfunction AccordionRoot({\n type = 'single',\n collapsible = false,\n expandedKeys,\n defaultExpandedKeys,\n onExpandedChange,\n isDisabled = false,\n disabledKeys,\n className,\n children,\n ...props\n}: AccordionProps) {\n // Map type prop to React Aria's allowsMultipleExpanded\n const allowsMultipleExpanded = type === 'multiple';\n\n // Auto-expand first item when collapsible={false} and no default provided\n // This ensures one item is always expanded in non-collapsible single mode\n const effectiveDefaultExpandedKeys = useMemo(() => {\n if (!collapsible && type === 'single' && !defaultExpandedKeys && !expandedKeys) {\n const firstItemId = getFirstAccordionItemId(children);\n return firstItemId ? [firstItemId] : undefined;\n }\n return defaultExpandedKeys;\n }, [collapsible, type, defaultExpandedKeys, expandedKeys, children]);\n\n // Context value for passing disabledKeys to AccordionItem\n const contextValue = useMemo(\n () => ({ disabledKeys }),\n [disabledKeys]\n );\n\n return (\n <AccordionContext.Provider value={contextValue}>\n <DisclosureGroup\n allowsMultipleExpanded={allowsMultipleExpanded}\n expandedKeys={expandedKeys as Set<AriaKey> | undefined}\n defaultExpandedKeys={effectiveDefaultExpandedKeys as Iterable<AriaKey> | undefined}\n onExpandedChange={onExpandedChange as ((keys: Set<AriaKey>) => void) | undefined}\n isDisabled={isDisabled}\n className={cn(accordionVariants(), className)}\n {...props}\n >\n {children}\n </DisclosureGroup>\n </AccordionContext.Provider>\n );\n}\n\nAccordionRoot.displayName = 'Accordion';\n\n/**\n * AccordionItem Component\n *\n * Wrapper for each expandable disclosure section.\n *\n * @see accordion-prd.md FR-002 (AccordionItem Component)\n *\n * @example\n * <AccordionItem id=\"faq-1\" isDisabled={!isAuthenticated}>\n * <AccordionTrigger>Members-only FAQ</AccordionTrigger>\n * <AccordionContent>This content is for members only.</AccordionContent>\n * </AccordionItem>\n */\nfunction AccordionItemComponent({\n id,\n isDisabled: isDisabledProp,\n className,\n children,\n ...props\n}: AccordionItemProps) {\n // Check if this item is in the disabledKeys array\n const { disabledKeys } = useContext(AccordionContext);\n const isDisabledFromKeys = disabledKeys?.includes(id as string | number) ?? false;\n const isDisabled = isDisabledProp || isDisabledFromKeys;\n\n return (\n <Disclosure\n id={id}\n isDisabled={isDisabled}\n className={composeRenderProps(className, (className) =>\n cn(accordionItemVariants(), className)\n )}\n {...props}\n >\n {children}\n </Disclosure>\n );\n}\n\nAccordionItemComponent.displayName = 'AccordionItem';\n\n/**\n * AccordionTrigger Component\n *\n * Clickable button that toggles accordion content visibility.\n * Wrapped in a Heading for proper document structure.\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger Component)\n * @see accordion-prd.md AR-002 (ARIA Attributes)\n * @see accordion-prd.md AR-003 (Keyboard Navigation)\n *\n * @example\n * // Default with chevron\n * <AccordionTrigger>Is it accessible?</AccordionTrigger>\n *\n * @example\n * // Custom heading level\n * <AccordionTrigger as=\"h2\">Important Section</AccordionTrigger>\n *\n * @example\n * // Custom icon\n * <AccordionTrigger icon={<PlusIcon className=\"h-4 w-4\" />}>\n * Click to expand\n * </AccordionTrigger>\n */\nfunction AccordionTriggerComponent({\n as: headingLevel = 'h3',\n icon,\n hideIcon = false,\n className,\n children,\n ...props\n}: AccordionTriggerProps) {\n // Access disclosure state from context\n const state = useContext(DisclosureStateContext);\n const isExpanded = state?.isExpanded ?? false;\n\n return (\n <Heading level={getHeadingLevel(headingLevel)}>\n <Button\n slot=\"trigger\"\n className={composeRenderProps(className, (className) =>\n cn(accordionTriggerVariants(), className)\n )}\n {...props}\n >\n <span className=\"flex-1 text-left\">{children}</span>\n {!hideIcon && (\n icon ?? (\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(accordionChevronVariants({ isExpanded }))}\n />\n )\n )}\n </Button>\n </Heading>\n );\n}\n\nAccordionTriggerComponent.displayName = 'AccordionTrigger';\n\n/**\n * AccordionContent Component\n *\n * Expandable container for accordion content.\n * Supports animated height transitions and React Activity state preservation.\n *\n * @see accordion-prd.md FR-004 (AccordionContent Component)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n *\n * @example\n * // Standard content\n * <AccordionContent>\n * Yes. It adheres to the WAI-ARIA design pattern.\n * </AccordionContent>\n *\n * @example\n * // With state preservation\n * <AccordionContent preserveState>\n * <form>\n * <input name=\"email\" />\n * </form>\n * </AccordionContent>\n */\n/**\n * Inner component for AccordionContent with state preservation\n * Uses DisclosureStateContext to get isExpanded state\n */\nfunction AccordionContentInner({\n preserveState,\n children,\n}: {\n preserveState: boolean;\n children: ReactNode;\n}) {\n const state = useContext(DisclosureStateContext);\n const isExpanded = state?.isExpanded ?? false;\n\n if (preserveState) {\n return (\n <Activity mode={isExpanded ? 'visible' : 'hidden'}>\n <div className={accordionContentInnerVariants()}>{children}</div>\n </Activity>\n );\n }\n\n return <div className={accordionContentInnerVariants()}>{children}</div>;\n}\n\nfunction AccordionContentComponent({\n preserveState = false,\n className,\n children,\n ...props\n}: AccordionContentProps) {\n return (\n <DisclosurePanel\n className={composeRenderProps(className, (className) =>\n cn(accordionContentVariants(), 'animate-accordion', className)\n )}\n {...props}\n >\n <AccordionContentInner preserveState={preserveState}>\n {children}\n </AccordionContentInner>\n </DisclosurePanel>\n );\n}\n\nAccordionContentComponent.displayName = 'AccordionContent';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\n/**\n * Direct named exports (not Object.assign compound pattern)\n *\n * Accordion follows React Aria's direct export pattern because:\n * - Simpler structure (only 4 components)\n * - Better tree-shaking with named exports\n * - Clearer imports: import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from '...'\n */\nexport const Accordion = AccordionRoot;\nexport const AccordionItem = AccordionItemComponent;\nexport const AccordionTrigger = AccordionTriggerComponent;\nexport const AccordionContent = AccordionContentComponent;\n\n// Re-export types for convenience\nexport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n};\n","import { z } from 'zod';\n\n/**\n * Base props schema for all Themis components\n * Ensures consistent accessibility and styling APIs across the library\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements)\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\nexport const BaseComponentPropsSchema = z.object({\n // Styling\n className: z.string().optional(),\n\n // React\n children: z.any().optional(), // ReactNode not directly supported by Zod\n id: z.string().optional(),\n\n // Accessibility (WCAG 2.2 AA requirements)\n 'aria-label': z.string().optional(),\n 'aria-labelledby': z.string().optional(),\n 'aria-describedby': z.string().optional(),\n 'aria-live': z.enum(['off', 'polite', 'assertive']).optional(),\n 'aria-hidden': z.boolean().optional(),\n\n // Testing & Development\n 'data-testid': z.string().optional(),\n});\n\nexport type BaseComponentProps = z.infer<typeof BaseComponentPropsSchema>;\n","import { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\nimport type { ReactNode, Key } from 'react';\n\n/**\n * Accordion Type Schema\n * Defines expansion mode: single (one item at a time) or multiple (any number)\n *\n * @see accordion-prd.md FR-005, FR-006 (Expansion Modes)\n */\nexport const AccordionTypeSchema = z.enum(['single', 'multiple']);\nexport type AccordionType = z.infer<typeof AccordionTypeSchema>;\n\n/**\n * Heading Level Schema\n * Configurable heading level for document structure (h1-h6)\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger with as prop)\n */\nexport const HeadingLevelSchema = z.enum(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']);\nexport type HeadingLevel = z.infer<typeof HeadingLevelSchema>;\n\n/**\n * Key Schema for item identification\n * Supports both string and number keys per React Aria convention\n */\nexport const KeySchema = z.union([z.string(), z.number()]);\n\n/**\n * Accordion root component props schema\n *\n * @see accordion-prd.md FR-001 (Accordion Root Component)\n * @see accordion-prd.md FR-007 (Controlled Mode)\n * @see accordion-prd.md FR-008 (Uncontrolled Mode)\n */\nexport const AccordionPropsSchema = BaseComponentPropsSchema.extend({\n // Expansion mode: 'single' (one at a time) or 'multiple' (any number)\n type: AccordionTypeSchema.optional().default('single'),\n\n // Allow all items to be collapsed (only applies to type=\"single\")\n // When false, one item must always be expanded\n collapsible: z.boolean().optional().default(false),\n\n // Controlled mode: currently expanded keys\n expandedKeys: z.custom<Set<Key>>().optional(),\n\n // Uncontrolled mode: initial expanded keys\n defaultExpandedKeys: z.array(KeySchema).optional(),\n\n // Expansion change handler\n onExpandedChange: z.custom<(keys: Set<Key>) => void>().optional(),\n\n // Disable all items\n isDisabled: z.boolean().optional().default(false),\n\n // Keys of items to disable individually\n disabledKeys: z.array(KeySchema).optional(),\n\n // Children: AccordionItem components\n children: z.custom<ReactNode>(),\n});\n\nexport interface AccordionProps {\n className?: string;\n children?: ReactNode;\n id?: string;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n 'aria-describedby'?: string;\n 'aria-live'?: 'off' | 'polite' | 'assertive';\n 'aria-hidden'?: boolean;\n 'data-testid'?: string;\n type?: AccordionType;\n collapsible?: boolean;\n expandedKeys?: Set<Key>;\n defaultExpandedKeys?: (string | number)[];\n onExpandedChange?: (keys: Set<Key>) => void;\n isDisabled?: boolean;\n disabledKeys?: (string | number)[];\n}\n\n/**\n * AccordionItem component props schema\n *\n * @see accordion-prd.md FR-002 (AccordionItem Component)\n */\nexport const AccordionItemPropsSchema = BaseComponentPropsSchema.extend({\n // Unique identifier (required)\n id: KeySchema,\n\n // Disable this specific item\n isDisabled: z.boolean().optional(),\n\n // Children: AccordionTrigger + AccordionContent\n children: z.custom<ReactNode>(),\n});\n\nexport interface AccordionItemProps {\n className?: string;\n children?: ReactNode;\n id: string | number;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n 'data-testid'?: string;\n isDisabled?: boolean;\n}\n\n/**\n * AccordionTrigger component props schema\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger Component)\n */\nexport const AccordionTriggerPropsSchema = BaseComponentPropsSchema.extend({\n // Heading level for proper document structure (default: h3)\n as: HeadingLevelSchema.optional().default('h3'),\n\n // Custom icon to replace default chevron\n icon: z.custom<ReactNode>().optional(),\n\n // Hide the expand/collapse icon entirely\n hideIcon: z.boolean().optional().default(false),\n\n // Trigger content (text, icons, custom content)\n children: z.custom<ReactNode>(),\n});\n\nexport interface AccordionTriggerProps {\n className?: string;\n children?: ReactNode;\n id?: string;\n 'aria-label'?: string;\n 'data-testid'?: string;\n as?: HeadingLevel;\n icon?: ReactNode;\n hideIcon?: boolean;\n}\n\n/**\n * AccordionContent component props schema\n *\n * @see accordion-prd.md FR-004 (AccordionContent Component)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const AccordionContentPropsSchema = BaseComponentPropsSchema.extend({\n // Preserve component state when collapsed using React Activity API\n // When true, wraps content in <Activity> component\n // Effects are cleaned up when hidden, restored when visible\n preserveState: z.boolean().optional().default(false),\n\n // Panel content\n children: z.custom<ReactNode>(),\n});\n\nexport interface AccordionContentProps {\n className?: string;\n children?: ReactNode;\n id?: string;\n 'data-testid'?: string;\n preserveState?: boolean;\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import {createContext,useMemo,useContext,Children,isValidElement,Activity}from'react';import {DisclosureGroup,Disclosure,composeRenderProps,DisclosureStateContext,Heading,Button,DisclosurePanel}from'react-aria-components';import {cva}from'class-variance-authority';import {ChevronDown}from'lucide-react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx,jsxs}from'react/jsx-runtime';import {z}from'zod';function d(...e){return twMerge(clsx(e))}var J=Activity??function({children:n,mode:r}){return jsx("div",{"data-activity-mode":r,children:n})},P=createContext({}),C=cva("w-full",{variants:{},defaultVariants:{}}),S=cva(["border-b border-[var(--border)]","last:border-b-0"].join(" "),{variants:{},defaultVariants:{}}),I=cva(["flex flex-1 items-center justify-between py-4 font-medium w-full","text-sm text-[var(--content-foreground)]","hover:underline","focus-visible:outline-none focus-visible:ring-2","focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2","focus-visible:ring-offset-[var(--content-background)]","min-h-[44px]","data-[disabled]:pointer-events-none data-[disabled]:opacity-50","transition-all"].join(" "),{variants:{},defaultVariants:{}}),V=cva(["h-4 w-4 shrink-0","text-[var(--menu-muted)]","transition-transform duration-200 ease-out","motion-reduce:transition-none"].join(" "),{variants:{isExpanded:{true:"rotate-180",false:"rotate-0"}},defaultVariants:{isExpanded:false}}),N=cva(["overflow-hidden","text-sm text-[var(--menu-muted)]"].join(" "),{variants:{},defaultVariants:{}}),g=cva("pb-4 pt-0",{variants:{},defaultVariants:{}});function Z(e){return {h1:1,h2:2,h3:3,h4:4,h5:5,h6:6}[e]}function _(e){let n=Children.toArray(e);for(let r of n)if(isValidElement(r)){let t=r.props;if(t&&typeof t=="object"&&"id"in t)return t.id}}function T({type:e="single",collapsible:n=false,expandedKeys:r,defaultExpandedKeys:t,onExpandedChange:c,isDisabled:l=false,disabledKeys:m,className:u,children:s,...w}){let z=e==="multiple",L=useMemo(()=>{if(!n&&e==="single"&&!t&&!r){let v=_(s);return v?[v]:void 0}return t},[n,e,t,r,s]),j=useMemo(()=>({disabledKeys:m}),[m]);return jsx(P.Provider,{value:j,children:jsx(DisclosureGroup,{allowsMultipleExpanded:z,expandedKeys:r,defaultExpandedKeys:L,onExpandedChange:c,isDisabled:l,className:d(C(),u),...w,children:s})})}T.displayName="Accordion";function D({id:e,isDisabled:n,className:r,children:t,...c}){let{disabledKeys:l}=useContext(P),m=l?.includes(e)??false;return jsx(Disclosure,{id:e,isDisabled:n||m,className:composeRenderProps(r,s=>d(S(),s)),...c,children:t})}D.displayName="AccordionItem";function R({as:e="h3",icon:n,hideIcon:r=false,className:t,children:c,...l}){let u=useContext(DisclosureStateContext)?.isExpanded??false;return jsx(Heading,{level:Z(e),children:jsxs(Button,{slot:"trigger",className:composeRenderProps(t,s=>d(I(),s)),...l,children:[jsx("span",{className:"flex-1 text-left",children:c}),!r&&(n??jsx(ChevronDown,{"aria-hidden":"true",className:d(V({isExpanded:u}))}))]})})}R.displayName="AccordionTrigger";function $({preserveState:e,children:n}){let t=useContext(DisclosureStateContext)?.isExpanded??false;return e?jsx(J,{mode:t?"visible":"hidden",children:jsx("div",{className:g(),children:n})}):jsx("div",{className:g(),children:n})}function K({preserveState:e=false,className:n,children:r,...t}){return jsx(DisclosurePanel,{className:composeRenderProps(n,c=>d(N(),"animate-accordion",c)),...t,children:jsx($,{preserveState:e,children:r})})}K.displayName="AccordionContent";var ee=T,oe=D,ne=R,te=K;var f=z.object({className:z.string().optional(),children:z.any().optional(),id:z.string().optional(),"aria-label":z.string().optional(),"aria-labelledby":z.string().optional(),"aria-describedby":z.string().optional(),"aria-live":z.enum(["off","polite","assertive"]).optional(),"aria-hidden":z.boolean().optional(),"data-testid":z.string().optional()});var E=z.enum(["single","multiple"]),H=z.enum(["h1","h2","h3","h4","h5","h6"]),A=z.union([z.string(),z.number()]),ie=f.extend({type:E.optional().default("single"),collapsible:z.boolean().optional().default(false),expandedKeys:z.custom().optional(),defaultExpandedKeys:z.array(A).optional(),onExpandedChange:z.custom().optional(),isDisabled:z.boolean().optional().default(false),disabledKeys:z.array(A).optional(),children:z.custom()}),ae=f.extend({id:A,isDisabled:z.boolean().optional(),children:z.custom()}),ce=f.extend({as:H.optional().default("h3"),icon:z.custom().optional(),hideIcon:z.boolean().optional().default(false),children:z.custom()}),se=f.extend({preserveState:z.boolean().optional().default(false),children:z.custom()});export{ee as Accordion,te as AccordionContent,se as AccordionContentPropsSchema,oe as AccordionItem,ae as AccordionItemPropsSchema,ie as AccordionPropsSchema,ne as AccordionTrigger,ce as AccordionTriggerPropsSchema,E as AccordionTypeSchema,H as HeadingLevelSchema,A as KeySchema,V as accordionChevronVariants,g as accordionContentInnerVariants,N as accordionContentVariants,S as accordionItemVariants,I as accordionTriggerVariants,C as accordionVariants};//# sourceMappingURL=index.mjs.map
2
+ import {createContext,useMemo,useContext,Children,isValidElement,Activity}from'react';import {DisclosureGroup,Disclosure,composeRenderProps,DisclosureStateContext,Heading,Button,DisclosurePanel}from'react-aria-components';import {cva}from'class-variance-authority';import {ChevronDown}from'lucide-react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx,jsxs}from'react/jsx-runtime';import {z}from'zod';function d(...e){return twMerge(clsx(e))}var J=Activity??function({children:n,mode:r}){return jsx("div",{"data-activity-mode":r,children:n})},C=createContext({}),P=cva("w-full",{variants:{},defaultVariants:{}}),N=cva(["border-b border-[var(--border)]","last:border-b-0"].join(" "),{variants:{},defaultVariants:{}}),S=cva(["flex flex-1 items-center justify-between py-4 font-medium w-full","text-sm text-[var(--content-foreground)]","hover:underline","focus-visible:outline-none focus-visible:ring-2","focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2","focus-visible:ring-offset-[var(--content-background)]","min-h-[44px]","data-[disabled]:pointer-events-none data-[disabled]:opacity-50","transition-all"].join(" "),{variants:{},defaultVariants:{}}),I=cva(["h-4 w-4 shrink-0","text-[var(--menu-muted)]","transition-transform duration-200 ease-out","motion-reduce:transition-none"].join(" "),{variants:{isExpanded:{true:"rotate-180",false:"rotate-0"}},defaultVariants:{isExpanded:false}}),V=cva(["overflow-hidden","text-sm text-[var(--menu-muted)]"].join(" "),{variants:{},defaultVariants:{}}),A=cva("pb-4 pt-0",{variants:{},defaultVariants:{}});function Z(e){return {h1:1,h2:2,h3:3,h4:4,h5:5,h6:6}[e]}function _(e){let n=Children.toArray(e);for(let r of n)if(isValidElement(r)){let t=r.props;if(t&&typeof t=="object"&&"id"in t)return t.id}}function R({type:e="single",collapsible:n=false,expandedKeys:r,defaultExpandedKeys:t,onExpandedChange:s,isDisabled:p=false,disabledKeys:m,className:f,children:c,...w}){let L=e==="multiple",k=useMemo(()=>{if(!n&&e==="single"&&!t&&!r){let x=_(c);return x?[x]:void 0}return t},[n,e,t,r,c]),j=useMemo(()=>({disabledKeys:m}),[m]);return jsx(C.Provider,{value:j,children:jsx(DisclosureGroup,{allowsMultipleExpanded:L,expandedKeys:r,defaultExpandedKeys:k,onExpandedChange:s,isDisabled:p,className:d(P(),f),...w,children:c})})}R.displayName="Accordion";function K({id:e,isDisabled:n,className:r,children:t,...s}){let{disabledKeys:p}=useContext(C),m=p?.includes(e)??false;return jsx(Disclosure,{id:e,isDisabled:n||m,className:composeRenderProps(r,c=>d(N(),c)),...s,children:t})}K.displayName="AccordionItem";function D({as:e="h3",icon:n,hideIcon:r=false,className:t,children:s,...p}){let f=useContext(DisclosureStateContext)?.isExpanded??false;return jsx(Heading,{level:Z(e),children:jsxs(Button,{slot:"trigger",className:composeRenderProps(t,c=>d(S(),c)),...p,children:[jsx("span",{className:"flex-1 text-left",children:s}),!r&&(n??jsx(ChevronDown,{"aria-hidden":"true",className:d(I({isExpanded:f}))}))]})})}D.displayName="AccordionTrigger";function $({preserveState:e,children:n}){let t=useContext(DisclosureStateContext)?.isExpanded??false;return e?jsx(J,{mode:t?"visible":"hidden",children:jsx("div",{className:A(),children:n})}):jsx("div",{className:A(),children:n})}function T({preserveState:e=false,className:n,children:r,...t}){return jsx(DisclosurePanel,{className:composeRenderProps(n,s=>d(V(),"animate-accordion",s)),...t,children:jsx($,{preserveState:e,children:r})})}T.displayName="AccordionContent";var ee=R,oe=K,ne=D,te=T;var u=z.object({className:z.string().optional(),children:z.any().optional(),id:z.string().optional(),"aria-label":z.string().optional(),"aria-labelledby":z.string().optional(),"aria-describedby":z.string().optional(),"aria-live":z.enum(["off","polite","assertive"]).optional(),"aria-hidden":z.boolean().optional(),"data-testid":z.string().optional()});var E=z.enum(["single","multiple"]),H=z.enum(["h1","h2","h3","h4","h5","h6"]),g=z.union([z.string(),z.number()]),ie=u.extend({type:E.optional().default("single"),collapsible:z.boolean().optional().default(false),expandedKeys:z.custom().optional(),defaultExpandedKeys:z.array(g).optional(),onExpandedChange:z.custom().optional(),isDisabled:z.boolean().optional().default(false),disabledKeys:z.array(g).optional(),children:z.custom()}),ae=u.extend({id:g,isDisabled:z.boolean().optional(),children:z.custom()}),se=u.extend({as:H.optional().default("h3"),icon:z.custom().optional(),hideIcon:z.boolean().optional().default(false),children:z.custom()}),ce=u.extend({preserveState:z.boolean().optional().default(false),children:z.custom()});export{ee as Accordion,te as AccordionContent,ce as AccordionContentPropsSchema,oe as AccordionItem,ae as AccordionItemPropsSchema,ie as AccordionPropsSchema,ne as AccordionTrigger,se as AccordionTriggerPropsSchema,E as AccordionTypeSchema,H as HeadingLevelSchema,g as KeySchema,I as accordionChevronVariants,A as accordionContentInnerVariants,V as accordionContentVariants,N as accordionItemVariants,S as accordionTriggerVariants,P as accordionVariants};//# sourceMappingURL=index.mjs.map
3
3
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/elements/Accordion/Accordion.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/Accordion/Accordion.types.ts"],"names":["cn","inputs","twMerge","clsx","Activity","ReactActivity","children","mode","jsx","AccordionContext","createContext","accordionVariants","cva","accordionItemVariants","accordionTriggerVariants","accordionChevronVariants","accordionContentVariants","accordionContentInnerVariants","getHeadingLevel","level","getFirstAccordionItemId","childArray","Children","child","isValidElement","childProps","AccordionRoot","type","collapsible","expandedKeys","defaultExpandedKeys","onExpandedChange","isDisabled","disabledKeys","className","props","allowsMultipleExpanded","effectiveDefaultExpandedKeys","useMemo","firstItemId","contextValue","DisclosureGroup","AccordionItemComponent","id","isDisabledProp","useContext","isDisabledFromKeys","Disclosure","composeRenderProps","AccordionTriggerComponent","headingLevel","icon","hideIcon","isExpanded","DisclosureStateContext","Heading","jsxs","Button","ChevronDown","AccordionContentInner","preserveState","AccordionContentComponent","DisclosurePanel","Accordion","AccordionItem","AccordionTrigger","AccordionContent","BaseComponentPropsSchema","z","AccordionTypeSchema","HeadingLevelSchema","KeySchema","AccordionPropsSchema","AccordionItemPropsSchema","AccordionTriggerPropsSchema","AccordionContentPropsSchema"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\n/**\n * Accordion Component - Implementation\n *\n * Accessible accordion/disclosure group component combining React Aria primitives with CVA styling.\n * Follows Themis library patterns with compound component structure and direct named exports.\n *\n * Key Features:\n * - React Aria DisclosureGroup for full accessibility (WCAG 2.2 AAA)\n * - CVA variants for consistent styling\n * - React 19.2 Activity API for state preservation (preserveState prop)\n * - Single/Multiple expansion modes\n * - Controlled and uncontrolled state management\n * - Configurable heading levels for document structure\n * - Custom icon support\n *\n * @see accordion-prd.md (Full requirements)\n * @see Accordion.types.ts (Zod schemas)\n * @see plan.md (Implementation approach)\n */\n\n// React 19.2 Activity API - may not be available in all builds\n// Import conditionally to support environments where Activity is unavailable\nimport {\n Activity as ReactActivity,\n type ReactNode,\n type ReactElement,\n useMemo,\n useContext,\n createContext,\n Children,\n isValidElement,\n} from 'react';\n\n// Activity component with fallback for environments where it's not available\n// The fallback simply renders children directly - no state preservation when Activity unavailable\nconst Activity = ReactActivity ?? function ActivityFallback({\n children,\n mode,\n}: {\n children: ReactNode;\n mode: 'visible' | 'hidden';\n}): ReactElement {\n return <div data-activity-mode={mode}>{children}</div>;\n};\n\nimport {\n DisclosureGroup,\n Disclosure,\n DisclosurePanel,\n Heading,\n Button,\n composeRenderProps,\n DisclosureStateContext,\n type Key as AriaKey,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { ChevronDown } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n HeadingLevel,\n} from './Accordion.types';\n\n// ============================================================================\n// Context for disabledKeys\n// ============================================================================\n\n/**\n * Context to pass disabledKeys from Accordion to AccordionItem\n * Since DisclosureGroup doesn't support disabledKeys directly, we handle it via context\n */\ninterface AccordionContextValue {\n disabledKeys?: (string | number)[];\n}\n\nconst AccordionContext = createContext<AccordionContextValue>({});\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * Accordion root CVA variants\n *\n * @see accordion-prd.md FR-001 (Accordion Root)\n */\nexport const accordionVariants = cva('w-full', {\n variants: {},\n defaultVariants: {},\n});\n\n/**\n * AccordionItem CVA variants\n *\n * @see accordion-prd.md FR-002 (AccordionItem)\n * @see accordion-prd.md DS-001 (Visual Design - borders)\n */\nexport const accordionItemVariants = cva(\n [\n 'border-b border-[var(--border)]',\n // Last item has no border (handled by last:border-b-0)\n 'last:border-b-0',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * AccordionTrigger CVA variants\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger)\n * @see accordion-prd.md AR-006 (Touch Target Size - 44x44px)\n * @see accordion-prd.md DS-002 (Typography)\n */\nexport const accordionTriggerVariants = cva(\n [\n // Layout\n 'flex flex-1 items-center justify-between py-4 font-medium w-full',\n // Text styling\n 'text-sm text-[var(--content-foreground)]',\n // Hover state\n 'hover:underline',\n // Focus visible ring (WCAG 2.4.13)\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n 'focus-visible:ring-offset-[var(--content-background)]',\n // WCAG 2.2 AAA: 44px minimum touch target\n 'min-h-[44px]',\n // Disabled state\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n // Transition for smooth interactions\n 'transition-all',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * Chevron icon CVA variants\n *\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const accordionChevronVariants = cva(\n [\n 'h-4 w-4 shrink-0',\n 'text-[var(--menu-muted)]',\n // Smooth rotation transition\n 'transition-transform duration-200 ease-out',\n // Reduced motion support\n 'motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n isExpanded: {\n true: 'rotate-180',\n false: 'rotate-0',\n },\n },\n defaultVariants: {\n isExpanded: false,\n },\n }\n);\n\n/**\n * AccordionContent CVA variants\n *\n * @see accordion-prd.md FR-004 (AccordionContent)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const accordionContentVariants = cva(\n [\n 'overflow-hidden',\n 'text-sm text-[var(--menu-muted)]',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * AccordionContent inner wrapper CVA variants\n */\nexport const accordionContentInnerVariants = cva('pb-4 pt-0', {\n variants: {},\n defaultVariants: {},\n});\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Convert heading level string to number for React Aria Heading\n */\nfunction getHeadingLevel(level: HeadingLevel): 1 | 2 | 3 | 4 | 5 | 6 {\n const levelMap: Record<HeadingLevel, 1 | 2 | 3 | 4 | 5 | 6> = {\n h1: 1,\n h2: 2,\n h3: 3,\n h4: 4,\n h5: 5,\n h6: 6,\n };\n return levelMap[level];\n}\n\n/**\n * Get the first AccordionItem id from children\n * Used for auto-expanding first item when collapsible={false}\n */\nfunction getFirstAccordionItemId(children: ReactNode): AriaKey | undefined {\n const childArray = Children.toArray(children);\n for (const child of childArray) {\n if (isValidElement(child)) {\n const childProps = child.props as Record<string, unknown>;\n if (childProps && typeof childProps === 'object' && 'id' in childProps) {\n return childProps.id as AriaKey;\n }\n }\n }\n return undefined;\n}\n\n// ============================================================================\n// Components\n// ============================================================================\n\n/**\n * Accordion Root Component\n *\n * Container for accordion items. Manages expansion state and provides\n * context to child components.\n *\n * @see accordion-prd.md FR-001 (Accordion Root Component)\n * @see accordion-prd.md FR-005 (Single Expansion Mode)\n * @see accordion-prd.md FR-006 (Multiple Expansion Mode)\n * @see accordion-prd.md FR-007 (Controlled Mode)\n * @see accordion-prd.md FR-008 (Uncontrolled Mode)\n *\n * @example\n * // Uncontrolled single mode\n * <Accordion type=\"single\" collapsible>\n * <AccordionItem id=\"item-1\">\n * <AccordionTrigger>Section 1</AccordionTrigger>\n * <AccordionContent>Content 1</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n *\n * @example\n * // Controlled multiple mode\n * <Accordion\n * type=\"multiple\"\n * expandedKeys={expandedKeys}\n * onExpandedChange={setExpandedKeys}\n * >\n * ...\n * </Accordion>\n */\nfunction AccordionRoot({\n type = 'single',\n collapsible = false,\n expandedKeys,\n defaultExpandedKeys,\n onExpandedChange,\n isDisabled = false,\n disabledKeys,\n className,\n children,\n ...props\n}: AccordionProps) {\n // Map type prop to React Aria's allowsMultipleExpanded\n const allowsMultipleExpanded = type === 'multiple';\n\n // Auto-expand first item when collapsible={false} and no default provided\n // This ensures one item is always expanded in non-collapsible single mode\n const effectiveDefaultExpandedKeys = useMemo(() => {\n if (!collapsible && type === 'single' && !defaultExpandedKeys && !expandedKeys) {\n const firstItemId = getFirstAccordionItemId(children);\n return firstItemId ? [firstItemId] : undefined;\n }\n return defaultExpandedKeys;\n }, [collapsible, type, defaultExpandedKeys, expandedKeys, children]);\n\n // Context value for passing disabledKeys to AccordionItem\n const contextValue = useMemo(\n () => ({ disabledKeys }),\n [disabledKeys]\n );\n\n return (\n <AccordionContext.Provider value={contextValue}>\n <DisclosureGroup\n allowsMultipleExpanded={allowsMultipleExpanded}\n expandedKeys={expandedKeys as Set<AriaKey> | undefined}\n defaultExpandedKeys={effectiveDefaultExpandedKeys as Iterable<AriaKey> | undefined}\n onExpandedChange={onExpandedChange as ((keys: Set<AriaKey>) => void) | undefined}\n isDisabled={isDisabled}\n className={cn(accordionVariants(), className)}\n {...props}\n >\n {children}\n </DisclosureGroup>\n </AccordionContext.Provider>\n );\n}\n\nAccordionRoot.displayName = 'Accordion';\n\n/**\n * AccordionItem Component\n *\n * Wrapper for each expandable disclosure section.\n *\n * @see accordion-prd.md FR-002 (AccordionItem Component)\n *\n * @example\n * <AccordionItem id=\"faq-1\" isDisabled={!isAuthenticated}>\n * <AccordionTrigger>Members-only FAQ</AccordionTrigger>\n * <AccordionContent>This content is for members only.</AccordionContent>\n * </AccordionItem>\n */\nfunction AccordionItemComponent({\n id,\n isDisabled: isDisabledProp,\n className,\n children,\n ...props\n}: AccordionItemProps) {\n // Check if this item is in the disabledKeys array\n const { disabledKeys } = useContext(AccordionContext);\n const isDisabledFromKeys = disabledKeys?.includes(id as string | number) ?? false;\n const isDisabled = isDisabledProp || isDisabledFromKeys;\n\n return (\n <Disclosure\n id={id}\n isDisabled={isDisabled}\n className={composeRenderProps(className, (className) =>\n cn(accordionItemVariants(), className)\n )}\n {...props}\n >\n {children}\n </Disclosure>\n );\n}\n\nAccordionItemComponent.displayName = 'AccordionItem';\n\n/**\n * AccordionTrigger Component\n *\n * Clickable button that toggles accordion content visibility.\n * Wrapped in a Heading for proper document structure.\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger Component)\n * @see accordion-prd.md AR-002 (ARIA Attributes)\n * @see accordion-prd.md AR-003 (Keyboard Navigation)\n *\n * @example\n * // Default with chevron\n * <AccordionTrigger>Is it accessible?</AccordionTrigger>\n *\n * @example\n * // Custom heading level\n * <AccordionTrigger as=\"h2\">Important Section</AccordionTrigger>\n *\n * @example\n * // Custom icon\n * <AccordionTrigger icon={<PlusIcon className=\"h-4 w-4\" />}>\n * Click to expand\n * </AccordionTrigger>\n */\nfunction AccordionTriggerComponent({\n as: headingLevel = 'h3',\n icon,\n hideIcon = false,\n className,\n children,\n ...props\n}: AccordionTriggerProps) {\n // Access disclosure state from context\n const state = useContext(DisclosureStateContext);\n const isExpanded = state?.isExpanded ?? false;\n\n return (\n <Heading level={getHeadingLevel(headingLevel)}>\n <Button\n slot=\"trigger\"\n className={composeRenderProps(className, (className) =>\n cn(accordionTriggerVariants(), className)\n )}\n {...props}\n >\n <span className=\"flex-1 text-left\">{children}</span>\n {!hideIcon && (\n icon ?? (\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(accordionChevronVariants({ isExpanded }))}\n />\n )\n )}\n </Button>\n </Heading>\n );\n}\n\nAccordionTriggerComponent.displayName = 'AccordionTrigger';\n\n/**\n * AccordionContent Component\n *\n * Expandable container for accordion content.\n * Supports animated height transitions and React Activity state preservation.\n *\n * @see accordion-prd.md FR-004 (AccordionContent Component)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n *\n * @example\n * // Standard content\n * <AccordionContent>\n * Yes. It adheres to the WAI-ARIA design pattern.\n * </AccordionContent>\n *\n * @example\n * // With state preservation\n * <AccordionContent preserveState>\n * <form>\n * <input name=\"email\" />\n * </form>\n * </AccordionContent>\n */\n/**\n * Inner component for AccordionContent with state preservation\n * Uses DisclosureStateContext to get isExpanded state\n */\nfunction AccordionContentInner({\n preserveState,\n children,\n}: {\n preserveState: boolean;\n children: ReactNode;\n}) {\n const state = useContext(DisclosureStateContext);\n const isExpanded = state?.isExpanded ?? false;\n\n if (preserveState) {\n return (\n <Activity mode={isExpanded ? 'visible' : 'hidden'}>\n <div className={accordionContentInnerVariants()}>{children}</div>\n </Activity>\n );\n }\n\n return <div className={accordionContentInnerVariants()}>{children}</div>;\n}\n\nfunction AccordionContentComponent({\n preserveState = false,\n className,\n children,\n ...props\n}: AccordionContentProps) {\n return (\n <DisclosurePanel\n className={composeRenderProps(className, (className) =>\n cn(accordionContentVariants(), 'animate-accordion', className)\n )}\n {...props}\n >\n <AccordionContentInner preserveState={preserveState}>\n {children}\n </AccordionContentInner>\n </DisclosurePanel>\n );\n}\n\nAccordionContentComponent.displayName = 'AccordionContent';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\n/**\n * Direct named exports (not Object.assign compound pattern)\n *\n * Accordion follows React Aria's direct export pattern because:\n * - Simpler structure (only 4 components)\n * - Better tree-shaking with named exports\n * - Clearer imports: import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from '...'\n */\nexport const Accordion = AccordionRoot;\nexport const AccordionItem = AccordionItemComponent;\nexport const AccordionTrigger = AccordionTriggerComponent;\nexport const AccordionContent = AccordionContentComponent;\n\n// Re-export types for convenience\nexport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n};\n","import { z } from 'zod';\n\n/**\n * Base props schema for all Themis components\n * Ensures consistent accessibility and styling APIs across the library\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements)\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\nexport const BaseComponentPropsSchema = z.object({\n // Styling\n className: z.string().optional(),\n\n // React\n children: z.any().optional(), // ReactNode not directly supported by Zod\n id: z.string().optional(),\n\n // Accessibility (WCAG 2.2 AA requirements)\n 'aria-label': z.string().optional(),\n 'aria-labelledby': z.string().optional(),\n 'aria-describedby': z.string().optional(),\n 'aria-live': z.enum(['off', 'polite', 'assertive']).optional(),\n 'aria-hidden': z.boolean().optional(),\n\n // Testing & Development\n 'data-testid': z.string().optional(),\n});\n\nexport type BaseComponentProps = z.infer<typeof BaseComponentPropsSchema>;\n","import { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\nimport type { ReactNode, Key } from 'react';\n\n/**\n * Accordion Type Schema\n * Defines expansion mode: single (one item at a time) or multiple (any number)\n *\n * @see accordion-prd.md FR-005, FR-006 (Expansion Modes)\n */\nexport const AccordionTypeSchema = z.enum(['single', 'multiple']);\nexport type AccordionType = z.infer<typeof AccordionTypeSchema>;\n\n/**\n * Heading Level Schema\n * Configurable heading level for document structure (h1-h6)\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger with as prop)\n */\nexport const HeadingLevelSchema = z.enum(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']);\nexport type HeadingLevel = z.infer<typeof HeadingLevelSchema>;\n\n/**\n * Key Schema for item identification\n * Supports both string and number keys per React Aria convention\n */\nexport const KeySchema = z.union([z.string(), z.number()]);\n\n/**\n * Accordion root component props schema\n *\n * @see accordion-prd.md FR-001 (Accordion Root Component)\n * @see accordion-prd.md FR-007 (Controlled Mode)\n * @see accordion-prd.md FR-008 (Uncontrolled Mode)\n */\nexport const AccordionPropsSchema = BaseComponentPropsSchema.extend({\n // Expansion mode: 'single' (one at a time) or 'multiple' (any number)\n type: AccordionTypeSchema.optional().default('single'),\n\n // Allow all items to be collapsed (only applies to type=\"single\")\n // When false, one item must always be expanded\n collapsible: z.boolean().optional().default(false),\n\n // Controlled mode: currently expanded keys\n expandedKeys: z.custom<Set<Key>>().optional(),\n\n // Uncontrolled mode: initial expanded keys\n defaultExpandedKeys: z.array(KeySchema).optional(),\n\n // Expansion change handler\n onExpandedChange: z.custom<(keys: Set<Key>) => void>().optional(),\n\n // Disable all items\n isDisabled: z.boolean().optional().default(false),\n\n // Keys of items to disable individually\n disabledKeys: z.array(KeySchema).optional(),\n\n // Children: AccordionItem components\n children: z.custom<ReactNode>(),\n});\n\nexport type AccordionProps = z.infer<typeof AccordionPropsSchema>;\n\n/**\n * AccordionItem component props schema\n *\n * @see accordion-prd.md FR-002 (AccordionItem Component)\n */\nexport const AccordionItemPropsSchema = BaseComponentPropsSchema.extend({\n // Unique identifier (required)\n id: KeySchema,\n\n // Disable this specific item\n isDisabled: z.boolean().optional(),\n\n // Children: AccordionTrigger + AccordionContent\n children: z.custom<ReactNode>(),\n});\n\nexport type AccordionItemProps = z.infer<typeof AccordionItemPropsSchema>;\n\n/**\n * AccordionTrigger component props schema\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger Component)\n */\nexport const AccordionTriggerPropsSchema = BaseComponentPropsSchema.extend({\n // Heading level for proper document structure (default: h3)\n as: HeadingLevelSchema.optional().default('h3'),\n\n // Custom icon to replace default chevron\n icon: z.custom<ReactNode>().optional(),\n\n // Hide the expand/collapse icon entirely\n hideIcon: z.boolean().optional().default(false),\n\n // Trigger content (text, icons, custom content)\n children: z.custom<ReactNode>(),\n});\n\nexport type AccordionTriggerProps = z.infer<typeof AccordionTriggerPropsSchema>;\n\n/**\n * AccordionContent component props schema\n *\n * @see accordion-prd.md FR-004 (AccordionContent Component)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const AccordionContentPropsSchema = BaseComponentPropsSchema.extend({\n // Preserve component state when collapsed using React Activity API\n // When true, wraps content in <Activity> component\n // Effects are cleaned up when hidden, restored when visible\n preserveState: z.boolean().optional().default(false),\n\n // Panel content\n children: z.custom<ReactNode>(),\n});\n\nexport type AccordionContentProps = z.infer<typeof AccordionContentPropsSchema>;\n"]}
1
+ {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/elements/Accordion/Accordion.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/Accordion/Accordion.types.ts"],"names":["cn","inputs","twMerge","clsx","Activity","ReactActivity","children","mode","jsx","AccordionContext","createContext","accordionVariants","cva","accordionItemVariants","accordionTriggerVariants","accordionChevronVariants","accordionContentVariants","accordionContentInnerVariants","getHeadingLevel","level","getFirstAccordionItemId","childArray","Children","child","isValidElement","childProps","AccordionRoot","type","collapsible","expandedKeys","defaultExpandedKeys","onExpandedChange","isDisabled","disabledKeys","className","props","allowsMultipleExpanded","effectiveDefaultExpandedKeys","useMemo","firstItemId","contextValue","DisclosureGroup","AccordionItemComponent","id","isDisabledProp","useContext","isDisabledFromKeys","Disclosure","composeRenderProps","AccordionTriggerComponent","headingLevel","icon","hideIcon","isExpanded","DisclosureStateContext","Heading","jsxs","Button","ChevronDown","AccordionContentInner","preserveState","AccordionContentComponent","DisclosurePanel","Accordion","AccordionItem","AccordionTrigger","AccordionContent","BaseComponentPropsSchema","z","AccordionTypeSchema","HeadingLevelSchema","KeySchema","AccordionPropsSchema","AccordionItemPropsSchema","AccordionTriggerPropsSchema","AccordionContentPropsSchema"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\n/**\n * Accordion Component - Implementation\n *\n * Accessible accordion/disclosure group component combining React Aria primitives with CVA styling.\n * Follows Themis library patterns with compound component structure and direct named exports.\n *\n * Key Features:\n * - React Aria DisclosureGroup for full accessibility (WCAG 2.2 AAA)\n * - CVA variants for consistent styling\n * - React 19.2 Activity API for state preservation (preserveState prop)\n * - Single/Multiple expansion modes\n * - Controlled and uncontrolled state management\n * - Configurable heading levels for document structure\n * - Custom icon support\n *\n * @see accordion-prd.md (Full requirements)\n * @see Accordion.types.ts (Zod schemas)\n * @see plan.md (Implementation approach)\n */\n\n// React 19.2 Activity API - may not be available in all builds\n// Import conditionally to support environments where Activity is unavailable\nimport {\n Activity as ReactActivity,\n type ReactNode,\n type ReactElement,\n useMemo,\n useContext,\n createContext,\n Children,\n isValidElement,\n} from 'react';\n\n// Activity component with fallback for environments where it's not available\n// The fallback simply renders children directly - no state preservation when Activity unavailable\nconst Activity = ReactActivity ?? function ActivityFallback({\n children,\n mode,\n}: {\n children: ReactNode;\n mode: 'visible' | 'hidden';\n}): ReactElement {\n return <div data-activity-mode={mode}>{children}</div>;\n};\n\nimport {\n DisclosureGroup,\n Disclosure,\n DisclosurePanel,\n Heading,\n Button,\n composeRenderProps,\n DisclosureStateContext,\n type Key as AriaKey,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { ChevronDown } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n HeadingLevel,\n} from './Accordion.types';\n\n// ============================================================================\n// Context for disabledKeys\n// ============================================================================\n\n/**\n * Context to pass disabledKeys from Accordion to AccordionItem\n * Since DisclosureGroup doesn't support disabledKeys directly, we handle it via context\n */\ninterface AccordionContextValue {\n disabledKeys?: (string | number)[];\n}\n\nconst AccordionContext = createContext<AccordionContextValue>({});\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * Accordion root CVA variants\n *\n * @see accordion-prd.md FR-001 (Accordion Root)\n */\nexport const accordionVariants = cva('w-full', {\n variants: {},\n defaultVariants: {},\n});\n\n/**\n * AccordionItem CVA variants\n *\n * @see accordion-prd.md FR-002 (AccordionItem)\n * @see accordion-prd.md DS-001 (Visual Design - borders)\n */\nexport const accordionItemVariants = cva(\n [\n 'border-b border-[var(--border)]',\n // Last item has no border (handled by last:border-b-0)\n 'last:border-b-0',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * AccordionTrigger CVA variants\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger)\n * @see accordion-prd.md AR-006 (Touch Target Size - 44x44px)\n * @see accordion-prd.md DS-002 (Typography)\n */\nexport const accordionTriggerVariants = cva(\n [\n // Layout\n 'flex flex-1 items-center justify-between py-4 font-medium w-full',\n // Text styling\n 'text-sm text-[var(--content-foreground)]',\n // Hover state\n 'hover:underline',\n // Focus visible ring (WCAG 2.4.13)\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n 'focus-visible:ring-offset-[var(--content-background)]',\n // WCAG 2.2 AAA: 44px minimum touch target\n 'min-h-[44px]',\n // Disabled state\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n // Transition for smooth interactions\n 'transition-all',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * Chevron icon CVA variants\n *\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const accordionChevronVariants = cva(\n [\n 'h-4 w-4 shrink-0',\n 'text-[var(--menu-muted)]',\n // Smooth rotation transition\n 'transition-transform duration-200 ease-out',\n // Reduced motion support\n 'motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n isExpanded: {\n true: 'rotate-180',\n false: 'rotate-0',\n },\n },\n defaultVariants: {\n isExpanded: false,\n },\n }\n);\n\n/**\n * AccordionContent CVA variants\n *\n * @see accordion-prd.md FR-004 (AccordionContent)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const accordionContentVariants = cva(\n [\n 'overflow-hidden',\n 'text-sm text-[var(--menu-muted)]',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * AccordionContent inner wrapper CVA variants\n */\nexport const accordionContentInnerVariants = cva('pb-4 pt-0', {\n variants: {},\n defaultVariants: {},\n});\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Convert heading level string to number for React Aria Heading\n */\nfunction getHeadingLevel(level: HeadingLevel): 1 | 2 | 3 | 4 | 5 | 6 {\n const levelMap: Record<HeadingLevel, 1 | 2 | 3 | 4 | 5 | 6> = {\n h1: 1,\n h2: 2,\n h3: 3,\n h4: 4,\n h5: 5,\n h6: 6,\n };\n return levelMap[level];\n}\n\n/**\n * Get the first AccordionItem id from children\n * Used for auto-expanding first item when collapsible={false}\n */\nfunction getFirstAccordionItemId(children: ReactNode): AriaKey | undefined {\n const childArray = Children.toArray(children);\n for (const child of childArray) {\n if (isValidElement(child)) {\n const childProps = child.props as Record<string, unknown>;\n if (childProps && typeof childProps === 'object' && 'id' in childProps) {\n return childProps.id as AriaKey;\n }\n }\n }\n return undefined;\n}\n\n// ============================================================================\n// Components\n// ============================================================================\n\n/**\n * Accordion Root Component\n *\n * Container for accordion items. Manages expansion state and provides\n * context to child components.\n *\n * @see accordion-prd.md FR-001 (Accordion Root Component)\n * @see accordion-prd.md FR-005 (Single Expansion Mode)\n * @see accordion-prd.md FR-006 (Multiple Expansion Mode)\n * @see accordion-prd.md FR-007 (Controlled Mode)\n * @see accordion-prd.md FR-008 (Uncontrolled Mode)\n *\n * @example\n * // Uncontrolled single mode\n * <Accordion type=\"single\" collapsible>\n * <AccordionItem id=\"item-1\">\n * <AccordionTrigger>Section 1</AccordionTrigger>\n * <AccordionContent>Content 1</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n *\n * @example\n * // Controlled multiple mode\n * <Accordion\n * type=\"multiple\"\n * expandedKeys={expandedKeys}\n * onExpandedChange={setExpandedKeys}\n * >\n * ...\n * </Accordion>\n */\nfunction AccordionRoot({\n type = 'single',\n collapsible = false,\n expandedKeys,\n defaultExpandedKeys,\n onExpandedChange,\n isDisabled = false,\n disabledKeys,\n className,\n children,\n ...props\n}: AccordionProps) {\n // Map type prop to React Aria's allowsMultipleExpanded\n const allowsMultipleExpanded = type === 'multiple';\n\n // Auto-expand first item when collapsible={false} and no default provided\n // This ensures one item is always expanded in non-collapsible single mode\n const effectiveDefaultExpandedKeys = useMemo(() => {\n if (!collapsible && type === 'single' && !defaultExpandedKeys && !expandedKeys) {\n const firstItemId = getFirstAccordionItemId(children);\n return firstItemId ? [firstItemId] : undefined;\n }\n return defaultExpandedKeys;\n }, [collapsible, type, defaultExpandedKeys, expandedKeys, children]);\n\n // Context value for passing disabledKeys to AccordionItem\n const contextValue = useMemo(\n () => ({ disabledKeys }),\n [disabledKeys]\n );\n\n return (\n <AccordionContext.Provider value={contextValue}>\n <DisclosureGroup\n allowsMultipleExpanded={allowsMultipleExpanded}\n expandedKeys={expandedKeys as Set<AriaKey> | undefined}\n defaultExpandedKeys={effectiveDefaultExpandedKeys as Iterable<AriaKey> | undefined}\n onExpandedChange={onExpandedChange as ((keys: Set<AriaKey>) => void) | undefined}\n isDisabled={isDisabled}\n className={cn(accordionVariants(), className)}\n {...props}\n >\n {children}\n </DisclosureGroup>\n </AccordionContext.Provider>\n );\n}\n\nAccordionRoot.displayName = 'Accordion';\n\n/**\n * AccordionItem Component\n *\n * Wrapper for each expandable disclosure section.\n *\n * @see accordion-prd.md FR-002 (AccordionItem Component)\n *\n * @example\n * <AccordionItem id=\"faq-1\" isDisabled={!isAuthenticated}>\n * <AccordionTrigger>Members-only FAQ</AccordionTrigger>\n * <AccordionContent>This content is for members only.</AccordionContent>\n * </AccordionItem>\n */\nfunction AccordionItemComponent({\n id,\n isDisabled: isDisabledProp,\n className,\n children,\n ...props\n}: AccordionItemProps) {\n // Check if this item is in the disabledKeys array\n const { disabledKeys } = useContext(AccordionContext);\n const isDisabledFromKeys = disabledKeys?.includes(id as string | number) ?? false;\n const isDisabled = isDisabledProp || isDisabledFromKeys;\n\n return (\n <Disclosure\n id={id}\n isDisabled={isDisabled}\n className={composeRenderProps(className, (className) =>\n cn(accordionItemVariants(), className)\n )}\n {...props}\n >\n {children}\n </Disclosure>\n );\n}\n\nAccordionItemComponent.displayName = 'AccordionItem';\n\n/**\n * AccordionTrigger Component\n *\n * Clickable button that toggles accordion content visibility.\n * Wrapped in a Heading for proper document structure.\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger Component)\n * @see accordion-prd.md AR-002 (ARIA Attributes)\n * @see accordion-prd.md AR-003 (Keyboard Navigation)\n *\n * @example\n * // Default with chevron\n * <AccordionTrigger>Is it accessible?</AccordionTrigger>\n *\n * @example\n * // Custom heading level\n * <AccordionTrigger as=\"h2\">Important Section</AccordionTrigger>\n *\n * @example\n * // Custom icon\n * <AccordionTrigger icon={<PlusIcon className=\"h-4 w-4\" />}>\n * Click to expand\n * </AccordionTrigger>\n */\nfunction AccordionTriggerComponent({\n as: headingLevel = 'h3',\n icon,\n hideIcon = false,\n className,\n children,\n ...props\n}: AccordionTriggerProps) {\n // Access disclosure state from context\n const state = useContext(DisclosureStateContext);\n const isExpanded = state?.isExpanded ?? false;\n\n return (\n <Heading level={getHeadingLevel(headingLevel)}>\n <Button\n slot=\"trigger\"\n className={composeRenderProps(className, (className) =>\n cn(accordionTriggerVariants(), className)\n )}\n {...props}\n >\n <span className=\"flex-1 text-left\">{children}</span>\n {!hideIcon && (\n icon ?? (\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(accordionChevronVariants({ isExpanded }))}\n />\n )\n )}\n </Button>\n </Heading>\n );\n}\n\nAccordionTriggerComponent.displayName = 'AccordionTrigger';\n\n/**\n * AccordionContent Component\n *\n * Expandable container for accordion content.\n * Supports animated height transitions and React Activity state preservation.\n *\n * @see accordion-prd.md FR-004 (AccordionContent Component)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n *\n * @example\n * // Standard content\n * <AccordionContent>\n * Yes. It adheres to the WAI-ARIA design pattern.\n * </AccordionContent>\n *\n * @example\n * // With state preservation\n * <AccordionContent preserveState>\n * <form>\n * <input name=\"email\" />\n * </form>\n * </AccordionContent>\n */\n/**\n * Inner component for AccordionContent with state preservation\n * Uses DisclosureStateContext to get isExpanded state\n */\nfunction AccordionContentInner({\n preserveState,\n children,\n}: {\n preserveState: boolean;\n children: ReactNode;\n}) {\n const state = useContext(DisclosureStateContext);\n const isExpanded = state?.isExpanded ?? false;\n\n if (preserveState) {\n return (\n <Activity mode={isExpanded ? 'visible' : 'hidden'}>\n <div className={accordionContentInnerVariants()}>{children}</div>\n </Activity>\n );\n }\n\n return <div className={accordionContentInnerVariants()}>{children}</div>;\n}\n\nfunction AccordionContentComponent({\n preserveState = false,\n className,\n children,\n ...props\n}: AccordionContentProps) {\n return (\n <DisclosurePanel\n className={composeRenderProps(className, (className) =>\n cn(accordionContentVariants(), 'animate-accordion', className)\n )}\n {...props}\n >\n <AccordionContentInner preserveState={preserveState}>\n {children}\n </AccordionContentInner>\n </DisclosurePanel>\n );\n}\n\nAccordionContentComponent.displayName = 'AccordionContent';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\n/**\n * Direct named exports (not Object.assign compound pattern)\n *\n * Accordion follows React Aria's direct export pattern because:\n * - Simpler structure (only 4 components)\n * - Better tree-shaking with named exports\n * - Clearer imports: import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from '...'\n */\nexport const Accordion = AccordionRoot;\nexport const AccordionItem = AccordionItemComponent;\nexport const AccordionTrigger = AccordionTriggerComponent;\nexport const AccordionContent = AccordionContentComponent;\n\n// Re-export types for convenience\nexport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n};\n","import { z } from 'zod';\n\n/**\n * Base props schema for all Themis components\n * Ensures consistent accessibility and styling APIs across the library\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements)\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\nexport const BaseComponentPropsSchema = z.object({\n // Styling\n className: z.string().optional(),\n\n // React\n children: z.any().optional(), // ReactNode not directly supported by Zod\n id: z.string().optional(),\n\n // Accessibility (WCAG 2.2 AA requirements)\n 'aria-label': z.string().optional(),\n 'aria-labelledby': z.string().optional(),\n 'aria-describedby': z.string().optional(),\n 'aria-live': z.enum(['off', 'polite', 'assertive']).optional(),\n 'aria-hidden': z.boolean().optional(),\n\n // Testing & Development\n 'data-testid': z.string().optional(),\n});\n\nexport type BaseComponentProps = z.infer<typeof BaseComponentPropsSchema>;\n","import { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\nimport type { ReactNode, Key } from 'react';\n\n/**\n * Accordion Type Schema\n * Defines expansion mode: single (one item at a time) or multiple (any number)\n *\n * @see accordion-prd.md FR-005, FR-006 (Expansion Modes)\n */\nexport const AccordionTypeSchema = z.enum(['single', 'multiple']);\nexport type AccordionType = z.infer<typeof AccordionTypeSchema>;\n\n/**\n * Heading Level Schema\n * Configurable heading level for document structure (h1-h6)\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger with as prop)\n */\nexport const HeadingLevelSchema = z.enum(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']);\nexport type HeadingLevel = z.infer<typeof HeadingLevelSchema>;\n\n/**\n * Key Schema for item identification\n * Supports both string and number keys per React Aria convention\n */\nexport const KeySchema = z.union([z.string(), z.number()]);\n\n/**\n * Accordion root component props schema\n *\n * @see accordion-prd.md FR-001 (Accordion Root Component)\n * @see accordion-prd.md FR-007 (Controlled Mode)\n * @see accordion-prd.md FR-008 (Uncontrolled Mode)\n */\nexport const AccordionPropsSchema = BaseComponentPropsSchema.extend({\n // Expansion mode: 'single' (one at a time) or 'multiple' (any number)\n type: AccordionTypeSchema.optional().default('single'),\n\n // Allow all items to be collapsed (only applies to type=\"single\")\n // When false, one item must always be expanded\n collapsible: z.boolean().optional().default(false),\n\n // Controlled mode: currently expanded keys\n expandedKeys: z.custom<Set<Key>>().optional(),\n\n // Uncontrolled mode: initial expanded keys\n defaultExpandedKeys: z.array(KeySchema).optional(),\n\n // Expansion change handler\n onExpandedChange: z.custom<(keys: Set<Key>) => void>().optional(),\n\n // Disable all items\n isDisabled: z.boolean().optional().default(false),\n\n // Keys of items to disable individually\n disabledKeys: z.array(KeySchema).optional(),\n\n // Children: AccordionItem components\n children: z.custom<ReactNode>(),\n});\n\nexport interface AccordionProps {\n className?: string;\n children?: ReactNode;\n id?: string;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n 'aria-describedby'?: string;\n 'aria-live'?: 'off' | 'polite' | 'assertive';\n 'aria-hidden'?: boolean;\n 'data-testid'?: string;\n type?: AccordionType;\n collapsible?: boolean;\n expandedKeys?: Set<Key>;\n defaultExpandedKeys?: (string | number)[];\n onExpandedChange?: (keys: Set<Key>) => void;\n isDisabled?: boolean;\n disabledKeys?: (string | number)[];\n}\n\n/**\n * AccordionItem component props schema\n *\n * @see accordion-prd.md FR-002 (AccordionItem Component)\n */\nexport const AccordionItemPropsSchema = BaseComponentPropsSchema.extend({\n // Unique identifier (required)\n id: KeySchema,\n\n // Disable this specific item\n isDisabled: z.boolean().optional(),\n\n // Children: AccordionTrigger + AccordionContent\n children: z.custom<ReactNode>(),\n});\n\nexport interface AccordionItemProps {\n className?: string;\n children?: ReactNode;\n id: string | number;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n 'data-testid'?: string;\n isDisabled?: boolean;\n}\n\n/**\n * AccordionTrigger component props schema\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger Component)\n */\nexport const AccordionTriggerPropsSchema = BaseComponentPropsSchema.extend({\n // Heading level for proper document structure (default: h3)\n as: HeadingLevelSchema.optional().default('h3'),\n\n // Custom icon to replace default chevron\n icon: z.custom<ReactNode>().optional(),\n\n // Hide the expand/collapse icon entirely\n hideIcon: z.boolean().optional().default(false),\n\n // Trigger content (text, icons, custom content)\n children: z.custom<ReactNode>(),\n});\n\nexport interface AccordionTriggerProps {\n className?: string;\n children?: ReactNode;\n id?: string;\n 'aria-label'?: string;\n 'data-testid'?: string;\n as?: HeadingLevel;\n icon?: ReactNode;\n hideIcon?: boolean;\n}\n\n/**\n * AccordionContent component props schema\n *\n * @see accordion-prd.md FR-004 (AccordionContent Component)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const AccordionContentPropsSchema = BaseComponentPropsSchema.extend({\n // Preserve component state when collapsed using React Activity API\n // When true, wraps content in <Activity> component\n // Effects are cleaned up when hidden, restored when visible\n preserveState: z.boolean().optional().default(false),\n\n // Panel content\n children: z.custom<ReactNode>(),\n});\n\nexport interface AccordionContentProps {\n className?: string;\n children?: ReactNode;\n id?: string;\n 'data-testid'?: string;\n preserveState?: boolean;\n}\n"]}
@@ -63,10 +63,27 @@ export declare const AlertDialogPropsSchema: z.ZodObject<{
63
63
  }>>>;
64
64
  onAction: z.ZodOptional<z.ZodCustom<() => void, () => void>>;
65
65
  }, z.core.$strip>;
66
- export type AlertDialogProps = z.infer<typeof AlertDialogPropsSchema> & {
66
+ export interface AlertDialogProps {
67
+ className?: string;
68
+ id?: string;
69
+ 'aria-label'?: string;
70
+ 'aria-labelledby'?: string;
71
+ 'aria-describedby'?: string;
72
+ 'data-testid'?: string;
67
73
  trigger: ReactNode;
74
+ isOpen?: boolean;
75
+ defaultOpen?: boolean;
76
+ onOpenChange?: (isOpen: boolean) => void;
77
+ title: string;
78
+ description?: string;
68
79
  children?: ReactNode;
80
+ variant?: AlertDialogVariant;
81
+ size?: AlertDialogSize;
82
+ cancelLabel?: string;
69
83
  cancelIcon?: ReactNode;
84
+ actionLabel: string;
70
85
  actionIcon?: ReactNode;
71
- };
86
+ actionVariant?: 'default' | 'destructive';
87
+ onAction?: () => void;
88
+ }
72
89
  //# sourceMappingURL=AlertDialog.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AlertDialog.types.d.ts","sourceRoot":"","sources":["../../../src/elements/AlertDialog/AlertDialog.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;EAAqC,CAAC;AAC3E,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;EAA6B,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;qDAWD,OAAO,KAAK,IAAI,WAAhB,OAAO,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;8CAiCvB,IAAI,QAAJ,IAAI;iBAC7B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,GAAG;IACtE,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB,CAAC"}
1
+ {"version":3,"file":"AlertDialog.types.d.ts","sourceRoot":"","sources":["../../../src/elements/AlertDialog/AlertDialog.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;EAAqC,CAAC;AAC3E,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;EAA6B,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;qDAWD,OAAO,KAAK,IAAI,WAAhB,OAAO,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;8CAiCvB,IAAI,QAAJ,IAAI;iBAC7B,CAAC;AAEH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,aAAa,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB"}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- 'use strict';var react=require('react'),reactAriaComponents=require('react-aria-components'),lucideReact=require('lucide-react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),classVarianceAuthority=require('class-variance-authority'),jsxRuntime=require('react/jsx-runtime'),zod=require('zod');function m(...t){return tailwindMerge.twMerge(clsx.clsx(t))}var K=["data-[entering]:animate-in","data-[entering]:fade-in-0","data-[entering]:zoom-in-95","data-[entering]:duration-200","data-[entering]:ease-out"],Q=["data-[exiting]:animate-out","data-[exiting]:fade-out-0","data-[exiting]:zoom-out-95","data-[exiting]:duration-150","data-[exiting]:ease-in"],J=["data-[entering]:animate-in","data-[entering]:fade-in-0","data-[entering]:slide-in-from-bottom-4","data-[entering]:duration-200","data-[entering]:ease-out"],tt=["data-[exiting]:animate-out","data-[exiting]:fade-out-0","data-[exiting]:slide-out-to-bottom-4","data-[exiting]:duration-150","data-[exiting]:ease-in"],D=["data-[entering]:animate-in","data-[entering]:fade-in-0","data-[entering]:duration-200"],T=["data-[exiting]:animate-out","data-[exiting]:fade-out-0","data-[exiting]:duration-150"],G=["motion-reduce:transition-none","motion-reduce:animate-none"];var ot=classVarianceAuthority.cva(["relative","bg-[var(--content-background)]","text-[var(--content-foreground)]","rounded-lg","shadow-lg","p-6","w-full","outline-none","mx-4","sm:mx-0",...G],{variants:{size:{sm:"max-w-sm",md:"max-w-md",lg:"max-w-lg",xl:"max-w-2xl",full:"max-w-full min-h-screen rounded-none"},animation:{"fade-zoom":[...K,...Q],fade:["data-[entering]:animate-in","data-[entering]:fade-in-0","data-[entering]:duration-200","data-[entering]:ease-out","data-[exiting]:animate-out","data-[exiting]:fade-out-0","data-[exiting]:duration-150","data-[exiting]:ease-in"],slide:[...J,...tt],none:""}},defaultVariants:{size:"md",animation:"fade-zoom"}}),at=classVarianceAuthority.cva(["fixed","inset-0","z-50","flex","items-center","justify-center","bg-black/50","backdrop-blur-sm",...G],{variants:{animation:{"fade-zoom":[...D,...T],fade:[...D,...T],slide:[...D,...T],none:""}},defaultVariants:{animation:"fade-zoom"}});var rt=react.createContext(void 0);function it({children:t,defaultOpen:o,isOpen:n,onOpenChange:s,role:l="dialog"}){let i=react.Children.toArray(t);if(process.env.NODE_ENV!=="production"){let e=i.some(r=>react.isValidElement(r)&&(r.type===h||r.type.displayName==="ModalTrigger")),u=i.some(r=>react.isValidElement(r)&&(r.type===N||r.type.displayName==="ModalContent"));if(!e||!u)throw new Error("Modal requires exactly one Modal.Trigger and one Modal.Content as children")}let p=i.find(e=>react.isValidElement(e)&&(e.type===h||e.type.displayName==="ModalTrigger")),v=i.find(e=>react.isValidElement(e)&&(e.type===N||e.type.displayName==="ModalContent")),f=p,g=react.isValidElement(f)?f.props.children:null,x=v;return jsxRuntime.jsx(rt.Provider,{value:{role:l},children:jsxRuntime.jsxs(reactAriaComponents.DialogTrigger,{defaultOpen:o,isOpen:n,onOpenChange:s,children:[g,x]})})}it.displayName="Modal";function h({children:t}){return t}h.displayName="ModalTrigger";function N({children:t,size:o="md",animation:n="fade-zoom",animationDuration:s=200,isDismissable:l=true,isKeyboardDismissDisabled:i=false,showClose:p=true,className:v}){let g=react.useContext(rt)?.role??"dialog",x=at({animation:n}),e=ot({size:o,animation:n}),u=m(e,v);return jsxRuntime.jsx(reactAriaComponents.ModalOverlay,{isDismissable:l,isKeyboardDismissDisabled:i,className:x,children:jsxRuntime.jsx(reactAriaComponents.Modal,{className:u,style:{transitionDuration:`${s}ms`},children:jsxRuntime.jsx(reactAriaComponents.Dialog,{role:g,className:"outline-none",children:({close:r})=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[p&&jsxRuntime.jsx(reactAriaComponents.Button,{onPress:r,className:"absolute right-0 top-0 flex items-center justify-center rounded-sm opacity-70 ring-offset-[var(--content-background)] transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-[var(--ring)] focus:ring-offset-2 disabled:pointer-events-none min-h-[44px] min-w-[44px]","aria-label":"Close modal",children:jsxRuntime.jsx(lucideReact.X,{className:"h-4 w-4","aria-hidden":"true"})}),t]})})})})}N.displayName="ModalContent";function st(t){return null}st.displayName="ModalOverlay";function _({children:t,className:o}){return jsxRuntime.jsx("div",{className:m("flex flex-col space-y-1.5 text-center sm:text-left",o),children:t})}_.displayName="ModalHeader";function I({children:t,as:o="h2",className:n}){return jsxRuntime.jsx(reactAriaComponents.Heading,{slot:"title",level:parseInt(o[1]??"2"),className:m("text-lg font-semibold leading-none tracking-tight",n),children:t})}I.displayName="ModalTitle";function V({children:t,className:o}){return jsxRuntime.jsx("p",{slot:"description",className:m("text-sm text-[var(--menu-muted)]",o),children:t})}V.displayName="ModalDescription";function R({children:t,className:o}){return jsxRuntime.jsx("div",{className:m("flex flex-col-reverse sm:flex-row sm:justify-end gap-2",o),children:t})}R.displayName="ModalFooter";function O({children:t}){let o=react.useContext(reactAriaComponents.OverlayTriggerStateContext);if(!o)throw new Error("Modal.Close must be used inside Modal.Content");if(!react.isValidElement(t))throw new Error("Modal.Close requires a valid React element as a child");let n=t,s=()=>{o.close();},l=n.props?.onPress;return react.cloneElement(n,{onPress:l?()=>{l(),s();}:s})}O.displayName="ModalClose";var lt=Object.assign(it,{Trigger:h,Content:N,Overlay:st,Header:_,Title:I,Description:V,Footer:R,Close:O});var pt=classVarianceAuthority.cva("inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50",{variants:{fullWidth:{true:"w-full",false:""},inVerticalGroup:{true:"items-stretch",false:"items-center"}},defaultVariants:{fullWidth:false,inVerticalGroup:false}}),ut=classVarianceAuthority.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer",{variants:{variant:{default:"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] data-[pressed]:bg-[var(--primary-action)]/80",destructive:"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] shadow-md hover:bg-[var(--destructive-background)]/90 data-[pressed]:bg-[var(--destructive-background)]/80",outline:"border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)] data-[pressed]:bg-[var(--input-border)]",secondary:"bg-[var(--secondary)] text-[var(--secondary-foreground)] shadow-md hover:bg-[var(--secondary)]/80 data-[pressed]:bg-[var(--secondary)]/70",ghost:"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)] data-[pressed]:bg-[var(--accent)]",link:"text-[var(--text-link)] underline-offset-4 hover:underline data-[pressed]:text-[var(--text-link-hover)]"},fullWidth:{true:"w-full",false:""},visualSize:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3 text-xs",lg:"h-11 rounded-md px-8",icon:"h-10 w-10",dot:"h-5 w-5 rounded-full p-0 min-h-0 min-w-0"},paywall:{true:"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] !shadow-md hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent",false:""}},defaultVariants:{variant:"default",visualSize:"default",paywall:false}});var H="data-[pressed]:scale-[0.97]";var k="data-[hovered]:shadow-md";var P="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",w="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground";var xt=react.createContext(null);xt.displayName="ButtonGroupContext";function vt(){return react.useContext(xt)}var bt=react.createContext(null);bt.displayName="ButtonGroupItemContext";function yt(){return react.useContext(bt)}classVarianceAuthority.cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}});var ht=classVarianceAuthority.cva("",{variants:{orientation:{horizontal:"min-w-[44px]",vertical:"flex min-h-[44px]"},position:{first:"",middle:"",last:"",only:""}},compoundVariants:[{orientation:"horizontal",position:"first",className:"rounded-r-none border-r-0"},{orientation:"horizontal",position:"middle",className:"rounded-none border-r-0"},{orientation:"horizontal",position:"last",className:"rounded-l-none"},{orientation:"vertical",position:"first",className:"rounded-b-none border-b-0"},{orientation:"vertical",position:"middle",className:"rounded-none border-b-0"},{orientation:"vertical",position:"last",className:"rounded-t-none"}],defaultVariants:{orientation:"horizontal",position:"only"}});classVarianceAuthority.cva("bg-[var(--border)]",{variants:{orientation:{horizontal:"w-px h-6 mx-1",vertical:"h-px w-full my-1"}},defaultVariants:{orientation:"horizontal"}});var B=react.memo(react.forwardRef(({className:t,buttonVisualClassName:o,variant:n,size:s,visualSize:l,fullWidth:i,loading:p=false,loadingText:v="Loading...",shortcut:f,children:g,isDisabled:x,paywall:e=false,paywallRedirect:u,paywallDescription:r,onPress:z,...E},W)=>{let j=react.useId(),M=vt(),q=yt(),Mt=n??M?.variant??"default",St=s??M?.size,Ot=x??M?.isDisabled??false,Z=M?.orientation==="vertical",X=i||Z,Dt=q?ht({orientation:M?.orientation??"horizontal",position:q.position}):"",L=l??St??"default";return process.env.NODE_ENV!=="production"&&(L==="dot"||L==="icon")&&!E["aria-label"]&&!g&&console.warn('[Button] visualSize="dot" or "icon" requires aria-label when no visible text is provided (WCAG 1.1.1)'),jsxRuntime.jsx(reactAriaComponents.Button,{ref:W,isDisabled:Ot||p||void 0,"aria-disabled":e?true:void 0,"aria-describedby":e?j:void 0,onPress:S=>{if(e){u&&window.open(u,"_blank","noopener,noreferrer");return}z?.(S);},className:m(pt({fullWidth:X,inVerticalGroup:Z}),t),...E,children:S=>jsxRuntime.jsxs("span",{className:m(ut({variant:Mt,visualSize:L,paywall:e,fullWidth:X}),Dt,o,H,k,P,w),"data-pressed":S.isPressed||void 0,children:[p&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(lucideReact.Loader2,{className:"motion-safe:animate-spin","aria-hidden":"true"}),jsxRuntime.jsx("span",{className:"sr-only","aria-live":"polite",children:v})]}),!p&&g,e&&jsxRuntime.jsx(lucideReact.Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),e&&jsxRuntime.jsxs("span",{id:j,className:"sr-only",children:["Premium feature: ",r||"Upgrade required to access this feature"]}),S.isFocusVisible&&f&&jsxRuntime.jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:f}),S.isPressed&&jsxRuntime.jsx("span",{className:"absolute inset-0 rounded-[inherit] bg-current opacity-10 motion-safe:animate-in motion-safe:zoom-in-95","aria-hidden":"true"})]})})}));B.displayName="Button";var Y=classVarianceAuthority.cva("border border-[var(--border)]",{variants:{variant:{default:"",destructive:"border-[var(--destructive-background)]"}},defaultVariants:{variant:"default"}});function Nt({trigger:t,isOpen:o,defaultOpen:n=false,onOpenChange:s,title:l,description:i,children:p,variant:v="default",size:f="md",cancelLabel:g="Cancel",cancelIcon:x,actionLabel:e,actionIcon:u,actionVariant:r="destructive",onAction:z,className:E}){return jsxRuntime.jsxs(lt,{role:"alertdialog",isOpen:o,defaultOpen:n,onOpenChange:s,children:[jsxRuntime.jsx(h,{children:t}),jsxRuntime.jsxs(N,{size:f,isDismissable:false,isKeyboardDismissDisabled:true,showClose:false,animation:"fade-zoom",animationDuration:200,className:Y({variant:v})+(E?` ${E}`:""),children:[jsxRuntime.jsxs(_,{children:[jsxRuntime.jsx(I,{as:"h2",children:l}),i&&jsxRuntime.jsx(V,{children:i})]}),p,jsxRuntime.jsxs(R,{children:[jsxRuntime.jsx(O,{children:jsxRuntime.jsxs(B,{variant:"secondary",children:[x&&jsxRuntime.jsx("span",{className:"mr-2","aria-hidden":"true",children:x}),g]})}),jsxRuntime.jsx(O,{children:jsxRuntime.jsxs(B,{variant:r,onPress:z,children:[u&&jsxRuntime.jsx("span",{className:"mr-2","aria-hidden":"true",children:u}),e]})})]})]})]})}Nt.displayName="AlertDialog";var At=zod.z.object({className:zod.z.string().optional(),children:zod.z.any().optional(),id:zod.z.string().optional(),"aria-label":zod.z.string().optional(),"aria-labelledby":zod.z.string().optional(),"aria-describedby":zod.z.string().optional(),"aria-live":zod.z.enum(["off","polite","assertive"]).optional(),"aria-hidden":zod.z.boolean().optional(),"data-testid":zod.z.string().optional()});var Ct=zod.z.enum(["default","destructive"]),Et=zod.z.enum(["sm","md","lg"]),Kt=At.extend({trigger:zod.z.custom(),isOpen:zod.z.boolean().optional(),defaultOpen:zod.z.boolean().optional().default(false),onOpenChange:zod.z.custom().optional(),title:zod.z.string(),description:zod.z.string().optional(),children:zod.z.custom().optional(),variant:Ct.optional().default("default"),size:Et.optional().default("md"),cancelLabel:zod.z.string().optional().default("Cancel"),cancelIcon:zod.z.custom().optional(),actionLabel:zod.z.string(),actionIcon:zod.z.custom().optional(),actionVariant:zod.z.enum(["default","destructive"]).optional().default("destructive"),onAction:zod.z.custom().optional()});exports.AlertDialog=Nt;exports.AlertDialogPropsSchema=Kt;exports.AlertDialogSizeSchema=Et;exports.AlertDialogVariantSchema=Ct;exports.alertDialogContentVariants=Y;//# sourceMappingURL=index.js.map
2
+ 'use strict';var react=require('react'),reactAriaComponents=require('react-aria-components'),lucideReact=require('lucide-react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),classVarianceAuthority=require('class-variance-authority'),jsxRuntime=require('react/jsx-runtime'),zod=require('zod');function m(...t){return tailwindMerge.twMerge(clsx.clsx(t))}var K=["data-[entering]:animate-in","data-[entering]:fade-in-0","data-[entering]:zoom-in-95","data-[entering]:duration-200","data-[entering]:ease-out"],Q=["data-[exiting]:animate-out","data-[exiting]:fade-out-0","data-[exiting]:zoom-out-95","data-[exiting]:duration-150","data-[exiting]:ease-in"],J=["data-[entering]:animate-in","data-[entering]:fade-in-0","data-[entering]:slide-in-from-bottom-4","data-[entering]:duration-200","data-[entering]:ease-out"],tt=["data-[exiting]:animate-out","data-[exiting]:fade-out-0","data-[exiting]:slide-out-to-bottom-4","data-[exiting]:duration-150","data-[exiting]:ease-in"],D=["data-[entering]:animate-in","data-[entering]:fade-in-0","data-[entering]:duration-200"],T=["data-[exiting]:animate-out","data-[exiting]:fade-out-0","data-[exiting]:duration-150"],G=["motion-reduce:transition-none","motion-reduce:animate-none"];var ot=classVarianceAuthority.cva(["relative","bg-[var(--content-background)]","text-[var(--content-foreground)]","rounded-lg","shadow-lg","p-6","w-full","outline-none","mx-4","sm:mx-0",...G],{variants:{size:{sm:"max-w-sm",md:"max-w-md",lg:"max-w-lg",xl:"max-w-2xl",full:"max-w-full min-h-screen rounded-none"},animation:{"fade-zoom":[...K,...Q],fade:["data-[entering]:animate-in","data-[entering]:fade-in-0","data-[entering]:duration-200","data-[entering]:ease-out","data-[exiting]:animate-out","data-[exiting]:fade-out-0","data-[exiting]:duration-150","data-[exiting]:ease-in"],slide:[...J,...tt],none:""}},defaultVariants:{size:"md",animation:"fade-zoom"}}),at=classVarianceAuthority.cva(["fixed","inset-0","z-50","flex","items-center","justify-center","bg-black/50","backdrop-blur-sm",...G],{variants:{animation:{"fade-zoom":[...D,...T],fade:[...D,...T],slide:[...D,...T],none:""}},defaultVariants:{animation:"fade-zoom"}});var rt=react.createContext(void 0);function it({children:t,defaultOpen:o,isOpen:n,onOpenChange:s,role:l="dialog"}){let i=react.Children.toArray(t);if(process.env.NODE_ENV!=="production"){let e=i.some(r=>react.isValidElement(r)&&(r.type===h||r.type.displayName==="ModalTrigger")),u=i.some(r=>react.isValidElement(r)&&(r.type===N||r.type.displayName==="ModalContent"));if(!e||!u)throw new Error("Modal requires exactly one Modal.Trigger and one Modal.Content as children")}let p=i.find(e=>react.isValidElement(e)&&(e.type===h||e.type.displayName==="ModalTrigger")),v=i.find(e=>react.isValidElement(e)&&(e.type===N||e.type.displayName==="ModalContent")),f=p,g=react.isValidElement(f)?f.props.children:null,x=v;return jsxRuntime.jsx(rt.Provider,{value:{role:l},children:jsxRuntime.jsxs(reactAriaComponents.DialogTrigger,{defaultOpen:o,isOpen:n,onOpenChange:s,children:[g,x]})})}it.displayName="Modal";function h({children:t}){return t}h.displayName="ModalTrigger";function N({children:t,size:o="md",animation:n="fade-zoom",animationDuration:s=200,isDismissable:l=true,isKeyboardDismissDisabled:i=false,showClose:p=true,className:v}){let g=react.useContext(rt)?.role??"dialog",x=at({animation:n}),e=ot({size:o,animation:n}),u=m(e,v);return jsxRuntime.jsx(reactAriaComponents.ModalOverlay,{isDismissable:l,isKeyboardDismissDisabled:i,className:x,children:jsxRuntime.jsx(reactAriaComponents.Modal,{className:u,style:{transitionDuration:`${s}ms`},children:jsxRuntime.jsx(reactAriaComponents.Dialog,{role:g,className:"outline-none",children:({close:r})=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[p&&jsxRuntime.jsx(reactAriaComponents.Button,{onPress:r,className:"absolute right-0 top-0 flex items-center justify-center rounded-sm opacity-70 ring-offset-[var(--content-background)] transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-[var(--ring)] focus:ring-offset-2 disabled:pointer-events-none min-h-[44px] min-w-[44px]","aria-label":"Close modal",children:jsxRuntime.jsx(lucideReact.X,{className:"h-4 w-4","aria-hidden":"true"})}),t]})})})})}N.displayName="ModalContent";function st(t){return null}st.displayName="ModalOverlay";function _({children:t,className:o}){return jsxRuntime.jsx("div",{className:m("flex flex-col space-y-1.5 text-center sm:text-left",o),children:t})}_.displayName="ModalHeader";function I({children:t,as:o="h2",className:n}){return jsxRuntime.jsx(reactAriaComponents.Heading,{slot:"title",level:parseInt(o[1]??"2"),className:m("text-lg font-semibold leading-none tracking-tight",n),children:t})}I.displayName="ModalTitle";function V({children:t,className:o}){return jsxRuntime.jsx("p",{slot:"description",className:m("text-sm text-[var(--menu-muted)]",o),children:t})}V.displayName="ModalDescription";function R({children:t,className:o}){return jsxRuntime.jsx("div",{className:m("flex flex-col-reverse sm:flex-row sm:justify-end gap-2",o),children:t})}R.displayName="ModalFooter";function O({children:t}){let o=react.useContext(reactAriaComponents.OverlayTriggerStateContext);if(!o)throw new Error("Modal.Close must be used inside Modal.Content");if(!react.isValidElement(t))throw new Error("Modal.Close requires a valid React element as a child");let n=t,s=()=>{o.close();},l=n.props?.onPress;return react.cloneElement(n,{onPress:l?()=>{l(),s();}:s})}O.displayName="ModalClose";var lt=Object.assign(it,{Trigger:h,Content:N,Overlay:st,Header:_,Title:I,Description:V,Footer:R,Close:O});var pt=classVarianceAuthority.cva("inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50",{variants:{fullWidth:{true:"w-full",false:""},inVerticalGroup:{true:"items-stretch",false:"items-center"}},defaultVariants:{fullWidth:false,inVerticalGroup:false}}),ut=classVarianceAuthority.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer",{variants:{variant:{default:"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] data-[pressed]:bg-[var(--primary-action)]/80",destructive:"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] shadow-md hover:bg-[var(--destructive-background)]/90 data-[pressed]:bg-[var(--destructive-background)]/80",outline:"border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)] data-[pressed]:bg-[var(--input-border)]",secondary:"bg-[var(--secondary)] text-[var(--secondary-foreground)] shadow-md hover:bg-[var(--secondary)]/80 data-[pressed]:bg-[var(--secondary)]/70",ghost:"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)] data-[pressed]:bg-[var(--accent)]",link:"text-[var(--text-link)] underline-offset-4 hover:underline data-[pressed]:text-[var(--text-link-hover)]"},fullWidth:{true:"w-full",false:""},visualSize:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3 text-xs",lg:"h-11 rounded-md px-8",icon:"h-10 w-10",dot:"h-5 w-5 rounded-full p-0 min-h-0 min-w-0"},paywall:{true:"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] !shadow-md hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent",false:""}},defaultVariants:{variant:"default",visualSize:"default",paywall:false}});var H="data-[pressed]:scale-[0.97]";var k="data-[hovered]:shadow-md";var P="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",w="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground";var xt=react.createContext(null);xt.displayName="ButtonGroupContext";function vt(){return react.useContext(xt)}var bt=react.createContext(null);bt.displayName="ButtonGroupItemContext";function yt(){return react.useContext(bt)}classVarianceAuthority.cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}});var ht=classVarianceAuthority.cva("",{variants:{orientation:{horizontal:"min-w-[44px]",vertical:"flex min-h-[44px]"},position:{first:"",middle:"",last:"",only:""}},compoundVariants:[{orientation:"horizontal",position:"first",className:"rounded-r-none border-r-0"},{orientation:"horizontal",position:"middle",className:"rounded-none border-r-0"},{orientation:"horizontal",position:"last",className:"rounded-l-none"},{orientation:"vertical",position:"first",className:"rounded-b-none border-b-0"},{orientation:"vertical",position:"middle",className:"rounded-none border-b-0"},{orientation:"vertical",position:"last",className:"rounded-t-none"}],defaultVariants:{orientation:"horizontal",position:"only"}});classVarianceAuthority.cva("bg-[var(--border)]",{variants:{orientation:{horizontal:"w-px h-6 mx-1",vertical:"h-px w-full my-1"}},defaultVariants:{orientation:"horizontal"}});var B=react.memo(react.forwardRef(({className:t,buttonVisualClassName:o,variant:n,size:s,visualSize:l,fullWidth:i,loading:p=false,loadingText:v="Loading...",shortcut:f,children:g,isDisabled:x,paywall:e=false,paywallRedirect:u,paywallDescription:r,onPress:L,...E},W)=>{let j=react.useId(),M=vt(),q=yt(),Mt=n??M?.variant??"default",St=s??M?.size,Ot=x??M?.isDisabled??false,Z=M?.orientation==="vertical",X=i||Z,Dt=q?ht({orientation:M?.orientation??"horizontal",position:q.position}):"",z=l??St??"default";return process.env.NODE_ENV!=="production"&&(z==="dot"||z==="icon")&&!E["aria-label"]&&!g&&console.warn('[Button] visualSize="dot" or "icon" requires aria-label when no visible text is provided (WCAG 1.1.1)'),jsxRuntime.jsx(reactAriaComponents.Button,{ref:W,isDisabled:Ot||p||void 0,"aria-disabled":e?true:void 0,"aria-describedby":e?j:void 0,onPress:S=>{if(e){u&&window.open(u,"_blank","noopener,noreferrer");return}L?.(S);},className:m(pt({fullWidth:X,inVerticalGroup:Z}),t),...E,children:S=>jsxRuntime.jsxs("span",{className:m(ut({variant:Mt,visualSize:z,paywall:e,fullWidth:X}),Dt,o,H,k,P,w),"data-pressed":S.isPressed||void 0,children:[p&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(lucideReact.Loader2,{className:"motion-safe:animate-spin","aria-hidden":"true"}),jsxRuntime.jsx("span",{className:"sr-only","aria-live":"polite",children:v})]}),!p&&g,e&&jsxRuntime.jsx(lucideReact.Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),e&&jsxRuntime.jsxs("span",{id:j,className:"sr-only",children:["Premium feature: ",r||"Upgrade required to access this feature"]}),S.isFocusVisible&&f&&jsxRuntime.jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:f}),S.isPressed&&jsxRuntime.jsx("span",{className:"absolute inset-0 rounded-[inherit] bg-current opacity-10 motion-safe:animate-in motion-safe:zoom-in-95","aria-hidden":"true"})]})})}));B.displayName="Button";var Y=classVarianceAuthority.cva("border border-[var(--border)]",{variants:{variant:{default:"",destructive:"border-[var(--destructive-background)]"}},defaultVariants:{variant:"default"}});function Nt({trigger:t,isOpen:o,defaultOpen:n=false,onOpenChange:s,title:l,description:i,children:p,variant:v="default",size:f="md",cancelLabel:g="Cancel",cancelIcon:x,actionLabel:e,actionIcon:u,actionVariant:r="destructive",onAction:L,className:E}){return jsxRuntime.jsxs(lt,{role:"alertdialog",isOpen:o,defaultOpen:n,onOpenChange:s,children:[jsxRuntime.jsx(h,{children:t}),jsxRuntime.jsxs(N,{size:f,isDismissable:false,isKeyboardDismissDisabled:true,showClose:false,animation:"fade-zoom",animationDuration:200,className:Y({variant:v})+(E?` ${E}`:""),children:[jsxRuntime.jsxs(_,{children:[jsxRuntime.jsx(I,{as:"h2",children:l}),i&&jsxRuntime.jsx(V,{children:i})]}),p,jsxRuntime.jsxs(R,{children:[jsxRuntime.jsx(O,{children:jsxRuntime.jsxs(B,{variant:"secondary",children:[x&&jsxRuntime.jsx("span",{className:"mr-2","aria-hidden":"true",children:x}),g]})}),jsxRuntime.jsx(O,{children:jsxRuntime.jsxs(B,{variant:r,onPress:L,children:[u&&jsxRuntime.jsx("span",{className:"mr-2","aria-hidden":"true",children:u}),e]})})]})]})]})}Nt.displayName="AlertDialog";var At=zod.z.object({className:zod.z.string().optional(),children:zod.z.any().optional(),id:zod.z.string().optional(),"aria-label":zod.z.string().optional(),"aria-labelledby":zod.z.string().optional(),"aria-describedby":zod.z.string().optional(),"aria-live":zod.z.enum(["off","polite","assertive"]).optional(),"aria-hidden":zod.z.boolean().optional(),"data-testid":zod.z.string().optional()});var Ct=zod.z.enum(["default","destructive"]),Et=zod.z.enum(["sm","md","lg"]),Kt=At.extend({trigger:zod.z.custom(),isOpen:zod.z.boolean().optional(),defaultOpen:zod.z.boolean().optional().default(false),onOpenChange:zod.z.custom().optional(),title:zod.z.string(),description:zod.z.string().optional(),children:zod.z.custom().optional(),variant:Ct.optional().default("default"),size:Et.optional().default("md"),cancelLabel:zod.z.string().optional().default("Cancel"),cancelIcon:zod.z.custom().optional(),actionLabel:zod.z.string(),actionIcon:zod.z.custom().optional(),actionVariant:zod.z.enum(["default","destructive"]).optional().default("destructive"),onAction:zod.z.custom().optional()});exports.AlertDialog=Nt;exports.AlertDialogPropsSchema=Kt;exports.AlertDialogSizeSchema=Et;exports.AlertDialogVariantSchema=Ct;exports.alertDialogContentVariants=Y;//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map