@allxsmith/bestax-bulma 5.26.6 → 5.27.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 (342) hide show
  1. package/dist/bestax.css +1 -1
  2. package/dist/bestax.css.map +1 -1
  3. package/dist/esm/columns/Column.js +48 -0
  4. package/dist/esm/columns/Column.js.map +1 -0
  5. package/dist/esm/columns/Columns.js +53 -0
  6. package/dist/esm/columns/Columns.js.map +1 -0
  7. package/dist/esm/components/Avatar.js +299 -0
  8. package/dist/esm/components/Avatar.js.map +1 -0
  9. package/dist/esm/components/Avatars.js +81 -0
  10. package/dist/esm/components/Avatars.js.map +1 -0
  11. package/dist/esm/components/Badge.js +105 -0
  12. package/dist/esm/components/Badge.js.map +1 -0
  13. package/dist/esm/components/Breadcrumb.js +36 -0
  14. package/dist/esm/components/Breadcrumb.js.map +1 -0
  15. package/dist/esm/components/Card.js +252 -0
  16. package/dist/esm/components/Card.js.map +1 -0
  17. package/dist/esm/components/Carousel.js +351 -0
  18. package/dist/esm/components/Carousel.js.map +1 -0
  19. package/dist/esm/components/Collapse.js +193 -0
  20. package/dist/esm/components/Collapse.js.map +1 -0
  21. package/dist/esm/components/Collapses.js +99 -0
  22. package/dist/esm/components/Collapses.js.map +1 -0
  23. package/dist/esm/components/Dialog.js +230 -0
  24. package/dist/esm/components/Dialog.js.map +1 -0
  25. package/dist/esm/components/Dropdown.js +362 -0
  26. package/dist/esm/components/Dropdown.js.map +1 -0
  27. package/dist/esm/components/Loading.js +87 -0
  28. package/dist/esm/components/Loading.js.map +1 -0
  29. package/dist/esm/components/Menu.js +117 -0
  30. package/dist/esm/components/Menu.js.map +1 -0
  31. package/dist/esm/components/Message.js +56 -0
  32. package/dist/esm/components/Message.js.map +1 -0
  33. package/dist/esm/components/Modal.js +354 -0
  34. package/dist/esm/components/Modal.js.map +1 -0
  35. package/dist/esm/components/Navbar.js +287 -0
  36. package/dist/esm/components/Navbar.js.map +1 -0
  37. package/dist/esm/components/Pagination.js +191 -0
  38. package/dist/esm/components/Pagination.js.map +1 -0
  39. package/dist/esm/components/Panel.js +100 -0
  40. package/dist/esm/components/Panel.js.map +1 -0
  41. package/dist/esm/components/Popover.js +298 -0
  42. package/dist/esm/components/Popover.js.map +1 -0
  43. package/dist/esm/components/Reveal.js +157 -0
  44. package/dist/esm/components/Reveal.js.map +1 -0
  45. package/dist/esm/components/Sidebar.js +209 -0
  46. package/dist/esm/components/Sidebar.js.map +1 -0
  47. package/dist/esm/components/Steps.js +128 -0
  48. package/dist/esm/components/Steps.js.map +1 -0
  49. package/dist/esm/components/Tabs.js +335 -0
  50. package/dist/esm/components/Tabs.js.map +1 -0
  51. package/dist/esm/components/Toast.js +322 -0
  52. package/dist/esm/components/Toast.js.map +1 -0
  53. package/dist/esm/components/Tooltip.js +202 -0
  54. package/dist/esm/components/Tooltip.js.map +1 -0
  55. package/dist/esm/components/collapsesContext.js +12 -0
  56. package/dist/esm/components/collapsesContext.js.map +1 -0
  57. package/dist/esm/elements/Block.js +29 -0
  58. package/dist/esm/elements/Block.js.map +1 -0
  59. package/dist/esm/elements/Box.js +32 -0
  60. package/dist/esm/elements/Box.js.map +1 -0
  61. package/dist/esm/elements/Button.js +139 -0
  62. package/dist/esm/elements/Button.js.map +1 -0
  63. package/dist/esm/elements/Buttons.js +42 -0
  64. package/dist/esm/elements/Buttons.js.map +1 -0
  65. package/dist/esm/elements/Code.js +25 -0
  66. package/dist/esm/elements/Code.js.map +1 -0
  67. package/dist/esm/elements/Content.js +33 -0
  68. package/dist/esm/elements/Content.js.map +1 -0
  69. package/dist/esm/elements/Delete.js +35 -0
  70. package/dist/esm/elements/Delete.js.map +1 -0
  71. package/dist/esm/elements/Divider.js +27 -0
  72. package/dist/esm/elements/Divider.js.map +1 -0
  73. package/dist/esm/elements/Emphasis.js +25 -0
  74. package/dist/esm/elements/Emphasis.js.map +1 -0
  75. package/dist/esm/elements/Figure.js +58 -0
  76. package/dist/esm/elements/Figure.js.map +1 -0
  77. package/dist/esm/elements/Icon.js +256 -0
  78. package/dist/esm/elements/Icon.js.map +1 -0
  79. package/dist/esm/elements/IconText.js +36 -0
  80. package/dist/esm/elements/IconText.js.map +1 -0
  81. package/dist/esm/elements/Image.js +46 -0
  82. package/dist/esm/elements/Image.js.map +1 -0
  83. package/dist/esm/elements/Link.js +36 -0
  84. package/dist/esm/elements/Link.js.map +1 -0
  85. package/dist/esm/elements/LinkButton.js +37 -0
  86. package/dist/esm/elements/LinkButton.js.map +1 -0
  87. package/dist/esm/elements/ListItem.js +28 -0
  88. package/dist/esm/elements/ListItem.js.map +1 -0
  89. package/dist/esm/elements/Loader.js +37 -0
  90. package/dist/esm/elements/Loader.js.map +1 -0
  91. package/dist/esm/elements/Notification.js +316 -0
  92. package/dist/esm/elements/Notification.js.map +1 -0
  93. package/dist/esm/elements/OrderedList.js +31 -0
  94. package/dist/esm/elements/OrderedList.js.map +1 -0
  95. package/dist/esm/elements/Paragraph.js +28 -0
  96. package/dist/esm/elements/Paragraph.js.map +1 -0
  97. package/dist/esm/elements/Pre.js +25 -0
  98. package/dist/esm/elements/Pre.js.map +1 -0
  99. package/dist/esm/elements/Progress.js +33 -0
  100. package/dist/esm/elements/Progress.js.map +1 -0
  101. package/dist/esm/elements/Skeleton.js +30 -0
  102. package/dist/esm/elements/Skeleton.js.map +1 -0
  103. package/dist/esm/elements/Span.js +28 -0
  104. package/dist/esm/elements/Span.js.map +1 -0
  105. package/dist/esm/elements/Strong.js +25 -0
  106. package/dist/esm/elements/Strong.js.map +1 -0
  107. package/dist/esm/elements/SubTitle.js +51 -0
  108. package/dist/esm/elements/SubTitle.js.map +1 -0
  109. package/dist/esm/elements/Table.js +51 -0
  110. package/dist/esm/elements/Table.js.map +1 -0
  111. package/dist/esm/elements/Tag.js +49 -0
  112. package/dist/esm/elements/Tag.js.map +1 -0
  113. package/dist/esm/elements/Tags.js +34 -0
  114. package/dist/esm/elements/Tags.js.map +1 -0
  115. package/dist/esm/elements/Tbody.js +26 -0
  116. package/dist/esm/elements/Tbody.js.map +1 -0
  117. package/dist/esm/elements/Td.js +61 -0
  118. package/dist/esm/elements/Td.js.map +1 -0
  119. package/dist/esm/elements/Tfoot.js +26 -0
  120. package/dist/esm/elements/Tfoot.js.map +1 -0
  121. package/dist/esm/elements/Th.js +34 -0
  122. package/dist/esm/elements/Th.js.map +1 -0
  123. package/dist/esm/elements/Thead.js +26 -0
  124. package/dist/esm/elements/Thead.js.map +1 -0
  125. package/dist/esm/elements/Title.js +44 -0
  126. package/dist/esm/elements/Title.js.map +1 -0
  127. package/dist/esm/elements/Tr.js +31 -0
  128. package/dist/esm/elements/Tr.js.map +1 -0
  129. package/dist/esm/elements/UnorderedList.js +31 -0
  130. package/dist/esm/elements/UnorderedList.js.map +1 -0
  131. package/dist/esm/elements/iconProps.js +49 -0
  132. package/dist/esm/elements/iconProps.js.map +1 -0
  133. package/dist/esm/form/Autocomplete.js +279 -0
  134. package/dist/esm/form/Autocomplete.js.map +1 -0
  135. package/dist/esm/form/Checkbox.js +111 -0
  136. package/dist/esm/form/Checkbox.js.map +1 -0
  137. package/dist/esm/form/Checkboxes.js +89 -0
  138. package/dist/esm/form/Checkboxes.js.map +1 -0
  139. package/dist/esm/form/Control.js +79 -0
  140. package/dist/esm/form/Control.js.map +1 -0
  141. package/dist/esm/form/DateInput.js +87 -0
  142. package/dist/esm/form/DateInput.js.map +1 -0
  143. package/dist/esm/form/DateInputBase.js +263 -0
  144. package/dist/esm/form/DateInputBase.js.map +1 -0
  145. package/dist/esm/form/DateRangeInput.js +76 -0
  146. package/dist/esm/form/DateRangeInput.js.map +1 -0
  147. package/dist/esm/form/DateRangeInputBase.js +301 -0
  148. package/dist/esm/form/DateRangeInputBase.js.map +1 -0
  149. package/dist/esm/form/DateTimeInput.js +87 -0
  150. package/dist/esm/form/DateTimeInput.js.map +1 -0
  151. package/dist/esm/form/DateTimeInputBase.js +333 -0
  152. package/dist/esm/form/DateTimeInputBase.js.map +1 -0
  153. package/dist/esm/form/Field.js +153 -0
  154. package/dist/esm/form/Field.js.map +1 -0
  155. package/dist/esm/form/File.js +109 -0
  156. package/dist/esm/form/File.js.map +1 -0
  157. package/dist/esm/form/FormContext.js +170 -0
  158. package/dist/esm/form/FormContext.js.map +1 -0
  159. package/dist/esm/form/Input.js +88 -0
  160. package/dist/esm/form/Input.js.map +1 -0
  161. package/dist/esm/form/InputBase.js +40 -0
  162. package/dist/esm/form/InputBase.js.map +1 -0
  163. package/dist/esm/form/Numberinput.js +199 -0
  164. package/dist/esm/form/Numberinput.js.map +1 -0
  165. package/dist/esm/form/Radio.js +108 -0
  166. package/dist/esm/form/Radio.js.map +1 -0
  167. package/dist/esm/form/Radios.js +91 -0
  168. package/dist/esm/form/Radios.js.map +1 -0
  169. package/dist/esm/form/Rate.js +279 -0
  170. package/dist/esm/form/Rate.js.map +1 -0
  171. package/dist/esm/form/Select.js +81 -0
  172. package/dist/esm/form/Select.js.map +1 -0
  173. package/dist/esm/form/SelectBase.js +54 -0
  174. package/dist/esm/form/SelectBase.js.map +1 -0
  175. package/dist/esm/form/Slider.js +459 -0
  176. package/dist/esm/form/Slider.js.map +1 -0
  177. package/dist/esm/form/Switch.js +96 -0
  178. package/dist/esm/form/Switch.js.map +1 -0
  179. package/dist/esm/form/Taginput.js +352 -0
  180. package/dist/esm/form/Taginput.js.map +1 -0
  181. package/dist/esm/form/TextArea.js +77 -0
  182. package/dist/esm/form/TextArea.js.map +1 -0
  183. package/dist/esm/form/TextAreaBase.js +45 -0
  184. package/dist/esm/form/TextAreaBase.js.map +1 -0
  185. package/dist/esm/form/TimeInput.js +83 -0
  186. package/dist/esm/form/TimeInput.js.map +1 -0
  187. package/dist/esm/form/TimeInputBase.js +246 -0
  188. package/dist/esm/form/TimeInputBase.js.map +1 -0
  189. package/dist/esm/form/_pickerInternals/Calendar.js +760 -0
  190. package/dist/esm/form/_pickerInternals/Calendar.js.map +1 -0
  191. package/dist/esm/form/_pickerInternals/PickerPopover.js +95 -0
  192. package/dist/esm/form/_pickerInternals/PickerPopover.js.map +1 -0
  193. package/dist/esm/form/_pickerInternals/TimeWheels.js +721 -0
  194. package/dist/esm/form/_pickerInternals/TimeWheels.js.map +1 -0
  195. package/dist/esm/form/_pickerInternals/audioTick.js +109 -0
  196. package/dist/esm/form/_pickerInternals/audioTick.js.map +1 -0
  197. package/dist/esm/form/_pickerInternals/dateUtils.js +267 -0
  198. package/dist/esm/form/_pickerInternals/dateUtils.js.map +1 -0
  199. package/dist/esm/form/_pickerInternals/formatters.js +322 -0
  200. package/dist/esm/form/_pickerInternals/formatters.js.map +1 -0
  201. package/dist/esm/form/_pickerInternals/haptics.js +38 -0
  202. package/dist/esm/form/_pickerInternals/haptics.js.map +1 -0
  203. package/dist/esm/form/_pickerInternals/nativeInputSupport.js +25 -0
  204. package/dist/esm/form/_pickerInternals/nativeInputSupport.js.map +1 -0
  205. package/dist/esm/form/_pickerInternals/pickerTypes.js +50 -0
  206. package/dist/esm/form/_pickerInternals/pickerTypes.js.map +1 -0
  207. package/dist/esm/form/_pickerInternals/segmentMap.js +315 -0
  208. package/dist/esm/form/_pickerInternals/segmentMap.js.map +1 -0
  209. package/dist/esm/form/_pickerInternals/useNativeMobilePicker.js +49 -0
  210. package/dist/esm/form/_pickerInternals/useNativeMobilePicker.js.map +1 -0
  211. package/dist/esm/form/_pickerInternals/useSegmentedEntry.js +427 -0
  212. package/dist/esm/form/_pickerInternals/useSegmentedEntry.js.map +1 -0
  213. package/dist/esm/form/controlLoading.js +18 -0
  214. package/dist/esm/form/controlLoading.js.map +1 -0
  215. package/dist/esm/form/useAutoLabelId.js +54 -0
  216. package/dist/esm/form/useAutoLabelId.js.map +1 -0
  217. package/dist/esm/grid/Cell.js +35 -0
  218. package/dist/esm/grid/Cell.js.map +1 -0
  219. package/dist/esm/grid/Grid.js +51 -0
  220. package/dist/esm/grid/Grid.js.map +1 -0
  221. package/dist/esm/helpers/ClientOnly.js +33 -0
  222. package/dist/esm/helpers/ClientOnly.js.map +1 -0
  223. package/dist/esm/helpers/Config.js +60 -0
  224. package/dist/esm/helpers/Config.js.map +1 -0
  225. package/dist/esm/helpers/Theme.js +947 -0
  226. package/dist/esm/helpers/Theme.js.map +1 -0
  227. package/dist/esm/helpers/anchorAttrs.js +72 -0
  228. package/dist/esm/helpers/anchorAttrs.js.map +1 -0
  229. package/dist/esm/helpers/bulmaClassHelpers.js +415 -0
  230. package/dist/esm/helpers/bulmaClassHelpers.js.map +1 -0
  231. package/dist/esm/helpers/buttonType.js +24 -0
  232. package/dist/esm/helpers/buttonType.js.map +1 -0
  233. package/dist/esm/helpers/classNames.js +137 -0
  234. package/dist/esm/helpers/classNames.js.map +1 -0
  235. package/dist/esm/helpers/colorDeprecations.js +50 -0
  236. package/dist/esm/helpers/colorDeprecations.js.map +1 -0
  237. package/dist/esm/helpers/devWarnings.js +27 -0
  238. package/dist/esm/helpers/devWarnings.js.map +1 -0
  239. package/dist/esm/helpers/inertProps.js +27 -0
  240. package/dist/esm/helpers/inertProps.js.map +1 -0
  241. package/dist/esm/helpers/mergeBulmaStyles.js +20 -0
  242. package/dist/esm/helpers/mergeBulmaStyles.js.map +1 -0
  243. package/dist/esm/helpers/polymorphic.js +18 -0
  244. package/dist/esm/helpers/polymorphic.js.map +1 -0
  245. package/dist/esm/helpers/portal.js +76 -0
  246. package/dist/esm/helpers/portal.js.map +1 -0
  247. package/dist/esm/helpers/positionStacks.js +45 -0
  248. package/dist/esm/helpers/positionStacks.js.map +1 -0
  249. package/dist/esm/helpers/scrollLock.js +38 -0
  250. package/dist/esm/helpers/scrollLock.js.map +1 -0
  251. package/dist/esm/helpers/shadowDom.js +71 -0
  252. package/dist/esm/helpers/shadowDom.js.map +1 -0
  253. package/dist/esm/helpers/statusRegion.js +282 -0
  254. package/dist/esm/helpers/statusRegion.js.map +1 -0
  255. package/dist/esm/helpers/useAnchoredPosition.js +86 -0
  256. package/dist/esm/helpers/useAnchoredPosition.js.map +1 -0
  257. package/dist/esm/helpers/useBulmaClasses.js +158 -0
  258. package/dist/esm/helpers/useBulmaClasses.js.map +1 -0
  259. package/dist/esm/helpers/useClientLayoutEffect.js +13 -0
  260. package/dist/esm/helpers/useClientLayoutEffect.js.map +1 -0
  261. package/dist/esm/helpers/useColorClasses.js +84 -0
  262. package/dist/esm/helpers/useColorClasses.js.map +1 -0
  263. package/dist/esm/helpers/useFlexboxClasses.js +92 -0
  264. package/dist/esm/helpers/useFlexboxClasses.js.map +1 -0
  265. package/dist/esm/helpers/useFocusTrap.js +470 -0
  266. package/dist/esm/helpers/useFocusTrap.js.map +1 -0
  267. package/dist/esm/helpers/useIsHydrated.js +31 -0
  268. package/dist/esm/helpers/useIsHydrated.js.map +1 -0
  269. package/dist/esm/helpers/useOtherClasses.js +115 -0
  270. package/dist/esm/helpers/useOtherClasses.js.map +1 -0
  271. package/dist/esm/helpers/useSpacingClasses.js +82 -0
  272. package/dist/esm/helpers/useSpacingClasses.js.map +1 -0
  273. package/dist/esm/helpers/useTypographyClasses.js +93 -0
  274. package/dist/esm/helpers/useTypographyClasses.js.map +1 -0
  275. package/dist/esm/helpers/useVisibilityClasses.js +134 -0
  276. package/dist/esm/helpers/useVisibilityClasses.js.map +1 -0
  277. package/dist/esm/helpers/withSubComponents.js +24 -0
  278. package/dist/esm/helpers/withSubComponents.js.map +1 -0
  279. package/dist/esm/layout/Container.js +48 -0
  280. package/dist/esm/layout/Container.js.map +1 -0
  281. package/dist/esm/layout/Footer.js +33 -0
  282. package/dist/esm/layout/Footer.js.map +1 -0
  283. package/dist/esm/layout/Hero.js +90 -0
  284. package/dist/esm/layout/Hero.js.map +1 -0
  285. package/dist/esm/layout/Level.js +110 -0
  286. package/dist/esm/layout/Level.js.map +1 -0
  287. package/dist/esm/layout/Media.js +86 -0
  288. package/dist/esm/layout/Media.js.map +1 -0
  289. package/dist/esm/layout/Section.js +30 -0
  290. package/dist/esm/layout/Section.js.map +1 -0
  291. package/dist/extras.css +1 -1
  292. package/dist/extras.css.map +1 -1
  293. package/dist/index.cjs +821 -102
  294. package/dist/index.cjs.map +1 -1
  295. package/dist/index.esm.js +115 -16845
  296. package/dist/index.esm.js.map +1 -1
  297. package/dist/types/components/Tabs.d.ts +25 -3
  298. package/dist/types/elements/Icon.d.ts +10 -7
  299. package/dist/types/form/DateInputBase.d.ts +8 -6
  300. package/dist/types/form/DateRangeInput.d.ts +91 -0
  301. package/dist/types/form/DateRangeInputBase.d.ts +172 -0
  302. package/dist/types/form/DateTimeInputBase.d.ts +10 -6
  303. package/dist/types/form/File.d.ts +18 -5
  304. package/dist/types/form/FormContext.d.ts +11 -0
  305. package/dist/types/form/TimeInputBase.d.ts +1 -1
  306. package/dist/types/form/_pickerInternals/PickerPopover.d.ts +1 -0
  307. package/dist/types/form/_pickerInternals/dateUtils.d.ts +7 -0
  308. package/dist/types/form/_pickerInternals/formatters.d.ts +14 -0
  309. package/dist/types/form/_pickerInternals/pickerTypes.d.ts +13 -0
  310. package/dist/types/form/_pickerInternals/useSegmentedEntry.d.ts +12 -3
  311. package/dist/types/index.d.ts +4 -0
  312. package/dist/types-cjs/components/Tabs.d.ts +25 -3
  313. package/dist/types-cjs/elements/Icon.d.ts +10 -7
  314. package/dist/types-cjs/form/DateInputBase.d.ts +8 -6
  315. package/dist/types-cjs/form/DateRangeInput.d.ts +91 -0
  316. package/dist/types-cjs/form/DateRangeInputBase.d.ts +172 -0
  317. package/dist/types-cjs/form/DateTimeInputBase.d.ts +10 -6
  318. package/dist/types-cjs/form/File.d.ts +18 -5
  319. package/dist/types-cjs/form/FormContext.d.ts +11 -0
  320. package/dist/types-cjs/form/TimeInputBase.d.ts +1 -1
  321. package/dist/types-cjs/form/_pickerInternals/PickerPopover.d.ts +1 -0
  322. package/dist/types-cjs/form/_pickerInternals/dateUtils.d.ts +7 -0
  323. package/dist/types-cjs/form/_pickerInternals/formatters.d.ts +14 -0
  324. package/dist/types-cjs/form/_pickerInternals/pickerTypes.d.ts +13 -0
  325. package/dist/types-cjs/form/_pickerInternals/useSegmentedEntry.d.ts +12 -3
  326. package/dist/types-cjs/index.d.ts +4 -0
  327. package/dist/versions/bestax-no-dark-mode.css +1 -1
  328. package/dist/versions/bestax-no-dark-mode.css.map +1 -1
  329. package/dist/versions/bestax-no-helpers-prefixed.css +1 -1
  330. package/dist/versions/bestax-no-helpers-prefixed.css.map +1 -1
  331. package/dist/versions/bestax-no-helpers.css +1 -1
  332. package/dist/versions/bestax-no-helpers.css.map +1 -1
  333. package/dist/versions/bestax-prefixed.css +1 -1
  334. package/dist/versions/bestax-prefixed.css.map +1 -1
  335. package/package.json +1 -1
  336. package/src/scss/components/_tabs.scss +44 -0
  337. package/src/scss/form/_dateinput.scss +87 -8
  338. package/src/scss/form/_daterangeinput.scss +63 -0
  339. package/src/scss/form/_datetimeinput.scss +7 -2
  340. package/src/scss/form/_file.scss +37 -0
  341. package/src/scss/form/_index.scss +2 -0
  342. package/src/scss/form/_picker-popover.scss +1 -4
