@allxsmith/bestax-bulma 5.56.0 → 5.57.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. package/README.md +2 -2
  2. package/dist/esm/columns/Column.js +1 -0
  3. package/dist/esm/columns/Column.js.map +1 -1
  4. package/dist/esm/columns/Columns.js +1 -0
  5. package/dist/esm/columns/Columns.js.map +1 -1
  6. package/dist/esm/components/Avatar.js +1 -0
  7. package/dist/esm/components/Avatar.js.map +1 -1
  8. package/dist/esm/components/Avatars.js +1 -0
  9. package/dist/esm/components/Avatars.js.map +1 -1
  10. package/dist/esm/components/Badge.js +1 -0
  11. package/dist/esm/components/Badge.js.map +1 -1
  12. package/dist/esm/components/Breadcrumb.js +1 -0
  13. package/dist/esm/components/Breadcrumb.js.map +1 -1
  14. package/dist/esm/components/Card.js +1 -0
  15. package/dist/esm/components/Card.js.map +1 -1
  16. package/dist/esm/components/Carousel.js +1 -0
  17. package/dist/esm/components/Carousel.js.map +1 -1
  18. package/dist/esm/components/Collapse.js +1 -0
  19. package/dist/esm/components/Collapse.js.map +1 -1
  20. package/dist/esm/components/Collapses.js +1 -0
  21. package/dist/esm/components/Collapses.js.map +1 -1
  22. package/dist/esm/components/Command.js +1 -0
  23. package/dist/esm/components/Command.js.map +1 -1
  24. package/dist/esm/components/ContextMenu.js +1 -0
  25. package/dist/esm/components/ContextMenu.js.map +1 -1
  26. package/dist/esm/components/DataTable.js +1 -0
  27. package/dist/esm/components/DataTable.js.map +1 -1
  28. package/dist/esm/components/Dialog.js +1 -0
  29. package/dist/esm/components/Dialog.js.map +1 -1
  30. package/dist/esm/components/Dropdown.js +5 -1
  31. package/dist/esm/components/Dropdown.js.map +1 -1
  32. package/dist/esm/components/EmptyState.js +1 -0
  33. package/dist/esm/components/EmptyState.js.map +1 -1
  34. package/dist/esm/components/HoverCard.js +1 -0
  35. package/dist/esm/components/HoverCard.js.map +1 -1
  36. package/dist/esm/components/Loading.js +1 -0
  37. package/dist/esm/components/Loading.js.map +1 -1
  38. package/dist/esm/components/Menu.js +1 -0
  39. package/dist/esm/components/Menu.js.map +1 -1
  40. package/dist/esm/components/Message.js +1 -0
  41. package/dist/esm/components/Message.js.map +1 -1
  42. package/dist/esm/components/Modal.js +1 -0
  43. package/dist/esm/components/Modal.js.map +1 -1
  44. package/dist/esm/components/Navbar.js +1 -0
  45. package/dist/esm/components/Navbar.js.map +1 -1
  46. package/dist/esm/components/Pagination.js +1 -0
  47. package/dist/esm/components/Pagination.js.map +1 -1
  48. package/dist/esm/components/Panel.js +1 -0
  49. package/dist/esm/components/Panel.js.map +1 -1
  50. package/dist/esm/components/Popover.js +1 -0
  51. package/dist/esm/components/Popover.js.map +1 -1
  52. package/dist/esm/components/Reveal.js +1 -0
  53. package/dist/esm/components/Reveal.js.map +1 -1
  54. package/dist/esm/components/ScrollArea.js +1 -0
  55. package/dist/esm/components/ScrollArea.js.map +1 -1
  56. package/dist/esm/components/SegmentedControl.js +1 -0
  57. package/dist/esm/components/SegmentedControl.js.map +1 -1
  58. package/dist/esm/components/Sidebar.js +1 -0
  59. package/dist/esm/components/Sidebar.js.map +1 -1
  60. package/dist/esm/components/Steps.js +1 -0
  61. package/dist/esm/components/Steps.js.map +1 -1
  62. package/dist/esm/components/Tabs.js +1 -0
  63. package/dist/esm/components/Tabs.js.map +1 -1
  64. package/dist/esm/components/Timeline.js +1 -0
  65. package/dist/esm/components/Timeline.js.map +1 -1
  66. package/dist/esm/components/Toast.js +1 -0
  67. package/dist/esm/components/Toast.js.map +1 -1
  68. package/dist/esm/components/Tooltip.js +1 -0
  69. package/dist/esm/components/Tooltip.js.map +1 -1
  70. package/dist/esm/components/TreeView.js +1 -0
  71. package/dist/esm/components/TreeView.js.map +1 -1
  72. package/dist/esm/components/collapsesContext.js +1 -0
  73. package/dist/esm/components/collapsesContext.js.map +1 -1
  74. package/dist/esm/components/useDataTable.js +1 -0
  75. package/dist/esm/components/useDataTable.js.map +1 -1
  76. package/dist/esm/elements/Block.js +1 -0
  77. package/dist/esm/elements/Block.js.map +1 -1
  78. package/dist/esm/elements/Box.js +1 -0
  79. package/dist/esm/elements/Box.js.map +1 -1
  80. package/dist/esm/elements/Button.js +1 -0
  81. package/dist/esm/elements/Button.js.map +1 -1
  82. package/dist/esm/elements/Buttons.js +1 -0
  83. package/dist/esm/elements/Buttons.js.map +1 -1
  84. package/dist/esm/elements/Code.js +1 -0
  85. package/dist/esm/elements/Code.js.map +1 -1
  86. package/dist/esm/elements/ColorSwatch.js +1 -0
  87. package/dist/esm/elements/ColorSwatch.js.map +1 -1
  88. package/dist/esm/elements/Content.js +1 -0
  89. package/dist/esm/elements/Content.js.map +1 -1
  90. package/dist/esm/elements/Delete.js +1 -0
  91. package/dist/esm/elements/Delete.js.map +1 -1
  92. package/dist/esm/elements/DescriptionList.js +1 -0
  93. package/dist/esm/elements/DescriptionList.js.map +1 -1
  94. package/dist/esm/elements/Divider.js +1 -0
  95. package/dist/esm/elements/Divider.js.map +1 -1
  96. package/dist/esm/elements/Emphasis.js +1 -0
  97. package/dist/esm/elements/Emphasis.js.map +1 -1
  98. package/dist/esm/elements/Figure.js +1 -0
  99. package/dist/esm/elements/Figure.js.map +1 -1
  100. package/dist/esm/elements/Icon.js +1 -0
  101. package/dist/esm/elements/Icon.js.map +1 -1
  102. package/dist/esm/elements/IconText.js +1 -0
  103. package/dist/esm/elements/IconText.js.map +1 -1
  104. package/dist/esm/elements/Image.js +1 -0
  105. package/dist/esm/elements/Image.js.map +1 -1
  106. package/dist/esm/elements/Kbd.js +1 -0
  107. package/dist/esm/elements/Kbd.js.map +1 -1
  108. package/dist/esm/elements/Link.js +1 -0
  109. package/dist/esm/elements/Link.js.map +1 -1
  110. package/dist/esm/elements/LinkButton.js +1 -0
  111. package/dist/esm/elements/LinkButton.js.map +1 -1
  112. package/dist/esm/elements/ListItem.js +1 -0
  113. package/dist/esm/elements/ListItem.js.map +1 -1
  114. package/dist/esm/elements/Loader.js +1 -0
  115. package/dist/esm/elements/Loader.js.map +1 -1
  116. package/dist/esm/elements/Notification.js +1 -0
  117. package/dist/esm/elements/Notification.js.map +1 -1
  118. package/dist/esm/elements/OrderedList.js +1 -0
  119. package/dist/esm/elements/OrderedList.js.map +1 -1
  120. package/dist/esm/elements/Paragraph.js +1 -0
  121. package/dist/esm/elements/Paragraph.js.map +1 -1
  122. package/dist/esm/elements/Pre.js +1 -0
  123. package/dist/esm/elements/Pre.js.map +1 -1
  124. package/dist/esm/elements/Progress.js +1 -0
  125. package/dist/esm/elements/Progress.js.map +1 -1
  126. package/dist/esm/elements/RingProgress.js +1 -0
  127. package/dist/esm/elements/RingProgress.js.map +1 -1
  128. package/dist/esm/elements/Skeleton.js +1 -0
  129. package/dist/esm/elements/Skeleton.js.map +1 -1
  130. package/dist/esm/elements/Span.js +1 -0
  131. package/dist/esm/elements/Span.js.map +1 -1
  132. package/dist/esm/elements/Strong.js +1 -0
  133. package/dist/esm/elements/Strong.js.map +1 -1
  134. package/dist/esm/elements/SubTitle.js +1 -0
  135. package/dist/esm/elements/SubTitle.js.map +1 -1
  136. package/dist/esm/elements/Table.js +1 -0
  137. package/dist/esm/elements/Table.js.map +1 -1
  138. package/dist/esm/elements/Tag.js +1 -0
  139. package/dist/esm/elements/Tag.js.map +1 -1
  140. package/dist/esm/elements/Tags.js +1 -0
  141. package/dist/esm/elements/Tags.js.map +1 -1
  142. package/dist/esm/elements/Tbody.js +1 -0
  143. package/dist/esm/elements/Tbody.js.map +1 -1
  144. package/dist/esm/elements/Td.js +1 -0
  145. package/dist/esm/elements/Td.js.map +1 -1
  146. package/dist/esm/elements/Tfoot.js +1 -0
  147. package/dist/esm/elements/Tfoot.js.map +1 -1
  148. package/dist/esm/elements/Th.js +1 -0
  149. package/dist/esm/elements/Th.js.map +1 -1
  150. package/dist/esm/elements/Thead.js +1 -0
  151. package/dist/esm/elements/Thead.js.map +1 -1
  152. package/dist/esm/elements/Title.js +1 -0
  153. package/dist/esm/elements/Title.js.map +1 -1
  154. package/dist/esm/elements/ToggleButton.js +1 -0
  155. package/dist/esm/elements/ToggleButton.js.map +1 -1
  156. package/dist/esm/elements/Tr.js +1 -0
  157. package/dist/esm/elements/Tr.js.map +1 -1
  158. package/dist/esm/elements/UnorderedList.js +1 -0
  159. package/dist/esm/elements/UnorderedList.js.map +1 -1
  160. package/dist/esm/elements/iconProps.js +1 -0
  161. package/dist/esm/elements/iconProps.js.map +1 -1
  162. package/dist/esm/form/Autocomplete.js +1 -0
  163. package/dist/esm/form/Autocomplete.js.map +1 -1
  164. package/dist/esm/form/Checkbox.js +1 -0
  165. package/dist/esm/form/Checkbox.js.map +1 -1
  166. package/dist/esm/form/CheckboxCard.js +1 -0
  167. package/dist/esm/form/CheckboxCard.js.map +1 -1
  168. package/dist/esm/form/Checkboxes.js +1 -0
  169. package/dist/esm/form/Checkboxes.js.map +1 -1
  170. package/dist/esm/form/ColorInput.js +1 -0
  171. package/dist/esm/form/ColorInput.js.map +1 -1
  172. package/dist/esm/form/ColorInputBase.js +1 -0
  173. package/dist/esm/form/ColorInputBase.js.map +1 -1
  174. package/dist/esm/form/ColorPicker.js +1 -0
  175. package/dist/esm/form/ColorPicker.js.map +1 -1
  176. package/dist/esm/form/Combobox.js +1 -0
  177. package/dist/esm/form/Combobox.js.map +1 -1
  178. package/dist/esm/form/Control.js +1 -0
  179. package/dist/esm/form/Control.js.map +1 -1
  180. package/dist/esm/form/DateInput.js +1 -0
  181. package/dist/esm/form/DateInput.js.map +1 -1
  182. package/dist/esm/form/DateInputBase.js +1 -0
  183. package/dist/esm/form/DateInputBase.js.map +1 -1
  184. package/dist/esm/form/DateRangeInput.js +1 -0
  185. package/dist/esm/form/DateRangeInput.js.map +1 -1
  186. package/dist/esm/form/DateRangeInputBase.js +1 -0
  187. package/dist/esm/form/DateRangeInputBase.js.map +1 -1
  188. package/dist/esm/form/DateTimeInput.js +1 -0
  189. package/dist/esm/form/DateTimeInput.js.map +1 -1
  190. package/dist/esm/form/DateTimeInputBase.js +1 -0
  191. package/dist/esm/form/DateTimeInputBase.js.map +1 -1
  192. package/dist/esm/form/Dropzone.js +1 -0
  193. package/dist/esm/form/Dropzone.js.map +1 -1
  194. package/dist/esm/form/Field.js +1 -0
  195. package/dist/esm/form/Field.js.map +1 -1
  196. package/dist/esm/form/Fieldset.js +1 -0
  197. package/dist/esm/form/Fieldset.js.map +1 -1
  198. package/dist/esm/form/File.js +1 -0
  199. package/dist/esm/form/File.js.map +1 -1
  200. package/dist/esm/form/FormContext.js +1 -0
  201. package/dist/esm/form/FormContext.js.map +1 -1
  202. package/dist/esm/form/Input.js +1 -0
  203. package/dist/esm/form/Input.js.map +1 -1
  204. package/dist/esm/form/InputBase.js +1 -0
  205. package/dist/esm/form/InputBase.js.map +1 -1
  206. package/dist/esm/form/Numberinput.js +1 -0
  207. package/dist/esm/form/Numberinput.js.map +1 -1
  208. package/dist/esm/form/PinInput.js +1 -0
  209. package/dist/esm/form/PinInput.js.map +1 -1
  210. package/dist/esm/form/Radio.js +1 -0
  211. package/dist/esm/form/Radio.js.map +1 -1
  212. package/dist/esm/form/RadioCard.js +1 -0
  213. package/dist/esm/form/RadioCard.js.map +1 -1
  214. package/dist/esm/form/Radios.js +1 -0
  215. package/dist/esm/form/Radios.js.map +1 -1
  216. package/dist/esm/form/Rate.js +1 -0
  217. package/dist/esm/form/Rate.js.map +1 -1
  218. package/dist/esm/form/Select.js +1 -0
  219. package/dist/esm/form/Select.js.map +1 -1
  220. package/dist/esm/form/SelectBase.js +1 -0
  221. package/dist/esm/form/SelectBase.js.map +1 -1
  222. package/dist/esm/form/Slider.js +1 -0
  223. package/dist/esm/form/Slider.js.map +1 -1
  224. package/dist/esm/form/Switch.js +1 -0
  225. package/dist/esm/form/Switch.js.map +1 -1
  226. package/dist/esm/form/Taginput.js +1 -0
  227. package/dist/esm/form/Taginput.js.map +1 -1
  228. package/dist/esm/form/TextArea.js +1 -0
  229. package/dist/esm/form/TextArea.js.map +1 -1
  230. package/dist/esm/form/TextAreaBase.js +1 -0
  231. package/dist/esm/form/TextAreaBase.js.map +1 -1
  232. package/dist/esm/form/TimeInput.js +1 -0
  233. package/dist/esm/form/TimeInput.js.map +1 -1
  234. package/dist/esm/form/TimeInputBase.js +1 -0
  235. package/dist/esm/form/TimeInputBase.js.map +1 -1
  236. package/dist/esm/form/_colorInternals/EyeDropperButton.js +1 -0
  237. package/dist/esm/form/_colorInternals/EyeDropperButton.js.map +1 -1
  238. package/dist/esm/form/_colorInternals/pickerState.js +1 -0
  239. package/dist/esm/form/_colorInternals/pickerState.js.map +1 -1
  240. package/dist/esm/form/_pickerInternals/Calendar.js +1 -0
  241. package/dist/esm/form/_pickerInternals/Calendar.js.map +1 -1
  242. package/dist/esm/form/_pickerInternals/PickerPopover.js +1 -0
  243. package/dist/esm/form/_pickerInternals/PickerPopover.js.map +1 -1
  244. package/dist/esm/form/_pickerInternals/TimeWheels.js +1 -0
  245. package/dist/esm/form/_pickerInternals/TimeWheels.js.map +1 -1
  246. package/dist/esm/form/_pickerInternals/useLocaleDefaults.js +1 -0
  247. package/dist/esm/form/_pickerInternals/useLocaleDefaults.js.map +1 -1
  248. package/dist/esm/form/_pickerInternals/useNativeMobilePicker.js +1 -0
  249. package/dist/esm/form/_pickerInternals/useNativeMobilePicker.js.map +1 -1
  250. package/dist/esm/form/_pickerInternals/useSegmentedEntry.js +1 -0
  251. package/dist/esm/form/_pickerInternals/useSegmentedEntry.js.map +1 -1
  252. package/dist/esm/form/controlLoading.js +1 -0
  253. package/dist/esm/form/controlLoading.js.map +1 -1
  254. package/dist/esm/form/groupFieldset.js +1 -0
  255. package/dist/esm/form/groupFieldset.js.map +1 -1
  256. package/dist/esm/form/useAutoLabelId.js +1 -0
  257. package/dist/esm/form/useAutoLabelId.js.map +1 -1
  258. package/dist/esm/grid/Cell.js +1 -0
  259. package/dist/esm/grid/Cell.js.map +1 -1
  260. package/dist/esm/grid/Grid.js +1 -0
  261. package/dist/esm/grid/Grid.js.map +1 -1
  262. package/dist/esm/helpers/ClientOnly.js +1 -0
  263. package/dist/esm/helpers/ClientOnly.js.map +1 -1
  264. package/dist/esm/helpers/Config.js +1 -0
  265. package/dist/esm/helpers/Config.js.map +1 -1
  266. package/dist/esm/helpers/LocaleProvider.js +1 -0
  267. package/dist/esm/helpers/LocaleProvider.js.map +1 -1
  268. package/dist/esm/helpers/Theme.js +1 -0
  269. package/dist/esm/helpers/Theme.js.map +1 -1
  270. package/dist/esm/helpers/flattenChildren.js +1 -0
  271. package/dist/esm/helpers/flattenChildren.js.map +1 -1
  272. package/dist/esm/helpers/inertProps.js +1 -0
  273. package/dist/esm/helpers/inertProps.js.map +1 -1
  274. package/dist/esm/helpers/localeFormat.js +1 -0
  275. package/dist/esm/helpers/localeFormat.js.map +1 -1
  276. package/dist/esm/helpers/overlayStack.js +1 -0
  277. package/dist/esm/helpers/overlayStack.js.map +1 -1
  278. package/dist/esm/helpers/portal.js +1 -0
  279. package/dist/esm/helpers/portal.js.map +1 -1
  280. package/dist/esm/helpers/scrollLock.js +1 -0
  281. package/dist/esm/helpers/scrollLock.js.map +1 -1
  282. package/dist/esm/helpers/statusRegion.js +1 -0
  283. package/dist/esm/helpers/statusRegion.js.map +1 -1
  284. package/dist/esm/helpers/typeahead.js +1 -0
  285. package/dist/esm/helpers/typeahead.js.map +1 -1
  286. package/dist/esm/helpers/useAnchoredPosition.js +1 -0
  287. package/dist/esm/helpers/useAnchoredPosition.js.map +1 -1
  288. package/dist/esm/helpers/useBulmaClasses.js +1 -0
  289. package/dist/esm/helpers/useBulmaClasses.js.map +1 -1
  290. package/dist/esm/helpers/useClientLayoutEffect.js +1 -0
  291. package/dist/esm/helpers/useClientLayoutEffect.js.map +1 -1
  292. package/dist/esm/helpers/useColorClasses.js +1 -0
  293. package/dist/esm/helpers/useColorClasses.js.map +1 -1
  294. package/dist/esm/helpers/useComboboxEngine.js +1 -0
  295. package/dist/esm/helpers/useComboboxEngine.js.map +1 -1
  296. package/dist/esm/helpers/useContextMenuTrigger.js +1 -0
  297. package/dist/esm/helpers/useContextMenuTrigger.js.map +1 -1
  298. package/dist/esm/helpers/useFlexboxClasses.js +1 -0
  299. package/dist/esm/helpers/useFlexboxClasses.js.map +1 -1
  300. package/dist/esm/helpers/useFocusTrap.js +1 -0
  301. package/dist/esm/helpers/useFocusTrap.js.map +1 -1
  302. package/dist/esm/helpers/useHoverOpen.js +1 -0
  303. package/dist/esm/helpers/useHoverOpen.js.map +1 -1
  304. package/dist/esm/helpers/useInertSiblings.js +1 -0
  305. package/dist/esm/helpers/useInertSiblings.js.map +1 -1
  306. package/dist/esm/helpers/useIsHydrated.js +1 -0
  307. package/dist/esm/helpers/useIsHydrated.js.map +1 -1
  308. package/dist/esm/helpers/useLatestRef.js +1 -0
  309. package/dist/esm/helpers/useLatestRef.js.map +1 -1
  310. package/dist/esm/helpers/useMenuKeys.js +1 -0
  311. package/dist/esm/helpers/useMenuKeys.js.map +1 -1
  312. package/dist/esm/helpers/useOtherClasses.js +1 -0
  313. package/dist/esm/helpers/useOtherClasses.js.map +1 -1
  314. package/dist/esm/helpers/useSpacingClasses.js +1 -0
  315. package/dist/esm/helpers/useSpacingClasses.js.map +1 -1
  316. package/dist/esm/helpers/useTreeView.js +1 -0
  317. package/dist/esm/helpers/useTreeView.js.map +1 -1
  318. package/dist/esm/helpers/useTypographyClasses.js +1 -0
  319. package/dist/esm/helpers/useTypographyClasses.js.map +1 -1
  320. package/dist/esm/helpers/useVisibilityClasses.js +1 -0
  321. package/dist/esm/helpers/useVisibilityClasses.js.map +1 -1
  322. package/dist/esm/layout/Container.js +1 -0
  323. package/dist/esm/layout/Container.js.map +1 -1
  324. package/dist/esm/layout/Footer.js +1 -0
  325. package/dist/esm/layout/Footer.js.map +1 -1
  326. package/dist/esm/layout/Hero.js +1 -0
  327. package/dist/esm/layout/Hero.js.map +1 -1
  328. package/dist/esm/layout/Level.js +1 -0
  329. package/dist/esm/layout/Level.js.map +1 -1
  330. package/dist/esm/layout/Media.js +1 -0
  331. package/dist/esm/layout/Media.js.map +1 -1
  332. package/dist/esm/layout/Section.js +1 -0
  333. package/dist/esm/layout/Section.js.map +1 -1
  334. package/dist/esm/layout/Splitter.js +1 -0
  335. package/dist/esm/layout/Splitter.js.map +1 -1
  336. package/dist/index.cjs +4 -1
  337. package/dist/index.cjs.map +1 -1
  338. package/package.json +28 -27