@@ -0,0 +1,335 @@
1
+ /* @allxsmith/bestax-bulma — AI agents: see AGENTS.md in the package root, or https://bestax.io/llms.txt */
2
+ import { jsx, jsxs } from 'react/jsx-runtime';
3
+ import React, { createContext, useEffect, useRef, useCallback, useState, useId, useContext } from 'react';
4
+ import { usePrefixedClassNames, classNames } from '../helpers/classNames.js';
5
+ import { withSubComponents } from '../helpers/withSubComponents.js';
6
+ import { useBulmaClasses } from '../helpers/useBulmaClasses.js';
7
+ import { warnDeprecatedColorProp } from '../helpers/colorDeprecations.js';
8
+ import { Icon } from '../elements/Icon.js';
9
+
10
+ const TabsContext = createContext(null);
11
+ function useTabsContext() {
12
+ return useContext(TabsContext);
13
+ }
14
+ /**
15
+ * The tabs and panels currently mounted under one `Tabs`. Each registers from
16
+ * an effect and removes itself on cleanup, so the links between them only
17
+ * ever name elements that exist, wherever in the tree the panels sit.
18
+ */
19
+ function useRegistry() {
20
+ const [records, setRecords] = useState([]);
21
+ const register = useCallback((record) => {
22
+ setRecords(prev => [...prev, record]);
23
+ return () => setRecords(prev => prev.filter(r => r !== record));
24
+ }, []);
25
+ return [records, register];
26
+ }
27
+ /**
28
+ * The list a tab belongs to: its `role="tablist"` ancestor, so an element
29
+ * wrapped around a tab doesn't cut it off from the others, or its parent when
30
+ * it sits outside a tab list.
31
+ */
32
+ function tabListOf(tab) {
33
+ return (tab.closest('[role="tablist"]') ?? tab.parentElement);
34
+ }
35
+ /**
36
+ * The tab a key press moves focus to, found among the tabs of the same list
37
+ * in DOM order, skipping disabled ones and wrapping at either end.
38
+ * `undefined` for a key the tab list does not handle, or when no enabled tab
39
+ * is left to go to.
40
+ */
41
+ function findTargetTab(current, key, vertical) {
42
+ const tabs = Array.from(tabListOf(current).querySelectorAll('[role="tab"]'));
43
+ const isEnabled = (el) => el.getAttribute('aria-disabled') !== 'true';
44
+ if (key === 'Home')
45
+ return tabs.find(isEnabled);
46
+ if (key === 'End')
47
+ return [...tabs].reverse().find(isEnabled);
48
+ let step;
49
+ if (key === 'ArrowRight' || (vertical && key === 'ArrowDown'))
50
+ step = 1;
51
+ else if (key === 'ArrowLeft' || (vertical && key === 'ArrowUp'))
52
+ step = -1;
53
+ else
54
+ return undefined;
55
+ const start = tabs.indexOf(current);
56
+ for (let i = 1; i <= tabs.length; i++) {
57
+ const candidate = tabs[(((start + step * i) % tabs.length) + tabs.length) % tabs.length];
58
+ if (isEnabled(candidate))
59
+ return candidate;
60
+ }
61
+ return undefined;
62
+ }
63
+ /**
64
+ * The `Tabs` component provides flexible and fully-featured Bulma tab navigation for your Bulma React UI.
65
+ *
66
+ * Built from `Tabs.Tab`, the tabs follow the WAI-ARIA tabs pattern with
67
+ * manual activation: the tab list is a single tab stop, the arrow keys, Home
68
+ * and End move focus between tabs (skipping disabled ones), and Enter or
69
+ * Space activates the focused tab. Each tab names its `Tabs.Content.Item` in
70
+ * `aria-controls`, and each panel names its tab in `aria-labelledby`. Built
71
+ * from `Tabs.Item` with links inside, the tabs stay plain Bulma navigation.
72
+ *
73
+ * @function
74
+ * @param {TabsProps} props - Props for the Tabs component.
75
+ * @returns {JSX.Element} The rendered tabs component.
76
+ * @see {@link https://bulma.io/documentation/components/tabs/ | Bulma Tabs documentation}
77
+ *
78
+ * @example
79
+ * // Basic tabs
80
+ * <Tabs>
81
+ * <Tabs.List>
82
+ * <Tabs.Tab index={0}>Pictures</Tabs.Tab>
83
+ * <Tabs.Tab index={1}>Music</Tabs.Tab>
84
+ * </Tabs.List>
85
+ * <Tabs.Content>
86
+ * <Tabs.Content.Item index={0}>Pictures content</Tabs.Content.Item>
87
+ * <Tabs.Content.Item index={1}>Music content</Tabs.Content.Item>
88
+ * </Tabs.Content>
89
+ * </Tabs>
90
+ */
91
+ const TabsComponent = ({ align, size, isFullwidth, isFullWidth, fullwidth, boxed, toggle, rounded, color, value, onChange, defaultValue = 0, vertical, side, expanded, className, children, ...props }) => {
92
+ warnDeprecatedColorProp('Tabs', color, 'Remove the prop; no replacement exists.');
93
+ const { bulmaHelperClasses, rest } = useBulmaClasses({ ...props });
94
+ // Controlled vs uncontrolled state
95
+ const isControlled = value !== undefined;
96
+ const [internalTab, setInternalTab] = useState(defaultValue);
97
+ const activeTab = isControlled ? value : internalTab;
98
+ const setActiveTab = useCallback((index) => {
99
+ if (!isControlled) {
100
+ setInternalTab(index);
101
+ }
102
+ onChange?.(index);
103
+ }, [isControlled, onChange]);
104
+ const baseId = useId();
105
+ const [tabs, registerTab] = useRegistry();
106
+ const [panels, registerPanel] = useRegistry();
107
+ const [focusedTab, setFocusedTab] = useState(null);
108
+ // One tab stop for the whole list (roving tabindex). While focus is inside
109
+ // the list the stop follows it, so Tab and Shift+Tab leave the list from
110
+ // whichever tab has focus; once focus leaves, the stop is the selected tab
111
+ // again. A disabled tab never holds it, and when the selected tab is
112
+ // disabled or missing the enabled tab with the lowest index does, so the
113
+ // list can always be reached. Before the tabs register (the server render
114
+ // and the first client render), the selected tab holds it. The registry is
115
+ // in the order the tabs last registered, which a tab changing its
116
+ // `disabled` or `id` reshuffles, hence the sort.
117
+ const enabledTabs = tabs
118
+ .filter(t => !t.disabled)
119
+ .sort((a, b) => a.index - b.index);
120
+ const canHoldStop = (index) => enabledTabs.some(t => t.index === index);
121
+ let tabStop;
122
+ if (canHoldStop(focusedTab))
123
+ tabStop = focusedTab;
124
+ else if (tabs.length === 0 || canHoldStop(activeTab))
125
+ tabStop = activeTab;
126
+ else
127
+ tabStop = enabledTabs.length > 0 ? enabledTabs[0].index : null;
128
+ // Check if children include TabsContent
129
+ const childArray = React.Children.toArray(children);
130
+ const hasContent = childArray.some(child => React.isValidElement(child) && child.type === TabsContent);
131
+ const contextValue = {
132
+ activeTab,
133
+ setActiveTab,
134
+ baseId,
135
+ tabStop,
136
+ setFocusedTab,
137
+ tabId: index => tabs.find(t => t.index === index)?.id,
138
+ panelId: index => panels.find(p => p.index === index)?.id,
139
+ registerTab,
140
+ registerPanel,
141
+ orientation: hasContent && vertical ? 'vertical' : 'horizontal',
142
+ };
143
+ // Build classes for the .tabs div
144
+ const tabsClasses = usePrefixedClassNames('tabs', {
145
+ [`is-${align}`]: align,
146
+ [`is-${size}`]: size,
147
+ [`is-${color}`]: color,
148
+ 'is-fullwidth': isFullwidth ?? isFullWidth ?? fullwidth,
149
+ 'is-boxed': boxed,
150
+ 'is-toggle': toggle,
151
+ 'is-toggle-rounded': rounded,
152
+ });
153
+ // Hoisted unconditionally to respect rules-of-hooks. Modifiers gate themselves
154
+ // via their truthy values — `tabs-root` is always prefixed, modifiers only
155
+ // apply in the vertical-with-content branch.
156
+ const rootClasses = usePrefixedClassNames('tabs-root', {
157
+ 'is-vertical': hasContent && vertical,
158
+ 'is-right': hasContent && vertical && side === 'right',
159
+ 'is-expanded': hasContent && vertical && expanded,
160
+ });
161
+ if (hasContent && vertical) {
162
+ const combinedRootClasses = classNames(rootClasses, bulmaHelperClasses, className);
163
+ // Split children into list-like and content children
164
+ const listChildren = [];
165
+ const contentChildren = [];
166
+ childArray.forEach(child => {
167
+ if (React.isValidElement(child) && child.type === TabsContent) {
168
+ contentChildren.push(child);
169
+ }
170
+ else {
171
+ listChildren.push(child);
172
+ }
173
+ });
174
+ return (jsx(TabsContext.Provider, { value: contextValue, children: jsxs("div", { className: combinedRootClasses, ...rest, children: [jsx("div", { className: tabsClasses, children: listChildren }), contentChildren] }) }));
175
+ }
176
+ if (hasContent) {
177
+ const combinedRootClasses = classNames(rootClasses, bulmaHelperClasses, className);
178
+ const listChildren = [];
179
+ const contentChildren = [];
180
+ childArray.forEach(child => {
181
+ if (React.isValidElement(child) && child.type === TabsContent) {
182
+ contentChildren.push(child);
183
+ }
184
+ else {
185
+ listChildren.push(child);
186
+ }
187
+ });
188
+ return (jsx(TabsContext.Provider, { value: contextValue, children: jsxs("div", { className: combinedRootClasses, ...rest, children: [jsx("div", { className: tabsClasses, children: listChildren }), contentChildren] }) }));
189
+ }
190
+ // No content children — backward compatible single .tabs div
191
+ const combinedClasses = classNames(tabsClasses, bulmaHelperClasses, className);
192
+ return (jsx(TabsContext.Provider, { value: contextValue, children: jsx("div", { className: combinedClasses, ...rest, children: children }) }));
193
+ };
194
+ /**
195
+ * The `<ul>` container for tab items.
196
+ *
197
+ * @function
198
+ * @param {TabListProps} props - Props for the TabList component.
199
+ * @returns {JSX.Element} The rendered tab list.
200
+ */
201
+ const TabList = ({ className, children, ...props }) => {
202
+ const ctx = useTabsContext();
203
+ return (jsx("ul", { role: "tablist", "aria-orientation": ctx?.orientation === 'vertical' ? 'vertical' : undefined, className: classNames(className) || undefined, ...props, children: children }));
204
+ };
205
+ /**
206
+ * Individual tab button. Consumes Tabs context for active state management.
207
+ * Renders `<a>` internally — consumers provide only the label text/children.
208
+ * Inside a `Tabs` it takes part in the tab list's keyboard support and links
209
+ * to the `Tabs.Content.Item` with the same `index`.
210
+ *
211
+ * @function
212
+ * @param {TabProps} props - Props for the Tab component.
213
+ * @returns {JSX.Element} The rendered tab.
214
+ */
215
+ const Tab = ({ index, disabled, icon, iconLibrary, iconVariant, iconSize = 'small', iconFeatures, className, children, id, onKeyDown, onFocus, onBlur, ...props }) => {
216
+ const ctx = useTabsContext();
217
+ const isActive = ctx ? ctx.activeTab === index : false;
218
+ const anchorRef = useRef(null);
219
+ const activeClass = usePrefixedClassNames({ 'is-active': isActive });
220
+ const tabId = id ?? (ctx ? `${ctx.baseId}-tab-${index}` : undefined);
221
+ const registerTab = ctx?.registerTab;
222
+ useEffect(() => {
223
+ if (!registerTab || tabId === undefined)
224
+ return undefined;
225
+ return registerTab({ index, id: tabId, disabled: !!disabled });
226
+ }, [registerTab, index, tabId, disabled]);
227
+ // Outside a Tabs there is no list to rove, so every enabled tab stays in
228
+ // the page tab order, as it always did.
229
+ let tabIndex;
230
+ if (disabled)
231
+ tabIndex = -1;
232
+ else if (ctx)
233
+ tabIndex = ctx.tabStop === index ? 0 : -1;
234
+ else
235
+ tabIndex = 0;
236
+ const handleClick = useCallback((e) => {
237
+ e.preventDefault();
238
+ if (!disabled && ctx) {
239
+ ctx.setActiveTab(index);
240
+ }
241
+ }, [disabled, ctx, index]);
242
+ const handleKeyDown = (e) => {
243
+ onKeyDown?.(e);
244
+ // A key on something inside the tab is that element's to answer.
245
+ if (e.defaultPrevented ||
246
+ e.target !== e.currentTarget ||
247
+ e.altKey ||
248
+ e.ctrlKey ||
249
+ e.metaKey) {
250
+ return;
251
+ }
252
+ if (e.key === 'Enter' || e.key === ' ') {
253
+ e.preventDefault();
254
+ // Activate through a click on the inner <a>, the element a pointer
255
+ // clicks, so click listeners see keyboard activation the way they see
256
+ // a native button's.
257
+ anchorRef.current.click();
258
+ return;
259
+ }
260
+ const target = findTargetTab(e.currentTarget, e.key, ctx?.orientation === 'vertical');
261
+ if (target) {
262
+ e.preventDefault();
263
+ target.focus();
264
+ }
265
+ };
266
+ const handleFocus = (e) => {
267
+ onFocus?.(e);
268
+ ctx?.setFocusedTab(index);
269
+ };
270
+ const handleBlur = (e) => {
271
+ onBlur?.(e);
272
+ if (!tabListOf(e.currentTarget).contains(e.relatedTarget)) {
273
+ ctx?.setFocusedTab(null);
274
+ }
275
+ };
276
+ return (jsx("li", { className: classNames(activeClass, className) || undefined, role: "tab", id: tabId, "aria-selected": isActive, "aria-controls": ctx?.panelId(index), "aria-disabled": disabled || undefined, tabIndex: tabIndex, onKeyDown: handleKeyDown, onFocus: handleFocus, onBlur: handleBlur, ...props, children: jsxs("a", { ref: anchorRef, onClick: handleClick, "aria-disabled": disabled || undefined, children: [icon && (jsx(Icon, { name: icon, library: iconLibrary, variant: iconVariant, size: iconSize, features: iconFeatures })), children && jsx("span", { children: children })] }) }));
277
+ };
278
+ /**
279
+ * Each tab; accepts `active`, `onClick`, etc.
280
+ *
281
+ * @function
282
+ * @param {TabItemProps} props - Props for the TabItem component.
283
+ * @returns {JSX.Element} The rendered tab item.
284
+ * @deprecated Use `Tabs.Tab` with an `index` prop instead.
285
+ */
286
+ const TabItem = ({ active, className, children, onClick, ...props }) => (jsx("li", { className: classNames({ [usePrefixedClassNames('is-active')]: active }, className) ||
287
+ undefined, onClick: onClick, ...props, children: children }));
288
+ /**
289
+ * Container for tab content panels. No custom props beyond `children` and standard `<div>` HTML attributes. Applies the `.tabs-content` class.
290
+ *
291
+ * @function
292
+ * @param {TabsContentProps} props - Props for the TabsContent component.
293
+ * @returns {JSX.Element} The rendered tabs content wrapper.
294
+ */
295
+ const TabsContentComponent = ({ className, children, ...props }) => {
296
+ const contentClass = usePrefixedClassNames('tabs-content');
297
+ return (jsx("div", { className: classNames(contentClass, className), ...props, children: children }));
298
+ };
299
+ /**
300
+ * Individual content panel. Shows/hides based on active tab from context.
301
+ *
302
+ * @function
303
+ * @param {TabContentItemProps} props - Props for the TabContentItem component.
304
+ * @returns {JSX.Element} The rendered tab content panel.
305
+ */
306
+ const TabContentItem = ({ index, className, children, id, ...props }) => {
307
+ const ctx = useTabsContext();
308
+ const isActive = ctx ? ctx.activeTab === index : false;
309
+ const itemClass = usePrefixedClassNames('tabs-content-item', {
310
+ 'is-active': isActive,
311
+ });
312
+ const panelId = id ?? (ctx ? `${ctx.baseId}-panel-${index}` : undefined);
313
+ const registerPanel = ctx?.registerPanel;
314
+ useEffect(() => {
315
+ if (!registerPanel || panelId === undefined)
316
+ return undefined;
317
+ return registerPanel({ index, id: panelId });
318
+ }, [registerPanel, index, panelId]);
319
+ return (jsx("div", { className: classNames(itemClass, className), role: "tabpanel", id: panelId, "aria-labelledby": ctx?.tabId(index), "aria-hidden": !isActive, ...props, children: children }));
320
+ };
321
+ // ---------------------------------------------------------------------------
322
+ // Static property attachment
323
+ // ---------------------------------------------------------------------------
324
+ const TabsContent = withSubComponents(TabsContentComponent, {
325
+ Item: TabContentItem,
326
+ });
327
+ const Tabs = withSubComponents(TabsComponent, {
328
+ List: TabList,
329
+ Tab,
330
+ Item: TabItem,
331
+ Content: TabsContent,
332
+ }, 'Tabs');
333
+
334
+ export { Tab, TabContentItem, TabItem, TabList, Tabs, TabsContent };
335
+ //# sourceMappingURL=Tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.js","sources":["../../../src/components/Tabs.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n useCallback,\n} from 'react';\nimport { classNames, usePrefixedClassNames } from '../helpers/classNames';\nimport { withSubComponents } from '../helpers/withSubComponents';\nimport { useBulmaClasses, BulmaClassesProps } from '../helpers/useBulmaClasses';\nimport { warnDeprecatedColorProp } from '../helpers/colorDeprecations';\nimport { Icon } from '../elements/Icon';\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface TabRecord {\n index: number;\n id: string;\n disabled: boolean;\n}\n\ninterface PanelRecord {\n index: number;\n id: string;\n}\n\ninterface TabsContextValue {\n activeTab: number;\n setActiveTab: (index: number) => void;\n /** Prefix for the ids the tabs and panels generate. */\n baseId: string;\n /** The tab that holds `tabIndex={0}`, or `null` when every tab is disabled. */\n tabStop: number | null;\n /** Records which tab has focus, so the tab stop can follow it. */\n setFocusedTab: (index: number | null) => void;\n /** The id of the mounted tab for `index`, for its panel's `aria-labelledby`. */\n tabId: (index: number) => string | undefined;\n /** The id of the mounted panel for `index`, for its tab's `aria-controls`. */\n panelId: (index: number) => string | undefined;\n registerTab: (record: TabRecord) => () => void;\n registerPanel: (record: PanelRecord) => () => void;\n orientation: 'horizontal' | 'vertical';\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null);\n\nfunction useTabsContext(): TabsContextValue | null {\n return useContext(TabsContext);\n}\n\n/**\n * The tabs and panels currently mounted under one `Tabs`. Each registers from\n * an effect and removes itself on cleanup, so the links between them only\n * ever name elements that exist, wherever in the tree the panels sit.\n */\nfunction useRegistry<T>(): [T[], (record: T) => () => void] {\n const [records, setRecords] = useState<T[]>([]);\n const register = useCallback((record: T) => {\n setRecords(prev => [...prev, record]);\n return () => setRecords(prev => prev.filter(r => r !== record));\n }, []);\n return [records, register];\n}\n\n/**\n * The list a tab belongs to: its `role=\"tablist\"` ancestor, so an element\n * wrapped around a tab doesn't cut it off from the others, or its parent when\n * it sits outside a tab list.\n */\nfunction tabListOf(tab: HTMLElement): HTMLElement {\n return (tab.closest('[role=\"tablist\"]') ?? tab.parentElement) as HTMLElement;\n}\n\n/**\n * The tab a key press moves focus to, found among the tabs of the same list\n * in DOM order, skipping disabled ones and wrapping at either end.\n * `undefined` for a key the tab list does not handle, or when no enabled tab\n * is left to go to.\n */\nfunction findTargetTab(\n current: HTMLElement,\n key: string,\n vertical: boolean\n): HTMLElement | undefined {\n const tabs = Array.from(\n tabListOf(current).querySelectorAll<HTMLElement>('[role=\"tab\"]')\n );\n const isEnabled = (el: HTMLElement) =>\n el.getAttribute('aria-disabled') !== 'true';\n\n if (key === 'Home') return tabs.find(isEnabled);\n if (key === 'End') return [...tabs].reverse().find(isEnabled);\n\n let step: number;\n if (key === 'ArrowRight' || (vertical && key === 'ArrowDown')) step = 1;\n else if (key === 'ArrowLeft' || (vertical && key === 'ArrowUp')) step = -1;\n else return undefined;\n\n const start = tabs.indexOf(current);\n for (let i = 1; i <= tabs.length; i++) {\n const candidate =\n tabs[(((start + step * i) % tabs.length) + tabs.length) % tabs.length];\n if (isEnabled(candidate)) return candidate;\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Tabs (root)\n// ---------------------------------------------------------------------------\n\n/**\n * Props for the Tabs component.\n */\nexport interface TabsProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Tab alignment. */\n align?: 'centered' | 'right' | 'left';\n /** Tab size. */\n size?: 'small' | 'medium' | 'large';\n /** Tabs expand to fill the horizontal space. */\n isFullwidth?: boolean;\n /** Tabs expand to fill the horizontal space. @deprecated Use `isFullwidth` instead — `isFullwidth` wins if both are set. */\n isFullWidth?: boolean;\n /** Tabs expand to fill the horizontal space. @deprecated Use `isFullwidth` instead — `isFullwidth` wins if both are set. */\n fullwidth?: boolean;\n /** Tabs use the boxed style. */\n boxed?: boolean;\n /** Tabs use the toggle style. */\n toggle?: boolean;\n /** Tabs use the rounded toggle style (only with `toggle`). */\n rounded?: boolean;\n /**\n * Bulma color for tab underlines and active state (renders `is-<color>`).\n *\n * Bulma ships no tabs color CSS, so this prop has never had a visual effect\n * for any value. Passing it logs a console warning in development.\n * @deprecated No `.tabs.is-<color>` CSS exists; the prop renders unstyled\n * and will be removed in the next major version.\n */\n color?:\n | 'primary'\n | 'link'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'black'\n | 'dark'\n | 'light'\n | 'white';\n /** Controlled active tab index. */\n value?: number;\n /**\n * Callback when active tab changes. Called with the tab's `index` when a\n * `Tabs.Tab` is activated: clicked, or Enter or Space pressed on it.\n * Moving focus with the arrow keys, Home or End does not call it, because\n * activation is manual: focus moves freely and the selected tab changes\n * only when the user picks one.\n */\n onChange?: (index: number) => void;\n /** Initial active tab index (uncontrolled). */\n defaultValue?: number;\n /**\n * Renders tabs vertically. With a `Tabs.Content`, the tab list is also\n * marked `aria-orientation=\"vertical\"` and ArrowUp and ArrowDown move focus\n * between tabs, alongside ArrowLeft and ArrowRight (the layout stacks\n * horizontally on mobile).\n */\n vertical?: boolean;\n /** Side placement when `vertical` is true. */\n side?: 'left' | 'right';\n /** Makes tabs take up the full width equally. */\n expanded?: boolean;\n /** Additional CSS classes. */\n className?: string;\n /** Tab list and tab items. */\n children?: React.ReactNode;\n}\n\n/**\n * The `Tabs` component provides flexible and fully-featured Bulma tab navigation for your Bulma React UI.\n *\n * Built from `Tabs.Tab`, the tabs follow the WAI-ARIA tabs pattern with\n * manual activation: the tab list is a single tab stop, the arrow keys, Home\n * and End move focus between tabs (skipping disabled ones), and Enter or\n * Space activates the focused tab. Each tab names its `Tabs.Content.Item` in\n * `aria-controls`, and each panel names its tab in `aria-labelledby`. Built\n * from `Tabs.Item` with links inside, the tabs stay plain Bulma navigation.\n *\n * @function\n * @param {TabsProps} props - Props for the Tabs component.\n * @returns {JSX.Element} The rendered tabs component.\n * @see {@link https://bulma.io/documentation/components/tabs/ | Bulma Tabs documentation}\n *\n * @example\n * // Basic tabs\n * <Tabs>\n * <Tabs.List>\n * <Tabs.Tab index={0}>Pictures</Tabs.Tab>\n * <Tabs.Tab index={1}>Music</Tabs.Tab>\n * </Tabs.List>\n * <Tabs.Content>\n * <Tabs.Content.Item index={0}>Pictures content</Tabs.Content.Item>\n * <Tabs.Content.Item index={1}>Music content</Tabs.Content.Item>\n * </Tabs.Content>\n * </Tabs>\n */\nconst TabsComponent: React.FC<TabsProps> = ({\n align,\n size,\n isFullwidth,\n isFullWidth,\n fullwidth,\n boxed,\n toggle,\n rounded,\n color,\n value,\n onChange,\n defaultValue = 0,\n vertical,\n side,\n expanded,\n className,\n children,\n ...props\n}) => {\n warnDeprecatedColorProp(\n 'Tabs',\n color,\n 'Remove the prop; no replacement exists.'\n );\n\n const { bulmaHelperClasses, rest } = useBulmaClasses({ ...props });\n\n // Controlled vs uncontrolled state\n const isControlled = value !== undefined;\n const [internalTab, setInternalTab] = useState(defaultValue);\n const activeTab = isControlled ? value : internalTab;\n\n const setActiveTab = useCallback(\n (index: number) => {\n if (!isControlled) {\n setInternalTab(index);\n }\n onChange?.(index);\n },\n [isControlled, onChange]\n );\n\n const baseId = useId();\n const [tabs, registerTab] = useRegistry<TabRecord>();\n const [panels, registerPanel] = useRegistry<PanelRecord>();\n const [focusedTab, setFocusedTab] = useState<number | null>(null);\n\n // One tab stop for the whole list (roving tabindex). While focus is inside\n // the list the stop follows it, so Tab and Shift+Tab leave the list from\n // whichever tab has focus; once focus leaves, the stop is the selected tab\n // again. A disabled tab never holds it, and when the selected tab is\n // disabled or missing the enabled tab with the lowest index does, so the\n // list can always be reached. Before the tabs register (the server render\n // and the first client render), the selected tab holds it. The registry is\n // in the order the tabs last registered, which a tab changing its\n // `disabled` or `id` reshuffles, hence the sort.\n const enabledTabs = tabs\n .filter(t => !t.disabled)\n .sort((a, b) => a.index - b.index);\n const canHoldStop = (index: number | null) =>\n enabledTabs.some(t => t.index === index);\n let tabStop: number | null;\n if (canHoldStop(focusedTab)) tabStop = focusedTab;\n else if (tabs.length === 0 || canHoldStop(activeTab)) tabStop = activeTab;\n else tabStop = enabledTabs.length > 0 ? enabledTabs[0].index : null;\n\n // Check if children include TabsContent\n const childArray = React.Children.toArray(children);\n const hasContent = childArray.some(\n child => React.isValidElement(child) && child.type === TabsContent\n );\n\n const contextValue: TabsContextValue = {\n activeTab,\n setActiveTab,\n baseId,\n tabStop,\n setFocusedTab,\n tabId: index => tabs.find(t => t.index === index)?.id,\n panelId: index => panels.find(p => p.index === index)?.id,\n registerTab,\n registerPanel,\n orientation: hasContent && vertical ? 'vertical' : 'horizontal',\n };\n\n // Build classes for the .tabs div\n const tabsClasses = usePrefixedClassNames('tabs', {\n [`is-${align}`]: align,\n [`is-${size}`]: size,\n [`is-${color}`]: color,\n 'is-fullwidth': isFullwidth ?? isFullWidth ?? fullwidth,\n 'is-boxed': boxed,\n 'is-toggle': toggle,\n 'is-toggle-rounded': rounded,\n });\n\n // Hoisted unconditionally to respect rules-of-hooks. Modifiers gate themselves\n // via their truthy values — `tabs-root` is always prefixed, modifiers only\n // apply in the vertical-with-content branch.\n const rootClasses = usePrefixedClassNames('tabs-root', {\n 'is-vertical': hasContent && vertical,\n 'is-right': hasContent && vertical && side === 'right',\n 'is-expanded': hasContent && vertical && expanded,\n });\n\n if (hasContent && vertical) {\n const combinedRootClasses = classNames(\n rootClasses,\n bulmaHelperClasses,\n className\n );\n\n // Split children into list-like and content children\n const listChildren: React.ReactNode[] = [];\n const contentChildren: React.ReactNode[] = [];\n childArray.forEach(child => {\n if (React.isValidElement(child) && child.type === TabsContent) {\n contentChildren.push(child);\n } else {\n listChildren.push(child);\n }\n });\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div className={combinedRootClasses} {...rest}>\n <div className={tabsClasses}>{listChildren}</div>\n {contentChildren}\n </div>\n </TabsContext.Provider>\n );\n }\n\n if (hasContent) {\n const combinedRootClasses = classNames(\n rootClasses,\n bulmaHelperClasses,\n className\n );\n\n const listChildren: React.ReactNode[] = [];\n const contentChildren: React.ReactNode[] = [];\n childArray.forEach(child => {\n if (React.isValidElement(child) && child.type === TabsContent) {\n contentChildren.push(child);\n } else {\n listChildren.push(child);\n }\n });\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div className={combinedRootClasses} {...rest}>\n <div className={tabsClasses}>{listChildren}</div>\n {contentChildren}\n </div>\n </TabsContext.Provider>\n );\n }\n\n // No content children — backward compatible single .tabs div\n const combinedClasses = classNames(\n tabsClasses,\n bulmaHelperClasses,\n className\n );\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div className={combinedClasses} {...rest}>\n {children}\n </div>\n </TabsContext.Provider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// TabList\n// ---------------------------------------------------------------------------\n\n/**\n * Props for the TabList component.\n */\nexport interface TabListProps extends React.HTMLAttributes<HTMLUListElement> {\n /** Additional CSS classes. */\n className?: string;\n /** Tab elements. */\n children?: React.ReactNode;\n}\n\n/**\n * The `<ul>` container for tab items.\n *\n * @function\n * @param {TabListProps} props - Props for the TabList component.\n * @returns {JSX.Element} The rendered tab list.\n */\nexport const TabList: React.FC<TabListProps> = ({\n className,\n children,\n ...props\n}) => {\n const ctx = useTabsContext();\n return (\n <ul\n role=\"tablist\"\n aria-orientation={\n ctx?.orientation === 'vertical' ? 'vertical' : undefined\n }\n className={classNames(className) || undefined}\n {...props}\n >\n {children}\n </ul>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Tab (new — context-aware)\n// ---------------------------------------------------------------------------\n\ntype IconLibrary = 'fa' | 'mdi' | 'ion' | 'material-icons' | 'material-symbols';\n\n/**\n * Props for the Tab component.\n * @extraProp {string} [id] - The tab's id, which its panel names in `aria-labelledby`. Generated inside a `Tabs` when omitted; a passed `id` is used and the panel follows it.\n * @extraProp {React.KeyboardEventHandler<HTMLLIElement>} [onKeyDown] - Called before the tab handles the key; call `event.preventDefault()` to stop the tab handling it.\n */\nexport interface TabProps extends Omit<\n React.LiHTMLAttributes<HTMLLIElement>,\n 'onClick'\n> {\n /** **Required.** Tab index for matching with content. */\n index: number;\n /**\n * Disables the tab. A disabled tab is marked `aria-disabled`, cannot be\n * activated, is skipped by the arrow keys, Home and End, and never holds\n * the tab list's tab stop. The bestax extras styles also dim it and turn\n * off its hover.\n */\n disabled?: boolean;\n /** Icon name for the tab. */\n icon?: string;\n /** Icon library to use. */\n iconLibrary?: IconLibrary;\n /** Icon style variant (e.g., 'solid', 'outlined', 'rounded'). */\n iconVariant?: string;\n /** Size of the tab icon. */\n iconSize?: 'small' | 'medium' | 'large';\n /** Additional icon modifiers. */\n iconFeatures?: string | string[];\n /** Additional CSS classes. */\n className?: string;\n /** Tab label content. */\n children?: React.ReactNode;\n}\n\n/**\n * Individual tab button. Consumes Tabs context for active state management.\n * Renders `<a>` internally — consumers provide only the label text/children.\n * Inside a `Tabs` it takes part in the tab list's keyboard support and links\n * to the `Tabs.Content.Item` with the same `index`.\n *\n * @function\n * @param {TabProps} props - Props for the Tab component.\n * @returns {JSX.Element} The rendered tab.\n */\nexport const Tab: React.FC<TabProps> = ({\n index,\n disabled,\n icon,\n iconLibrary,\n iconVariant,\n iconSize = 'small',\n iconFeatures,\n className,\n children,\n id,\n onKeyDown,\n onFocus,\n onBlur,\n ...props\n}) => {\n const ctx = useTabsContext();\n const isActive = ctx ? ctx.activeTab === index : false;\n const anchorRef = useRef<HTMLAnchorElement>(null);\n\n const activeClass = usePrefixedClassNames({ 'is-active': isActive });\n\n const tabId = id ?? (ctx ? `${ctx.baseId}-tab-${index}` : undefined);\n const registerTab = ctx?.registerTab;\n useEffect(() => {\n if (!registerTab || tabId === undefined) return undefined;\n return registerTab({ index, id: tabId, disabled: !!disabled });\n }, [registerTab, index, tabId, disabled]);\n\n // Outside a Tabs there is no list to rove, so every enabled tab stays in\n // the page tab order, as it always did.\n let tabIndex: number;\n if (disabled) tabIndex = -1;\n else if (ctx) tabIndex = ctx.tabStop === index ? 0 : -1;\n else tabIndex = 0;\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n if (!disabled && ctx) {\n ctx.setActiveTab(index);\n }\n },\n [disabled, ctx, index]\n );\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLLIElement>) => {\n onKeyDown?.(e);\n // A key on something inside the tab is that element's to answer.\n if (\n e.defaultPrevented ||\n e.target !== e.currentTarget ||\n e.altKey ||\n e.ctrlKey ||\n e.metaKey\n ) {\n return;\n }\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n // Activate through a click on the inner <a>, the element a pointer\n // clicks, so click listeners see keyboard activation the way they see\n // a native button's.\n (anchorRef.current as HTMLAnchorElement).click();\n return;\n }\n const target = findTargetTab(\n e.currentTarget,\n e.key,\n ctx?.orientation === 'vertical'\n );\n if (target) {\n e.preventDefault();\n target.focus();\n }\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLLIElement>) => {\n onFocus?.(e);\n ctx?.setFocusedTab(index);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLLIElement>) => {\n onBlur?.(e);\n if (!tabListOf(e.currentTarget).contains(e.relatedTarget)) {\n ctx?.setFocusedTab(null);\n }\n };\n\n return (\n <li\n className={classNames(activeClass, className) || undefined}\n role=\"tab\"\n id={tabId}\n aria-selected={isActive}\n aria-controls={ctx?.panelId(index)}\n aria-disabled={disabled || undefined}\n tabIndex={tabIndex}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...props}\n >\n <a\n ref={anchorRef}\n onClick={handleClick}\n aria-disabled={disabled || undefined}\n >\n {icon && (\n <Icon\n name={icon}\n library={iconLibrary}\n variant={iconVariant}\n size={iconSize}\n features={iconFeatures}\n />\n )}\n {children && <span>{children}</span>}\n </a>\n </li>\n );\n};\n\n// ---------------------------------------------------------------------------\n// TabItem (backward-compatible — no context)\n// ---------------------------------------------------------------------------\n\n/**\n * Props for the TabItem component (backward-compatible).\n */\nexport interface TabItemProps extends React.LiHTMLAttributes<HTMLLIElement> {\n /** Whether the tab is active. */\n active?: boolean;\n /** Additional CSS classes. */\n className?: string;\n /** Tab content. */\n children?: React.ReactNode;\n /** Click handler. */\n onClick?: React.MouseEventHandler<HTMLLIElement>;\n}\n\n/**\n * Each tab; accepts `active`, `onClick`, etc.\n *\n * @function\n * @param {TabItemProps} props - Props for the TabItem component.\n * @returns {JSX.Element} The rendered tab item.\n * @deprecated Use `Tabs.Tab` with an `index` prop instead.\n */\nexport const TabItem: React.FC<TabItemProps> = ({\n active,\n className,\n children,\n onClick,\n ...props\n}) => (\n <li\n className={\n classNames({ [usePrefixedClassNames('is-active')]: active }, className) ||\n undefined\n }\n onClick={onClick}\n {...props}\n >\n {children}\n </li>\n);\n\n// ---------------------------------------------------------------------------\n// TabsContent\n// ---------------------------------------------------------------------------\n\n/**\n * Props for the TabsContent component.\n */\nexport interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Additional CSS classes. */\n className?: string;\n /** TabContentItem elements. */\n children?: React.ReactNode;\n}\n\n/**\n * Container for tab content panels. No custom props beyond `children` and standard `<div>` HTML attributes. Applies the `.tabs-content` class.\n *\n * @function\n * @param {TabsContentProps} props - Props for the TabsContent component.\n * @returns {JSX.Element} The rendered tabs content wrapper.\n */\nconst TabsContentComponent: React.FC<TabsContentProps> = ({\n className,\n children,\n ...props\n}) => {\n const contentClass = usePrefixedClassNames('tabs-content');\n return (\n <div className={classNames(contentClass, className)} {...props}>\n {children}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// TabContentItem\n// ---------------------------------------------------------------------------\n\n/**\n * Props for the TabContentItem component.\n * @extraProp {string} [id] - The panel's id, which its tab names in `aria-controls`. Generated inside a `Tabs` when omitted; a passed `id` is used and the tab follows it.\n * @extraProp {number} [tabIndex] - The panel is not focusable by default. Pass `0` when it holds nothing focusable, so Tab moves from the tab list into it.\n */\nexport interface TabContentItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** **Required.** Tab index for matching with content. */\n index: number;\n /** Additional CSS classes. */\n className?: string;\n /** Panel content. */\n children?: React.ReactNode;\n}\n\n/**\n * Individual content panel. Shows/hides based on active tab from context.\n *\n * @function\n * @param {TabContentItemProps} props - Props for the TabContentItem component.\n * @returns {JSX.Element} The rendered tab content panel.\n */\nexport const TabContentItem: React.FC<TabContentItemProps> = ({\n index,\n className,\n children,\n id,\n ...props\n}) => {\n const ctx = useTabsContext();\n const isActive = ctx ? ctx.activeTab === index : false;\n\n const itemClass = usePrefixedClassNames('tabs-content-item', {\n 'is-active': isActive,\n });\n\n const panelId = id ?? (ctx ? `${ctx.baseId}-panel-${index}` : undefined);\n const registerPanel = ctx?.registerPanel;\n useEffect(() => {\n if (!registerPanel || panelId === undefined) return undefined;\n return registerPanel({ index, id: panelId });\n }, [registerPanel, index, panelId]);\n\n return (\n <div\n className={classNames(itemClass, className)}\n role=\"tabpanel\"\n id={panelId}\n aria-labelledby={ctx?.tabId(index)}\n aria-hidden={!isActive}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Static property attachment\n// ---------------------------------------------------------------------------\n\nexport const TabsContent = withSubComponents(TabsContentComponent, {\n Item: TabContentItem,\n});\n\nexport const Tabs = withSubComponents(\n TabsComponent,\n {\n List: TabList,\n Tab,\n Item: TabItem,\n Content: TabsContent,\n },\n 'Tabs'\n);\n\nexport default Tabs;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}