@@ -1 +1 @@
1
- {"version":3,"file":"Card.js","sources":["../../../src/components/Card.tsx"],"sourcesContent":["import React from 'react';\nimport {\n classNames,\n usePrefixedClassNames,\n prefixedClassNames,\n} from '../helpers/classNames';\nimport { withSubComponents } from '../helpers/withSubComponents';\nimport {\n type AnchorOnlyAttributes,\n ANCHOR_ONLY_ATTRS,\n omitAttrs,\n} from '../helpers/anchorAttrs';\nimport { buttonType } from '../helpers/buttonType';\nimport {\n useBulmaClasses,\n BulmaClassesProps,\n validColors,\n validSchemeColors,\n} from '../helpers/useBulmaClasses';\nimport { mergeBulmaStyles } from '../helpers/mergeBulmaStyles';\nimport { useConfig } from '../helpers/Config';\n\n/**\n * Props for the Card component.\n * @extraProp {'centered' | 'justified' | 'left' | 'right'} [textAlign] - Text alignment.\n */\nexport interface CardProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Additional CSS classes to apply. */\n className?: string;\n /** Text color for the card. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /**\n * Text color alias: renders `has-text-<color>`, exactly like `textColor`.\n * Not a filled card variant (no `.card.is-<color>` CSS exists). Prefer\n * `textColor`, which takes precedence when both are set; use `bgColor` for\n * a colored surface.\n */\n color?: 'primary' | 'link' | 'info' | 'success' | 'warning' | 'danger';\n /**\n * Background color for the card. `scheme-*` values render as a\n * dark-mode-safe inline `background-color: var(--bulma-scheme-*)` instead\n * of a class. The `scheme-invert*` values do not change text color — pair\n * them with a contrasting foreground.\n */\n bgColor?:\n | (typeof validColors)[number]\n | (typeof validSchemeColors)[number]\n | 'inherit'\n | 'current';\n /** Whether the card has a shadow (default: `true`). */\n hasShadow?: boolean;\n /** Card header content, rendered inside `.card-header-title`. */\n header?: React.ReactNode;\n /** If true, centers the header title. */\n headerCentered?: boolean;\n /** Card header icon, rendered as a sibling to the header title. */\n headerIcon?: React.ReactNode;\n /** Card footer content; each item is wrapped in `.card-footer-item`. */\n footer?: React.ReactNode | React.ReactNode[];\n /** Card image node or image src string. */\n image?: React.ReactNode | string;\n /** Alternate text for the card image. */\n imageAlt?: string;\n /** Card content (body). */\n children?: React.ReactNode;\n}\n\n/**\n * Check if children contain any Card compound sub-components.\n * @param {React.ReactNode} children - The children to inspect.\n * @returns {boolean} True if any child is a Card compound component.\n */\nconst hasCompoundComponents = (children: React.ReactNode): boolean => {\n return React.Children.toArray(children).some(child => {\n if (!React.isValidElement(child)) return false;\n\n // Direct comparison with our compound component functions\n return (\n child.type === CardHeader ||\n child.type === CardContent ||\n child.type === CardImage ||\n child.type === CardFooter ||\n child.type === CardFooterItem ||\n child.type === CardHeaderIcon\n );\n });\n};\n\n/**\n * The `Card` component renders a Bulma-styled card with optional header, image, content, and footer.\n *\n * @function\n * @param {CardProps} props - Props for the Card component.\n * @returns {JSX.Element} The rendered card element.\n * @see {@link https://bulma.io/documentation/components/card/ | Bulma Card documentation}\n */\nconst CardComponent: React.FC<CardProps> = ({\n className,\n children,\n textColor,\n color,\n bgColor,\n hasShadow = true,\n header,\n headerCentered,\n headerIcon,\n footer,\n image,\n imageAlt,\n style,\n ...props\n}) => {\n const { classPrefix } = useConfig();\n const { bulmaHelperClasses, bulmaHelperStyles, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n\n // Generate Bulma classes with prefix\n const bulmaClasses = usePrefixedClassNames('card', {\n 'is-shadowless': !hasShadow,\n });\n\n // Combine prefixed Bulma classes with unprefixed user className and prefixed helper classes\n const cardClasses = classNames(bulmaClasses, bulmaHelperClasses, className);\n\n // Render header with optional icon and is-centered modifier\n const renderHeader = (\n header: React.ReactNode,\n headerIcon: React.ReactNode,\n headerCentered: boolean | undefined,\n classPrefix: string | undefined\n ) => {\n if (!header && !headerIcon) return null;\n return (\n <header className={prefixedClassNames(classPrefix, 'card-header')}>\n {header && (\n <div\n className={prefixedClassNames(classPrefix, 'card-header-title', {\n 'is-centered': headerCentered,\n })}\n >\n {header}\n </div>\n )}\n {headerIcon}\n </header>\n );\n };\n\n // Any falsy footer (including `0`) and an empty array render no footer bar,\n // rather than a stray `0` or an empty `.card-footer`.\n const hasFooter = Array.isArray(footer) ? footer.length > 0 : Boolean(footer);\n return (\n <div\n className={cardClasses}\n style={mergeBulmaStyles(bulmaHelperStyles, style)}\n {...rest}\n >\n {renderHeader(header, headerIcon, headerCentered, classPrefix)}\n {image && (\n <div className={prefixedClassNames(classPrefix, 'card-image')}>\n {typeof image === 'string' ? (\n <figure className={prefixedClassNames(classPrefix, 'image')}>\n <img src={image} alt={imageAlt ?? 'Card image'} />\n </figure>\n ) : (\n image\n )}\n </div>\n )}\n {/* Only render card-content if children is specified and doesn't contain compound components */}\n {typeof children !== 'undefined' &&\n children !== null &&\n children !== '' &&\n !hasCompoundComponents(children) && (\n <div className={prefixedClassNames(classPrefix, 'card-content')}>\n {children}\n </div>\n )}\n {/* Render children directly if they contain compound components */}\n {typeof children !== 'undefined' &&\n children !== null &&\n children !== '' &&\n hasCompoundComponents(children) &&\n children}\n {hasFooter && (\n <footer className={prefixedClassNames(classPrefix, 'card-footer')}>\n {Array.isArray(footer) ? (\n footer.map((item, idx) => (\n <span\n className={prefixedClassNames(classPrefix, 'card-footer-item')}\n key={idx}\n >\n {item}\n </span>\n ))\n ) : (\n <span\n className={prefixedClassNames(classPrefix, 'card-footer-item')}\n >\n {footer}\n </span>\n )}\n </footer>\n )}\n </div>\n );\n};\n\n// Compound components for flexible composition\n\n/**\n * Props for the Card.Header compound component.\n */\nexport interface CardHeaderProps\n extends\n React.HTMLAttributes<HTMLElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Bulma color modifier (text color helper). */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Text color helper; wins over `color` when both are set. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Header content. Wrap in Card.Header.Title for Bulma styling. */\n children?: React.ReactNode;\n /** Whether to center the header title text. */\n centered?: boolean;\n}\n\n/**\n * Props for the Card.Image compound component.\n */\nexport interface CardImageProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Bulma color modifier (text color helper). */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Text color helper; wins over `color` when both are set. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Image content (e.g. a `<figure>` with an `<img>`). */\n children?: React.ReactNode;\n}\n\n/**\n * Props for the Card.Content compound component.\n */\nexport interface CardContentProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Bulma color modifier (text color helper). */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Text color helper; wins over `color` when both are set. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Card body content. */\n children?: React.ReactNode;\n}\n\n/**\n * Props for the Card.Footer compound component.\n */\nexport interface CardFooterProps\n extends\n React.HTMLAttributes<HTMLElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Bulma color modifier (text color helper). */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Text color helper; wins over `color` when both are set. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Footer content, typically Card.FooterItem elements. */\n children?: React.ReactNode;\n}\n\n/**\n * The set withheld from a non-anchor `Card.FooterItem` (`span`/`button`): the\n * derived anchor-only attributes, minus `type` (also valid on a `<button>` as\n * `submit`/`button`/`reset`, so stripping it there would remove a working\n * attribute; one set for both tags means a `type` also reaches a `<span>`,\n * which `Dropdown.Item` avoids by choosing its set per tag), plus `rel` (React\n * declares it on `HTMLAttributes` for every element, so the derived set alone\n * would not withhold it — the same addition `Level.Item` makes).\n */\nconst STRIP_FROM_NON_ANCHOR: Readonly<\n Record<Exclude<keyof AnchorOnlyAttributes, 'type'> | 'rel', true>\n> = (() => {\n const { type: _type, ...rest } = ANCHOR_ONLY_ATTRS;\n return { ...rest, rel: true };\n})();\n\n/**\n * What `<button>` adds over the attributes every element has (`disabled`,\n * `form`, `name`, `value` and the `form*` submit overrides), subtracted from\n * React's types the way `AnchorOnlyAttributes` is, so it grows when React's\n * does. Minus `type`, which `AnchorOnlyAttributes` already declares as the\n * `<a>` MIME string: two heritage clauses declaring it differently do not\n * compile, and the `<button>` branch reads it back off the forwarded props.\n */\ntype ButtonOnlyAttributes = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n keyof React.HTMLAttributes<HTMLButtonElement> | 'type'\n>;\n\n/**\n * The set withheld from a non-button `Card.FooterItem` (`span`/`a`), keyed so\n * it stops compiling until a button attribute React adds is named here.\n */\nconst STRIP_FROM_NON_BUTTON: Readonly<\n Record<keyof ButtonOnlyAttributes, true>\n> = {\n disabled: true,\n form: true,\n formAction: true,\n formEncType: true,\n formMethod: true,\n formNoValidate: true,\n formTarget: true,\n name: true,\n value: true,\n};\n\n/**\n * Props for the Card.FooterItem compound component.\n *\n * The anchor and button attributes arrive through `AnchorOnlyAttributes` and\n * `ButtonOnlyAttributes` at every `as`, and each set is forwarded only to its\n * own tag: `STRIP_FROM_NON_ANCHOR` and `STRIP_FROM_NON_BUTTON` above withhold\n * them from the others at runtime, since narrowing the type per `as` is\n * source-breaking (see `Level.Item`'s own note on #672).\n */\nexport interface CardFooterItemProps\n extends\n AnchorOnlyAttributes,\n ButtonOnlyAttributes,\n React.HTMLAttributes<\n HTMLSpanElement | HTMLAnchorElement | HTMLButtonElement\n >,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Element type to render (default: `span`). Bulma's own card markup uses `a`. */\n as?: 'span' | 'a' | 'button';\n /** Bulma color modifier (text color helper). */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Text color helper; wins over `color` when both are set. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Footer item content (link, button, text, etc.). */\n children?: React.ReactNode;\n}\n\n/**\n * Props for the Card.Header.Title compound component.\n */\nexport interface CardHeaderTitleProps\n extends\n React.HTMLAttributes<\n HTMLDivElement | HTMLParagraphElement | HTMLHeadingElement\n >,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Element type to render (default: `div`). Bulma's own card markup uses `p`; a heading suits a title that should read as one. */\n as?: 'div' | 'p' | 'h2' | 'h3' | 'h4';\n /** Bulma color modifier (text color helper). */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Text color helper; wins over `color` when both are set. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Title text content. */\n children?: React.ReactNode;\n /** Whether to center the title text. */\n centered?: boolean;\n}\n\n/**\n * Props for the Card.Header.Icon compound component.\n * @extraProp {'button' | 'submit' | 'reset'} [type='button'] - Button type. Defaults to `'button'`, so a header icon inside a form does not submit it. Pass `'submit'` or `'reset'` and yours is used; any other value, or a spread carrying `type: undefined`, renders `'button'`.\n * @extraProp {string} [aria-label='more options'] - Accessible name. Pass your own to replace it. An empty one, or a spread carrying `'aria-label': undefined`, keeps the default rather than leaving the button unnamed.\n */\nexport interface CardHeaderIconProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Bulma color modifier (text color helper). */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Text color helper; wins over `color` when both are set. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Icon content (e.g. an icon element). */\n children?: React.ReactNode;\n}\n\n/**\n * Card header compound component. Wraps children in a `.card-header` element.\n *\n * @function\n * @param {CardHeaderProps} props - Props for the CardHeader component.\n * @returns {JSX.Element} The rendered card header.\n */\nconst CardHeader: React.FC<CardHeaderProps> = ({\n className,\n children,\n centered,\n color,\n bgColor,\n textColor,\n ...props\n}) => {\n const { classPrefix } = useConfig();\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n\n // Check if children contains a CardHeaderTitle component\n const hasHeaderTitle = React.Children.toArray(children).some(\n child =>\n React.isValidElement(child) &&\n typeof child.type === 'function' &&\n child.type === CardHeaderTitle\n );\n\n const headerClasses = usePrefixedClassNames('card-header');\n\n return (\n <header\n className={classNames(headerClasses, bulmaHelperClasses, className)}\n {...rest}\n >\n {hasHeaderTitle ? (\n children\n ) : (\n <div\n className={classNames(\n prefixedClassNames(classPrefix, 'card-header-title', {\n 'is-centered': centered,\n }),\n className\n )}\n >\n {children}\n </div>\n )}\n </header>\n );\n};\n\n/**\n * Card header title compound component. Renders a `.card-header-title` element.\n *\n * @function\n * @param {CardHeaderTitleProps} props - Props for the CardHeaderTitle component.\n * @returns {JSX.Element} The rendered card header title.\n */\nconst CardHeaderTitle: React.FC<CardHeaderTitleProps> = ({\n as = 'div',\n className,\n children,\n centered,\n color,\n bgColor,\n textColor,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n const Tag = as;\n return (\n <Tag\n className={classNames(\n usePrefixedClassNames('card-header-title', {\n 'is-centered': centered,\n }),\n bulmaHelperClasses,\n className\n )}\n {...rest}\n >\n {children}\n </Tag>\n );\n};\n\n/**\n * Card header icon compound component. Renders a `.card-header-icon` button.\n *\n * @function\n * @param {CardHeaderIconProps} props - Props for the CardHeaderIcon component.\n * @returns {JSX.Element} The rendered card header icon button.\n */\nconst CardHeaderIcon: React.FC<CardHeaderIconProps> = ({\n className,\n children,\n color,\n bgColor,\n textColor,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n return (\n <button\n className={classNames(\n usePrefixedClassNames('card-header-icon'),\n bulmaHelperClasses,\n className\n )}\n {...rest}\n // After the spread, reading through it: a key the spread carries with no\n // value would otherwise erase the default, leaving a nameless button\n // that submits the form around it. An empty label falls back too: the\n // button is drawn as an icon, so `''` would leave it unnamed. A caller's\n // own value still wins; `buttonType` says more.\n aria-label={rest['aria-label'] || 'more options'}\n type={buttonType(rest.type)}\n >\n {children}\n </button>\n );\n};\n\n/**\n * Card image compound component. Wraps children in a `.card-image` element.\n *\n * @function\n * @param {CardImageProps} props - Props for the CardImage component.\n * @returns {JSX.Element} The rendered card image container.\n */\nconst CardImage: React.FC<CardImageProps> = ({\n className,\n children,\n color,\n bgColor,\n textColor,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n return (\n <div\n className={classNames(\n usePrefixedClassNames('card-image'),\n bulmaHelperClasses,\n className\n )}\n {...rest}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Card content compound component. Wraps children in a `.card-content` element.\n *\n * @function\n * @param {CardContentProps} props - Props for the CardContent component.\n * @returns {JSX.Element} The rendered card content container.\n */\nconst CardContent: React.FC<CardContentProps> = ({\n className,\n children,\n color,\n bgColor,\n textColor,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n return (\n <div\n className={classNames(\n usePrefixedClassNames('card-content'),\n bulmaHelperClasses,\n className\n )}\n {...rest}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Card footer compound component. Wraps children in a `.card-footer` element.\n *\n * @function\n * @param {CardFooterProps} props - Props for the CardFooter component.\n * @returns {JSX.Element} The rendered card footer.\n */\nconst CardFooter: React.FC<CardFooterProps> = ({\n className,\n children,\n color,\n bgColor,\n textColor,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n return (\n <footer\n className={classNames(\n usePrefixedClassNames('card-footer'),\n bulmaHelperClasses,\n className\n )}\n {...rest}\n >\n {children}\n </footer>\n );\n};\n\n/**\n * Card footer item compound component. Wraps children in a `.card-footer-item` span.\n *\n * @function\n * @param {CardFooterItemProps} props - Props for the CardFooterItem component.\n * @returns {JSX.Element} The rendered card footer item.\n */\nconst CardFooterItem: React.FC<CardFooterItemProps> = ({\n as = 'span',\n className,\n children,\n color,\n bgColor,\n textColor,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n const itemClasses = classNames(\n usePrefixedClassNames('card-footer-item'),\n bulmaHelperClasses,\n className\n );\n\n // The anchor's own attributes reach an `<a>` and nothing else, and the button's a\n // `<button>` — `STRIP_FROM_NON_ANCHOR` above names the anchor set and why `type`\n // stays while `rel` is added, and `STRIP_FROM_NON_BUTTON` the button set.\n if (as === 'a') {\n return (\n <a className={itemClasses} {...omitAttrs(rest, STRIP_FROM_NON_BUTTON)}>\n {children}\n </a>\n );\n }\n\n const forwarded = omitAttrs(rest, STRIP_FROM_NON_ANCHOR);\n\n if (as === 'button') {\n return (\n <button\n className={itemClasses}\n {...forwarded}\n // A footer item button must not submit an enclosing form by default —\n // `<button>` defaults to `type=\"submit\"`, and a Save/Cancel action row\n // sitting in a form is the common case this `as` exists for.\n //\n // A MISSING `type` is not the only way that default arrives: `type` is\n // typed here as the `<a>` MIME string (`STRIP_FROM_NON_ANCHOR` above\n // says why it is not withheld), so `as=\"button\" type=\"text/html\"`\n // compiles, and HTML's INVALID-value default for a button's `type` is\n // submit too. `buttonType` keeps `button`, `submit` and `reset` and\n // turns anything else into `button`.\n type={buttonType((forwarded as { type?: string }).type)}\n >\n {children}\n </button>\n );\n }\n\n return (\n <span\n className={itemClasses}\n {...omitAttrs(forwarded, STRIP_FROM_NON_BUTTON)}\n >\n {children}\n </span>\n );\n};\n\n// Attach nested Title and Icon components to CardHeader\nconst CardHeaderCompound = withSubComponents(CardHeader, {\n Title: CardHeaderTitle,\n Icon: CardHeaderIcon,\n});\n\n/** Card component with Header, Image, Content, Footer, and FooterItem sub-components. */\nexport const Card = withSubComponents(\n CardComponent,\n {\n Header: CardHeaderCompound,\n Image: CardImage,\n Content: CardContent,\n Footer: CardFooter,\n FooterItem: CardFooterItem,\n },\n 'Card'\n);\n"],"names":["_jsxs","_jsx","STRIP_FROM_NON_ANCHOR"],"mappings":"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"}
1
+ {"version":3,"file":"Card.js","sources":["../../../src/components/Card.tsx"],"sourcesContent":["import React from 'react';\nimport {\n classNames,\n usePrefixedClassNames,\n prefixedClassNames,\n} from '../helpers/classNames';\nimport { withSubComponents } from '../helpers/withSubComponents';\nimport {\n type AnchorOnlyAttributes,\n ANCHOR_ONLY_ATTRS,\n omitAttrs,\n} from '../helpers/anchorAttrs';\nimport { buttonType } from '../helpers/buttonType';\nimport {\n useBulmaClasses,\n BulmaClassesProps,\n validColors,\n validSchemeColors,\n} from '../helpers/useBulmaClasses';\nimport { mergeBulmaStyles } from '../helpers/mergeBulmaStyles';\nimport { useConfig } from '../helpers/Config';\n\n/**\n * Props for the Card component.\n * @extraProp {'centered' | 'justified' | 'left' | 'right'} [textAlign] - Text alignment.\n */\nexport interface CardProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Additional CSS classes to apply. */\n className?: string;\n /** Text color for the card. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /**\n * Text color alias: renders `has-text-<color>`, exactly like `textColor`.\n * Not a filled card variant (no `.card.is-<color>` CSS exists). Prefer\n * `textColor`, which takes precedence when both are set; use `bgColor` for\n * a colored surface.\n */\n color?: 'primary' | 'link' | 'info' | 'success' | 'warning' | 'danger';\n /**\n * Background color for the card. `scheme-*` values render as a\n * dark-mode-safe inline `background-color: var(--bulma-scheme-*)` instead\n * of a class. The `scheme-invert*` values do not change text color — pair\n * them with a contrasting foreground.\n */\n bgColor?:\n | (typeof validColors)[number]\n | (typeof validSchemeColors)[number]\n | 'inherit'\n | 'current';\n /** Whether the card has a shadow (default: `true`). */\n hasShadow?: boolean;\n /** Card header content, rendered inside `.card-header-title`. */\n header?: React.ReactNode;\n /** If true, centers the header title. */\n headerCentered?: boolean;\n /** Card header icon, rendered as a sibling to the header title. */\n headerIcon?: React.ReactNode;\n /** Card footer content; each item is wrapped in `.card-footer-item`. */\n footer?: React.ReactNode | React.ReactNode[];\n /** Card image node or image src string. */\n image?: React.ReactNode | string;\n /** Alternate text for the card image. */\n imageAlt?: string;\n /** Card content (body). */\n children?: React.ReactNode;\n}\n\n/**\n * Check if children contain any Card compound sub-components.\n * @param {React.ReactNode} children - The children to inspect.\n * @returns {boolean} True if any child is a Card compound component.\n */\nconst hasCompoundComponents = (children: React.ReactNode): boolean => {\n return React.Children.toArray(children).some(child => {\n if (!React.isValidElement(child)) return false;\n\n // Direct comparison with our compound component functions\n return (\n child.type === CardHeader ||\n child.type === CardContent ||\n child.type === CardImage ||\n child.type === CardFooter ||\n child.type === CardFooterItem ||\n child.type === CardHeaderIcon\n );\n });\n};\n\n/**\n * The `Card` component renders a Bulma-styled card with optional header, image, content, and footer.\n *\n * @function\n * @param {CardProps} props - Props for the Card component.\n * @returns {JSX.Element} The rendered card element.\n * @see {@link https://bulma.io/documentation/components/card/ | Bulma Card documentation}\n */\nconst CardComponent: React.FC<CardProps> = ({\n className,\n children,\n textColor,\n color,\n bgColor,\n hasShadow = true,\n header,\n headerCentered,\n headerIcon,\n footer,\n image,\n imageAlt,\n style,\n ...props\n}) => {\n const { classPrefix } = useConfig();\n const { bulmaHelperClasses, bulmaHelperStyles, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n\n // Generate Bulma classes with prefix\n const bulmaClasses = usePrefixedClassNames('card', {\n 'is-shadowless': !hasShadow,\n });\n\n // Combine prefixed Bulma classes with unprefixed user className and prefixed helper classes\n const cardClasses = classNames(bulmaClasses, bulmaHelperClasses, className);\n\n // Render header with optional icon and is-centered modifier\n const renderHeader = (\n header: React.ReactNode,\n headerIcon: React.ReactNode,\n headerCentered: boolean | undefined,\n classPrefix: string | undefined\n ) => {\n if (!header && !headerIcon) return null;\n return (\n <header className={prefixedClassNames(classPrefix, 'card-header')}>\n {header && (\n <div\n className={prefixedClassNames(classPrefix, 'card-header-title', {\n 'is-centered': headerCentered,\n })}\n >\n {header}\n </div>\n )}\n {headerIcon}\n </header>\n );\n };\n\n // Any falsy footer (including `0`) and an empty array render no footer bar,\n // rather than a stray `0` or an empty `.card-footer`.\n const hasFooter = Array.isArray(footer) ? footer.length > 0 : Boolean(footer);\n return (\n <div\n className={cardClasses}\n style={mergeBulmaStyles(bulmaHelperStyles, style)}\n {...rest}\n >\n {renderHeader(header, headerIcon, headerCentered, classPrefix)}\n {image && (\n <div className={prefixedClassNames(classPrefix, 'card-image')}>\n {typeof image === 'string' ? (\n <figure className={prefixedClassNames(classPrefix, 'image')}>\n <img src={image} alt={imageAlt ?? 'Card image'} />\n </figure>\n ) : (\n image\n )}\n </div>\n )}\n {/* Only render card-content if children is specified and doesn't contain compound components */}\n {typeof children !== 'undefined' &&\n children !== null &&\n children !== '' &&\n !hasCompoundComponents(children) && (\n <div className={prefixedClassNames(classPrefix, 'card-content')}>\n {children}\n </div>\n )}\n {/* Render children directly if they contain compound components */}\n {typeof children !== 'undefined' &&\n children !== null &&\n children !== '' &&\n hasCompoundComponents(children) &&\n children}\n {hasFooter && (\n <footer className={prefixedClassNames(classPrefix, 'card-footer')}>\n {Array.isArray(footer) ? (\n footer.map((item, idx) => (\n <span\n className={prefixedClassNames(classPrefix, 'card-footer-item')}\n key={idx}\n >\n {item}\n </span>\n ))\n ) : (\n <span\n className={prefixedClassNames(classPrefix, 'card-footer-item')}\n >\n {footer}\n </span>\n )}\n </footer>\n )}\n </div>\n );\n};\n\n// Compound components for flexible composition\n\n/**\n * Props for the Card.Header compound component.\n */\nexport interface CardHeaderProps\n extends\n React.HTMLAttributes<HTMLElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Bulma color modifier (text color helper). */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Text color helper; wins over `color` when both are set. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Header content. Wrap in Card.Header.Title for Bulma styling. */\n children?: React.ReactNode;\n /** Whether to center the header title text. */\n centered?: boolean;\n}\n\n/**\n * Props for the Card.Image compound component.\n */\nexport interface CardImageProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Bulma color modifier (text color helper). */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Text color helper; wins over `color` when both are set. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Image content (e.g. a `<figure>` with an `<img>`). */\n children?: React.ReactNode;\n}\n\n/**\n * Props for the Card.Content compound component.\n */\nexport interface CardContentProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Bulma color modifier (text color helper). */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Text color helper; wins over `color` when both are set. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Card body content. */\n children?: React.ReactNode;\n}\n\n/**\n * Props for the Card.Footer compound component.\n */\nexport interface CardFooterProps\n extends\n React.HTMLAttributes<HTMLElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Bulma color modifier (text color helper). */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Text color helper; wins over `color` when both are set. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Footer content, typically Card.FooterItem elements. */\n children?: React.ReactNode;\n}\n\n/**\n * The set withheld from a non-anchor `Card.FooterItem` (`span`/`button`): the\n * derived anchor-only attributes, minus `type` (also valid on a `<button>` as\n * `submit`/`button`/`reset`, so stripping it there would remove a working\n * attribute; one set for both tags means a `type` also reaches a `<span>`,\n * which `Dropdown.Item` avoids by choosing its set per tag), plus `rel` (React\n * declares it on `HTMLAttributes` for every element, so the derived set alone\n * would not withhold it — the same addition `Level.Item` makes).\n */\nconst STRIP_FROM_NON_ANCHOR: Readonly<\n Record<Exclude<keyof AnchorOnlyAttributes, 'type'> | 'rel', true>\n> = (() => {\n const { type: _type, ...rest } = ANCHOR_ONLY_ATTRS;\n return { ...rest, rel: true };\n})();\n\n/**\n * What `<button>` adds over the attributes every element has (`disabled`,\n * `form`, `name`, `value` and the `form*` submit overrides), subtracted from\n * React's types the way `AnchorOnlyAttributes` is, so it grows when React's\n * does. Minus `type`, which `AnchorOnlyAttributes` already declares as the\n * `<a>` MIME string: two heritage clauses declaring it differently do not\n * compile, and the `<button>` branch reads it back off the forwarded props.\n */\ntype ButtonOnlyAttributes = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n keyof React.HTMLAttributes<HTMLButtonElement> | 'type'\n>;\n\n/**\n * The set withheld from a non-button `Card.FooterItem` (`span`/`a`), keyed so\n * it stops compiling until a button attribute React adds is named here.\n */\nconst STRIP_FROM_NON_BUTTON: Readonly<\n Record<keyof ButtonOnlyAttributes, true>\n> = {\n disabled: true,\n form: true,\n formAction: true,\n formEncType: true,\n formMethod: true,\n formNoValidate: true,\n formTarget: true,\n name: true,\n value: true,\n};\n\n/**\n * Props for the Card.FooterItem compound component.\n *\n * The anchor and button attributes arrive through `AnchorOnlyAttributes` and\n * `ButtonOnlyAttributes` at every `as`, and each set is forwarded only to its\n * own tag: `STRIP_FROM_NON_ANCHOR` and `STRIP_FROM_NON_BUTTON` above withhold\n * them from the others at runtime, since narrowing the type per `as` is\n * source-breaking (see `Level.Item`'s own note on #672).\n */\nexport interface CardFooterItemProps\n extends\n AnchorOnlyAttributes,\n ButtonOnlyAttributes,\n React.HTMLAttributes<\n HTMLSpanElement | HTMLAnchorElement | HTMLButtonElement\n >,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Element type to render (default: `span`). Bulma's own card markup uses `a`. */\n as?: 'span' | 'a' | 'button';\n /** Bulma color modifier (text color helper). */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Text color helper; wins over `color` when both are set. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Footer item content (link, button, text, etc.). */\n children?: React.ReactNode;\n}\n\n/**\n * Props for the Card.Header.Title compound component.\n */\nexport interface CardHeaderTitleProps\n extends\n React.HTMLAttributes<\n HTMLDivElement | HTMLParagraphElement | HTMLHeadingElement\n >,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Element type to render (default: `div`). Bulma's own card markup uses `p`; a heading suits a title that should read as one. */\n as?: 'div' | 'p' | 'h2' | 'h3' | 'h4';\n /** Bulma color modifier (text color helper). */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Text color helper; wins over `color` when both are set. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Title text content. */\n children?: React.ReactNode;\n /** Whether to center the title text. */\n centered?: boolean;\n}\n\n/**\n * Props for the Card.Header.Icon compound component.\n * @extraProp {'button' | 'submit' | 'reset'} [type='button'] - Button type. Defaults to `'button'`, so a header icon inside a form does not submit it. Pass `'submit'` or `'reset'` and yours is used; any other value, or a spread carrying `type: undefined`, renders `'button'`.\n * @extraProp {string} [aria-label='more options'] - Accessible name. Pass your own to replace it. An empty one, or a spread carrying `'aria-label': undefined`, keeps the default rather than leaving the button unnamed.\n */\nexport interface CardHeaderIconProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Bulma color modifier (text color helper). */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Text color helper; wins over `color` when both are set. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Icon content (e.g. an icon element). */\n children?: React.ReactNode;\n}\n\n/**\n * Card header compound component. Wraps children in a `.card-header` element.\n *\n * @function\n * @param {CardHeaderProps} props - Props for the CardHeader component.\n * @returns {JSX.Element} The rendered card header.\n */\nconst CardHeader: React.FC<CardHeaderProps> = ({\n className,\n children,\n centered,\n color,\n bgColor,\n textColor,\n ...props\n}) => {\n const { classPrefix } = useConfig();\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n\n // Check if children contains a CardHeaderTitle component\n const hasHeaderTitle = React.Children.toArray(children).some(\n child =>\n React.isValidElement(child) &&\n typeof child.type === 'function' &&\n child.type === CardHeaderTitle\n );\n\n const headerClasses = usePrefixedClassNames('card-header');\n\n return (\n <header\n className={classNames(headerClasses, bulmaHelperClasses, className)}\n {...rest}\n >\n {hasHeaderTitle ? (\n children\n ) : (\n <div\n className={classNames(\n prefixedClassNames(classPrefix, 'card-header-title', {\n 'is-centered': centered,\n }),\n className\n )}\n >\n {children}\n </div>\n )}\n </header>\n );\n};\n\n/**\n * Card header title compound component. Renders a `.card-header-title` element.\n *\n * @function\n * @param {CardHeaderTitleProps} props - Props for the CardHeaderTitle component.\n * @returns {JSX.Element} The rendered card header title.\n */\nconst CardHeaderTitle: React.FC<CardHeaderTitleProps> = ({\n as = 'div',\n className,\n children,\n centered,\n color,\n bgColor,\n textColor,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n const Tag = as;\n return (\n <Tag\n className={classNames(\n usePrefixedClassNames('card-header-title', {\n 'is-centered': centered,\n }),\n bulmaHelperClasses,\n className\n )}\n {...rest}\n >\n {children}\n </Tag>\n );\n};\n\n/**\n * Card header icon compound component. Renders a `.card-header-icon` button.\n *\n * @function\n * @param {CardHeaderIconProps} props - Props for the CardHeaderIcon component.\n * @returns {JSX.Element} The rendered card header icon button.\n */\nconst CardHeaderIcon: React.FC<CardHeaderIconProps> = ({\n className,\n children,\n color,\n bgColor,\n textColor,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n return (\n <button\n className={classNames(\n usePrefixedClassNames('card-header-icon'),\n bulmaHelperClasses,\n className\n )}\n {...rest}\n // After the spread, reading through it: a key the spread carries with no\n // value would otherwise erase the default, leaving a nameless button\n // that submits the form around it. An empty label falls back too: the\n // button is drawn as an icon, so `''` would leave it unnamed. A caller's\n // own value still wins; `buttonType` says more.\n aria-label={rest['aria-label'] || 'more options'}\n type={buttonType(rest.type)}\n >\n {children}\n </button>\n );\n};\n\n/**\n * Card image compound component. Wraps children in a `.card-image` element.\n *\n * @function\n * @param {CardImageProps} props - Props for the CardImage component.\n * @returns {JSX.Element} The rendered card image container.\n */\nconst CardImage: React.FC<CardImageProps> = ({\n className,\n children,\n color,\n bgColor,\n textColor,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n return (\n <div\n className={classNames(\n usePrefixedClassNames('card-image'),\n bulmaHelperClasses,\n className\n )}\n {...rest}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Card content compound component. Wraps children in a `.card-content` element.\n *\n * @function\n * @param {CardContentProps} props - Props for the CardContent component.\n * @returns {JSX.Element} The rendered card content container.\n */\nconst CardContent: React.FC<CardContentProps> = ({\n className,\n children,\n color,\n bgColor,\n textColor,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n return (\n <div\n className={classNames(\n usePrefixedClassNames('card-content'),\n bulmaHelperClasses,\n className\n )}\n {...rest}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Card footer compound component. Wraps children in a `.card-footer` element.\n *\n * @function\n * @param {CardFooterProps} props - Props for the CardFooter component.\n * @returns {JSX.Element} The rendered card footer.\n */\nconst CardFooter: React.FC<CardFooterProps> = ({\n className,\n children,\n color,\n bgColor,\n textColor,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n return (\n <footer\n className={classNames(\n usePrefixedClassNames('card-footer'),\n bulmaHelperClasses,\n className\n )}\n {...rest}\n >\n {children}\n </footer>\n );\n};\n\n/**\n * Card footer item compound component. Wraps children in a `.card-footer-item` span.\n *\n * @function\n * @param {CardFooterItemProps} props - Props for the CardFooterItem component.\n * @returns {JSX.Element} The rendered card footer item.\n */\nconst CardFooterItem: React.FC<CardFooterItemProps> = ({\n as = 'span',\n className,\n children,\n color,\n bgColor,\n textColor,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n const itemClasses = classNames(\n usePrefixedClassNames('card-footer-item'),\n bulmaHelperClasses,\n className\n );\n\n // The anchor's own attributes reach an `<a>` and nothing else, and the button's a\n // `<button>` — `STRIP_FROM_NON_ANCHOR` above names the anchor set and why `type`\n // stays while `rel` is added, and `STRIP_FROM_NON_BUTTON` the button set.\n if (as === 'a') {\n return (\n <a className={itemClasses} {...omitAttrs(rest, STRIP_FROM_NON_BUTTON)}>\n {children}\n </a>\n );\n }\n\n const forwarded = omitAttrs(rest, STRIP_FROM_NON_ANCHOR);\n\n if (as === 'button') {\n return (\n <button\n className={itemClasses}\n {...forwarded}\n // A footer item button must not submit an enclosing form by default —\n // `<button>` defaults to `type=\"submit\"`, and a Save/Cancel action row\n // sitting in a form is the common case this `as` exists for.\n //\n // A MISSING `type` is not the only way that default arrives: `type` is\n // typed here as the `<a>` MIME string (`STRIP_FROM_NON_ANCHOR` above\n // says why it is not withheld), so `as=\"button\" type=\"text/html\"`\n // compiles, and HTML's INVALID-value default for a button's `type` is\n // submit too. `buttonType` keeps `button`, `submit` and `reset` and\n // turns anything else into `button`.\n type={buttonType((forwarded as { type?: string }).type)}\n >\n {children}\n </button>\n );\n }\n\n return (\n <span\n className={itemClasses}\n {...omitAttrs(forwarded, STRIP_FROM_NON_BUTTON)}\n >\n {children}\n </span>\n );\n};\n\n// Attach nested Title and Icon components to CardHeader\nconst CardHeaderCompound = withSubComponents(CardHeader, {\n Title: CardHeaderTitle,\n Icon: CardHeaderIcon,\n});\n\n/** Card component with Header, Image, Content, Footer, and FooterItem sub-components. */\nexport const Card = withSubComponents(\n CardComponent,\n {\n Header: CardHeaderCompound,\n Image: CardImage,\n Content: CardContent,\n Footer: CardFooter,\n FooterItem: CardFooterItem,\n },\n 'Card'\n);\n"],"names":["_jsxs","_jsx","STRIP_FROM_NON_ANCHOR"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  /* @allxsmith/bestax-bulma — AI agents: see AGENTS.md in the package root, or https://bestax.io/llms.txt */
2
+ 'use client';
2
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
4
  import { forwardRef, useRef, useState, Children, isValidElement, useEffect, useCallback, cloneElement } from 'react';
4
5
  import { classNames, usePrefixedClassNames, prefixedClassNames } from '../helpers/classNames.js';
@@ -1 +1 @@
1
- {"version":3,"file":"Carousel.js","sources":["../../../src/components/Carousel.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useState,\n useRef,\n useEffect,\n useCallback,\n Children,\n isValidElement,\n cloneElement,\n} from 'react';\nimport {\n classNames,\n prefixedClassNames,\n usePrefixedClassNames,\n} from '../helpers/classNames';\nimport { useBulmaClasses, BulmaClassesProps } from '../helpers/useBulmaClasses';\nimport { useClassPrefix } from '../helpers/Config';\nimport { getActiveElementInTree } from '../helpers/shadowDom';\nimport { useLatestRef } from '../helpers/useLatestRef';\nimport { useClientLayoutEffect } from '../helpers/useClientLayoutEffect';\nimport { inertProps } from '../helpers/inertProps';\nimport { Icon } from '../elements/Icon';\nimport { Button } from '../elements/Button';\n\n/**\n * Props for the CarouselItem component.\n */\nexport interface CarouselItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Whether this item is in view. `Carousel` sets it on every item in view,\n * so with several in view several are active.\n */\n active?: boolean;\n /**\n * The slide's content. An image in it is held to the slide's width at its\n * own height, unless something sizes the image itself: a ratio `Image`\n * fills its frame, and an `Avatar`'s photo its circle, as they do outside a\n * carousel.\n */\n children?: React.ReactNode;\n}\n\n/**\n * Individual carousel item/slide.\n *\n * @function\n * @param {CarouselItemProps} props - Props for the CarouselItem component.\n * @param {React.Ref<HTMLDivElement>} ref - Forwarded ref to the carousel item element.\n * @returns {JSX.Element} The rendered carousel item.\n */\nexport const CarouselItem = forwardRef<HTMLDivElement, CarouselItemProps>(\n ({ active, className, children, ...props }, ref) => {\n const itemClasses = classNames(\n usePrefixedClassNames('carousel-item', { 'is-active': active }),\n className\n );\n\n return (\n <div ref={ref} className={itemClasses} {...props}>\n {children}\n </div>\n );\n }\n);\n\nCarouselItem.displayName = 'CarouselItem';\n\ntype IconLibrary = 'fa' | 'mdi' | 'ion' | 'material-icons' | 'material-symbols';\n\n/**\n * Default SVG icon for the previous arrow button.\n *\n * @function\n * @returns {JSX.Element} The rendered SVG chevron-left icon.\n */\nconst DefaultPrevIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n);\n\n/**\n * Default SVG icon for the next arrow button.\n *\n * @function\n * @returns {JSX.Element} The rendered SVG chevron-right icon.\n */\nconst DefaultNextIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n);\n\n/**\n * The media queries Bulma's `fullhd`, `widescreen`, `desktop` and `tablet`\n * mixins open with, widest first, at Bulma's default breakpoints. The\n * stylesheet picks the count in view with those mixins; these tell the\n * script which count that is. Narrower than the last one is `mobile`.\n */\nconst VIEWPORT_QUERIES = [\n 'screen and (min-width: 1408px)',\n 'screen and (min-width: 1216px)',\n 'screen and (min-width: 1024px)',\n 'screen and (min-width: 769px), print',\n];\n\n/** `useBulmaViewport`'s answer below the tablet breakpoint. */\nconst MOBILE = VIEWPORT_QUERIES.length;\n\n/**\n * The `--bulma-carousel-items-to-show*` variable each count prop writes, in\n * the order the component lists them: the viewports as above, mobile, and\n * last `itemsToShow` itself.\n */\nconst COUNT_SUFFIXES = [\n '-fullhd',\n '-widescreen',\n '-desktop',\n '-tablet',\n '-mobile',\n '',\n];\n\n/**\n * Which of Bulma's viewports the window is in: the index of the widest\n * `VIEWPORT_QUERIES` entry that matches, `MOBILE` below them all, or `-1`\n * when that isn't known (on the server, before the first layout effect, and\n * whenever `enabled` is off, so a carousel with one count everywhere\n * subscribes to nothing).\n *\n * @function\n * @param {boolean} enabled - Whether any viewport-specific count is set.\n * @returns {number} The viewport, as described above.\n */\nfunction useBulmaViewport(enabled: boolean): number {\n const [viewport, setViewport] = useState(-1);\n\n useClientLayoutEffect(() => {\n if (!enabled || typeof window.matchMedia !== 'function') return undefined;\n const lists = VIEWPORT_QUERIES.map(query => window.matchMedia(query));\n const update = () => {\n const index = lists.findIndex(list => list.matches);\n setViewport(index < 0 ? MOBILE : index);\n };\n update();\n lists.forEach(list => list.addEventListener('change', update));\n return () =>\n lists.forEach(list => list.removeEventListener('change', update));\n }, [enabled]);\n\n return enabled ? viewport : -1;\n}\n\n/**\n * A count prop as the whole number the carousel works with: rounded down,\n * and never below 1, so a zero or a stray `NaN` can't divide by nothing.\n *\n * @function\n * @param {number | undefined} count - The prop as given.\n * @returns {number | undefined} The count, or `undefined` when unset.\n */\nconst wholeCount = (count: number | undefined) =>\n count === undefined ? undefined : Math.max(1, Math.floor(count) || 1);\n\n/**\n * Props for the Carousel component.\n * @extraProp {string} [className] - Additional CSS classes.\n * @extraProp {React.Ref<HTMLElement>} [ref] - Ref forwarded to the carousel element.\n */\nexport interface CarouselProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'color'>,\n BulmaClassesProps {\n /**\n * Index of the first item in view (controlled); with one item in view, the\n * slide shown. A value between two of the positions a step lands on (see\n * `itemsToScroll`) is shown as given, and the next step goes on from it.\n * With `repeat`, a value past either end wraps around; without it, one\n * that would leave empty space after the last item shows the last full\n * view. Neither correction calls `onChange`. A value that takes the item\n * holding focus out of view moves focus to the first item in view, as a\n * swipe or a change of width does.\n * @defaultValue 0\n */\n value?: number;\n /**\n * Enable auto-play: one step (`itemsToScroll` items) per `interval`.\n * Without `repeat` it stops at the last position. It waits while the\n * pointer is over the carousel (see `pauseOnHover`) and while focus is\n * inside one of its items, so an item being read or used never moves out\n * of view.\n */\n autoplay?: boolean;\n /** Auto-play interval in milliseconds. Default: 5000. */\n interval?: number;\n /** Pause auto-play on hover. Default: true. */\n pauseOnHover?: boolean;\n /**\n * Loop back to the first position after the last. Default: true. With\n * several items in view, the view runs on past the last item into the\n * first ones, so it can show the end and the start side by side. Only\n * loops when some item is out of view.\n */\n repeat?: boolean;\n /**\n * Enable drag/swipe navigation. Default: true. A swipe moves one step,\n * however far it travels.\n */\n hasDrag?: boolean;\n /**\n * How many items are in view at once, at every width no\n * `itemsToShow<Viewport>` prop covers. Those props read the way a\n * `Column`'s `size<Viewport>` props do: `itemsToShowMobile` applies below\n * Bulma's tablet breakpoint, each of the others from its own breakpoint\n * up, and where several apply the widest one wins. A whole number, rounded\n * down and at least 1. The widths come from the stylesheet, so they are\n * right on the first paint; the arrows, indicators and steps use the\n * count for the window's width once the page has hydrated, and this one\n * until then. With this many children or fewer, every item keeps its\n * share of the width, nothing moves, and no arrows or indicators render.\n * @defaultValue 1\n */\n itemsToShow?: number;\n /**\n * Items in view at any width below Bulma's tablet breakpoint (769px),\n * fractional ones included. Falls back to `itemsToShow`.\n */\n itemsToShowMobile?: number;\n /**\n * Items in view from Bulma's tablet breakpoint (769px) up, until a wider\n * viewport's prop takes over. Falls back to `itemsToShow`.\n */\n itemsToShowTablet?: number;\n /**\n * Items in view from Bulma's desktop breakpoint (1024px) up, until a wider\n * viewport's prop takes over. Falls back to `itemsToShowTablet`, then\n * `itemsToShow`.\n */\n itemsToShowDesktop?: number;\n /**\n * Items in view from Bulma's widescreen breakpoint (1216px) up, until\n * `itemsToShowFullhd` takes over. Falls back to `itemsToShowDesktop`, and\n * on down to `itemsToShow`.\n */\n itemsToShowWidescreen?: number;\n /**\n * Items in view from Bulma's fullhd breakpoint (1408px) up. Falls back to\n * `itemsToShowWidescreen`, and on down to `itemsToShow`.\n */\n itemsToShowFullhd?: number;\n /**\n * How many items one step moves, for an arrow, an arrow key, a swipe or an\n * autoplay tick. A whole number, capped at the count in view so a step\n * never skips an item. Without `repeat`, the last step stops at the last\n * full view, so it can be shorter; with `repeat`, the step after the last\n * position goes on to the first one. The indicators mark these positions,\n * one per step rather than one per item. When the count in view changes\n * with the window's width, the first item in view stays in view.\n * @defaultValue 1\n */\n itemsToScroll?: number;\n /**\n * Show navigation arrows. Default: true. They render `type=\"button\"`, so a\n * carousel inside a form is not submitted by moving between slides.\n */\n arrow?: boolean;\n /** Only show arrows on hover. */\n arrowHover?: boolean;\n /**\n * Show slide indicators. Default: true. There is one for each position a\n * step can land on (see `itemsToScroll`). They render `type=\"button\"`, so\n * a carousel inside a form is not submitted by picking a slide.\n */\n indicator?: boolean;\n /**\n * Puts the indicators over the slides instead of below them, at the edge\n * `indicatorPosition` names. It also turns on the overlay look unless\n * `overlayControls` says otherwise, so on its own it gives the look made\n * for photos: light arrows, and light indicators on a dark gradient band.\n */\n indicatorInside?: boolean;\n /**\n * The overlay look, made for photos. The arrows take the\n * `--bulma-carousel-overlay-arrow-*` colors, and indicators over the\n * slides take the `--bulma-carousel-overlay-indicator-*` colors on a dark\n * gradient band. Indicators below the slides keep their plain colors,\n * since they sit on the page. It follows `indicatorInside` unless you set\n * it, so `overlayControls={false}` puts the indicators over the slides\n * with the plain look, and `overlayControls` alone gives the arrows the\n * overlay look with the indicators below. While it's on, `arrowColor`\n * doesn't apply.\n * @defaultValue indicatorInside\n */\n overlayControls?: boolean;\n /**\n * The edge of the slides `indicatorInside` puts the indicators on.\n * Default: 'bottom'. Without `indicatorInside` they sit below the slides\n * whatever this says, so leave it unset there.\n */\n indicatorPosition?: 'bottom' | 'top';\n /** Indicator style. Default: 'dots'. */\n indicatorStyle?: 'circles' | 'dots' | 'lines' | 'bars';\n /** Icon name for the previous arrow button. */\n iconPrev?: string;\n /** Icon name for the next arrow button. */\n iconNext?: string;\n /** Icon library to use. */\n iconLibrary?: IconLibrary;\n /** Icon style variant (e.g., 'solid', 'outlined'). */\n iconVariant?: string;\n /** Icon size modifier. */\n iconSize?: 'small' | 'medium' | 'large';\n /** Additional icon modifiers. */\n iconFeatures?: string | string[];\n /** Show semi-transparent background on arrow buttons. Set to `false` for icon-only arrows. */\n arrowBackground?: boolean;\n /**\n * Color theme for navigation arrows. Not applied while the overlay look is\n * on (see `overlayControls`, which `indicatorInside` turns on), whose\n * arrows take `--bulma-carousel-overlay-arrow-color`.\n */\n arrowColor?: 'light' | 'dark';\n /** Accessible label for the carousel region. Default: 'Image carousel'. */\n ariaLabel?: string;\n /**\n * Called with the index of the first item in view when an arrow, an arrow\n * key, an indicator, a swipe or autoplay moves the carousel.\n */\n onChange?: (value: number) => void;\n /** CarouselItem children. */\n children?: React.ReactNode;\n}\n\n/**\n * The `Carousel` component provides an image/content slider with navigation arrows and indicators.\n *\n * @function\n * @param {CarouselProps} props - Props for the Carousel component.\n * @param {React.Ref<HTMLDivElement>} ref - Forwarded ref to the carousel element.\n * @returns {JSX.Element} The rendered carousel component.\n *\n * @example\n * // Basic carousel\n * <Carousel>\n * <CarouselItem>Slide 1</CarouselItem>\n * <CarouselItem>Slide 2</CarouselItem>\n * <CarouselItem>Slide 3</CarouselItem>\n * </Carousel>\n *\n * @example\n * // Auto-playing carousel\n * <Carousel autoplay interval={3000}>\n * <CarouselItem>\n * <img src=\"image1.jpg\" alt=\"Slide 1\" />\n * </CarouselItem>\n * <CarouselItem>\n * <img src=\"image2.jpg\" alt=\"Slide 2\" />\n * </CarouselItem>\n * </Carousel>\n *\n * @example\n * // Three cards in view on desktop, two on tablet, one on mobile\n * <Carousel itemsToShow={1} itemsToShowTablet={2} itemsToShowDesktop={3}>\n * {cards.map(card => (\n * <CarouselItem key={card.id}>{card.body}</CarouselItem>\n * ))}\n * </Carousel>\n */\nexport const Carousel = forwardRef<HTMLDivElement, CarouselProps>(\n (\n {\n value: controlledValue,\n autoplay = false,\n interval = 5000,\n pauseOnHover = true,\n repeat = true,\n hasDrag = true,\n itemsToShow,\n itemsToShowMobile,\n itemsToShowTablet,\n itemsToShowDesktop,\n itemsToShowWidescreen,\n itemsToShowFullhd,\n itemsToScroll,\n arrow = true,\n arrowHover = false,\n indicator = true,\n indicatorInside = false,\n overlayControls = indicatorInside,\n indicatorPosition = 'bottom',\n indicatorStyle = 'dots',\n iconPrev,\n iconNext,\n iconLibrary,\n iconVariant,\n iconSize,\n iconFeatures,\n arrowBackground = true,\n arrowColor,\n ariaLabel = 'Image carousel',\n onChange,\n className,\n style,\n children,\n ...props\n },\n ref\n ) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses(props);\n const carouselRef = useRef<HTMLDivElement>(null);\n // Cleanup returned by a consumer's callback ref on attach, held until detach.\n const consumerCleanupRef = useRef<(() => void) | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const slidesRef = useRef<HTMLDivElement>(null);\n // The item (a child of the track) that holds focus, until focus leaves\n // the items for somewhere else\n const focusedItemRef = useRef<Element | undefined>(undefined);\n\n const [internalValue, setInternalValue] = useState(0);\n const [isPaused, setIsPaused] = useState(false);\n const [isFocusInside, setIsFocusInside] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [dragStart, setDragStart] = useState(0);\n const [dragOffset, setDragOffset] = useState(0);\n const [isWrapping, setIsWrapping] = useState(false);\n const [displayIndex, setDisplayIndex] = useState(0);\n const [skipTransition, setSkipTransition] = useState(false);\n\n // Get valid children\n const items = Children.toArray(children).filter(\n isValidElement\n ) as React.ReactElement<CarouselItemProps>[];\n const itemCount = items.length;\n\n // The count in view. The viewport props come widest first, in the order\n // of VIEWPORT_QUERIES, then mobile; each min-width viewport falls back to\n // the narrower ones, and every viewport to `itemsToShow`, the cascade the\n // stylesheet's `--bulma-carousel-items-to-show-*` defaults spell out.\n const counts = [\n itemsToShowFullhd,\n itemsToShowWidescreen,\n itemsToShowDesktop,\n itemsToShowTablet,\n itemsToShowMobile,\n ].map(wholeCount);\n const baseCount = wholeCount(itemsToShow);\n const viewport = useBulmaViewport(counts.some(c => c !== undefined));\n const inView =\n (viewport === MOBILE\n ? counts[MOBILE]\n : viewport >= 0\n ? counts.slice(viewport, MOBILE).find(c => c !== undefined)\n : undefined) ??\n baseCount ??\n 1;\n // The props as the stylesheet reads them, so the widths are right from\n // the first paint, on the server too.\n const countStyle: Record<string, number> = {};\n [...counts, baseCount].forEach((count, i) => {\n if (count !== undefined) {\n countStyle[`--bulma-carousel-items-to-show${COUNT_SUFFIXES[i]}`] =\n count;\n }\n });\n\n const scroll = Math.min(wholeCount(itemsToScroll) ?? 1, inView);\n const looping = repeat && itemCount > inView;\n const lastStart = Math.max(0, itemCount - inView);\n // Where the view can start: every `scroll` items from the first, and\n // without a loop the last full view as well, which is what keeps the\n // end of the track from showing empty space.\n const positions: number[] = [];\n for (let p = 0; p < (looping ? itemCount : lastStart); p += scroll) {\n positions.push(p);\n }\n if (!looping) positions.push(lastStart);\n const lastPosition = positions[positions.length - 1];\n const canMove = positions.length > 1;\n\n const wrap = (index: number) =>\n ((index % itemCount) + itemCount) % itemCount;\n const fit = (index: number) =>\n looping ? wrap(index) : Math.min(Math.max(index, 0), lastStart);\n\n // Use controlled or internal value, as a start the view can show\n const activeIndex = fit(controlledValue ?? internalValue);\n // The indicator for the last position at or before the first item in view\n const activePosition = positions.reduce(\n (found, position, index) => (position <= activeIndex ? index : found),\n 0\n );\n const nextIndex = positions[activePosition + 1];\n // From between two positions, the previous step is the one just behind\n const prevIndex =\n activeIndex > positions[activePosition]\n ? positions[activePosition]\n : positions[activePosition - 1];\n\n // Sync displayIndex when the value changes externally, or when the count\n // in view moves the start it fits to. Intentional external-prop sync that\n // must not run mid-wrap animation; covered by tests and certified\n // in-browser. Uncontrolled, the fitted start becomes the value too, so a\n // later change of count keeps what was first in view in view.\n useEffect(() => {\n if (!isWrapping) {\n // eslint-disable-next-line react-hooks/set-state-in-effect -- syncing to controlled prop\n setDisplayIndex(activeIndex);\n if (controlledValue === undefined) setInternalValue(activeIndex);\n }\n }, [activeIndex, isWrapping, controlledValue]);\n\n // Update active index\n const setActiveIndex = useCallback(\n (index: number) => {\n if (controlledValue === undefined) {\n setInternalValue(index);\n }\n setDisplayIndex(index);\n setIsWrapping(false);\n onChange?.(index);\n },\n [controlledValue, onChange]\n );\n\n // Navigation handlers\n const goToPrev = useCallback(() => {\n if (prevIndex !== undefined) {\n setActiveIndex(prevIndex);\n } else if (looping) {\n // Animate to the clones before the first item, which show the last\n // position, and snap to the real one when the transition ends\n setDisplayIndex(lastPosition - itemCount);\n setIsWrapping(true);\n }\n }, [prevIndex, looping, lastPosition, itemCount, setActiveIndex]);\n\n const goToNext = useCallback(() => {\n if (nextIndex !== undefined) {\n setActiveIndex(nextIndex);\n } else if (looping) {\n // Animate to the clones after the last item, which show the first\n // position, and snap to the real one when the transition ends\n setDisplayIndex(itemCount);\n setIsWrapping(true);\n }\n }, [nextIndex, looping, itemCount, setActiveIndex]);\n\n // Read when the timer fires or an arrow key arrives, so neither the\n // timer nor the key listener starts over while `onChange` changes\n // identity, as an inline one does on every render of the parent.\n const goToPrevRef = useLatestRef(goToPrev);\n const goToNextRef = useLatestRef(goToNext);\n\n // Auto-play. Each slide gets the whole interval, so a slide change,\n // autoplay's own or the user's, starts the timer over. A render that\n // leaves the slide where it is doesn't. It waits while focus is inside\n // an item, so what someone is reading or using doesn't move away. The\n // timer reads where focus is when it fires, rather than trusting the\n // last focus event alone: a browser moving focus off an element that\n // went inert need not fire one, and the pause would never end. A focus\n // change still starts the timer over, so an item gets the whole\n // interval once focus leaves it.\n const isPlaying =\n autoplay && (looping || nextIndex !== undefined) && !isPaused;\n const isRotating = isPlaying && !isFocusInside;\n\n useEffect(() => {\n if (!isPlaying) return undefined;\n\n const timer = setInterval(() => {\n const track = slidesRef.current;\n if (track?.contains(getActiveElementInTree(track))) return;\n if (isFocusInside) setIsFocusInside(false);\n goToNextRef.current();\n }, interval);\n\n return () => clearInterval(timer);\n }, [isPlaying, isFocusInside, interval, activeIndex, goToNextRef]);\n\n // Pause on hover\n const handleMouseEnter = useCallback(() => {\n if (pauseOnHover) {\n setIsPaused(true);\n }\n }, [pauseOnHover]);\n\n const handleMouseLeave = useCallback(() => {\n if (pauseOnHover) {\n setIsPaused(false);\n }\n }, [pauseOnHover]);\n\n // Drag handlers\n const handleDragStart = useCallback(\n (clientX: number) => {\n if (!hasDrag) return;\n setIsDragging(true);\n setDragStart(clientX);\n setDragOffset(0);\n },\n [hasDrag]\n );\n\n const handleDragMove = useCallback(\n (clientX: number) => {\n if (!isDragging) return;\n setDragOffset(clientX - dragStart);\n },\n [isDragging, dragStart]\n );\n\n const handleDragEnd = useCallback(() => {\n if (!isDragging) return;\n setIsDragging(false);\n\n const threshold = 50;\n if (dragOffset < -threshold) {\n goToNext();\n } else if (dragOffset > threshold) {\n goToPrev();\n }\n\n setDragOffset(0);\n }, [isDragging, dragOffset, goToNext, goToPrev]);\n\n // Mouse events\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n handleDragStart(e.clientX);\n },\n [handleDragStart]\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n handleDragMove(e.clientX);\n },\n [handleDragMove]\n );\n\n const handleMouseUp = useCallback(() => {\n handleDragEnd();\n }, [handleDragEnd]);\n\n // Touch events\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n handleDragStart(e.touches[0].clientX);\n },\n [handleDragStart]\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent) => {\n handleDragMove(e.touches[0].clientX);\n },\n [handleDragMove]\n );\n\n const handleTouchEnd = useCallback(() => {\n handleDragEnd();\n }, [handleDragEnd]);\n\n // Keyboard navigation, from the carousel's own controls. Inside an item\n // the keys are its content's (a field's caret, a slider), and a step\n // from there could take the focused item out of view.\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n const node = carouselRef.current;\n const active = getActiveElementInTree(node);\n if (!node?.contains(active) || slidesRef.current?.contains(active)) {\n return;\n }\n\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault();\n goToPrevRef.current();\n break;\n case 'ArrowRight':\n e.preventDefault();\n goToNextRef.current();\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [goToPrevRef, goToNextRef]);\n\n // Handle wrap-around transition end: the track's own, since an item's\n // content can end a transition of its own that bubbles up to here\n const handleTransitionEnd = useCallback(\n (e: React.TransitionEvent<HTMLDivElement>) => {\n if (isWrapping && e.target === e.currentTarget) {\n // Skip transition for the instant snap from the clones to the\n // real items they copy\n setSkipTransition(true);\n setActiveIndex(((displayIndex % itemCount) + itemCount) % itemCount);\n\n // Re-enable transition after the snap\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setSkipTransition(false);\n });\n });\n }\n },\n [isWrapping, displayIndex, itemCount, setActiveIndex]\n );\n\n // Combined ref\n const combinedRef = useCallback(\n (node: HTMLDivElement | null) => {\n (carouselRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node;\n if (typeof ref === 'function') {\n // React 19 lets a callback ref return a cleanup function and detaches by\n // running it instead of calling the ref with `null`; React 18 discards the\n // return value entirely. Returning it from here would be a React-19-only\n // contract, so we hold the cleanup and run it ourselves on detach — the\n // same shape as `Dropdown`, `Modal`, `Dialog`, `Sidebar` and `Toast`.\n // The form controls that merge a forwarded ref still discard the cleanup\n // and detach with `ref(null)`, so this is not yet library-wide — grep\n // `typeof ref === 'function'` for the current split.\n if (node === null) {\n const consumerCleanup = consumerCleanupRef.current;\n consumerCleanupRef.current = null;\n if (consumerCleanup) {\n consumerCleanup();\n } else {\n ref(null);\n }\n return;\n }\n const cleanup: unknown = ref(node);\n consumerCleanupRef.current =\n typeof cleanup === 'function' ? (cleanup as () => void) : null;\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n },\n [ref]\n );\n\n // Can navigate\n const canGoPrev = looping || prevIndex !== undefined;\n const canGoNext = looping || nextIndex !== undefined;\n\n // Generate classes\n const carouselClasses = usePrefixedClassNames('carousel', {\n 'is-overlay': overlayControls,\n 'has-arrow-hover': arrowHover,\n [`is-indicator-${indicatorStyle}`]: indicatorStyle !== 'dots',\n [`is-arrow-${arrowColor}`]: !!arrowColor,\n });\n const classPrefix = useClassPrefix();\n const carouselContainerClass = usePrefixedClassNames('carousel-container');\n const carouselSlidesClass = usePrefixedClassNames('carousel-slides');\n const carouselArrowPrevClass = usePrefixedClassNames(\n 'carousel-arrow',\n 'is-prev',\n { 'is-transparent': !arrowBackground }\n );\n const carouselArrowNextClass = usePrefixedClassNames(\n 'carousel-arrow',\n 'is-next',\n { 'is-transparent': !arrowBackground }\n );\n const carouselIndicatorClass = usePrefixedClassNames('carousel-indicator', {\n 'is-inside': indicatorInside,\n 'is-top': indicatorPosition === 'top',\n });\n\n const combinedClasses = classNames(\n carouselClasses,\n bulmaHelperClasses,\n className\n );\n\n // Where the track is drawn from: mid-wrap the clones, otherwise a start\n // the view can show, so a change in the count in view never paints\n // empty space while the sync above catches up.\n const shownIndex = isWrapping ? displayIndex : fit(displayIndex);\n // Enough clones on each side to fill the widest view any viewport sets,\n // since the stylesheet, not this count, sizes what's on screen\n const cloneCount = looping\n ? Math.min(\n itemCount,\n Math.max(baseCount ?? 1, ...counts.map(c => c ?? 1))\n )\n : 0;\n // The track: a full view's worth of clones of the last items, the items,\n // and clones of the first ones, for a seamless loop. Each entry is the\n // item it shows and its key.\n const slots: [number, React.Key][] = items.map((_, index) => [\n index,\n index,\n ]);\n for (let k = 0; k < cloneCount; k++) {\n slots.splice(k, 0, [itemCount - cloneCount + k, `clone-before-${k}`]);\n slots.push([k, `clone-after-${k}`]);\n }\n\n // Render slides with active state (includes clones for infinite loop).\n // What's in view is a run of slots, so where a looping view runs past\n // the last item, the clones on screen are the live copies and the items\n // they copy, off screen, are the hidden ones: no item is exposed twice,\n // and the copy exposed is the one in view.\n const renderSlides = () =>\n slots.map(([index, key], slot) => {\n const item = items[index];\n const own = item.props;\n const isShown =\n slot >= shownIndex + cloneCount &&\n slot < shownIndex + cloneCount + inView;\n return cloneElement(item, {\n key,\n active: isShown,\n role: own.role ?? 'group',\n 'aria-roledescription': own['aria-roledescription'] ?? 'slide',\n ...(own['aria-label'] || own['aria-labelledby']\n ? {}\n : { 'aria-label': `${index + 1} of ${itemCount}` }),\n // Out of view: hidden from assistive tech, and inert, so nothing\n // in it takes focus or a click\n ...(isShown ? {} : { 'aria-hidden': true, ...inertProps(true) }),\n });\n });\n\n // Hand focus on when the item holding it leaves the view. An item out\n // of view is inert, and a browser drops focus from an inert element to\n // the page, so a swipe, a change of count with the window's width, a new\n // controlled value or the item's removal would leave a keyboard or\n // screen reader user nowhere. Focus goes to the first item in view,\n // given `tabindex=\"-1\"` for it unless it has a tabindex of its own. A\n // layout effect runs before the browser gets to drop the focus; the\n // focused item's removal drops it at once, so focus on the page itself\n // still counts as the item's.\n useClientLayoutEffect(() => {\n const held = focusedItemRef.current;\n if (!held) return;\n const track = slidesRef.current as HTMLDivElement;\n const start = shownIndex + cloneCount;\n const slot = Array.prototype.indexOf.call(track.children, held);\n if (slot >= start && slot < start + inView) return;\n const active = getActiveElementInTree(track);\n if (active !== held.ownerDocument.body && !held.contains(active)) {\n return;\n }\n focusedItemRef.current = undefined;\n const first = track.children[start] as HTMLElement | undefined;\n if (!first) return;\n if (!first.hasAttribute('tabindex')) first.tabIndex = -1;\n first.focus({ preventScroll: true });\n }, [shownIndex, cloneCount, inView, itemCount]);\n\n return (\n <div\n ref={combinedRef}\n className={combinedClasses}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label={ariaLabel}\n style={{ ...countStyle, ...style }}\n {...rest}\n >\n <div\n ref={containerRef}\n className={carouselContainerClass}\n onMouseDown={hasDrag ? handleMouseDown : undefined}\n onMouseMove={hasDrag && isDragging ? handleMouseMove : undefined}\n onMouseUp={hasDrag ? handleMouseUp : undefined}\n onMouseLeave={hasDrag ? handleMouseUp : undefined}\n onTouchStart={hasDrag ? handleTouchStart : undefined}\n onTouchMove={hasDrag ? handleTouchMove : undefined}\n onTouchEnd={hasDrag ? handleTouchEnd : undefined}\n style={{\n transform: isDragging ? `translateX(${dragOffset}px)` : undefined,\n cursor: hasDrag ? (isDragging ? 'grabbing' : 'grab') : undefined,\n }}\n >\n <div\n ref={slidesRef}\n className={carouselSlidesClass}\n style={{\n // One item is the track's width plus a gap, over the count the\n // stylesheet has in view; account for the prepended clones\n transform: `translateX(calc(${-(shownIndex + cloneCount)} * (100% + var(--bulma-carousel-item-gap, 0px)) / var(--bulma-carousel-items-in-view, 1)))`,\n // Disable transition during drag or instant snap after wrap-around\n transition:\n isDragging || skipTransition\n ? 'none'\n : 'transform 0.3s ease-in-out',\n }}\n // Announce what comes into view, except while autoplay turns it\n aria-live={isRotating ? 'off' : 'polite'}\n onFocus={e => {\n setIsFocusInside(true);\n focusedItemRef.current = Array.from(\n e.currentTarget.children\n ).find(item => item.contains(e.target));\n }}\n onBlur={e => {\n const inside = e.currentTarget.contains(e.relatedTarget);\n setIsFocusInside(inside);\n if (!inside) focusedItemRef.current = undefined;\n }}\n onTransitionEnd={handleTransitionEnd}\n >\n {renderSlides()}\n </div>\n {arrow && canMove && (\n <>\n <Button\n type=\"button\"\n className={carouselArrowPrevClass}\n onClick={goToPrev}\n isDisabled={!canGoPrev}\n aria-label=\"Previous slide\"\n >\n {iconPrev ? (\n <Icon\n name={iconPrev}\n library={iconLibrary}\n variant={iconVariant}\n size={iconSize}\n features={iconFeatures}\n />\n ) : (\n <DefaultPrevIcon />\n )}\n </Button>\n <Button\n type=\"button\"\n className={carouselArrowNextClass}\n onClick={goToNext}\n isDisabled={!canGoNext}\n aria-label=\"Next slide\"\n >\n {iconNext ? (\n <Icon\n name={iconNext}\n library={iconLibrary}\n variant={iconVariant}\n size={iconSize}\n features={iconFeatures}\n />\n ) : (\n <DefaultNextIcon />\n )}\n </Button>\n </>\n )}\n </div>\n\n {indicator && canMove && (\n <div className={carouselIndicatorClass} role=\"tablist\">\n {positions.map((position, index) => (\n <Button\n key={position}\n type=\"button\"\n className={prefixedClassNames(classPrefix, 'indicator-item', {\n 'is-active': index === activePosition,\n })}\n onClick={() => setActiveIndex(position)}\n role=\"tab\"\n aria-selected={index === activePosition}\n aria-label={`Go to slide ${position + 1}`}\n />\n ))}\n </div>\n )}\n </div>\n );\n }\n);\n\nCarousel.displayName = 'Carousel';\n\nexport default Carousel;\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"Carousel.js","sources":["../../../src/components/Carousel.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useState,\n useRef,\n useEffect,\n useCallback,\n Children,\n isValidElement,\n cloneElement,\n} from 'react';\nimport {\n classNames,\n prefixedClassNames,\n usePrefixedClassNames,\n} from '../helpers/classNames';\nimport { useBulmaClasses, BulmaClassesProps } from '../helpers/useBulmaClasses';\nimport { useClassPrefix } from '../helpers/Config';\nimport { getActiveElementInTree } from '../helpers/shadowDom';\nimport { useLatestRef } from '../helpers/useLatestRef';\nimport { useClientLayoutEffect } from '../helpers/useClientLayoutEffect';\nimport { inertProps } from '../helpers/inertProps';\nimport { Icon } from '../elements/Icon';\nimport { Button } from '../elements/Button';\n\n/**\n * Props for the CarouselItem component.\n */\nexport interface CarouselItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Whether this item is in view. `Carousel` sets it on every item in view,\n * so with several in view several are active.\n */\n active?: boolean;\n /**\n * The slide's content. An image in it is held to the slide's width at its\n * own height, unless something sizes the image itself: a ratio `Image`\n * fills its frame, and an `Avatar`'s photo its circle, as they do outside a\n * carousel.\n */\n children?: React.ReactNode;\n}\n\n/**\n * Individual carousel item/slide.\n *\n * @function\n * @param {CarouselItemProps} props - Props for the CarouselItem component.\n * @param {React.Ref<HTMLDivElement>} ref - Forwarded ref to the carousel item element.\n * @returns {JSX.Element} The rendered carousel item.\n */\nexport const CarouselItem = forwardRef<HTMLDivElement, CarouselItemProps>(\n ({ active, className, children, ...props }, ref) => {\n const itemClasses = classNames(\n usePrefixedClassNames('carousel-item', { 'is-active': active }),\n className\n );\n\n return (\n <div ref={ref} className={itemClasses} {...props}>\n {children}\n </div>\n );\n }\n);\n\nCarouselItem.displayName = 'CarouselItem';\n\ntype IconLibrary = 'fa' | 'mdi' | 'ion' | 'material-icons' | 'material-symbols';\n\n/**\n * Default SVG icon for the previous arrow button.\n *\n * @function\n * @returns {JSX.Element} The rendered SVG chevron-left icon.\n */\nconst DefaultPrevIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n);\n\n/**\n * Default SVG icon for the next arrow button.\n *\n * @function\n * @returns {JSX.Element} The rendered SVG chevron-right icon.\n */\nconst DefaultNextIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n);\n\n/**\n * The media queries Bulma's `fullhd`, `widescreen`, `desktop` and `tablet`\n * mixins open with, widest first, at Bulma's default breakpoints. The\n * stylesheet picks the count in view with those mixins; these tell the\n * script which count that is. Narrower than the last one is `mobile`.\n */\nconst VIEWPORT_QUERIES = [\n 'screen and (min-width: 1408px)',\n 'screen and (min-width: 1216px)',\n 'screen and (min-width: 1024px)',\n 'screen and (min-width: 769px), print',\n];\n\n/** `useBulmaViewport`'s answer below the tablet breakpoint. */\nconst MOBILE = VIEWPORT_QUERIES.length;\n\n/**\n * The `--bulma-carousel-items-to-show*` variable each count prop writes, in\n * the order the component lists them: the viewports as above, mobile, and\n * last `itemsToShow` itself.\n */\nconst COUNT_SUFFIXES = [\n '-fullhd',\n '-widescreen',\n '-desktop',\n '-tablet',\n '-mobile',\n '',\n];\n\n/**\n * Which of Bulma's viewports the window is in: the index of the widest\n * `VIEWPORT_QUERIES` entry that matches, `MOBILE` below them all, or `-1`\n * when that isn't known (on the server, before the first layout effect, and\n * whenever `enabled` is off, so a carousel with one count everywhere\n * subscribes to nothing).\n *\n * @function\n * @param {boolean} enabled - Whether any viewport-specific count is set.\n * @returns {number} The viewport, as described above.\n */\nfunction useBulmaViewport(enabled: boolean): number {\n const [viewport, setViewport] = useState(-1);\n\n useClientLayoutEffect(() => {\n if (!enabled || typeof window.matchMedia !== 'function') return undefined;\n const lists = VIEWPORT_QUERIES.map(query => window.matchMedia(query));\n const update = () => {\n const index = lists.findIndex(list => list.matches);\n setViewport(index < 0 ? MOBILE : index);\n };\n update();\n lists.forEach(list => list.addEventListener('change', update));\n return () =>\n lists.forEach(list => list.removeEventListener('change', update));\n }, [enabled]);\n\n return enabled ? viewport : -1;\n}\n\n/**\n * A count prop as the whole number the carousel works with: rounded down,\n * and never below 1, so a zero or a stray `NaN` can't divide by nothing.\n *\n * @function\n * @param {number | undefined} count - The prop as given.\n * @returns {number | undefined} The count, or `undefined` when unset.\n */\nconst wholeCount = (count: number | undefined) =>\n count === undefined ? undefined : Math.max(1, Math.floor(count) || 1);\n\n/**\n * Props for the Carousel component.\n * @extraProp {string} [className] - Additional CSS classes.\n * @extraProp {React.Ref<HTMLElement>} [ref] - Ref forwarded to the carousel element.\n */\nexport interface CarouselProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'color'>,\n BulmaClassesProps {\n /**\n * Index of the first item in view (controlled); with one item in view, the\n * slide shown. A value between two of the positions a step lands on (see\n * `itemsToScroll`) is shown as given, and the next step goes on from it.\n * With `repeat`, a value past either end wraps around; without it, one\n * that would leave empty space after the last item shows the last full\n * view. Neither correction calls `onChange`. A value that takes the item\n * holding focus out of view moves focus to the first item in view, as a\n * swipe or a change of width does.\n * @defaultValue 0\n */\n value?: number;\n /**\n * Enable auto-play: one step (`itemsToScroll` items) per `interval`.\n * Without `repeat` it stops at the last position. It waits while the\n * pointer is over the carousel (see `pauseOnHover`) and while focus is\n * inside one of its items, so an item being read or used never moves out\n * of view.\n */\n autoplay?: boolean;\n /** Auto-play interval in milliseconds. Default: 5000. */\n interval?: number;\n /** Pause auto-play on hover. Default: true. */\n pauseOnHover?: boolean;\n /**\n * Loop back to the first position after the last. Default: true. With\n * several items in view, the view runs on past the last item into the\n * first ones, so it can show the end and the start side by side. Only\n * loops when some item is out of view.\n */\n repeat?: boolean;\n /**\n * Enable drag/swipe navigation. Default: true. A swipe moves one step,\n * however far it travels.\n */\n hasDrag?: boolean;\n /**\n * How many items are in view at once, at every width no\n * `itemsToShow<Viewport>` prop covers. Those props read the way a\n * `Column`'s `size<Viewport>` props do: `itemsToShowMobile` applies below\n * Bulma's tablet breakpoint, each of the others from its own breakpoint\n * up, and where several apply the widest one wins. A whole number, rounded\n * down and at least 1. The widths come from the stylesheet, so they are\n * right on the first paint; the arrows, indicators and steps use the\n * count for the window's width once the page has hydrated, and this one\n * until then. With this many children or fewer, every item keeps its\n * share of the width, nothing moves, and no arrows or indicators render.\n * @defaultValue 1\n */\n itemsToShow?: number;\n /**\n * Items in view at any width below Bulma's tablet breakpoint (769px),\n * fractional ones included. Falls back to `itemsToShow`.\n */\n itemsToShowMobile?: number;\n /**\n * Items in view from Bulma's tablet breakpoint (769px) up, until a wider\n * viewport's prop takes over. Falls back to `itemsToShow`.\n */\n itemsToShowTablet?: number;\n /**\n * Items in view from Bulma's desktop breakpoint (1024px) up, until a wider\n * viewport's prop takes over. Falls back to `itemsToShowTablet`, then\n * `itemsToShow`.\n */\n itemsToShowDesktop?: number;\n /**\n * Items in view from Bulma's widescreen breakpoint (1216px) up, until\n * `itemsToShowFullhd` takes over. Falls back to `itemsToShowDesktop`, and\n * on down to `itemsToShow`.\n */\n itemsToShowWidescreen?: number;\n /**\n * Items in view from Bulma's fullhd breakpoint (1408px) up. Falls back to\n * `itemsToShowWidescreen`, and on down to `itemsToShow`.\n */\n itemsToShowFullhd?: number;\n /**\n * How many items one step moves, for an arrow, an arrow key, a swipe or an\n * autoplay tick. A whole number, capped at the count in view so a step\n * never skips an item. Without `repeat`, the last step stops at the last\n * full view, so it can be shorter; with `repeat`, the step after the last\n * position goes on to the first one. The indicators mark these positions,\n * one per step rather than one per item. When the count in view changes\n * with the window's width, the first item in view stays in view.\n * @defaultValue 1\n */\n itemsToScroll?: number;\n /**\n * Show navigation arrows. Default: true. They render `type=\"button\"`, so a\n * carousel inside a form is not submitted by moving between slides.\n */\n arrow?: boolean;\n /** Only show arrows on hover. */\n arrowHover?: boolean;\n /**\n * Show slide indicators. Default: true. There is one for each position a\n * step can land on (see `itemsToScroll`). They render `type=\"button\"`, so\n * a carousel inside a form is not submitted by picking a slide.\n */\n indicator?: boolean;\n /**\n * Puts the indicators over the slides instead of below them, at the edge\n * `indicatorPosition` names. It also turns on the overlay look unless\n * `overlayControls` says otherwise, so on its own it gives the look made\n * for photos: light arrows, and light indicators on a dark gradient band.\n */\n indicatorInside?: boolean;\n /**\n * The overlay look, made for photos. The arrows take the\n * `--bulma-carousel-overlay-arrow-*` colors, and indicators over the\n * slides take the `--bulma-carousel-overlay-indicator-*` colors on a dark\n * gradient band. Indicators below the slides keep their plain colors,\n * since they sit on the page. It follows `indicatorInside` unless you set\n * it, so `overlayControls={false}` puts the indicators over the slides\n * with the plain look, and `overlayControls` alone gives the arrows the\n * overlay look with the indicators below. While it's on, `arrowColor`\n * doesn't apply.\n * @defaultValue indicatorInside\n */\n overlayControls?: boolean;\n /**\n * The edge of the slides `indicatorInside` puts the indicators on.\n * Default: 'bottom'. Without `indicatorInside` they sit below the slides\n * whatever this says, so leave it unset there.\n */\n indicatorPosition?: 'bottom' | 'top';\n /** Indicator style. Default: 'dots'. */\n indicatorStyle?: 'circles' | 'dots' | 'lines' | 'bars';\n /** Icon name for the previous arrow button. */\n iconPrev?: string;\n /** Icon name for the next arrow button. */\n iconNext?: string;\n /** Icon library to use. */\n iconLibrary?: IconLibrary;\n /** Icon style variant (e.g., 'solid', 'outlined'). */\n iconVariant?: string;\n /** Icon size modifier. */\n iconSize?: 'small' | 'medium' | 'large';\n /** Additional icon modifiers. */\n iconFeatures?: string | string[];\n /** Show semi-transparent background on arrow buttons. Set to `false` for icon-only arrows. */\n arrowBackground?: boolean;\n /**\n * Color theme for navigation arrows. Not applied while the overlay look is\n * on (see `overlayControls`, which `indicatorInside` turns on), whose\n * arrows take `--bulma-carousel-overlay-arrow-color`.\n */\n arrowColor?: 'light' | 'dark';\n /** Accessible label for the carousel region. Default: 'Image carousel'. */\n ariaLabel?: string;\n /**\n * Called with the index of the first item in view when an arrow, an arrow\n * key, an indicator, a swipe or autoplay moves the carousel.\n */\n onChange?: (value: number) => void;\n /** CarouselItem children. */\n children?: React.ReactNode;\n}\n\n/**\n * The `Carousel` component provides an image/content slider with navigation arrows and indicators.\n *\n * @function\n * @param {CarouselProps} props - Props for the Carousel component.\n * @param {React.Ref<HTMLDivElement>} ref - Forwarded ref to the carousel element.\n * @returns {JSX.Element} The rendered carousel component.\n *\n * @example\n * // Basic carousel\n * <Carousel>\n * <CarouselItem>Slide 1</CarouselItem>\n * <CarouselItem>Slide 2</CarouselItem>\n * <CarouselItem>Slide 3</CarouselItem>\n * </Carousel>\n *\n * @example\n * // Auto-playing carousel\n * <Carousel autoplay interval={3000}>\n * <CarouselItem>\n * <img src=\"image1.jpg\" alt=\"Slide 1\" />\n * </CarouselItem>\n * <CarouselItem>\n * <img src=\"image2.jpg\" alt=\"Slide 2\" />\n * </CarouselItem>\n * </Carousel>\n *\n * @example\n * // Three cards in view on desktop, two on tablet, one on mobile\n * <Carousel itemsToShow={1} itemsToShowTablet={2} itemsToShowDesktop={3}>\n * {cards.map(card => (\n * <CarouselItem key={card.id}>{card.body}</CarouselItem>\n * ))}\n * </Carousel>\n */\nexport const Carousel = forwardRef<HTMLDivElement, CarouselProps>(\n (\n {\n value: controlledValue,\n autoplay = false,\n interval = 5000,\n pauseOnHover = true,\n repeat = true,\n hasDrag = true,\n itemsToShow,\n itemsToShowMobile,\n itemsToShowTablet,\n itemsToShowDesktop,\n itemsToShowWidescreen,\n itemsToShowFullhd,\n itemsToScroll,\n arrow = true,\n arrowHover = false,\n indicator = true,\n indicatorInside = false,\n overlayControls = indicatorInside,\n indicatorPosition = 'bottom',\n indicatorStyle = 'dots',\n iconPrev,\n iconNext,\n iconLibrary,\n iconVariant,\n iconSize,\n iconFeatures,\n arrowBackground = true,\n arrowColor,\n ariaLabel = 'Image carousel',\n onChange,\n className,\n style,\n children,\n ...props\n },\n ref\n ) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses(props);\n const carouselRef = useRef<HTMLDivElement>(null);\n // Cleanup returned by a consumer's callback ref on attach, held until detach.\n const consumerCleanupRef = useRef<(() => void) | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const slidesRef = useRef<HTMLDivElement>(null);\n // The item (a child of the track) that holds focus, until focus leaves\n // the items for somewhere else\n const focusedItemRef = useRef<Element | undefined>(undefined);\n\n const [internalValue, setInternalValue] = useState(0);\n const [isPaused, setIsPaused] = useState(false);\n const [isFocusInside, setIsFocusInside] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [dragStart, setDragStart] = useState(0);\n const [dragOffset, setDragOffset] = useState(0);\n const [isWrapping, setIsWrapping] = useState(false);\n const [displayIndex, setDisplayIndex] = useState(0);\n const [skipTransition, setSkipTransition] = useState(false);\n\n // Get valid children\n const items = Children.toArray(children).filter(\n isValidElement\n ) as React.ReactElement<CarouselItemProps>[];\n const itemCount = items.length;\n\n // The count in view. The viewport props come widest first, in the order\n // of VIEWPORT_QUERIES, then mobile; each min-width viewport falls back to\n // the narrower ones, and every viewport to `itemsToShow`, the cascade the\n // stylesheet's `--bulma-carousel-items-to-show-*` defaults spell out.\n const counts = [\n itemsToShowFullhd,\n itemsToShowWidescreen,\n itemsToShowDesktop,\n itemsToShowTablet,\n itemsToShowMobile,\n ].map(wholeCount);\n const baseCount = wholeCount(itemsToShow);\n const viewport = useBulmaViewport(counts.some(c => c !== undefined));\n const inView =\n (viewport === MOBILE\n ? counts[MOBILE]\n : viewport >= 0\n ? counts.slice(viewport, MOBILE).find(c => c !== undefined)\n : undefined) ??\n baseCount ??\n 1;\n // The props as the stylesheet reads them, so the widths are right from\n // the first paint, on the server too.\n const countStyle: Record<string, number> = {};\n [...counts, baseCount].forEach((count, i) => {\n if (count !== undefined) {\n countStyle[`--bulma-carousel-items-to-show${COUNT_SUFFIXES[i]}`] =\n count;\n }\n });\n\n const scroll = Math.min(wholeCount(itemsToScroll) ?? 1, inView);\n const looping = repeat && itemCount > inView;\n const lastStart = Math.max(0, itemCount - inView);\n // Where the view can start: every `scroll` items from the first, and\n // without a loop the last full view as well, which is what keeps the\n // end of the track from showing empty space.\n const positions: number[] = [];\n for (let p = 0; p < (looping ? itemCount : lastStart); p += scroll) {\n positions.push(p);\n }\n if (!looping) positions.push(lastStart);\n const lastPosition = positions[positions.length - 1];\n const canMove = positions.length > 1;\n\n const wrap = (index: number) =>\n ((index % itemCount) + itemCount) % itemCount;\n const fit = (index: number) =>\n looping ? wrap(index) : Math.min(Math.max(index, 0), lastStart);\n\n // Use controlled or internal value, as a start the view can show\n const activeIndex = fit(controlledValue ?? internalValue);\n // The indicator for the last position at or before the first item in view\n const activePosition = positions.reduce(\n (found, position, index) => (position <= activeIndex ? index : found),\n 0\n );\n const nextIndex = positions[activePosition + 1];\n // From between two positions, the previous step is the one just behind\n const prevIndex =\n activeIndex > positions[activePosition]\n ? positions[activePosition]\n : positions[activePosition - 1];\n\n // Sync displayIndex when the value changes externally, or when the count\n // in view moves the start it fits to. Intentional external-prop sync that\n // must not run mid-wrap animation; covered by tests and certified\n // in-browser. Uncontrolled, the fitted start becomes the value too, so a\n // later change of count keeps what was first in view in view.\n useEffect(() => {\n if (!isWrapping) {\n // eslint-disable-next-line react-hooks/set-state-in-effect -- syncing to controlled prop\n setDisplayIndex(activeIndex);\n if (controlledValue === undefined) setInternalValue(activeIndex);\n }\n }, [activeIndex, isWrapping, controlledValue]);\n\n // Update active index\n const setActiveIndex = useCallback(\n (index: number) => {\n if (controlledValue === undefined) {\n setInternalValue(index);\n }\n setDisplayIndex(index);\n setIsWrapping(false);\n onChange?.(index);\n },\n [controlledValue, onChange]\n );\n\n // Navigation handlers\n const goToPrev = useCallback(() => {\n if (prevIndex !== undefined) {\n setActiveIndex(prevIndex);\n } else if (looping) {\n // Animate to the clones before the first item, which show the last\n // position, and snap to the real one when the transition ends\n setDisplayIndex(lastPosition - itemCount);\n setIsWrapping(true);\n }\n }, [prevIndex, looping, lastPosition, itemCount, setActiveIndex]);\n\n const goToNext = useCallback(() => {\n if (nextIndex !== undefined) {\n setActiveIndex(nextIndex);\n } else if (looping) {\n // Animate to the clones after the last item, which show the first\n // position, and snap to the real one when the transition ends\n setDisplayIndex(itemCount);\n setIsWrapping(true);\n }\n }, [nextIndex, looping, itemCount, setActiveIndex]);\n\n // Read when the timer fires or an arrow key arrives, so neither the\n // timer nor the key listener starts over while `onChange` changes\n // identity, as an inline one does on every render of the parent.\n const goToPrevRef = useLatestRef(goToPrev);\n const goToNextRef = useLatestRef(goToNext);\n\n // Auto-play. Each slide gets the whole interval, so a slide change,\n // autoplay's own or the user's, starts the timer over. A render that\n // leaves the slide where it is doesn't. It waits while focus is inside\n // an item, so what someone is reading or using doesn't move away. The\n // timer reads where focus is when it fires, rather than trusting the\n // last focus event alone: a browser moving focus off an element that\n // went inert need not fire one, and the pause would never end. A focus\n // change still starts the timer over, so an item gets the whole\n // interval once focus leaves it.\n const isPlaying =\n autoplay && (looping || nextIndex !== undefined) && !isPaused;\n const isRotating = isPlaying && !isFocusInside;\n\n useEffect(() => {\n if (!isPlaying) return undefined;\n\n const timer = setInterval(() => {\n const track = slidesRef.current;\n if (track?.contains(getActiveElementInTree(track))) return;\n if (isFocusInside) setIsFocusInside(false);\n goToNextRef.current();\n }, interval);\n\n return () => clearInterval(timer);\n }, [isPlaying, isFocusInside, interval, activeIndex, goToNextRef]);\n\n // Pause on hover\n const handleMouseEnter = useCallback(() => {\n if (pauseOnHover) {\n setIsPaused(true);\n }\n }, [pauseOnHover]);\n\n const handleMouseLeave = useCallback(() => {\n if (pauseOnHover) {\n setIsPaused(false);\n }\n }, [pauseOnHover]);\n\n // Drag handlers\n const handleDragStart = useCallback(\n (clientX: number) => {\n if (!hasDrag) return;\n setIsDragging(true);\n setDragStart(clientX);\n setDragOffset(0);\n },\n [hasDrag]\n );\n\n const handleDragMove = useCallback(\n (clientX: number) => {\n if (!isDragging) return;\n setDragOffset(clientX - dragStart);\n },\n [isDragging, dragStart]\n );\n\n const handleDragEnd = useCallback(() => {\n if (!isDragging) return;\n setIsDragging(false);\n\n const threshold = 50;\n if (dragOffset < -threshold) {\n goToNext();\n } else if (dragOffset > threshold) {\n goToPrev();\n }\n\n setDragOffset(0);\n }, [isDragging, dragOffset, goToNext, goToPrev]);\n\n // Mouse events\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n handleDragStart(e.clientX);\n },\n [handleDragStart]\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n handleDragMove(e.clientX);\n },\n [handleDragMove]\n );\n\n const handleMouseUp = useCallback(() => {\n handleDragEnd();\n }, [handleDragEnd]);\n\n // Touch events\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n handleDragStart(e.touches[0].clientX);\n },\n [handleDragStart]\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent) => {\n handleDragMove(e.touches[0].clientX);\n },\n [handleDragMove]\n );\n\n const handleTouchEnd = useCallback(() => {\n handleDragEnd();\n }, [handleDragEnd]);\n\n // Keyboard navigation, from the carousel's own controls. Inside an item\n // the keys are its content's (a field's caret, a slider), and a step\n // from there could take the focused item out of view.\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n const node = carouselRef.current;\n const active = getActiveElementInTree(node);\n if (!node?.contains(active) || slidesRef.current?.contains(active)) {\n return;\n }\n\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault();\n goToPrevRef.current();\n break;\n case 'ArrowRight':\n e.preventDefault();\n goToNextRef.current();\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [goToPrevRef, goToNextRef]);\n\n // Handle wrap-around transition end: the track's own, since an item's\n // content can end a transition of its own that bubbles up to here\n const handleTransitionEnd = useCallback(\n (e: React.TransitionEvent<HTMLDivElement>) => {\n if (isWrapping && e.target === e.currentTarget) {\n // Skip transition for the instant snap from the clones to the\n // real items they copy\n setSkipTransition(true);\n setActiveIndex(((displayIndex % itemCount) + itemCount) % itemCount);\n\n // Re-enable transition after the snap\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setSkipTransition(false);\n });\n });\n }\n },\n [isWrapping, displayIndex, itemCount, setActiveIndex]\n );\n\n // Combined ref\n const combinedRef = useCallback(\n (node: HTMLDivElement | null) => {\n (carouselRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node;\n if (typeof ref === 'function') {\n // React 19 lets a callback ref return a cleanup function and detaches by\n // running it instead of calling the ref with `null`; React 18 discards the\n // return value entirely. Returning it from here would be a React-19-only\n // contract, so we hold the cleanup and run it ourselves on detach — the\n // same shape as `Dropdown`, `Modal`, `Dialog`, `Sidebar` and `Toast`.\n // The form controls that merge a forwarded ref still discard the cleanup\n // and detach with `ref(null)`, so this is not yet library-wide — grep\n // `typeof ref === 'function'` for the current split.\n if (node === null) {\n const consumerCleanup = consumerCleanupRef.current;\n consumerCleanupRef.current = null;\n if (consumerCleanup) {\n consumerCleanup();\n } else {\n ref(null);\n }\n return;\n }\n const cleanup: unknown = ref(node);\n consumerCleanupRef.current =\n typeof cleanup === 'function' ? (cleanup as () => void) : null;\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n },\n [ref]\n );\n\n // Can navigate\n const canGoPrev = looping || prevIndex !== undefined;\n const canGoNext = looping || nextIndex !== undefined;\n\n // Generate classes\n const carouselClasses = usePrefixedClassNames('carousel', {\n 'is-overlay': overlayControls,\n 'has-arrow-hover': arrowHover,\n [`is-indicator-${indicatorStyle}`]: indicatorStyle !== 'dots',\n [`is-arrow-${arrowColor}`]: !!arrowColor,\n });\n const classPrefix = useClassPrefix();\n const carouselContainerClass = usePrefixedClassNames('carousel-container');\n const carouselSlidesClass = usePrefixedClassNames('carousel-slides');\n const carouselArrowPrevClass = usePrefixedClassNames(\n 'carousel-arrow',\n 'is-prev',\n { 'is-transparent': !arrowBackground }\n );\n const carouselArrowNextClass = usePrefixedClassNames(\n 'carousel-arrow',\n 'is-next',\n { 'is-transparent': !arrowBackground }\n );\n const carouselIndicatorClass = usePrefixedClassNames('carousel-indicator', {\n 'is-inside': indicatorInside,\n 'is-top': indicatorPosition === 'top',\n });\n\n const combinedClasses = classNames(\n carouselClasses,\n bulmaHelperClasses,\n className\n );\n\n // Where the track is drawn from: mid-wrap the clones, otherwise a start\n // the view can show, so a change in the count in view never paints\n // empty space while the sync above catches up.\n const shownIndex = isWrapping ? displayIndex : fit(displayIndex);\n // Enough clones on each side to fill the widest view any viewport sets,\n // since the stylesheet, not this count, sizes what's on screen\n const cloneCount = looping\n ? Math.min(\n itemCount,\n Math.max(baseCount ?? 1, ...counts.map(c => c ?? 1))\n )\n : 0;\n // The track: a full view's worth of clones of the last items, the items,\n // and clones of the first ones, for a seamless loop. Each entry is the\n // item it shows and its key.\n const slots: [number, React.Key][] = items.map((_, index) => [\n index,\n index,\n ]);\n for (let k = 0; k < cloneCount; k++) {\n slots.splice(k, 0, [itemCount - cloneCount + k, `clone-before-${k}`]);\n slots.push([k, `clone-after-${k}`]);\n }\n\n // Render slides with active state (includes clones for infinite loop).\n // What's in view is a run of slots, so where a looping view runs past\n // the last item, the clones on screen are the live copies and the items\n // they copy, off screen, are the hidden ones: no item is exposed twice,\n // and the copy exposed is the one in view.\n const renderSlides = () =>\n slots.map(([index, key], slot) => {\n const item = items[index];\n const own = item.props;\n const isShown =\n slot >= shownIndex + cloneCount &&\n slot < shownIndex + cloneCount + inView;\n return cloneElement(item, {\n key,\n active: isShown,\n role: own.role ?? 'group',\n 'aria-roledescription': own['aria-roledescription'] ?? 'slide',\n ...(own['aria-label'] || own['aria-labelledby']\n ? {}\n : { 'aria-label': `${index + 1} of ${itemCount}` }),\n // Out of view: hidden from assistive tech, and inert, so nothing\n // in it takes focus or a click\n ...(isShown ? {} : { 'aria-hidden': true, ...inertProps(true) }),\n });\n });\n\n // Hand focus on when the item holding it leaves the view. An item out\n // of view is inert, and a browser drops focus from an inert element to\n // the page, so a swipe, a change of count with the window's width, a new\n // controlled value or the item's removal would leave a keyboard or\n // screen reader user nowhere. Focus goes to the first item in view,\n // given `tabindex=\"-1\"` for it unless it has a tabindex of its own. A\n // layout effect runs before the browser gets to drop the focus; the\n // focused item's removal drops it at once, so focus on the page itself\n // still counts as the item's.\n useClientLayoutEffect(() => {\n const held = focusedItemRef.current;\n if (!held) return;\n const track = slidesRef.current as HTMLDivElement;\n const start = shownIndex + cloneCount;\n const slot = Array.prototype.indexOf.call(track.children, held);\n if (slot >= start && slot < start + inView) return;\n const active = getActiveElementInTree(track);\n if (active !== held.ownerDocument.body && !held.contains(active)) {\n return;\n }\n focusedItemRef.current = undefined;\n const first = track.children[start] as HTMLElement | undefined;\n if (!first) return;\n if (!first.hasAttribute('tabindex')) first.tabIndex = -1;\n first.focus({ preventScroll: true });\n }, [shownIndex, cloneCount, inView, itemCount]);\n\n return (\n <div\n ref={combinedRef}\n className={combinedClasses}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label={ariaLabel}\n style={{ ...countStyle, ...style }}\n {...rest}\n >\n <div\n ref={containerRef}\n className={carouselContainerClass}\n onMouseDown={hasDrag ? handleMouseDown : undefined}\n onMouseMove={hasDrag && isDragging ? handleMouseMove : undefined}\n onMouseUp={hasDrag ? handleMouseUp : undefined}\n onMouseLeave={hasDrag ? handleMouseUp : undefined}\n onTouchStart={hasDrag ? handleTouchStart : undefined}\n onTouchMove={hasDrag ? handleTouchMove : undefined}\n onTouchEnd={hasDrag ? handleTouchEnd : undefined}\n style={{\n transform: isDragging ? `translateX(${dragOffset}px)` : undefined,\n cursor: hasDrag ? (isDragging ? 'grabbing' : 'grab') : undefined,\n }}\n >\n <div\n ref={slidesRef}\n className={carouselSlidesClass}\n style={{\n // One item is the track's width plus a gap, over the count the\n // stylesheet has in view; account for the prepended clones\n transform: `translateX(calc(${-(shownIndex + cloneCount)} * (100% + var(--bulma-carousel-item-gap, 0px)) / var(--bulma-carousel-items-in-view, 1)))`,\n // Disable transition during drag or instant snap after wrap-around\n transition:\n isDragging || skipTransition\n ? 'none'\n : 'transform 0.3s ease-in-out',\n }}\n // Announce what comes into view, except while autoplay turns it\n aria-live={isRotating ? 'off' : 'polite'}\n onFocus={e => {\n setIsFocusInside(true);\n focusedItemRef.current = Array.from(\n e.currentTarget.children\n ).find(item => item.contains(e.target));\n }}\n onBlur={e => {\n const inside = e.currentTarget.contains(e.relatedTarget);\n setIsFocusInside(inside);\n if (!inside) focusedItemRef.current = undefined;\n }}\n onTransitionEnd={handleTransitionEnd}\n >\n {renderSlides()}\n </div>\n {arrow && canMove && (\n <>\n <Button\n type=\"button\"\n className={carouselArrowPrevClass}\n onClick={goToPrev}\n isDisabled={!canGoPrev}\n aria-label=\"Previous slide\"\n >\n {iconPrev ? (\n <Icon\n name={iconPrev}\n library={iconLibrary}\n variant={iconVariant}\n size={iconSize}\n features={iconFeatures}\n />\n ) : (\n <DefaultPrevIcon />\n )}\n </Button>\n <Button\n type=\"button\"\n className={carouselArrowNextClass}\n onClick={goToNext}\n isDisabled={!canGoNext}\n aria-label=\"Next slide\"\n >\n {iconNext ? (\n <Icon\n name={iconNext}\n library={iconLibrary}\n variant={iconVariant}\n size={iconSize}\n features={iconFeatures}\n />\n ) : (\n <DefaultNextIcon />\n )}\n </Button>\n </>\n )}\n </div>\n\n {indicator && canMove && (\n <div className={carouselIndicatorClass} role=\"tablist\">\n {positions.map((position, index) => (\n <Button\n key={position}\n type=\"button\"\n className={prefixedClassNames(classPrefix, 'indicator-item', {\n 'is-active': index === activePosition,\n })}\n onClick={() => setActiveIndex(position)}\n role=\"tab\"\n aria-selected={index === activePosition}\n aria-label={`Go to slide ${position + 1}`}\n />\n ))}\n </div>\n )}\n </div>\n );\n }\n);\n\nCarousel.displayName = 'Carousel';\n\nexport default Carousel;\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  /* @allxsmith/bestax-bulma — AI agents: see AGENTS.md in the package root, or https://bestax.io/llms.txt */
2
+ 'use client';
2
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
4
  import { useRef, useContext, useState, useId, useEffect, useCallback } from 'react';
4
5
  import { usePrefixedClassNames, classNames } from '../helpers/classNames.js';
@@ -1 +1 @@
1
- {"version":3,"file":"Collapse.js","sources":["../../../src/components/Collapse.tsx"],"sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useContext,\n useId,\n} from 'react';\nimport { classNames, usePrefixedClassNames } from '../helpers/classNames';\nimport { useBulmaClasses, BulmaClassesProps } from '../helpers/useBulmaClasses';\nimport { warnOnce } from '../helpers/devWarnings';\nimport { inertProps } from '../helpers/inertProps';\nimport { CollapsesItemContext } from './collapsesContext';\n\n/**\n * Props for the Collapse component.\n * @extraProp {React.ReactNode} [children] - The collapsible content.\n * @extraProp {string} [className] - Additional CSS classes.\n */\nexport interface CollapseProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'color'>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /**\n * Controlled open state. If provided, component is controlled, and the\n * trigger only reports through `onOpenChange`. Inside a `Collapses` group, a\n * Collapse that sets `open` stays yours: the group neither overrides it nor\n * closes it when another item opens.\n */\n open?: boolean;\n /** Initial open state for uncontrolled usage. Ignored inside a `Collapses` group, whose `defaultValue` decides. */\n defaultOpen?: boolean;\n /** Called when the trigger opens the Collapse. Fires only while the Collapse keeps its own state: not when `open` is set, and not when a `Collapses` group manages it. `onOpenChange` reports in every mode. */\n onOpen?: () => void;\n /** Called when the trigger closes the Collapse. Fires only while the Collapse keeps its own state: not when `open` is set, and not when a `Collapses` group manages it. `onOpenChange` reports in every mode. */\n onClose?: () => void;\n /** Called with the state the trigger asks for (`true` to open) each time it is clicked or activated with Enter or Space, in every mode. Pair it with `open` to let the trigger drive a controlled Collapse. */\n onOpenChange?: (open: boolean) => void;\n /** The clickable trigger element (header/button). */\n trigger?: React.ReactNode;\n /** Animation style, or `false` to disable. */\n animation?: 'fade' | 'slide' | false;\n /** Position of the trigger relative to content. */\n position?: 'top' | 'bottom';\n /**\n * Custom aria id for accessibility.\n * @defaultValue auto\n */\n ariaId?: string;\n /** Adds a border around the collapse. */\n bordered?: boolean;\n /** Additional classes for the trigger wrapper. */\n triggerClassName?: string;\n /** Additional classes for the content wrapper. */\n contentClassName?: string;\n}\n\n/**\n * The `Collapse` component provides an expandable/collapsible content panel.\n *\n * @function\n * @param {CollapseProps} props - Props for the Collapse component.\n * @returns {JSX.Element} The rendered collapse component.\n *\n * @example\n * // Basic uncontrolled collapse\n * <Collapse trigger={<button>Click to toggle</button>}>\n * <p>Collapsible content here</p>\n * </Collapse>\n *\n * @example\n * // Controlled collapse, driven by its own trigger\n * const [isOpen, setIsOpen] = useState(false);\n * <Collapse open={isOpen} onOpenChange={setIsOpen} trigger={<strong>Toggle</strong>}>\n * <p>Content</p>\n * </Collapse>\n *\n * @example\n * // With callbacks\n * <Collapse\n * trigger={<button>Toggle</button>}\n * onOpen={() => console.log('Opened!')}\n * onClose={() => console.log('Closed!')}\n * >\n * <p>Content</p>\n * </Collapse>\n */\nexport const Collapse: React.FC<CollapseProps> = ({\n open: controlledOpen,\n defaultOpen = false,\n onOpen,\n onClose,\n onOpenChange,\n trigger,\n animation = 'fade',\n position = 'top',\n ariaId,\n bordered,\n children,\n className,\n triggerClassName,\n contentClassName,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses(props);\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Three possible owners of the open state, in order: the caller when `open`\n // is set, an enclosing Collapses group, and this Collapse itself. A caller's\n // `open` wins over the group, which is how the group leaves such an item\n // alone.\n const isControlled = controlledOpen !== undefined;\n const group = useContext(CollapsesItemContext);\n const groupItem = isControlled ? null : group;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isOpen = controlledOpen ?? groupItem?.open ?? internalOpen;\n\n // A group owns the state of the items it manages, so these props do\n // nothing there. That is easy to miss, so development says which ones and\n // what to use instead, once per combination (the way Avatar keys its\n // warning), and `warnOnce` keeps production silent.\n if (groupItem) {\n const ignored = [\n defaultOpen && 'defaultOpen',\n onOpen && 'onOpen',\n onClose && 'onClose',\n ].filter((name): name is string => Boolean(name));\n if (ignored.length > 0) {\n const callbacks = ignored.filter(name => name !== 'defaultOpen');\n warnOnce(\n `Collapse:ignored-in-Collapses:${ignored.join('+')}`,\n `[bestax-bulma] <Collapse ${ignored.join(' ')}> inside <Collapses>: ` +\n [\n ignored.includes('defaultOpen') &&\n `defaultOpen has no effect, because the group decides which ` +\n `items start open. Pass the item's index in the group's ` +\n `defaultValue instead.`,\n callbacks.length > 0 &&\n `${callbacks.join(' and ')} never fire${callbacks.length > 1 ? '' : 's'}, ` +\n `because the group holds the item's open state. Use the ` +\n `item's onOpenChange, or the group's onChange, instead.`,\n ]\n .filter(Boolean)\n .join(' ')\n );\n }\n }\n\n // Start from the resolved state rather than `defaultOpen`, so an item that\n // mounts open through `open` or a group is not first painted (or rendered\n // on the server) at height 0 under the slide animation.\n const [height, setHeight] = useState<number | 'auto'>(isOpen ? 'auto' : 0);\n\n // Generate unique ID for accessibility (useId is SSR-safe and stable across\n // renders; works in React 18 and 19).\n const generatedId = useId();\n const uniqueId = ariaId || generatedId;\n\n // Update height when open state changes (for 'slide' animation)\n useEffect(() => {\n if (!contentRef.current) return undefined;\n if (animation !== 'slide') return undefined;\n\n if (isOpen) {\n // Opening: set height to content's scrollHeight\n const contentHeight = contentRef.current.scrollHeight;\n setHeight(contentHeight);\n\n // After animation completes, set to auto for dynamic content\n const timer = setTimeout(() => {\n setHeight('auto');\n }, 300); // Match CSS transition duration\n return () => clearTimeout(timer);\n } else {\n // Closing: first set to current height, then to 0\n if (height === 'auto') {\n // Read scrollHeight and offsetHeight to capture the current size and\n // force a layout flush, then schedule the height transition to 0.\n // (Reading offsetHeight after assignment is the standard reflow trick;\n // assigning into a state setter avoids a bare expression statement.)\n const currentHeight = contentRef.current.scrollHeight;\n const reflowHeight = contentRef.current.offsetHeight;\n setHeight(Math.max(currentHeight, reflowHeight));\n requestAnimationFrame(() => {\n setHeight(0);\n });\n } else {\n setHeight(0);\n }\n }\n return undefined;\n // `height` is read here but is an output of this effect; re-running when it\n // changes would re-trigger the open/close animation, so it's intentionally\n // excluded from the deps.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, animation]);\n\n // The trigger reports in every mode, then changes only the state this\n // Collapse owns. `onOpen`/`onClose` belong to that last case alone.\n const handleToggle = useCallback(() => {\n const next = !isOpen;\n onOpenChange?.(next);\n if (isControlled) return;\n if (groupItem) {\n groupItem.setOpen(next);\n return;\n }\n setInternalOpen(next);\n if (next) {\n onOpen?.();\n } else {\n onClose?.();\n }\n }, [isOpen, isControlled, groupItem, onOpenChange, onOpen, onClose]);\n\n // Handle keyboard interaction\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleToggle();\n }\n },\n [handleToggle]\n );\n\n // Generate Bulma classes\n const collapseClasses = usePrefixedClassNames('collapse', {\n 'is-active': isOpen,\n 'is-bordered': bordered,\n });\n\n const combinedClasses = classNames(\n collapseClasses,\n bulmaHelperClasses,\n className\n );\n const combinedTriggerClasses = classNames(\n usePrefixedClassNames('collapse-trigger'),\n triggerClassName\n );\n const combinedContentClasses = classNames(\n usePrefixedClassNames('collapse-content', {\n 'is-active': isOpen,\n }),\n contentClassName\n );\n\n // Content wrapper styles based on animation type\n let contentWrapperStyle: React.CSSProperties;\n\n if (animation === 'slide') {\n contentWrapperStyle = {\n height: height === 'auto' ? 'auto' : `${height}px`,\n overflow: 'hidden',\n transition: 'height 0.3s ease-in-out',\n };\n } else if (animation === 'fade') {\n contentWrapperStyle = {\n opacity: isOpen ? 1 : 0,\n overflow: 'hidden',\n height: isOpen ? 'auto' : 0,\n transition: 'opacity 0.3s ease-in-out',\n };\n } else {\n contentWrapperStyle = {\n display: isOpen ? 'block' : 'none',\n };\n }\n\n const triggerElement = (\n <div\n className={combinedTriggerClasses}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-expanded={isOpen}\n aria-controls={uniqueId}\n >\n {trigger}\n </div>\n );\n\n const contentElement = (\n <div style={contentWrapperStyle}>\n {/* A closed panel under `fade` or `slide` is only squeezed to height 0,\n so its links and fields would stay in the tab order. `inert` takes\n them out (and from pointer and find-in-page), matching\n `aria-hidden`, and costs the animations nothing. */}\n <div\n ref={contentRef}\n id={uniqueId}\n className={combinedContentClasses}\n aria-hidden={!isOpen}\n {...inertProps(!isOpen)}\n >\n {children}\n </div>\n </div>\n );\n\n // The group's item context stops here: a Collapse nested in this one's\n // content is not an item of this one's group.\n return (\n <CollapsesItemContext.Provider value={null}>\n <div className={combinedClasses} {...rest}>\n {position === 'bottom' ? (\n <>\n {contentElement}\n {triggerElement}\n </>\n ) : (\n <>\n {triggerElement}\n {contentElement}\n </>\n )}\n </div>\n </CollapsesItemContext.Provider>\n );\n};\n\nexport default Collapse;\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"Collapse.js","sources":["../../../src/components/Collapse.tsx"],"sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useContext,\n useId,\n} from 'react';\nimport { classNames, usePrefixedClassNames } from '../helpers/classNames';\nimport { useBulmaClasses, BulmaClassesProps } from '../helpers/useBulmaClasses';\nimport { warnOnce } from '../helpers/devWarnings';\nimport { inertProps } from '../helpers/inertProps';\nimport { CollapsesItemContext } from './collapsesContext';\n\n/**\n * Props for the Collapse component.\n * @extraProp {React.ReactNode} [children] - The collapsible content.\n * @extraProp {string} [className] - Additional CSS classes.\n */\nexport interface CollapseProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'color'>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /**\n * Controlled open state. If provided, component is controlled, and the\n * trigger only reports through `onOpenChange`. Inside a `Collapses` group, a\n * Collapse that sets `open` stays yours: the group neither overrides it nor\n * closes it when another item opens.\n */\n open?: boolean;\n /** Initial open state for uncontrolled usage. Ignored inside a `Collapses` group, whose `defaultValue` decides. */\n defaultOpen?: boolean;\n /** Called when the trigger opens the Collapse. Fires only while the Collapse keeps its own state: not when `open` is set, and not when a `Collapses` group manages it. `onOpenChange` reports in every mode. */\n onOpen?: () => void;\n /** Called when the trigger closes the Collapse. Fires only while the Collapse keeps its own state: not when `open` is set, and not when a `Collapses` group manages it. `onOpenChange` reports in every mode. */\n onClose?: () => void;\n /** Called with the state the trigger asks for (`true` to open) each time it is clicked or activated with Enter or Space, in every mode. Pair it with `open` to let the trigger drive a controlled Collapse. */\n onOpenChange?: (open: boolean) => void;\n /** The clickable trigger element (header/button). */\n trigger?: React.ReactNode;\n /** Animation style, or `false` to disable. */\n animation?: 'fade' | 'slide' | false;\n /** Position of the trigger relative to content. */\n position?: 'top' | 'bottom';\n /**\n * Custom aria id for accessibility.\n * @defaultValue auto\n */\n ariaId?: string;\n /** Adds a border around the collapse. */\n bordered?: boolean;\n /** Additional classes for the trigger wrapper. */\n triggerClassName?: string;\n /** Additional classes for the content wrapper. */\n contentClassName?: string;\n}\n\n/**\n * The `Collapse` component provides an expandable/collapsible content panel.\n *\n * @function\n * @param {CollapseProps} props - Props for the Collapse component.\n * @returns {JSX.Element} The rendered collapse component.\n *\n * @example\n * // Basic uncontrolled collapse\n * <Collapse trigger={<button>Click to toggle</button>}>\n * <p>Collapsible content here</p>\n * </Collapse>\n *\n * @example\n * // Controlled collapse, driven by its own trigger\n * const [isOpen, setIsOpen] = useState(false);\n * <Collapse open={isOpen} onOpenChange={setIsOpen} trigger={<strong>Toggle</strong>}>\n * <p>Content</p>\n * </Collapse>\n *\n * @example\n * // With callbacks\n * <Collapse\n * trigger={<button>Toggle</button>}\n * onOpen={() => console.log('Opened!')}\n * onClose={() => console.log('Closed!')}\n * >\n * <p>Content</p>\n * </Collapse>\n */\nexport const Collapse: React.FC<CollapseProps> = ({\n open: controlledOpen,\n defaultOpen = false,\n onOpen,\n onClose,\n onOpenChange,\n trigger,\n animation = 'fade',\n position = 'top',\n ariaId,\n bordered,\n children,\n className,\n triggerClassName,\n contentClassName,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses(props);\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Three possible owners of the open state, in order: the caller when `open`\n // is set, an enclosing Collapses group, and this Collapse itself. A caller's\n // `open` wins over the group, which is how the group leaves such an item\n // alone.\n const isControlled = controlledOpen !== undefined;\n const group = useContext(CollapsesItemContext);\n const groupItem = isControlled ? null : group;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isOpen = controlledOpen ?? groupItem?.open ?? internalOpen;\n\n // A group owns the state of the items it manages, so these props do\n // nothing there. That is easy to miss, so development says which ones and\n // what to use instead, once per combination (the way Avatar keys its\n // warning), and `warnOnce` keeps production silent.\n if (groupItem) {\n const ignored = [\n defaultOpen && 'defaultOpen',\n onOpen && 'onOpen',\n onClose && 'onClose',\n ].filter((name): name is string => Boolean(name));\n if (ignored.length > 0) {\n const callbacks = ignored.filter(name => name !== 'defaultOpen');\n warnOnce(\n `Collapse:ignored-in-Collapses:${ignored.join('+')}`,\n `[bestax-bulma] <Collapse ${ignored.join(' ')}> inside <Collapses>: ` +\n [\n ignored.includes('defaultOpen') &&\n `defaultOpen has no effect, because the group decides which ` +\n `items start open. Pass the item's index in the group's ` +\n `defaultValue instead.`,\n callbacks.length > 0 &&\n `${callbacks.join(' and ')} never fire${callbacks.length > 1 ? '' : 's'}, ` +\n `because the group holds the item's open state. Use the ` +\n `item's onOpenChange, or the group's onChange, instead.`,\n ]\n .filter(Boolean)\n .join(' ')\n );\n }\n }\n\n // Start from the resolved state rather than `defaultOpen`, so an item that\n // mounts open through `open` or a group is not first painted (or rendered\n // on the server) at height 0 under the slide animation.\n const [height, setHeight] = useState<number | 'auto'>(isOpen ? 'auto' : 0);\n\n // Generate unique ID for accessibility (useId is SSR-safe and stable across\n // renders; works in React 18 and 19).\n const generatedId = useId();\n const uniqueId = ariaId || generatedId;\n\n // Update height when open state changes (for 'slide' animation)\n useEffect(() => {\n if (!contentRef.current) return undefined;\n if (animation !== 'slide') return undefined;\n\n if (isOpen) {\n // Opening: set height to content's scrollHeight\n const contentHeight = contentRef.current.scrollHeight;\n setHeight(contentHeight);\n\n // After animation completes, set to auto for dynamic content\n const timer = setTimeout(() => {\n setHeight('auto');\n }, 300); // Match CSS transition duration\n return () => clearTimeout(timer);\n } else {\n // Closing: first set to current height, then to 0\n if (height === 'auto') {\n // Read scrollHeight and offsetHeight to capture the current size and\n // force a layout flush, then schedule the height transition to 0.\n // (Reading offsetHeight after assignment is the standard reflow trick;\n // assigning into a state setter avoids a bare expression statement.)\n const currentHeight = contentRef.current.scrollHeight;\n const reflowHeight = contentRef.current.offsetHeight;\n setHeight(Math.max(currentHeight, reflowHeight));\n requestAnimationFrame(() => {\n setHeight(0);\n });\n } else {\n setHeight(0);\n }\n }\n return undefined;\n // `height` is read here but is an output of this effect; re-running when it\n // changes would re-trigger the open/close animation, so it's intentionally\n // excluded from the deps.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, animation]);\n\n // The trigger reports in every mode, then changes only the state this\n // Collapse owns. `onOpen`/`onClose` belong to that last case alone.\n const handleToggle = useCallback(() => {\n const next = !isOpen;\n onOpenChange?.(next);\n if (isControlled) return;\n if (groupItem) {\n groupItem.setOpen(next);\n return;\n }\n setInternalOpen(next);\n if (next) {\n onOpen?.();\n } else {\n onClose?.();\n }\n }, [isOpen, isControlled, groupItem, onOpenChange, onOpen, onClose]);\n\n // Handle keyboard interaction\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleToggle();\n }\n },\n [handleToggle]\n );\n\n // Generate Bulma classes\n const collapseClasses = usePrefixedClassNames('collapse', {\n 'is-active': isOpen,\n 'is-bordered': bordered,\n });\n\n const combinedClasses = classNames(\n collapseClasses,\n bulmaHelperClasses,\n className\n );\n const combinedTriggerClasses = classNames(\n usePrefixedClassNames('collapse-trigger'),\n triggerClassName\n );\n const combinedContentClasses = classNames(\n usePrefixedClassNames('collapse-content', {\n 'is-active': isOpen,\n }),\n contentClassName\n );\n\n // Content wrapper styles based on animation type\n let contentWrapperStyle: React.CSSProperties;\n\n if (animation === 'slide') {\n contentWrapperStyle = {\n height: height === 'auto' ? 'auto' : `${height}px`,\n overflow: 'hidden',\n transition: 'height 0.3s ease-in-out',\n };\n } else if (animation === 'fade') {\n contentWrapperStyle = {\n opacity: isOpen ? 1 : 0,\n overflow: 'hidden',\n height: isOpen ? 'auto' : 0,\n transition: 'opacity 0.3s ease-in-out',\n };\n } else {\n contentWrapperStyle = {\n display: isOpen ? 'block' : 'none',\n };\n }\n\n const triggerElement = (\n <div\n className={combinedTriggerClasses}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-expanded={isOpen}\n aria-controls={uniqueId}\n >\n {trigger}\n </div>\n );\n\n const contentElement = (\n <div style={contentWrapperStyle}>\n {/* A closed panel under `fade` or `slide` is only squeezed to height 0,\n so its links and fields would stay in the tab order. `inert` takes\n them out (and from pointer and find-in-page), matching\n `aria-hidden`, and costs the animations nothing. */}\n <div\n ref={contentRef}\n id={uniqueId}\n className={combinedContentClasses}\n aria-hidden={!isOpen}\n {...inertProps(!isOpen)}\n >\n {children}\n </div>\n </div>\n );\n\n // The group's item context stops here: a Collapse nested in this one's\n // content is not an item of this one's group.\n return (\n <CollapsesItemContext.Provider value={null}>\n <div className={combinedClasses} {...rest}>\n {position === 'bottom' ? (\n <>\n {contentElement}\n {triggerElement}\n </>\n ) : (\n <>\n {triggerElement}\n {contentElement}\n </>\n )}\n </div>\n </CollapsesItemContext.Provider>\n );\n};\n\nexport default Collapse;\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  /* @allxsmith/bestax-bulma — AI agents: see AGENTS.md in the package root, or https://bestax.io/llms.txt */
2
+ 'use client';
2
3
  import { jsx } from 'react/jsx-runtime';
3
4
  import React, { useState } from 'react';
4
5
  import { usePrefixedClassNames, classNames } from '../helpers/classNames.js';
@@ -1 +1 @@
1
- {"version":3,"file":"Collapses.js","sources":["../../../src/components/Collapses.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { classNames, usePrefixedClassNames } from '../helpers/classNames';\nimport { withSubComponents } from '../helpers/withSubComponents';\nimport { useBulmaClasses, BulmaClassesProps } from '../helpers/useBulmaClasses';\nimport { Collapse } from './Collapse';\nimport { CollapsesItemContext } from './collapsesContext';\nimport { flattenChildren } from '../helpers/flattenChildren';\n\n/**\n * Props shared by both modes of the Collapses component.\n */\ninterface CollapsesBaseProps\n extends\n Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'color' | 'defaultValue' | 'onChange'\n >,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Joins the items into one block, with no gap between them and only the outer corners rounded. The joins show on `bordered` items. */\n seamless?: boolean;\n /** Additional CSS classes to apply. */\n className?: string;\n /** The `Collapse` items. Each child element is one item, indexed from 0 in order, with the children of a fragment counted one by one. A child that sets its own `open` keeps it: the group leaves that item alone. */\n children?: React.ReactNode;\n}\n\n/**\n * Props for Collapses in single mode, the accordion: opening one item closes the others.\n */\nexport interface CollapsesSingleProps extends CollapsesBaseProps {\n /**\n * Lets items open independently. Without it, opening one item closes the others.\n * @defaultValue false\n */\n multiple?: false;\n /** Controlled open items: the index of the open item, or `null` for none. With `multiple`, an array of indexes. An index is a position among the children, so rendering an item conditionally or reordering them moves the open state onto a neighbour: render every item and hide one with `visibility=\"hidden\"`, or keep `value` in step yourself. */\n value?: number | null;\n /** Open items for uncontrolled use, as an index or `null` (the default, none open). With `multiple`, an array of indexes, empty by default. Indexes are positions among the children, as for `value`. */\n defaultValue?: number | null;\n /** Called with the new open items each time a trigger asks for a change, whether or not `value` is set: an index or `null`, or with `multiple` an array of indexes in ascending order. Indexes are positions among the children, as for `value`. */\n onChange?: (value: number | null) => void;\n}\n\n/**\n * Props for Collapses with `multiple`: items open and close independently.\n */\nexport interface CollapsesMultipleProps extends CollapsesBaseProps {\n /**\n * Lets items open independently. Without it, opening one item closes the others.\n * @defaultValue false\n */\n multiple: true;\n /** Controlled open items: the index of the open item, or `null` for none. With `multiple`, an array of indexes. An index is a position among the children, so rendering an item conditionally or reordering them moves the open state onto a neighbour: render every item and hide one with `visibility=\"hidden\"`, or keep `value` in step yourself. */\n value?: number[];\n /** Open items for uncontrolled use, as an index or `null` (the default, none open). With `multiple`, an array of indexes, empty by default. Indexes are positions among the children, as for `value`. */\n defaultValue?: number[];\n /** Called with the new open items each time a trigger asks for a change, whether or not `value` is set: an index or `null`, or with `multiple` an array of indexes in ascending order. Indexes are positions among the children, as for `value`. */\n onChange?: (value: number[]) => void;\n}\n\n/**\n * Props for the Collapses component, a discriminated union on `multiple`: the open items are an index (or `null`) in single mode and an array of indexes with `multiple`.\n */\nexport type CollapsesProps = CollapsesSingleProps | CollapsesMultipleProps;\n\n/** Either mode's value as the list of open indexes. */\nfunction toIndexes(value: number | number[] | null | undefined): number[] {\n if (Array.isArray(value)) return value;\n return typeof value === 'number' ? [value] : [];\n}\n\n/**\n * The `Collapses` component groups `Collapse` items into an accordion that keeps one item open at a time, or any number with `multiple`.\n *\n * @function\n * @param {CollapsesProps} props - Props for the Collapses component.\n * @returns {JSX.Element} The rendered group.\n *\n * @example\n * // Accordion: one item open at a time, the first to start with\n * <Collapses defaultValue={0}>\n * <Collapse bordered trigger={<strong>Shipping</strong>}>…</Collapse>\n * <Collapse bordered trigger={<strong>Returns</strong>}>…</Collapse>\n * </Collapses>\n *\n * @example\n * // Controlled, with items that open independently\n * const [open, setOpen] = useState<number[]>([]);\n * <Collapses multiple value={open} onChange={setOpen}>…</Collapses>\n */\nconst CollapsesComponent: React.FC<CollapsesProps> = ({\n multiple = false,\n value,\n defaultValue,\n onChange,\n seamless = false,\n className,\n children,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({ ...props });\n\n // Controlled vs uncontrolled, as in Tabs. State is held as a list of open\n // indexes in both modes; `multiple` only decides how a change is computed\n // and which shape `onChange` receives.\n const isControlled = value !== undefined;\n const [internalOpen, setInternalOpen] = useState(() =>\n toIndexes(defaultValue)\n );\n const openIndexes = isControlled ? toIndexes(value) : internalOpen;\n\n // Each mode types `onChange` for its own shape, and the value built below\n // always matches `multiple`, the union's discriminant.\n const reportChange = onChange as\n ((next: number | number[] | null) => void) | undefined;\n\n const setItemOpen = (index: number, open: boolean) => {\n const others = openIndexes.filter(i => i !== index);\n // Single mode keeps at most one item open, so opening one drops the rest.\n // Ascending order, whatever order the items were opened in, so the value\n // reads and compares the same way however the user got there.\n const next = (\n open ? (multiple ? [...others, index] : [index]) : others\n ).sort((a, b) => a - b);\n if (!isControlled) setInternalOpen(next);\n reportChange?.(multiple ? next : (next[0] ?? null));\n };\n\n const groupClasses = usePrefixedClassNames('collapses', {\n 'is-seamless': seamless,\n });\n const combinedClasses = classNames(\n groupClasses,\n bulmaHelperClasses,\n className\n );\n\n const items: React.ReactNode[] = [];\n let index = 0;\n for (const child of flattenChildren(children)) {\n if (!React.isValidElement(child)) {\n items.push(child);\n continue;\n }\n const itemIndex = index;\n index += 1;\n items.push(\n <CollapsesItemContext.Provider\n key={child.key}\n value={{\n open: openIndexes.includes(itemIndex),\n setOpen: open => setItemOpen(itemIndex, open),\n }}\n >\n {child}\n </CollapsesItemContext.Provider>\n );\n }\n\n return (\n <div className={combinedClasses} {...rest}>\n {items}\n </div>\n );\n};\n\nexport const Collapses = withSubComponents(\n CollapsesComponent,\n { Collapse },\n 'Collapses'\n);\n\nexport default Collapses;\n"],"names":["_jsx"],"mappings":";;;;;;;;;;AAiEA;AACA,SAAS,SAAS,CAAC,KAA2C,EAAA;AAC5D,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;AACtC,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE;AACjD;AAEA;;;;;;;;;;;;;;;;;;AAkBG;AACH,MAAM,kBAAkB,GAA6B,CAAC,EACpD,QAAQ,GAAG,KAAK,EAChB,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,QAAQ,GAAG,KAAK,EAChB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,KAAI;AACH,IAAA,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;;;;AAKlE,IAAA,MAAM,YAAY,GAAG,KAAK,KAAK,SAAS;AACxC,IAAA,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,MAC/C,SAAS,CAAC,YAAY,CAAC,CACxB;AACD,IAAA,MAAM,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,YAAY;;;IAIlE,MAAM,YAAY,GAAG,QACmC;AAExD,IAAA,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,IAAa,KAAI;AACnD,QAAA,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;;;;QAInD,MAAM,IAAI,GAAG,CACX,IAAI,IAAI,QAAQ,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,MAAM,EACzD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACvB,QAAA,IAAI,CAAC,YAAY;YAAE,eAAe,CAAC,IAAI,CAAC;AACxC,QAAA,YAAY,GAAG,QAAQ,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AACrD,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAG,qBAAqB,CAAC,WAAW,EAAE;AACtD,QAAA,aAAa,EAAE,QAAQ;AACxB,KAAA,CAAC;IACF,MAAM,eAAe,GAAG,UAAU,CAChC,YAAY,EACZ,kBAAkB,EAClB,SAAS,CACV;IAED,MAAM,KAAK,GAAsB,EAAE;IACnC,IAAI,KAAK,GAAG,CAAC;IACb,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE;QAC7C,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;AAChC,YAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YACjB;QACF;QACA,MAAM,SAAS,GAAG,KAAK;QACvB,KAAK,IAAI,CAAC;QACV,KAAK,CAAC,IAAI,CACRA,GAAA,CAAC,oBAAoB,CAAC,QAAQ,EAAA,EAE5B,KAAK,EAAE;AACL,gBAAA,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;gBACrC,OAAO,EAAE,IAAI,IAAI,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC;AAC9C,aAAA,EAAA,QAAA,EAEA,KAAK,EAAA,EAND,KAAK,CAAC,GAAG,CAOgB,CACjC;IACH;IAEA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,eAAe,EAAA,GAAM,IAAI,EAAA,QAAA,EACtC,KAAK,EAAA,CACF;AAEV,CAAC;AAEM,MAAM,SAAS,GAAG,iBAAiB,CACxC,kBAAkB,EAClB,EAAE,QAAQ,EAAE,EACZ,WAAW;;"}
1
+ {"version":3,"file":"Collapses.js","sources":["../../../src/components/Collapses.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { classNames, usePrefixedClassNames } from '../helpers/classNames';\nimport { withSubComponents } from '../helpers/withSubComponents';\nimport { useBulmaClasses, BulmaClassesProps } from '../helpers/useBulmaClasses';\nimport { Collapse } from './Collapse';\nimport { CollapsesItemContext } from './collapsesContext';\nimport { flattenChildren } from '../helpers/flattenChildren';\n\n/**\n * Props shared by both modes of the Collapses component.\n */\ninterface CollapsesBaseProps\n extends\n Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'color' | 'defaultValue' | 'onChange'\n >,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Joins the items into one block, with no gap between them and only the outer corners rounded. The joins show on `bordered` items. */\n seamless?: boolean;\n /** Additional CSS classes to apply. */\n className?: string;\n /** The `Collapse` items. Each child element is one item, indexed from 0 in order, with the children of a fragment counted one by one. A child that sets its own `open` keeps it: the group leaves that item alone. */\n children?: React.ReactNode;\n}\n\n/**\n * Props for Collapses in single mode, the accordion: opening one item closes the others.\n */\nexport interface CollapsesSingleProps extends CollapsesBaseProps {\n /**\n * Lets items open independently. Without it, opening one item closes the others.\n * @defaultValue false\n */\n multiple?: false;\n /** Controlled open items: the index of the open item, or `null` for none. With `multiple`, an array of indexes. An index is a position among the children, so rendering an item conditionally or reordering them moves the open state onto a neighbour: render every item and hide one with `visibility=\"hidden\"`, or keep `value` in step yourself. */\n value?: number | null;\n /** Open items for uncontrolled use, as an index or `null` (the default, none open). With `multiple`, an array of indexes, empty by default. Indexes are positions among the children, as for `value`. */\n defaultValue?: number | null;\n /** Called with the new open items each time a trigger asks for a change, whether or not `value` is set: an index or `null`, or with `multiple` an array of indexes in ascending order. Indexes are positions among the children, as for `value`. */\n onChange?: (value: number | null) => void;\n}\n\n/**\n * Props for Collapses with `multiple`: items open and close independently.\n */\nexport interface CollapsesMultipleProps extends CollapsesBaseProps {\n /**\n * Lets items open independently. Without it, opening one item closes the others.\n * @defaultValue false\n */\n multiple: true;\n /** Controlled open items: the index of the open item, or `null` for none. With `multiple`, an array of indexes. An index is a position among the children, so rendering an item conditionally or reordering them moves the open state onto a neighbour: render every item and hide one with `visibility=\"hidden\"`, or keep `value` in step yourself. */\n value?: number[];\n /** Open items for uncontrolled use, as an index or `null` (the default, none open). With `multiple`, an array of indexes, empty by default. Indexes are positions among the children, as for `value`. */\n defaultValue?: number[];\n /** Called with the new open items each time a trigger asks for a change, whether or not `value` is set: an index or `null`, or with `multiple` an array of indexes in ascending order. Indexes are positions among the children, as for `value`. */\n onChange?: (value: number[]) => void;\n}\n\n/**\n * Props for the Collapses component, a discriminated union on `multiple`: the open items are an index (or `null`) in single mode and an array of indexes with `multiple`.\n */\nexport type CollapsesProps = CollapsesSingleProps | CollapsesMultipleProps;\n\n/** Either mode's value as the list of open indexes. */\nfunction toIndexes(value: number | number[] | null | undefined): number[] {\n if (Array.isArray(value)) return value;\n return typeof value === 'number' ? [value] : [];\n}\n\n/**\n * The `Collapses` component groups `Collapse` items into an accordion that keeps one item open at a time, or any number with `multiple`.\n *\n * @function\n * @param {CollapsesProps} props - Props for the Collapses component.\n * @returns {JSX.Element} The rendered group.\n *\n * @example\n * // Accordion: one item open at a time, the first to start with\n * <Collapses defaultValue={0}>\n * <Collapse bordered trigger={<strong>Shipping</strong>}>…</Collapse>\n * <Collapse bordered trigger={<strong>Returns</strong>}>…</Collapse>\n * </Collapses>\n *\n * @example\n * // Controlled, with items that open independently\n * const [open, setOpen] = useState<number[]>([]);\n * <Collapses multiple value={open} onChange={setOpen}>…</Collapses>\n */\nconst CollapsesComponent: React.FC<CollapsesProps> = ({\n multiple = false,\n value,\n defaultValue,\n onChange,\n seamless = false,\n className,\n children,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({ ...props });\n\n // Controlled vs uncontrolled, as in Tabs. State is held as a list of open\n // indexes in both modes; `multiple` only decides how a change is computed\n // and which shape `onChange` receives.\n const isControlled = value !== undefined;\n const [internalOpen, setInternalOpen] = useState(() =>\n toIndexes(defaultValue)\n );\n const openIndexes = isControlled ? toIndexes(value) : internalOpen;\n\n // Each mode types `onChange` for its own shape, and the value built below\n // always matches `multiple`, the union's discriminant.\n const reportChange = onChange as\n ((next: number | number[] | null) => void) | undefined;\n\n const setItemOpen = (index: number, open: boolean) => {\n const others = openIndexes.filter(i => i !== index);\n // Single mode keeps at most one item open, so opening one drops the rest.\n // Ascending order, whatever order the items were opened in, so the value\n // reads and compares the same way however the user got there.\n const next = (\n open ? (multiple ? [...others, index] : [index]) : others\n ).sort((a, b) => a - b);\n if (!isControlled) setInternalOpen(next);\n reportChange?.(multiple ? next : (next[0] ?? null));\n };\n\n const groupClasses = usePrefixedClassNames('collapses', {\n 'is-seamless': seamless,\n });\n const combinedClasses = classNames(\n groupClasses,\n bulmaHelperClasses,\n className\n );\n\n const items: React.ReactNode[] = [];\n let index = 0;\n for (const child of flattenChildren(children)) {\n if (!React.isValidElement(child)) {\n items.push(child);\n continue;\n }\n const itemIndex = index;\n index += 1;\n items.push(\n <CollapsesItemContext.Provider\n key={child.key}\n value={{\n open: openIndexes.includes(itemIndex),\n setOpen: open => setItemOpen(itemIndex, open),\n }}\n >\n {child}\n </CollapsesItemContext.Provider>\n );\n }\n\n return (\n <div className={combinedClasses} {...rest}>\n {items}\n </div>\n );\n};\n\nexport const Collapses = withSubComponents(\n CollapsesComponent,\n { Collapse },\n 'Collapses'\n);\n\nexport default Collapses;\n"],"names":["_jsx"],"mappings":";;;;;;;;;;;AAiEA;AACA,SAAS,SAAS,CAAC,KAA2C,EAAA;AAC5D,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;AACtC,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE;AACjD;AAEA;;;;;;;;;;;;;;;;;;AAkBG;AACH,MAAM,kBAAkB,GAA6B,CAAC,EACpD,QAAQ,GAAG,KAAK,EAChB,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,QAAQ,GAAG,KAAK,EAChB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,KAAI;AACH,IAAA,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;;;;AAKlE,IAAA,MAAM,YAAY,GAAG,KAAK,KAAK,SAAS;AACxC,IAAA,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,MAC/C,SAAS,CAAC,YAAY,CAAC,CACxB;AACD,IAAA,MAAM,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,YAAY;;;IAIlE,MAAM,YAAY,GAAG,QACmC;AAExD,IAAA,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,IAAa,KAAI;AACnD,QAAA,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;;;;QAInD,MAAM,IAAI,GAAG,CACX,IAAI,IAAI,QAAQ,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,MAAM,EACzD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACvB,QAAA,IAAI,CAAC,YAAY;YAAE,eAAe,CAAC,IAAI,CAAC;AACxC,QAAA,YAAY,GAAG,QAAQ,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AACrD,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAG,qBAAqB,CAAC,WAAW,EAAE;AACtD,QAAA,aAAa,EAAE,QAAQ;AACxB,KAAA,CAAC;IACF,MAAM,eAAe,GAAG,UAAU,CAChC,YAAY,EACZ,kBAAkB,EAClB,SAAS,CACV;IAED,MAAM,KAAK,GAAsB,EAAE;IACnC,IAAI,KAAK,GAAG,CAAC;IACb,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE;QAC7C,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;AAChC,YAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YACjB;QACF;QACA,MAAM,SAAS,GAAG,KAAK;QACvB,KAAK,IAAI,CAAC;QACV,KAAK,CAAC,IAAI,CACRA,GAAA,CAAC,oBAAoB,CAAC,QAAQ,EAAA,EAE5B,KAAK,EAAE;AACL,gBAAA,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;gBACrC,OAAO,EAAE,IAAI,IAAI,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC;AAC9C,aAAA,EAAA,QAAA,EAEA,KAAK,EAAA,EAND,KAAK,CAAC,GAAG,CAOgB,CACjC;IACH;IAEA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,eAAe,EAAA,GAAM,IAAI,EAAA,QAAA,EACtC,KAAK,EAAA,CACF;AAEV,CAAC;AAEM,MAAM,SAAS,GAAG,iBAAiB,CACxC,kBAAkB,EAClB,EAAE,QAAQ,EAAE,EACZ,WAAW;;"}