@allxsmith/bestax-bulma 5.56.0 → 5.57.0

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 (335) hide show
  1. package/dist/esm/columns/Column.js +1 -0
  2. package/dist/esm/columns/Column.js.map +1 -1
  3. package/dist/esm/columns/Columns.js +1 -0
  4. package/dist/esm/columns/Columns.js.map +1 -1
  5. package/dist/esm/components/Avatar.js +1 -0
  6. package/dist/esm/components/Avatar.js.map +1 -1
  7. package/dist/esm/components/Avatars.js +1 -0
  8. package/dist/esm/components/Avatars.js.map +1 -1
  9. package/dist/esm/components/Badge.js +1 -0
  10. package/dist/esm/components/Badge.js.map +1 -1
  11. package/dist/esm/components/Breadcrumb.js +1 -0
  12. package/dist/esm/components/Breadcrumb.js.map +1 -1
  13. package/dist/esm/components/Card.js +1 -0
  14. package/dist/esm/components/Card.js.map +1 -1
  15. package/dist/esm/components/Carousel.js +1 -0
  16. package/dist/esm/components/Carousel.js.map +1 -1
  17. package/dist/esm/components/Collapse.js +1 -0
  18. package/dist/esm/components/Collapse.js.map +1 -1
  19. package/dist/esm/components/Collapses.js +1 -0
  20. package/dist/esm/components/Collapses.js.map +1 -1
  21. package/dist/esm/components/Command.js +1 -0
  22. package/dist/esm/components/Command.js.map +1 -1
  23. package/dist/esm/components/ContextMenu.js +1 -0
  24. package/dist/esm/components/ContextMenu.js.map +1 -1
  25. package/dist/esm/components/DataTable.js +1 -0
  26. package/dist/esm/components/DataTable.js.map +1 -1
  27. package/dist/esm/components/Dialog.js +1 -0
  28. package/dist/esm/components/Dialog.js.map +1 -1
  29. package/dist/esm/components/Dropdown.js +1 -0
  30. package/dist/esm/components/Dropdown.js.map +1 -1
  31. package/dist/esm/components/EmptyState.js +1 -0
  32. package/dist/esm/components/EmptyState.js.map +1 -1
  33. package/dist/esm/components/HoverCard.js +1 -0
  34. package/dist/esm/components/HoverCard.js.map +1 -1
  35. package/dist/esm/components/Loading.js +1 -0
  36. package/dist/esm/components/Loading.js.map +1 -1
  37. package/dist/esm/components/Menu.js +1 -0
  38. package/dist/esm/components/Menu.js.map +1 -1
  39. package/dist/esm/components/Message.js +1 -0
  40. package/dist/esm/components/Message.js.map +1 -1
  41. package/dist/esm/components/Modal.js +1 -0
  42. package/dist/esm/components/Modal.js.map +1 -1
  43. package/dist/esm/components/Navbar.js +1 -0
  44. package/dist/esm/components/Navbar.js.map +1 -1
  45. package/dist/esm/components/Pagination.js +1 -0
  46. package/dist/esm/components/Pagination.js.map +1 -1
  47. package/dist/esm/components/Panel.js +1 -0
  48. package/dist/esm/components/Panel.js.map +1 -1
  49. package/dist/esm/components/Popover.js +1 -0
  50. package/dist/esm/components/Popover.js.map +1 -1
  51. package/dist/esm/components/Reveal.js +1 -0
  52. package/dist/esm/components/Reveal.js.map +1 -1
  53. package/dist/esm/components/ScrollArea.js +1 -0
  54. package/dist/esm/components/ScrollArea.js.map +1 -1
  55. package/dist/esm/components/SegmentedControl.js +1 -0
  56. package/dist/esm/components/SegmentedControl.js.map +1 -1
  57. package/dist/esm/components/Sidebar.js +1 -0
  58. package/dist/esm/components/Sidebar.js.map +1 -1
  59. package/dist/esm/components/Steps.js +1 -0
  60. package/dist/esm/components/Steps.js.map +1 -1
  61. package/dist/esm/components/Tabs.js +1 -0
  62. package/dist/esm/components/Tabs.js.map +1 -1
  63. package/dist/esm/components/Timeline.js +1 -0
  64. package/dist/esm/components/Timeline.js.map +1 -1
  65. package/dist/esm/components/Toast.js +1 -0
  66. package/dist/esm/components/Toast.js.map +1 -1
  67. package/dist/esm/components/Tooltip.js +1 -0
  68. package/dist/esm/components/Tooltip.js.map +1 -1
  69. package/dist/esm/components/TreeView.js +1 -0
  70. package/dist/esm/components/TreeView.js.map +1 -1
  71. package/dist/esm/components/collapsesContext.js +1 -0
  72. package/dist/esm/components/collapsesContext.js.map +1 -1
  73. package/dist/esm/components/useDataTable.js +1 -0
  74. package/dist/esm/components/useDataTable.js.map +1 -1
  75. package/dist/esm/elements/Block.js +1 -0
  76. package/dist/esm/elements/Block.js.map +1 -1
  77. package/dist/esm/elements/Box.js +1 -0
  78. package/dist/esm/elements/Box.js.map +1 -1
  79. package/dist/esm/elements/Button.js +1 -0
  80. package/dist/esm/elements/Button.js.map +1 -1
  81. package/dist/esm/elements/Buttons.js +1 -0
  82. package/dist/esm/elements/Buttons.js.map +1 -1
  83. package/dist/esm/elements/Code.js +1 -0
  84. package/dist/esm/elements/Code.js.map +1 -1
  85. package/dist/esm/elements/ColorSwatch.js +1 -0
  86. package/dist/esm/elements/ColorSwatch.js.map +1 -1
  87. package/dist/esm/elements/Content.js +1 -0
  88. package/dist/esm/elements/Content.js.map +1 -1
  89. package/dist/esm/elements/Delete.js +1 -0
  90. package/dist/esm/elements/Delete.js.map +1 -1
  91. package/dist/esm/elements/DescriptionList.js +1 -0
  92. package/dist/esm/elements/DescriptionList.js.map +1 -1
  93. package/dist/esm/elements/Divider.js +1 -0
  94. package/dist/esm/elements/Divider.js.map +1 -1
  95. package/dist/esm/elements/Emphasis.js +1 -0
  96. package/dist/esm/elements/Emphasis.js.map +1 -1
  97. package/dist/esm/elements/Figure.js +1 -0
  98. package/dist/esm/elements/Figure.js.map +1 -1
  99. package/dist/esm/elements/Icon.js +1 -0
  100. package/dist/esm/elements/Icon.js.map +1 -1
  101. package/dist/esm/elements/IconText.js +1 -0
  102. package/dist/esm/elements/IconText.js.map +1 -1
  103. package/dist/esm/elements/Image.js +1 -0
  104. package/dist/esm/elements/Image.js.map +1 -1
  105. package/dist/esm/elements/Kbd.js +1 -0
  106. package/dist/esm/elements/Kbd.js.map +1 -1
  107. package/dist/esm/elements/Link.js +1 -0
  108. package/dist/esm/elements/Link.js.map +1 -1
  109. package/dist/esm/elements/LinkButton.js +1 -0
  110. package/dist/esm/elements/LinkButton.js.map +1 -1
  111. package/dist/esm/elements/ListItem.js +1 -0
  112. package/dist/esm/elements/ListItem.js.map +1 -1
  113. package/dist/esm/elements/Loader.js +1 -0
  114. package/dist/esm/elements/Loader.js.map +1 -1
  115. package/dist/esm/elements/Notification.js +1 -0
  116. package/dist/esm/elements/Notification.js.map +1 -1
  117. package/dist/esm/elements/OrderedList.js +1 -0
  118. package/dist/esm/elements/OrderedList.js.map +1 -1
  119. package/dist/esm/elements/Paragraph.js +1 -0
  120. package/dist/esm/elements/Paragraph.js.map +1 -1
  121. package/dist/esm/elements/Pre.js +1 -0
  122. package/dist/esm/elements/Pre.js.map +1 -1
  123. package/dist/esm/elements/Progress.js +1 -0
  124. package/dist/esm/elements/Progress.js.map +1 -1
  125. package/dist/esm/elements/RingProgress.js +1 -0
  126. package/dist/esm/elements/RingProgress.js.map +1 -1
  127. package/dist/esm/elements/Skeleton.js +1 -0
  128. package/dist/esm/elements/Skeleton.js.map +1 -1
  129. package/dist/esm/elements/Span.js +1 -0
  130. package/dist/esm/elements/Span.js.map +1 -1
  131. package/dist/esm/elements/Strong.js +1 -0
  132. package/dist/esm/elements/Strong.js.map +1 -1
  133. package/dist/esm/elements/SubTitle.js +1 -0
  134. package/dist/esm/elements/SubTitle.js.map +1 -1
  135. package/dist/esm/elements/Table.js +1 -0
  136. package/dist/esm/elements/Table.js.map +1 -1
  137. package/dist/esm/elements/Tag.js +1 -0
  138. package/dist/esm/elements/Tag.js.map +1 -1
  139. package/dist/esm/elements/Tags.js +1 -0
  140. package/dist/esm/elements/Tags.js.map +1 -1
  141. package/dist/esm/elements/Tbody.js +1 -0
  142. package/dist/esm/elements/Tbody.js.map +1 -1
  143. package/dist/esm/elements/Td.js +1 -0
  144. package/dist/esm/elements/Td.js.map +1 -1
  145. package/dist/esm/elements/Tfoot.js +1 -0
  146. package/dist/esm/elements/Tfoot.js.map +1 -1
  147. package/dist/esm/elements/Th.js +1 -0
  148. package/dist/esm/elements/Th.js.map +1 -1
  149. package/dist/esm/elements/Thead.js +1 -0
  150. package/dist/esm/elements/Thead.js.map +1 -1
  151. package/dist/esm/elements/Title.js +1 -0
  152. package/dist/esm/elements/Title.js.map +1 -1
  153. package/dist/esm/elements/ToggleButton.js +1 -0
  154. package/dist/esm/elements/ToggleButton.js.map +1 -1
  155. package/dist/esm/elements/Tr.js +1 -0
  156. package/dist/esm/elements/Tr.js.map +1 -1
  157. package/dist/esm/elements/UnorderedList.js +1 -0
  158. package/dist/esm/elements/UnorderedList.js.map +1 -1
  159. package/dist/esm/elements/iconProps.js +1 -0
  160. package/dist/esm/elements/iconProps.js.map +1 -1
  161. package/dist/esm/form/Autocomplete.js +1 -0
  162. package/dist/esm/form/Autocomplete.js.map +1 -1
  163. package/dist/esm/form/Checkbox.js +1 -0
  164. package/dist/esm/form/Checkbox.js.map +1 -1
  165. package/dist/esm/form/CheckboxCard.js +1 -0
  166. package/dist/esm/form/CheckboxCard.js.map +1 -1
  167. package/dist/esm/form/Checkboxes.js +1 -0
  168. package/dist/esm/form/Checkboxes.js.map +1 -1
  169. package/dist/esm/form/ColorInput.js +1 -0
  170. package/dist/esm/form/ColorInput.js.map +1 -1
  171. package/dist/esm/form/ColorInputBase.js +1 -0
  172. package/dist/esm/form/ColorInputBase.js.map +1 -1
  173. package/dist/esm/form/ColorPicker.js +1 -0
  174. package/dist/esm/form/ColorPicker.js.map +1 -1
  175. package/dist/esm/form/Combobox.js +1 -0
  176. package/dist/esm/form/Combobox.js.map +1 -1
  177. package/dist/esm/form/Control.js +1 -0
  178. package/dist/esm/form/Control.js.map +1 -1
  179. package/dist/esm/form/DateInput.js +1 -0
  180. package/dist/esm/form/DateInput.js.map +1 -1
  181. package/dist/esm/form/DateInputBase.js +1 -0
  182. package/dist/esm/form/DateInputBase.js.map +1 -1
  183. package/dist/esm/form/DateRangeInput.js +1 -0
  184. package/dist/esm/form/DateRangeInput.js.map +1 -1
  185. package/dist/esm/form/DateRangeInputBase.js +1 -0
  186. package/dist/esm/form/DateRangeInputBase.js.map +1 -1
  187. package/dist/esm/form/DateTimeInput.js +1 -0
  188. package/dist/esm/form/DateTimeInput.js.map +1 -1
  189. package/dist/esm/form/DateTimeInputBase.js +1 -0
  190. package/dist/esm/form/DateTimeInputBase.js.map +1 -1
  191. package/dist/esm/form/Dropzone.js +1 -0
  192. package/dist/esm/form/Dropzone.js.map +1 -1
  193. package/dist/esm/form/Field.js +1 -0
  194. package/dist/esm/form/Field.js.map +1 -1
  195. package/dist/esm/form/Fieldset.js +1 -0
  196. package/dist/esm/form/Fieldset.js.map +1 -1
  197. package/dist/esm/form/File.js +1 -0
  198. package/dist/esm/form/File.js.map +1 -1
  199. package/dist/esm/form/FormContext.js +1 -0
  200. package/dist/esm/form/FormContext.js.map +1 -1
  201. package/dist/esm/form/Input.js +1 -0
  202. package/dist/esm/form/Input.js.map +1 -1
  203. package/dist/esm/form/InputBase.js +1 -0
  204. package/dist/esm/form/InputBase.js.map +1 -1
  205. package/dist/esm/form/Numberinput.js +1 -0
  206. package/dist/esm/form/Numberinput.js.map +1 -1
  207. package/dist/esm/form/PinInput.js +1 -0
  208. package/dist/esm/form/PinInput.js.map +1 -1
  209. package/dist/esm/form/Radio.js +1 -0
  210. package/dist/esm/form/Radio.js.map +1 -1
  211. package/dist/esm/form/RadioCard.js +1 -0
  212. package/dist/esm/form/RadioCard.js.map +1 -1
  213. package/dist/esm/form/Radios.js +1 -0
  214. package/dist/esm/form/Radios.js.map +1 -1
  215. package/dist/esm/form/Rate.js +1 -0
  216. package/dist/esm/form/Rate.js.map +1 -1
  217. package/dist/esm/form/Select.js +1 -0
  218. package/dist/esm/form/Select.js.map +1 -1
  219. package/dist/esm/form/SelectBase.js +1 -0
  220. package/dist/esm/form/SelectBase.js.map +1 -1
  221. package/dist/esm/form/Slider.js +1 -0
  222. package/dist/esm/form/Slider.js.map +1 -1
  223. package/dist/esm/form/Switch.js +1 -0
  224. package/dist/esm/form/Switch.js.map +1 -1
  225. package/dist/esm/form/Taginput.js +1 -0
  226. package/dist/esm/form/Taginput.js.map +1 -1
  227. package/dist/esm/form/TextArea.js +1 -0
  228. package/dist/esm/form/TextArea.js.map +1 -1
  229. package/dist/esm/form/TextAreaBase.js +1 -0
  230. package/dist/esm/form/TextAreaBase.js.map +1 -1
  231. package/dist/esm/form/TimeInput.js +1 -0
  232. package/dist/esm/form/TimeInput.js.map +1 -1
  233. package/dist/esm/form/TimeInputBase.js +1 -0
  234. package/dist/esm/form/TimeInputBase.js.map +1 -1
  235. package/dist/esm/form/_colorInternals/EyeDropperButton.js +1 -0
  236. package/dist/esm/form/_colorInternals/EyeDropperButton.js.map +1 -1
  237. package/dist/esm/form/_colorInternals/pickerState.js +1 -0
  238. package/dist/esm/form/_colorInternals/pickerState.js.map +1 -1
  239. package/dist/esm/form/_pickerInternals/Calendar.js +1 -0
  240. package/dist/esm/form/_pickerInternals/Calendar.js.map +1 -1
  241. package/dist/esm/form/_pickerInternals/PickerPopover.js +1 -0
  242. package/dist/esm/form/_pickerInternals/PickerPopover.js.map +1 -1
  243. package/dist/esm/form/_pickerInternals/TimeWheels.js +1 -0
  244. package/dist/esm/form/_pickerInternals/TimeWheels.js.map +1 -1
  245. package/dist/esm/form/_pickerInternals/useLocaleDefaults.js +1 -0
  246. package/dist/esm/form/_pickerInternals/useLocaleDefaults.js.map +1 -1
  247. package/dist/esm/form/_pickerInternals/useNativeMobilePicker.js +1 -0
  248. package/dist/esm/form/_pickerInternals/useNativeMobilePicker.js.map +1 -1
  249. package/dist/esm/form/_pickerInternals/useSegmentedEntry.js +1 -0
  250. package/dist/esm/form/_pickerInternals/useSegmentedEntry.js.map +1 -1
  251. package/dist/esm/form/controlLoading.js +1 -0
  252. package/dist/esm/form/controlLoading.js.map +1 -1
  253. package/dist/esm/form/groupFieldset.js +1 -0
  254. package/dist/esm/form/groupFieldset.js.map +1 -1
  255. package/dist/esm/form/useAutoLabelId.js +1 -0
  256. package/dist/esm/form/useAutoLabelId.js.map +1 -1
  257. package/dist/esm/grid/Cell.js +1 -0
  258. package/dist/esm/grid/Cell.js.map +1 -1
  259. package/dist/esm/grid/Grid.js +1 -0
  260. package/dist/esm/grid/Grid.js.map +1 -1
  261. package/dist/esm/helpers/ClientOnly.js +1 -0
  262. package/dist/esm/helpers/ClientOnly.js.map +1 -1
  263. package/dist/esm/helpers/Config.js +1 -0
  264. package/dist/esm/helpers/Config.js.map +1 -1
  265. package/dist/esm/helpers/LocaleProvider.js +1 -0
  266. package/dist/esm/helpers/LocaleProvider.js.map +1 -1
  267. package/dist/esm/helpers/Theme.js +1 -0
  268. package/dist/esm/helpers/Theme.js.map +1 -1
  269. package/dist/esm/helpers/flattenChildren.js +1 -0
  270. package/dist/esm/helpers/flattenChildren.js.map +1 -1
  271. package/dist/esm/helpers/inertProps.js +1 -0
  272. package/dist/esm/helpers/inertProps.js.map +1 -1
  273. package/dist/esm/helpers/localeFormat.js +1 -0
  274. package/dist/esm/helpers/localeFormat.js.map +1 -1
  275. package/dist/esm/helpers/overlayStack.js +1 -0
  276. package/dist/esm/helpers/overlayStack.js.map +1 -1
  277. package/dist/esm/helpers/portal.js +1 -0
  278. package/dist/esm/helpers/portal.js.map +1 -1
  279. package/dist/esm/helpers/scrollLock.js +1 -0
  280. package/dist/esm/helpers/scrollLock.js.map +1 -1
  281. package/dist/esm/helpers/statusRegion.js +1 -0
  282. package/dist/esm/helpers/statusRegion.js.map +1 -1
  283. package/dist/esm/helpers/typeahead.js +1 -0
  284. package/dist/esm/helpers/typeahead.js.map +1 -1
  285. package/dist/esm/helpers/useAnchoredPosition.js +1 -0
  286. package/dist/esm/helpers/useAnchoredPosition.js.map +1 -1
  287. package/dist/esm/helpers/useBulmaClasses.js +1 -0
  288. package/dist/esm/helpers/useBulmaClasses.js.map +1 -1
  289. package/dist/esm/helpers/useClientLayoutEffect.js +1 -0
  290. package/dist/esm/helpers/useClientLayoutEffect.js.map +1 -1
  291. package/dist/esm/helpers/useColorClasses.js +1 -0
  292. package/dist/esm/helpers/useColorClasses.js.map +1 -1
  293. package/dist/esm/helpers/useComboboxEngine.js +1 -0
  294. package/dist/esm/helpers/useComboboxEngine.js.map +1 -1
  295. package/dist/esm/helpers/useContextMenuTrigger.js +1 -0
  296. package/dist/esm/helpers/useContextMenuTrigger.js.map +1 -1
  297. package/dist/esm/helpers/useFlexboxClasses.js +1 -0
  298. package/dist/esm/helpers/useFlexboxClasses.js.map +1 -1
  299. package/dist/esm/helpers/useFocusTrap.js +1 -0
  300. package/dist/esm/helpers/useFocusTrap.js.map +1 -1
  301. package/dist/esm/helpers/useHoverOpen.js +1 -0
  302. package/dist/esm/helpers/useHoverOpen.js.map +1 -1
  303. package/dist/esm/helpers/useInertSiblings.js +1 -0
  304. package/dist/esm/helpers/useInertSiblings.js.map +1 -1
  305. package/dist/esm/helpers/useIsHydrated.js +1 -0
  306. package/dist/esm/helpers/useIsHydrated.js.map +1 -1
  307. package/dist/esm/helpers/useLatestRef.js +1 -0
  308. package/dist/esm/helpers/useLatestRef.js.map +1 -1
  309. package/dist/esm/helpers/useMenuKeys.js +1 -0
  310. package/dist/esm/helpers/useMenuKeys.js.map +1 -1
  311. package/dist/esm/helpers/useOtherClasses.js +1 -0
  312. package/dist/esm/helpers/useOtherClasses.js.map +1 -1
  313. package/dist/esm/helpers/useSpacingClasses.js +1 -0
  314. package/dist/esm/helpers/useSpacingClasses.js.map +1 -1
  315. package/dist/esm/helpers/useTreeView.js +1 -0
  316. package/dist/esm/helpers/useTreeView.js.map +1 -1
  317. package/dist/esm/helpers/useTypographyClasses.js +1 -0
  318. package/dist/esm/helpers/useTypographyClasses.js.map +1 -1
  319. package/dist/esm/helpers/useVisibilityClasses.js +1 -0
  320. package/dist/esm/helpers/useVisibilityClasses.js.map +1 -1
  321. package/dist/esm/layout/Container.js +1 -0
  322. package/dist/esm/layout/Container.js.map +1 -1
  323. package/dist/esm/layout/Footer.js +1 -0
  324. package/dist/esm/layout/Footer.js.map +1 -1
  325. package/dist/esm/layout/Hero.js +1 -0
  326. package/dist/esm/layout/Hero.js.map +1 -1
  327. package/dist/esm/layout/Level.js +1 -0
  328. package/dist/esm/layout/Level.js.map +1 -1
  329. package/dist/esm/layout/Media.js +1 -0
  330. package/dist/esm/layout/Media.js.map +1 -1
  331. package/dist/esm/layout/Section.js +1 -0
  332. package/dist/esm/layout/Section.js.map +1 -1
  333. package/dist/esm/layout/Splitter.js +1 -0
  334. package/dist/esm/layout/Splitter.js.map +1 -1
  335. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"groupFieldset.js","sources":["../../../src/form/groupFieldset.tsx"],"sourcesContent":["import React from 'react';\nimport { classNames, usePrefixedClassNames } from '../helpers/classNames';\nimport { FieldProvider } from './FormContext';\nimport type { FormFieldProps } from './fieldProps';\n\ninterface GroupFieldsetProps {\n /** The group's label, rendered as the `<legend>`. */\n label: React.ReactNode;\n /** Sizes the legend's label column when `horizontal`. */\n labelSize?: FormFieldProps['labelSize'];\n /** Props for the element that shows the label; any `htmlFor` is dropped. */\n labelProps?: FormFieldProps['labelProps'];\n /** Puts the legend in the label column and the rest in the body. */\n horizontal?: boolean;\n /** Set on the `<fieldset>` beside its `field` class. */\n fieldClassName?: string;\n /** The group's role, when it isn't the fieldset's own `group`. */\n role?: 'radiogroup';\n /** The group's own attributes: they describe the group, so they go on the `<fieldset>`. */\n attributes: object;\n /** The group's help text, after the content. */\n message: React.ReactNode;\n /** The group's content: its `Control` and the box of choices. */\n children: React.ReactNode;\n}\n\n/**\n * The `Field` a `Checkboxes` or `Radios` with `as=\"fieldset\"` renders of its\n * own, as a native `<fieldset>`: Bulma's field markup, with its label as the\n * `<legend>` (inside the `field-label` column when horizontal), so the legend\n * names the group and needs no id. It holds a `Field`'s place for what is\n * inside, so the choices read as inside a `Field`. Internal; not part of the\n * public API.\n */\nexport const GroupFieldset: React.FC<GroupFieldsetProps> = ({\n label,\n labelSize,\n labelProps,\n horizontal,\n fieldClassName,\n role,\n attributes,\n message,\n children,\n}) => {\n const fieldClass = usePrefixedClassNames('field', {\n 'is-horizontal': !!horizontal,\n });\n const labelClass = usePrefixedClassNames('label');\n const fieldLabelClass = usePrefixedClassNames('field-label', {\n [`is-${labelSize || 'normal'}`]: true,\n });\n const fieldBodyClass = usePrefixedClassNames('field-body');\n\n // A legend names its fieldset with no `for`, so a `htmlFor` has nothing\n // to point at.\n const {\n htmlFor: _htmlFor,\n className: labelClassName,\n ...ownLabelProps\n } = labelProps ?? {};\n void _htmlFor;\n const shownLabel = {\n ...ownLabelProps,\n className: classNames(labelClass, labelClassName as string | undefined),\n } as React.HTMLAttributes<HTMLElement>;\n\n let legend: React.ReactNode = null;\n if (label) {\n legend = horizontal ? (\n <legend className={fieldLabelClass}>\n <span {...shownLabel}>{label}</span>\n </legend>\n ) : (\n <legend {...shownLabel}>{label}</legend>\n );\n }\n\n return (\n <FieldProvider value={true}>\n <fieldset\n className={classNames(fieldClass, fieldClassName)}\n role={role}\n {...attributes}\n >\n {legend}\n {horizontal ? (\n <div className={fieldBodyClass}>\n {children}\n {message}\n </div>\n ) : (\n <>\n {children}\n {message}\n </>\n )}\n </fieldset>\n </FieldProvider>\n );\n};\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":";;;;;AA0BA;;;;;;;AAOG;AACI,MAAM,aAAa,GAAiC,CAAC,EAC1D,KAAK,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,cAAc,EACd,IAAI,EACJ,UAAU,EACV,OAAO,EACP,QAAQ,GACT,KAAI;AACH,IAAA,MAAM,UAAU,GAAG,qBAAqB,CAAC,OAAO,EAAE;QAChD,eAAe,EAAE,CAAC,CAAC,UAAU;AAC9B,KAAA,CAAC;AACF,IAAA,MAAM,UAAU,GAAG,qBAAqB,CAAC,OAAO,CAAC;AACjD,IAAA,MAAM,eAAe,GAAG,qBAAqB,CAAC,aAAa,EAAE;AAC3D,QAAA,CAAC,MAAM,SAAS,IAAI,QAAQ,CAAA,CAAE,GAAG,IAAI;AACtC,KAAA,CAAC;AACF,IAAA,MAAM,cAAc,GAAG,qBAAqB,CAAC,YAAY,CAAC;;;AAI1D,IAAA,MAAM,EACJ,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,cAAc,EACzB,GAAG,aAAa,EACjB,GAAG,UAAU,IAAI,EAAE;AAEpB,IAAA,MAAM,UAAU,GAAG;AACjB,QAAA,GAAG,aAAa;AAChB,QAAA,SAAS,EAAE,UAAU,CAAC,UAAU,EAAE,cAAoC,CAAC;KACnC;IAEtC,IAAI,MAAM,GAAoB,IAAI;IAClC,IAAI,KAAK,EAAE;AACT,QAAA,MAAM,GAAG,UAAU,IACjBA,GAAA,CAAA,QAAA,EAAA,EAAQ,SAAS,EAAE,eAAe,EAAA,QAAA,EAChCA,GAAA,CAAA,MAAA,EAAA,EAAA,GAAU,UAAU,EAAA,QAAA,EAAG,KAAK,EAAA,CAAQ,EAAA,CAC7B,KAETA,GAAA,CAAA,QAAA,EAAA,EAAA,GAAY,UAAU,EAAA,QAAA,EAAG,KAAK,EAAA,CAAU,CACzC;IACH;IAEA,QACEA,GAAA,CAAC,aAAa,EAAA,EAAC,KAAK,EAAE,IAAI,EAAA,QAAA,EACxBC,IAAA,CAAA,UAAA,EAAA,EACE,SAAS,EAAE,UAAU,CAAC,UAAU,EAAE,cAAc,CAAC,EACjD,IAAI,EAAE,IAAI,EAAA,GACN,UAAU,EAAA,QAAA,EAAA,CAEb,MAAM,EACN,UAAU,IACTA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,cAAc,EAAA,QAAA,EAAA,CAC3B,QAAQ,EACR,OAAO,CAAA,EAAA,CACJ,KAENA,IAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CACG,QAAQ,EACR,OAAO,CAAA,EAAA,CACP,CACJ,CAAA,EAAA,CACQ,EAAA,CACG;AAEpB;;"}
1
+ {"version":3,"file":"groupFieldset.js","sources":["../../../src/form/groupFieldset.tsx"],"sourcesContent":["import React from 'react';\nimport { classNames, usePrefixedClassNames } from '../helpers/classNames';\nimport { FieldProvider } from './FormContext';\nimport type { FormFieldProps } from './fieldProps';\n\ninterface GroupFieldsetProps {\n /** The group's label, rendered as the `<legend>`. */\n label: React.ReactNode;\n /** Sizes the legend's label column when `horizontal`. */\n labelSize?: FormFieldProps['labelSize'];\n /** Props for the element that shows the label; any `htmlFor` is dropped. */\n labelProps?: FormFieldProps['labelProps'];\n /** Puts the legend in the label column and the rest in the body. */\n horizontal?: boolean;\n /** Set on the `<fieldset>` beside its `field` class. */\n fieldClassName?: string;\n /** The group's role, when it isn't the fieldset's own `group`. */\n role?: 'radiogroup';\n /** The group's own attributes: they describe the group, so they go on the `<fieldset>`. */\n attributes: object;\n /** The group's help text, after the content. */\n message: React.ReactNode;\n /** The group's content: its `Control` and the box of choices. */\n children: React.ReactNode;\n}\n\n/**\n * The `Field` a `Checkboxes` or `Radios` with `as=\"fieldset\"` renders of its\n * own, as a native `<fieldset>`: Bulma's field markup, with its label as the\n * `<legend>` (inside the `field-label` column when horizontal), so the legend\n * names the group and needs no id. It holds a `Field`'s place for what is\n * inside, so the choices read as inside a `Field`. Internal; not part of the\n * public API.\n */\nexport const GroupFieldset: React.FC<GroupFieldsetProps> = ({\n label,\n labelSize,\n labelProps,\n horizontal,\n fieldClassName,\n role,\n attributes,\n message,\n children,\n}) => {\n const fieldClass = usePrefixedClassNames('field', {\n 'is-horizontal': !!horizontal,\n });\n const labelClass = usePrefixedClassNames('label');\n const fieldLabelClass = usePrefixedClassNames('field-label', {\n [`is-${labelSize || 'normal'}`]: true,\n });\n const fieldBodyClass = usePrefixedClassNames('field-body');\n\n // A legend names its fieldset with no `for`, so a `htmlFor` has nothing\n // to point at.\n const {\n htmlFor: _htmlFor,\n className: labelClassName,\n ...ownLabelProps\n } = labelProps ?? {};\n void _htmlFor;\n const shownLabel = {\n ...ownLabelProps,\n className: classNames(labelClass, labelClassName as string | undefined),\n } as React.HTMLAttributes<HTMLElement>;\n\n let legend: React.ReactNode = null;\n if (label) {\n legend = horizontal ? (\n <legend className={fieldLabelClass}>\n <span {...shownLabel}>{label}</span>\n </legend>\n ) : (\n <legend {...shownLabel}>{label}</legend>\n );\n }\n\n return (\n <FieldProvider value={true}>\n <fieldset\n className={classNames(fieldClass, fieldClassName)}\n role={role}\n {...attributes}\n >\n {legend}\n {horizontal ? (\n <div className={fieldBodyClass}>\n {children}\n {message}\n </div>\n ) : (\n <>\n {children}\n {message}\n </>\n )}\n </fieldset>\n </FieldProvider>\n );\n};\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":";;;;;;AA0BA;;;;;;;AAOG;AACI,MAAM,aAAa,GAAiC,CAAC,EAC1D,KAAK,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,cAAc,EACd,IAAI,EACJ,UAAU,EACV,OAAO,EACP,QAAQ,GACT,KAAI;AACH,IAAA,MAAM,UAAU,GAAG,qBAAqB,CAAC,OAAO,EAAE;QAChD,eAAe,EAAE,CAAC,CAAC,UAAU;AAC9B,KAAA,CAAC;AACF,IAAA,MAAM,UAAU,GAAG,qBAAqB,CAAC,OAAO,CAAC;AACjD,IAAA,MAAM,eAAe,GAAG,qBAAqB,CAAC,aAAa,EAAE;AAC3D,QAAA,CAAC,MAAM,SAAS,IAAI,QAAQ,CAAA,CAAE,GAAG,IAAI;AACtC,KAAA,CAAC;AACF,IAAA,MAAM,cAAc,GAAG,qBAAqB,CAAC,YAAY,CAAC;;;AAI1D,IAAA,MAAM,EACJ,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,cAAc,EACzB,GAAG,aAAa,EACjB,GAAG,UAAU,IAAI,EAAE;AAEpB,IAAA,MAAM,UAAU,GAAG;AACjB,QAAA,GAAG,aAAa;AAChB,QAAA,SAAS,EAAE,UAAU,CAAC,UAAU,EAAE,cAAoC,CAAC;KACnC;IAEtC,IAAI,MAAM,GAAoB,IAAI;IAClC,IAAI,KAAK,EAAE;AACT,QAAA,MAAM,GAAG,UAAU,IACjBA,GAAA,CAAA,QAAA,EAAA,EAAQ,SAAS,EAAE,eAAe,EAAA,QAAA,EAChCA,GAAA,CAAA,MAAA,EAAA,EAAA,GAAU,UAAU,EAAA,QAAA,EAAG,KAAK,EAAA,CAAQ,EAAA,CAC7B,KAETA,GAAA,CAAA,QAAA,EAAA,EAAA,GAAY,UAAU,EAAA,QAAA,EAAG,KAAK,EAAA,CAAU,CACzC;IACH;IAEA,QACEA,GAAA,CAAC,aAAa,EAAA,EAAC,KAAK,EAAE,IAAI,EAAA,QAAA,EACxBC,IAAA,CAAA,UAAA,EAAA,EACE,SAAS,EAAE,UAAU,CAAC,UAAU,EAAE,cAAc,CAAC,EACjD,IAAI,EAAE,IAAI,EAAA,GACN,UAAU,EAAA,QAAA,EAAA,CAEb,MAAM,EACN,UAAU,IACTA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,cAAc,EAAA,QAAA,EAAA,CAC3B,QAAQ,EACR,OAAO,CAAA,EAAA,CACJ,KAENA,IAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CACG,QAAQ,EACR,OAAO,CAAA,EAAA,CACP,CACJ,CAAA,EAAA,CACQ,EAAA,CACG;AAEpB;;"}
@@ -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 { useId } from 'react';
3
4
  import { useFieldLabelId, useFieldLabelFor, useReportFieldLabelFor, useFieldLabelElementId } from './FormContext.js';
4
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"useAutoLabelId.js","sources":["../../../src/form/useAutoLabelId.ts"],"sourcesContent":["import React, { useId } from 'react';\nimport type { FieldProps } from './Field';\nimport {\n useFieldLabelElementId,\n useFieldLabelFor,\n useFieldLabelId,\n useReportFieldLabelFor,\n} from './FormContext';\n\ninterface UseAutoLabelIdOptions {\n /** The convenience `label` prop as passed by the caller. */\n label: React.ReactNode;\n /** User-supplied id for the control, if any. */\n id?: string;\n /** User-supplied labelProps, if any. */\n labelProps?: FieldProps['labelProps'];\n /**\n * True when this render actually outputs the label wired to a control —\n * false inside an outer Field (label is dropped), in variants that render\n * no Field, and in modes with no labellable control (e.g. inline pickers).\n */\n rendersLabel: boolean;\n /**\n * False when this render has no input to label at all (an inline picker),\n * so it takes no id from a surrounding Field either. Defaults to true.\n */\n hasInput?: boolean;\n /**\n * True when the control also points `aria-labelledby` at the label, as a\n * range Slider's thumbs (#981), Autocomplete's and Taginput's suggestion\n * lists (#998, #1082) and Combobox's list (#1083) do, so it needs the\n * label's own id. Its own label then gets one\n * (`labelProps.id` when given, otherwise a generated one), and the hook\n * returns it, or a surrounding Field's, as `labelId`.\n */\n needsLabelId?: boolean;\n}\n\n/**\n * Associates the convenience `label` prop with its control (#368): generates\n * an id for the control and returns labelProps carrying a matching `htmlFor`.\n * A user-supplied `id` is used as the target instead of the generated one, and\n * an explicit `htmlFor` key in labelProps — even set to `undefined` — disables\n * generation entirely: the user has taken over the association (#495 presence\n * semantics). When the control renders no label of its own, it adopts the id\n * a labeled Field around it offers, the way the bases do, so that Field's\n * label names it (#939); a user `id` still wins there. It tells that Field\n * when the control took its id, since the Field's label drops a `for`\n * nothing took (#1004). With `needsLabelId` it also returns the id of\n * whichever label names the control (#981).\n * Internal; not part of the public API.\n */\nexport function useAutoLabelId({\n label,\n id,\n labelProps,\n rendersLabel,\n hasInput = true,\n needsLabelId = false,\n}: UseAutoLabelIdOptions): {\n controlId: string | undefined;\n fieldLabelProps: FieldProps['labelProps'] | undefined;\n /** Whether a rendered label, its own or a surrounding Field's, points at `controlId`. */\n labelled: boolean;\n /**\n * With `needsLabelId`, the id of the label that names `controlId`, its own\n * or a surrounding Field's. Undefined when no label names it, or when a\n * Field's label wired by hand names it without an `id` in its labelProps,\n * since the Field generates none for a label wired by hand.\n */\n labelId: string | undefined;\n} {\n // Called unconditionally per the rules of hooks; SSR-safe on React 18 and 19.\n const generatedId = useId();\n // Read outside the control's own Field, so it is set only when an outer\n // Field holds the control, which then renders no label of its own.\n const fieldLabelId = useFieldLabelId();\n // What an outer Field's label points at, even when wired by hand, and the\n // id that label renders with, read together so the id is that label's.\n // Set in `grouped`/`hasAddons` Fields too when the label is wired by hand,\n // since its `for` names this one control whatever the layout (see Field).\n const fieldLabelFor = useFieldLabelFor();\n // Truthiness mirrors Field's own `if (label)` render gate.\n const active = !!label && rendersLabel;\n // Presence, not truthiness: `htmlFor: undefined` is an explicit opt-out and\n // must not leave an orphan generated id on the control.\n const userWired = !!labelProps && 'htmlFor' in labelProps;\n const adopted = !active && hasInput ? fieldLabelId : undefined;\n const controlId = id ?? (active && !userWired ? generatedId : adopted);\n // Tells a labeled Field around the control when its label's `for` names\n // the control, since it drops a `for` nothing took (#1004).\n useReportFieldLabelFor(\n fieldLabelId !== undefined && controlId === fieldLabelId\n );\n const ownLabelProps = { htmlFor: controlId, ...labelProps };\n const labelTarget = active ? ownLabelProps.htmlFor : fieldLabelFor.htmlFor;\n const labelled = !!controlId && labelTarget === controlId;\n // Only a label that names the control gets an id to point at, with the\n // suffix Field gives its own, from an id that is already unique.\n const ownLabelId =\n needsLabelId && active && labelled\n ? (labelProps?.id ?? `${generatedId}-label`)\n : undefined;\n // Inactive with a label still means an own Field may render it (pickers'\n // inline mode). The explicit `htmlFor: undefined` tells Field the\n // association is owned here, so it must not generate one that would\n // dangle (#495 presence semantics).\n const fieldLabelProps = active\n ? ownLabelId\n ? { ...ownLabelProps, id: ownLabelId }\n : ownLabelProps\n : label\n ? { htmlFor: undefined, ...labelProps }\n : labelProps;\n const labelId =\n needsLabelId && labelled\n ? active\n ? ownLabelId\n : fieldLabelFor.id\n : undefined;\n return { controlId, fieldLabelProps, labelled, labelId };\n}\n\ninterface UseAutoLabelledByOptions {\n /** The convenience `label` prop as passed by the caller. */\n label: React.ReactNode;\n /** User-supplied labelProps, if any. */\n labelProps?: FieldProps['labelProps'];\n /** True when this render actually outputs the label naming the group. */\n rendersLabel: boolean;\n /**\n * The caller's remaining props. A non-empty `aria-label` among them names\n * the group, and so does any `aria-labelledby` key, even an undefined one,\n * since the group spreads them after its own attribute. Either keeps every\n * label off the group, its own and a surrounding Field's alike.\n */\n callerProps: object;\n}\n\n/**\n * Group-input counterpart of {@link useAutoLabelId} (#494): a group of\n * controls cannot take a single `htmlFor`, so instead the rendered `<label>`\n * gets a generated id and the group container points at it with\n * `aria-labelledby`. A user-supplied `labelProps.id` is used as the target\n * instead of generating one. Any caller `htmlFor` is stripped — a group label\n * names the group, never a single control — so the merged labelProps always\n * carry an explicit `htmlFor: undefined`. When the group renders no label of\n * its own, it points at the label of a labeled Field around it instead\n * (#939). A caller who named the group with `aria-label` or\n * `aria-labelledby` gets no `aria-labelledby` from either label, so their\n * name wins wherever the label sits.\n * Internal; not part of the public API.\n */\nexport function useAutoLabelledBy({\n label,\n labelProps,\n rendersLabel,\n callerProps,\n}: UseAutoLabelledByOptions): {\n ariaLabelledBy: string | undefined;\n fieldLabelProps: FieldProps['labelProps'] | undefined;\n} {\n // Called unconditionally per the rules of hooks; SSR-safe on React 18 and 19.\n const generatedId = useId();\n // Set only when an outer Field holds the group (see useAutoLabelId).\n const fieldLabelElementId = useFieldLabelElementId();\n const active = !!label && rendersLabel;\n const labelId = labelProps?.id ?? (active ? generatedId : undefined);\n const fieldLabelProps = active\n ? { ...labelProps, id: labelId, htmlFor: undefined }\n : labelProps;\n const aria = callerProps as React.AriaAttributes;\n // Presence for aria-labelledby: the caller's key replaces the attribute\n // through the spread whatever its value, and pointing it at a label would\n // only take a Rate's fallback name away. Checked before either label, so\n // the caller's name wins over the group's own `label` as it does over a\n // Field's, the way an aria-label beats a `<label for>` on a single input.\n const callerNamed = !!aria['aria-label'] || 'aria-labelledby' in aria;\n const ariaLabelledBy = callerNamed\n ? undefined\n : active\n ? labelId\n : fieldLabelElementId;\n return { ariaLabelledBy, fieldLabelProps };\n}\n"],"names":[],"mappings":";;;;AAsCA;;;;;;;;;;;;;AAaG;SACa,cAAc,CAAC,EAC7B,KAAK,EACL,EAAE,EACF,UAAU,EACV,YAAY,EACZ,QAAQ,GAAG,IAAI,EACf,YAAY,GAAG,KAAK,GACE,EAAA;;AActB,IAAA,MAAM,WAAW,GAAG,KAAK,EAAE;;;AAG3B,IAAA,MAAM,YAAY,GAAG,eAAe,EAAE;;;;;AAKtC,IAAA,MAAM,aAAa,GAAG,gBAAgB,EAAE;;AAExC,IAAA,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,YAAY;;;IAGtC,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,IAAI,SAAS,IAAI,UAAU;AACzD,IAAA,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,QAAQ,GAAG,YAAY,GAAG,SAAS;AAC9D,IAAA,MAAM,SAAS,GAAG,EAAE,KAAK,MAAM,IAAI,CAAC,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;;;IAGtE,sBAAsB,CACpB,YAAY,KAAK,SAAS,IAAI,SAAS,KAAK,YAAY,CACzD;IACD,MAAM,aAAa,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE;AAC3D,IAAA,MAAM,WAAW,GAAG,MAAM,GAAG,aAAa,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO;IAC1E,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,IAAI,WAAW,KAAK,SAAS;;;AAGzD,IAAA,MAAM,UAAU,GACd,YAAY,IAAI,MAAM,IAAI;WACrB,UAAU,EAAE,EAAE,IAAI,CAAA,EAAG,WAAW,CAAA,MAAA,CAAQ;UACzC,SAAS;;;;;IAKf,MAAM,eAAe,GAAG;AACtB,UAAE;cACE,EAAE,GAAG,aAAa,EAAE,EAAE,EAAE,UAAU;AACpC,cAAE;AACJ,UAAE;cACE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU;cACnC,UAAU;AAChB,IAAA,MAAM,OAAO,GACX,YAAY,IAAI;AACd,UAAE;AACA,cAAE;cACA,aAAa,CAAC;UAChB,SAAS;IACf,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC1D;AAkBA;;;;;;;;;;;;;AAaG;AACG,SAAU,iBAAiB,CAAC,EAChC,KAAK,EACL,UAAU,EACV,YAAY,EACZ,WAAW,GACc,EAAA;;AAKzB,IAAA,MAAM,WAAW,GAAG,KAAK,EAAE;;AAE3B,IAAA,MAAM,mBAAmB,GAAG,sBAAsB,EAAE;AACpD,IAAA,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,YAAY;AACtC,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,EAAE,KAAK,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IACpE,MAAM,eAAe,GAAG;AACtB,UAAE,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;UAChD,UAAU;IACd,MAAM,IAAI,GAAG,WAAmC;;;;;;AAMhD,IAAA,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,iBAAiB,IAAI,IAAI;IACrE,MAAM,cAAc,GAAG;AACrB,UAAE;AACF,UAAE;AACA,cAAE;cACA,mBAAmB;AACzB,IAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE;AAC5C;;"}
1
+ {"version":3,"file":"useAutoLabelId.js","sources":["../../../src/form/useAutoLabelId.ts"],"sourcesContent":["import React, { useId } from 'react';\nimport type { FieldProps } from './Field';\nimport {\n useFieldLabelElementId,\n useFieldLabelFor,\n useFieldLabelId,\n useReportFieldLabelFor,\n} from './FormContext';\n\ninterface UseAutoLabelIdOptions {\n /** The convenience `label` prop as passed by the caller. */\n label: React.ReactNode;\n /** User-supplied id for the control, if any. */\n id?: string;\n /** User-supplied labelProps, if any. */\n labelProps?: FieldProps['labelProps'];\n /**\n * True when this render actually outputs the label wired to a control —\n * false inside an outer Field (label is dropped), in variants that render\n * no Field, and in modes with no labellable control (e.g. inline pickers).\n */\n rendersLabel: boolean;\n /**\n * False when this render has no input to label at all (an inline picker),\n * so it takes no id from a surrounding Field either. Defaults to true.\n */\n hasInput?: boolean;\n /**\n * True when the control also points `aria-labelledby` at the label, as a\n * range Slider's thumbs (#981), Autocomplete's and Taginput's suggestion\n * lists (#998, #1082) and Combobox's list (#1083) do, so it needs the\n * label's own id. Its own label then gets one\n * (`labelProps.id` when given, otherwise a generated one), and the hook\n * returns it, or a surrounding Field's, as `labelId`.\n */\n needsLabelId?: boolean;\n}\n\n/**\n * Associates the convenience `label` prop with its control (#368): generates\n * an id for the control and returns labelProps carrying a matching `htmlFor`.\n * A user-supplied `id` is used as the target instead of the generated one, and\n * an explicit `htmlFor` key in labelProps — even set to `undefined` — disables\n * generation entirely: the user has taken over the association (#495 presence\n * semantics). When the control renders no label of its own, it adopts the id\n * a labeled Field around it offers, the way the bases do, so that Field's\n * label names it (#939); a user `id` still wins there. It tells that Field\n * when the control took its id, since the Field's label drops a `for`\n * nothing took (#1004). With `needsLabelId` it also returns the id of\n * whichever label names the control (#981).\n * Internal; not part of the public API.\n */\nexport function useAutoLabelId({\n label,\n id,\n labelProps,\n rendersLabel,\n hasInput = true,\n needsLabelId = false,\n}: UseAutoLabelIdOptions): {\n controlId: string | undefined;\n fieldLabelProps: FieldProps['labelProps'] | undefined;\n /** Whether a rendered label, its own or a surrounding Field's, points at `controlId`. */\n labelled: boolean;\n /**\n * With `needsLabelId`, the id of the label that names `controlId`, its own\n * or a surrounding Field's. Undefined when no label names it, or when a\n * Field's label wired by hand names it without an `id` in its labelProps,\n * since the Field generates none for a label wired by hand.\n */\n labelId: string | undefined;\n} {\n // Called unconditionally per the rules of hooks; SSR-safe on React 18 and 19.\n const generatedId = useId();\n // Read outside the control's own Field, so it is set only when an outer\n // Field holds the control, which then renders no label of its own.\n const fieldLabelId = useFieldLabelId();\n // What an outer Field's label points at, even when wired by hand, and the\n // id that label renders with, read together so the id is that label's.\n // Set in `grouped`/`hasAddons` Fields too when the label is wired by hand,\n // since its `for` names this one control whatever the layout (see Field).\n const fieldLabelFor = useFieldLabelFor();\n // Truthiness mirrors Field's own `if (label)` render gate.\n const active = !!label && rendersLabel;\n // Presence, not truthiness: `htmlFor: undefined` is an explicit opt-out and\n // must not leave an orphan generated id on the control.\n const userWired = !!labelProps && 'htmlFor' in labelProps;\n const adopted = !active && hasInput ? fieldLabelId : undefined;\n const controlId = id ?? (active && !userWired ? generatedId : adopted);\n // Tells a labeled Field around the control when its label's `for` names\n // the control, since it drops a `for` nothing took (#1004).\n useReportFieldLabelFor(\n fieldLabelId !== undefined && controlId === fieldLabelId\n );\n const ownLabelProps = { htmlFor: controlId, ...labelProps };\n const labelTarget = active ? ownLabelProps.htmlFor : fieldLabelFor.htmlFor;\n const labelled = !!controlId && labelTarget === controlId;\n // Only a label that names the control gets an id to point at, with the\n // suffix Field gives its own, from an id that is already unique.\n const ownLabelId =\n needsLabelId && active && labelled\n ? (labelProps?.id ?? `${generatedId}-label`)\n : undefined;\n // Inactive with a label still means an own Field may render it (pickers'\n // inline mode). The explicit `htmlFor: undefined` tells Field the\n // association is owned here, so it must not generate one that would\n // dangle (#495 presence semantics).\n const fieldLabelProps = active\n ? ownLabelId\n ? { ...ownLabelProps, id: ownLabelId }\n : ownLabelProps\n : label\n ? { htmlFor: undefined, ...labelProps }\n : labelProps;\n const labelId =\n needsLabelId && labelled\n ? active\n ? ownLabelId\n : fieldLabelFor.id\n : undefined;\n return { controlId, fieldLabelProps, labelled, labelId };\n}\n\ninterface UseAutoLabelledByOptions {\n /** The convenience `label` prop as passed by the caller. */\n label: React.ReactNode;\n /** User-supplied labelProps, if any. */\n labelProps?: FieldProps['labelProps'];\n /** True when this render actually outputs the label naming the group. */\n rendersLabel: boolean;\n /**\n * The caller's remaining props. A non-empty `aria-label` among them names\n * the group, and so does any `aria-labelledby` key, even an undefined one,\n * since the group spreads them after its own attribute. Either keeps every\n * label off the group, its own and a surrounding Field's alike.\n */\n callerProps: object;\n}\n\n/**\n * Group-input counterpart of {@link useAutoLabelId} (#494): a group of\n * controls cannot take a single `htmlFor`, so instead the rendered `<label>`\n * gets a generated id and the group container points at it with\n * `aria-labelledby`. A user-supplied `labelProps.id` is used as the target\n * instead of generating one. Any caller `htmlFor` is stripped — a group label\n * names the group, never a single control — so the merged labelProps always\n * carry an explicit `htmlFor: undefined`. When the group renders no label of\n * its own, it points at the label of a labeled Field around it instead\n * (#939). A caller who named the group with `aria-label` or\n * `aria-labelledby` gets no `aria-labelledby` from either label, so their\n * name wins wherever the label sits.\n * Internal; not part of the public API.\n */\nexport function useAutoLabelledBy({\n label,\n labelProps,\n rendersLabel,\n callerProps,\n}: UseAutoLabelledByOptions): {\n ariaLabelledBy: string | undefined;\n fieldLabelProps: FieldProps['labelProps'] | undefined;\n} {\n // Called unconditionally per the rules of hooks; SSR-safe on React 18 and 19.\n const generatedId = useId();\n // Set only when an outer Field holds the group (see useAutoLabelId).\n const fieldLabelElementId = useFieldLabelElementId();\n const active = !!label && rendersLabel;\n const labelId = labelProps?.id ?? (active ? generatedId : undefined);\n const fieldLabelProps = active\n ? { ...labelProps, id: labelId, htmlFor: undefined }\n : labelProps;\n const aria = callerProps as React.AriaAttributes;\n // Presence for aria-labelledby: the caller's key replaces the attribute\n // through the spread whatever its value, and pointing it at a label would\n // only take a Rate's fallback name away. Checked before either label, so\n // the caller's name wins over the group's own `label` as it does over a\n // Field's, the way an aria-label beats a `<label for>` on a single input.\n const callerNamed = !!aria['aria-label'] || 'aria-labelledby' in aria;\n const ariaLabelledBy = callerNamed\n ? undefined\n : active\n ? labelId\n : fieldLabelElementId;\n return { ariaLabelledBy, fieldLabelProps };\n}\n"],"names":[],"mappings":";;;;;AAsCA;;;;;;;;;;;;;AAaG;SACa,cAAc,CAAC,EAC7B,KAAK,EACL,EAAE,EACF,UAAU,EACV,YAAY,EACZ,QAAQ,GAAG,IAAI,EACf,YAAY,GAAG,KAAK,GACE,EAAA;;AActB,IAAA,MAAM,WAAW,GAAG,KAAK,EAAE;;;AAG3B,IAAA,MAAM,YAAY,GAAG,eAAe,EAAE;;;;;AAKtC,IAAA,MAAM,aAAa,GAAG,gBAAgB,EAAE;;AAExC,IAAA,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,YAAY;;;IAGtC,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,IAAI,SAAS,IAAI,UAAU;AACzD,IAAA,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,QAAQ,GAAG,YAAY,GAAG,SAAS;AAC9D,IAAA,MAAM,SAAS,GAAG,EAAE,KAAK,MAAM,IAAI,CAAC,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;;;IAGtE,sBAAsB,CACpB,YAAY,KAAK,SAAS,IAAI,SAAS,KAAK,YAAY,CACzD;IACD,MAAM,aAAa,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE;AAC3D,IAAA,MAAM,WAAW,GAAG,MAAM,GAAG,aAAa,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO;IAC1E,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,IAAI,WAAW,KAAK,SAAS;;;AAGzD,IAAA,MAAM,UAAU,GACd,YAAY,IAAI,MAAM,IAAI;WACrB,UAAU,EAAE,EAAE,IAAI,CAAA,EAAG,WAAW,CAAA,MAAA,CAAQ;UACzC,SAAS;;;;;IAKf,MAAM,eAAe,GAAG;AACtB,UAAE;cACE,EAAE,GAAG,aAAa,EAAE,EAAE,EAAE,UAAU;AACpC,cAAE;AACJ,UAAE;cACE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU;cACnC,UAAU;AAChB,IAAA,MAAM,OAAO,GACX,YAAY,IAAI;AACd,UAAE;AACA,cAAE;cACA,aAAa,CAAC;UAChB,SAAS;IACf,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC1D;AAkBA;;;;;;;;;;;;;AAaG;AACG,SAAU,iBAAiB,CAAC,EAChC,KAAK,EACL,UAAU,EACV,YAAY,EACZ,WAAW,GACc,EAAA;;AAKzB,IAAA,MAAM,WAAW,GAAG,KAAK,EAAE;;AAE3B,IAAA,MAAM,mBAAmB,GAAG,sBAAsB,EAAE;AACpD,IAAA,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,YAAY;AACtC,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,EAAE,KAAK,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IACpE,MAAM,eAAe,GAAG;AACtB,UAAE,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;UAChD,UAAU;IACd,MAAM,IAAI,GAAG,WAAmC;;;;;;AAMhD,IAAA,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,iBAAiB,IAAI,IAAI;IACrE,MAAM,cAAc,GAAG;AACrB,UAAE;AACF,UAAE;AACA,cAAE;cACA,mBAAmB;AACzB,IAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE;AAC5C;;"}
@@ -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 { usePrefixedClassNames, classNames } from '../helpers/classNames.js';
4
5
  import { useBulmaClasses } from '../helpers/useBulmaClasses.js';
@@ -1 +1 @@
1
- {"version":3,"file":"Cell.js","sources":["../../../src/grid/Cell.tsx"],"sourcesContent":["import React from 'react';\nimport { classNames, usePrefixedClassNames } from '../helpers/classNames';\nimport {\n useBulmaClasses,\n BulmaClassesProps,\n validColors,\n} from '../helpers/useBulmaClasses';\n\n/**\n * Type for grid cell span values.\n */\nexport type CellSpanValue = number;\n\n/**\n * Props for the Cell component.\n */\nexport interface CellProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Which column the cell starts at (Bulma: `is-col-start-x`). */\n colStart?: number;\n /** Which column the cell ends at, counting from the end (Bulma: `is-col-from-end-x`). */\n colFromEnd?: number;\n /** How many columns the cell will span (Bulma: `is-col-span-x`). */\n colSpan?: CellSpanValue;\n /** Which row the cell starts at (Bulma: `is-row-start-x`). */\n rowStart?: number;\n /** Which row the cell ends at, counting from the end (Bulma: `is-row-from-end-x`). */\n rowFromEnd?: number;\n /** How many rows the cell will span (Bulma: `is-row-span-x`). */\n rowSpan?: CellSpanValue;\n /** Additional CSS class names. */\n className?: string;\n /** Text color. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Bulma color modifier for the cell. */\n color?: 'primary' | 'link' | 'info' | 'success' | 'warning' | 'danger';\n /** Background color. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Content to render inside the cell. */\n children?: React.ReactNode;\n}\n\n/**\n * The `Cell` component provides a single Bulma grid cell for use inside the [`Grid`](./grid.md) component.\n *\n * @function\n * @param {CellProps} props - Props for the Cell component.\n * @returns {JSX.Element} The rendered grid cell.\n * @see {@link https://bulma.io/documentation/grid/ | Bulma Grid documentation}\n */\nexport const Cell: React.FC<CellProps> = ({\n colStart,\n colFromEnd,\n colSpan,\n rowStart,\n rowFromEnd,\n rowSpan,\n className,\n textColor,\n color: _fieldColor,\n bgColor,\n children,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor,\n backgroundColor: bgColor,\n ...props,\n });\n\n const mainClass = usePrefixedClassNames('cell');\n\n // Build cell grid classes with prefixes\n const cellGridClasses = usePrefixedClassNames('', {\n [`is-col-start-${colStart}`]: colStart !== undefined && colStart !== null,\n [`is-col-from-end-${colFromEnd}`]:\n colFromEnd !== undefined && colFromEnd !== null,\n [`is-col-span-${colSpan}`]: colSpan !== undefined && colSpan !== null,\n [`is-row-start-${rowStart}`]: rowStart !== undefined && rowStart !== null,\n [`is-row-from-end-${rowFromEnd}`]:\n rowFromEnd !== undefined && rowFromEnd !== null,\n [`is-row-span-${rowSpan}`]: rowSpan !== undefined && rowSpan !== null,\n });\n\n const cellClasses = classNames(\n mainClass,\n cellGridClasses,\n className,\n bulmaHelperClasses\n );\n\n return (\n <div className={cellClasses} {...rest}>\n {children}\n </div>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;AA4CA;;;;;;;AAOG;AACI,MAAM,IAAI,GAAwB,CAAC,EACxC,QAAQ,EACR,UAAU,EACV,OAAO,EACP,QAAQ,EACR,UAAU,EACV,OAAO,EACP,SAAS,EACT,SAAS,EACT,KAAK,EAAE,WAAW,EAClB,OAAO,EACP,QAAQ,EACR,GAAG,KAAK,EACT,KAAI;AACH,IAAA,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC;AACnD,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,eAAe,EAAE,OAAO;AACxB,QAAA,GAAG,KAAK;AACT,KAAA,CAAC;AAEF,IAAA,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC;;AAG/C,IAAA,MAAM,eAAe,GAAG,qBAAqB,CAAC,EAAE,EAAE;QAChD,CAAC,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAE,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;QACzE,CAAC,CAAA,gBAAA,EAAmB,UAAU,CAAA,CAAE,GAC9B,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI;QACjD,CAAC,CAAA,YAAA,EAAe,OAAO,CAAA,CAAE,GAAG,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI;QACrE,CAAC,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAE,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;QACzE,CAAC,CAAA,gBAAA,EAAmB,UAAU,CAAA,CAAE,GAC9B,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI;QACjD,CAAC,CAAA,YAAA,EAAe,OAAO,CAAA,CAAE,GAAG,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI;AACtE,KAAA,CAAC;AAEF,IAAA,MAAM,WAAW,GAAG,UAAU,CAC5B,SAAS,EACT,eAAe,EACf,SAAS,EACT,kBAAkB,CACnB;IAED,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,WAAW,EAAA,GAAM,IAAI,EAAA,QAAA,EAClC,QAAQ,EAAA,CACL;AAEV;;"}
1
+ {"version":3,"file":"Cell.js","sources":["../../../src/grid/Cell.tsx"],"sourcesContent":["import React from 'react';\nimport { classNames, usePrefixedClassNames } from '../helpers/classNames';\nimport {\n useBulmaClasses,\n BulmaClassesProps,\n validColors,\n} from '../helpers/useBulmaClasses';\n\n/**\n * Type for grid cell span values.\n */\nexport type CellSpanValue = number;\n\n/**\n * Props for the Cell component.\n */\nexport interface CellProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Which column the cell starts at (Bulma: `is-col-start-x`). */\n colStart?: number;\n /** Which column the cell ends at, counting from the end (Bulma: `is-col-from-end-x`). */\n colFromEnd?: number;\n /** How many columns the cell will span (Bulma: `is-col-span-x`). */\n colSpan?: CellSpanValue;\n /** Which row the cell starts at (Bulma: `is-row-start-x`). */\n rowStart?: number;\n /** Which row the cell ends at, counting from the end (Bulma: `is-row-from-end-x`). */\n rowFromEnd?: number;\n /** How many rows the cell will span (Bulma: `is-row-span-x`). */\n rowSpan?: CellSpanValue;\n /** Additional CSS class names. */\n className?: string;\n /** Text color. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Bulma color modifier for the cell. */\n color?: 'primary' | 'link' | 'info' | 'success' | 'warning' | 'danger';\n /** Background color. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Content to render inside the cell. */\n children?: React.ReactNode;\n}\n\n/**\n * The `Cell` component provides a single Bulma grid cell for use inside the [`Grid`](./grid.md) component.\n *\n * @function\n * @param {CellProps} props - Props for the Cell component.\n * @returns {JSX.Element} The rendered grid cell.\n * @see {@link https://bulma.io/documentation/grid/ | Bulma Grid documentation}\n */\nexport const Cell: React.FC<CellProps> = ({\n colStart,\n colFromEnd,\n colSpan,\n rowStart,\n rowFromEnd,\n rowSpan,\n className,\n textColor,\n color: _fieldColor,\n bgColor,\n children,\n ...props\n}) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor,\n backgroundColor: bgColor,\n ...props,\n });\n\n const mainClass = usePrefixedClassNames('cell');\n\n // Build cell grid classes with prefixes\n const cellGridClasses = usePrefixedClassNames('', {\n [`is-col-start-${colStart}`]: colStart !== undefined && colStart !== null,\n [`is-col-from-end-${colFromEnd}`]:\n colFromEnd !== undefined && colFromEnd !== null,\n [`is-col-span-${colSpan}`]: colSpan !== undefined && colSpan !== null,\n [`is-row-start-${rowStart}`]: rowStart !== undefined && rowStart !== null,\n [`is-row-from-end-${rowFromEnd}`]:\n rowFromEnd !== undefined && rowFromEnd !== null,\n [`is-row-span-${rowSpan}`]: rowSpan !== undefined && rowSpan !== null,\n });\n\n const cellClasses = classNames(\n mainClass,\n cellGridClasses,\n className,\n bulmaHelperClasses\n );\n\n return (\n <div className={cellClasses} {...rest}>\n {children}\n </div>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;AA4CA;;;;;;;AAOG;AACI,MAAM,IAAI,GAAwB,CAAC,EACxC,QAAQ,EACR,UAAU,EACV,OAAO,EACP,QAAQ,EACR,UAAU,EACV,OAAO,EACP,SAAS,EACT,SAAS,EACT,KAAK,EAAE,WAAW,EAClB,OAAO,EACP,QAAQ,EACR,GAAG,KAAK,EACT,KAAI;AACH,IAAA,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC;AACnD,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,eAAe,EAAE,OAAO;AACxB,QAAA,GAAG,KAAK;AACT,KAAA,CAAC;AAEF,IAAA,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC;;AAG/C,IAAA,MAAM,eAAe,GAAG,qBAAqB,CAAC,EAAE,EAAE;QAChD,CAAC,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAE,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;QACzE,CAAC,CAAA,gBAAA,EAAmB,UAAU,CAAA,CAAE,GAC9B,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI;QACjD,CAAC,CAAA,YAAA,EAAe,OAAO,CAAA,CAAE,GAAG,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI;QACrE,CAAC,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAE,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;QACzE,CAAC,CAAA,gBAAA,EAAmB,UAAU,CAAA,CAAE,GAC9B,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI;QACjD,CAAC,CAAA,YAAA,EAAe,OAAO,CAAA,CAAE,GAAG,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI;AACtE,KAAA,CAAC;AAEF,IAAA,MAAM,WAAW,GAAG,UAAU,CAC5B,SAAS,EACT,eAAe,EACf,SAAS,EACT,kBAAkB,CACnB;IAED,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,WAAW,EAAA,GAAM,IAAI,EAAA,QAAA,EAClC,QAAQ,EAAA,CACL;AAEV;;"}
@@ -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 { usePrefixedClassNames, classNames } from '../helpers/classNames.js';
4
5
  import { withSubComponents } from '../helpers/withSubComponents.js';
@@ -1 +1 @@
1
- {"version":3,"file":"Grid.js","sources":["../../../src/grid/Grid.tsx"],"sourcesContent":["import React from 'react';\nimport { classNames, usePrefixedClassNames } from '../helpers/classNames';\nimport { withSubComponents } from '../helpers/withSubComponents';\nimport { Cell } from './Cell';\nimport {\n useBulmaClasses,\n BulmaClassesProps,\n validColors,\n} from '../helpers/useBulmaClasses';\nimport type { BulmaGapStep } from '../helpers/bulmaClassHelpers';\n\n/**\n * The whole steps of Bulma's 0-8 gap scale, as `Columns` takes them. Accepts\n * the value as a number or a numeric string.\n *\n * `Grid`'s gap props and the shared `gap`, `columnGap` and `rowGap` helper\n * props take the half steps as well, as `BulmaGapStep`.\n */\nexport type BulmaGapValue =\n | 0\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6\n | 7\n | 8\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8';\n/**\n * Allowed minimum column values for Bulma grid.\n */\nexport type BulmaMinColValue =\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6\n | 7\n | 8\n | 9\n | 10\n | 11\n | 12\n | 13\n | 14\n | 15\n | 16\n | 17\n | 18\n | 19\n | 20\n | 21\n | 22\n | 23\n | 24\n | 25\n | 26\n | 27\n | 28\n | 29\n | 30\n | 31\n | 32;\n/**\n * Allowed fixed grid columns for Bulma grid.\n */\nexport type BulmaFixedGridCols =\n 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\n/**\n * Allowed fixed grid columns prop for Bulma grid.\n */\nexport type BulmaFixedGridColsProp = BulmaFixedGridCols | 'auto';\n\n/**\n * Props for the Grid component.\n */\nexport interface GridProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Use a fixed grid layout (`.fixed-grid > .grid`). */\n isFixed?: boolean;\n /**\n * Main gap for grid (Bulma `is-gap-X`), a whole or half step of Bulma's gap\n * scale. The same values and class as the `gap` helper prop on every other\n * component.\n */\n gap?: BulmaGapStep;\n /** Column gap for grid (`is-column-gap-X`), on the same scale as `gap`. */\n columnGap?: BulmaGapStep;\n /** Row gap for grid (`is-row-gap-X`), on the same scale as `gap`. */\n rowGap?: BulmaGapStep;\n /** Minimum column width for the grid (`is-col-min-X`). */\n minCol?: BulmaMinColValue;\n /** For fixed grids: explicit column count (`has-X-cols`), or `'auto'` for auto-count. */\n fixedCols?: BulmaFixedGridColsProp;\n /** For fixed grids: explicit column count for mobile. */\n fixedColsMobile?: BulmaFixedGridCols;\n /** For fixed grids: explicit column count for tablet. */\n fixedColsTablet?: BulmaFixedGridCols;\n /** For fixed grids: explicit column count for desktop. */\n fixedColsDesktop?: BulmaFixedGridCols;\n /** For fixed grids: explicit column count for widescreen. */\n fixedColsWidescreen?: BulmaFixedGridCols;\n /** For fixed grids: explicit column count for fullhd. */\n fixedColsFullhd?: BulmaFixedGridCols;\n /** Additional CSS classes for the grid. */\n className?: string;\n /** Text color. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Bulma color modifier for the grid. */\n color?: 'primary' | 'link' | 'info' | 'success' | 'warning' | 'danger';\n /** Background color. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Children to render inside the grid (usually `Cell` components). */\n children?: React.ReactNode;\n}\n\n/**\n * The `Grid` component provides Bulma's advanced CSS Grid layout for complex, modern layouts.\n *\n * @function\n * @param {GridProps} props - Props for the Grid component.\n * @returns {JSX.Element} The rendered grid.\n * @see {@link https://bulma.io/documentation/grid/ | Bulma Grid documentation}\n */\nconst GridComponent: React.FC<GridProps> = ({\n isFixed = false,\n gap,\n columnGap,\n rowGap,\n minCol,\n fixedCols,\n fixedColsMobile,\n fixedColsTablet,\n fixedColsDesktop,\n fixedColsWidescreen,\n fixedColsFullhd,\n className,\n textColor,\n color: _fieldColor,\n bgColor,\n children,\n ...props\n}) => {\n // Map textColor and bgColor to color and backgroundColor for useBulmaClasses\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor,\n backgroundColor: bgColor,\n ...props,\n });\n\n const mainClass = usePrefixedClassNames('grid');\n\n // Build grid inner classes with prefixes\n const gridInnerClasses = usePrefixedClassNames('', {\n [`is-gap-${gap}`]: gap !== undefined && gap !== null,\n [`is-column-gap-${columnGap}`]:\n columnGap !== undefined && columnGap !== null,\n [`is-row-gap-${rowGap}`]: rowGap !== undefined && rowGap !== null,\n [`is-col-min-${minCol}`]: minCol !== undefined && minCol !== null,\n });\n\n // Build fixed grid classes with prefixes (always called, used conditionally)\n const fixedGridClasses = usePrefixedClassNames('fixed-grid', {\n 'has-auto-count': fixedCols === 'auto',\n [`has-${fixedCols}-cols`]: fixedCols !== undefined && fixedCols !== 'auto',\n [`has-${fixedColsMobile}-cols-mobile`]:\n fixedColsMobile !== undefined && fixedColsMobile !== null,\n [`has-${fixedColsTablet}-cols-tablet`]:\n fixedColsTablet !== undefined && fixedColsTablet !== null,\n [`has-${fixedColsDesktop}-cols-desktop`]:\n fixedColsDesktop !== undefined && fixedColsDesktop !== null,\n [`has-${fixedColsWidescreen}-cols-widescreen`]:\n fixedColsWidescreen !== undefined && fixedColsWidescreen !== null,\n [`has-${fixedColsFullhd}-cols-fullhd`]:\n fixedColsFullhd !== undefined && fixedColsFullhd !== null,\n });\n\n const gridClasses = classNames(\n mainClass,\n gridInnerClasses,\n bulmaHelperClasses,\n className\n );\n\n if (isFixed) {\n return (\n <div className={fixedGridClasses}>\n <div className={gridClasses} {...rest}>\n {children}\n </div>\n </div>\n );\n }\n\n // Standard Bulma grid (not fixed)\n return (\n <div className={gridClasses} {...rest}>\n {children}\n </div>\n );\n};\n\nexport const Grid = withSubComponents(GridComponent, { Cell }, 'Grid');\n"],"names":["_jsx"],"mappings":";;;;;;;AAgIA;;;;;;;AAOG;AACH,MAAM,aAAa,GAAwB,CAAC,EAC1C,OAAO,GAAG,KAAK,EACf,GAAG,EACH,SAAS,EACT,MAAM,EACN,MAAM,EACN,SAAS,EACT,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,SAAS,EACT,SAAS,EACT,KAAK,EAAE,WAAW,EAClB,OAAO,EACP,QAAQ,EACR,GAAG,KAAK,EACT,KAAI;;AAEH,IAAA,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC;AACnD,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,eAAe,EAAE,OAAO;AACxB,QAAA,GAAG,KAAK;AACT,KAAA,CAAC;AAEF,IAAA,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC;;AAG/C,IAAA,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,EAAE,EAAE;QACjD,CAAC,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE,GAAG,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;QACpD,CAAC,CAAA,cAAA,EAAiB,SAAS,CAAA,CAAE,GAC3B,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI;QAC/C,CAAC,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;QACjE,CAAC,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;AAClE,KAAA,CAAC;;AAGF,IAAA,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,YAAY,EAAE;QAC3D,gBAAgB,EAAE,SAAS,KAAK,MAAM;QACtC,CAAC,CAAA,IAAA,EAAO,SAAS,CAAA,KAAA,CAAO,GAAG,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,MAAM;QAC1E,CAAC,CAAA,IAAA,EAAO,eAAe,CAAA,YAAA,CAAc,GACnC,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,IAAI;QAC3D,CAAC,CAAA,IAAA,EAAO,eAAe,CAAA,YAAA,CAAc,GACnC,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,IAAI;QAC3D,CAAC,CAAA,IAAA,EAAO,gBAAgB,CAAA,aAAA,CAAe,GACrC,gBAAgB,KAAK,SAAS,IAAI,gBAAgB,KAAK,IAAI;QAC7D,CAAC,CAAA,IAAA,EAAO,mBAAmB,CAAA,gBAAA,CAAkB,GAC3C,mBAAmB,KAAK,SAAS,IAAI,mBAAmB,KAAK,IAAI;QACnE,CAAC,CAAA,IAAA,EAAO,eAAe,CAAA,YAAA,CAAc,GACnC,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,IAAI;AAC5D,KAAA,CAAC;AAEF,IAAA,MAAM,WAAW,GAAG,UAAU,CAC5B,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,CACV;IAED,IAAI,OAAO,EAAE;AACX,QAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,gBAAgB,YAC9BA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,WAAW,KAAM,IAAI,EAAA,QAAA,EAClC,QAAQ,EAAA,CACL,EAAA,CACF;IAEV;;IAGA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,WAAW,EAAA,GAAM,IAAI,EAAA,QAAA,EAClC,QAAQ,EAAA,CACL;AAEV,CAAC;AAEM,MAAM,IAAI,GAAG,iBAAiB,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM;;"}
1
+ {"version":3,"file":"Grid.js","sources":["../../../src/grid/Grid.tsx"],"sourcesContent":["import React from 'react';\nimport { classNames, usePrefixedClassNames } from '../helpers/classNames';\nimport { withSubComponents } from '../helpers/withSubComponents';\nimport { Cell } from './Cell';\nimport {\n useBulmaClasses,\n BulmaClassesProps,\n validColors,\n} from '../helpers/useBulmaClasses';\nimport type { BulmaGapStep } from '../helpers/bulmaClassHelpers';\n\n/**\n * The whole steps of Bulma's 0-8 gap scale, as `Columns` takes them. Accepts\n * the value as a number or a numeric string.\n *\n * `Grid`'s gap props and the shared `gap`, `columnGap` and `rowGap` helper\n * props take the half steps as well, as `BulmaGapStep`.\n */\nexport type BulmaGapValue =\n | 0\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6\n | 7\n | 8\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8';\n/**\n * Allowed minimum column values for Bulma grid.\n */\nexport type BulmaMinColValue =\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6\n | 7\n | 8\n | 9\n | 10\n | 11\n | 12\n | 13\n | 14\n | 15\n | 16\n | 17\n | 18\n | 19\n | 20\n | 21\n | 22\n | 23\n | 24\n | 25\n | 26\n | 27\n | 28\n | 29\n | 30\n | 31\n | 32;\n/**\n * Allowed fixed grid columns for Bulma grid.\n */\nexport type BulmaFixedGridCols =\n 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\n/**\n * Allowed fixed grid columns prop for Bulma grid.\n */\nexport type BulmaFixedGridColsProp = BulmaFixedGridCols | 'auto';\n\n/**\n * Props for the Grid component.\n */\nexport interface GridProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Use a fixed grid layout (`.fixed-grid > .grid`). */\n isFixed?: boolean;\n /**\n * Main gap for grid (Bulma `is-gap-X`), a whole or half step of Bulma's gap\n * scale. The same values and class as the `gap` helper prop on every other\n * component.\n */\n gap?: BulmaGapStep;\n /** Column gap for grid (`is-column-gap-X`), on the same scale as `gap`. */\n columnGap?: BulmaGapStep;\n /** Row gap for grid (`is-row-gap-X`), on the same scale as `gap`. */\n rowGap?: BulmaGapStep;\n /** Minimum column width for the grid (`is-col-min-X`). */\n minCol?: BulmaMinColValue;\n /** For fixed grids: explicit column count (`has-X-cols`), or `'auto'` for auto-count. */\n fixedCols?: BulmaFixedGridColsProp;\n /** For fixed grids: explicit column count for mobile. */\n fixedColsMobile?: BulmaFixedGridCols;\n /** For fixed grids: explicit column count for tablet. */\n fixedColsTablet?: BulmaFixedGridCols;\n /** For fixed grids: explicit column count for desktop. */\n fixedColsDesktop?: BulmaFixedGridCols;\n /** For fixed grids: explicit column count for widescreen. */\n fixedColsWidescreen?: BulmaFixedGridCols;\n /** For fixed grids: explicit column count for fullhd. */\n fixedColsFullhd?: BulmaFixedGridCols;\n /** Additional CSS classes for the grid. */\n className?: string;\n /** Text color. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Bulma color modifier for the grid. */\n color?: 'primary' | 'link' | 'info' | 'success' | 'warning' | 'danger';\n /** Background color. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Children to render inside the grid (usually `Cell` components). */\n children?: React.ReactNode;\n}\n\n/**\n * The `Grid` component provides Bulma's advanced CSS Grid layout for complex, modern layouts.\n *\n * @function\n * @param {GridProps} props - Props for the Grid component.\n * @returns {JSX.Element} The rendered grid.\n * @see {@link https://bulma.io/documentation/grid/ | Bulma Grid documentation}\n */\nconst GridComponent: React.FC<GridProps> = ({\n isFixed = false,\n gap,\n columnGap,\n rowGap,\n minCol,\n fixedCols,\n fixedColsMobile,\n fixedColsTablet,\n fixedColsDesktop,\n fixedColsWidescreen,\n fixedColsFullhd,\n className,\n textColor,\n color: _fieldColor,\n bgColor,\n children,\n ...props\n}) => {\n // Map textColor and bgColor to color and backgroundColor for useBulmaClasses\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor,\n backgroundColor: bgColor,\n ...props,\n });\n\n const mainClass = usePrefixedClassNames('grid');\n\n // Build grid inner classes with prefixes\n const gridInnerClasses = usePrefixedClassNames('', {\n [`is-gap-${gap}`]: gap !== undefined && gap !== null,\n [`is-column-gap-${columnGap}`]:\n columnGap !== undefined && columnGap !== null,\n [`is-row-gap-${rowGap}`]: rowGap !== undefined && rowGap !== null,\n [`is-col-min-${minCol}`]: minCol !== undefined && minCol !== null,\n });\n\n // Build fixed grid classes with prefixes (always called, used conditionally)\n const fixedGridClasses = usePrefixedClassNames('fixed-grid', {\n 'has-auto-count': fixedCols === 'auto',\n [`has-${fixedCols}-cols`]: fixedCols !== undefined && fixedCols !== 'auto',\n [`has-${fixedColsMobile}-cols-mobile`]:\n fixedColsMobile !== undefined && fixedColsMobile !== null,\n [`has-${fixedColsTablet}-cols-tablet`]:\n fixedColsTablet !== undefined && fixedColsTablet !== null,\n [`has-${fixedColsDesktop}-cols-desktop`]:\n fixedColsDesktop !== undefined && fixedColsDesktop !== null,\n [`has-${fixedColsWidescreen}-cols-widescreen`]:\n fixedColsWidescreen !== undefined && fixedColsWidescreen !== null,\n [`has-${fixedColsFullhd}-cols-fullhd`]:\n fixedColsFullhd !== undefined && fixedColsFullhd !== null,\n });\n\n const gridClasses = classNames(\n mainClass,\n gridInnerClasses,\n bulmaHelperClasses,\n className\n );\n\n if (isFixed) {\n return (\n <div className={fixedGridClasses}>\n <div className={gridClasses} {...rest}>\n {children}\n </div>\n </div>\n );\n }\n\n // Standard Bulma grid (not fixed)\n return (\n <div className={gridClasses} {...rest}>\n {children}\n </div>\n );\n};\n\nexport const Grid = withSubComponents(GridComponent, { Cell }, 'Grid');\n"],"names":["_jsx"],"mappings":";;;;;;;;AAgIA;;;;;;;AAOG;AACH,MAAM,aAAa,GAAwB,CAAC,EAC1C,OAAO,GAAG,KAAK,EACf,GAAG,EACH,SAAS,EACT,MAAM,EACN,MAAM,EACN,SAAS,EACT,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,SAAS,EACT,SAAS,EACT,KAAK,EAAE,WAAW,EAClB,OAAO,EACP,QAAQ,EACR,GAAG,KAAK,EACT,KAAI;;AAEH,IAAA,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC;AACnD,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,eAAe,EAAE,OAAO;AACxB,QAAA,GAAG,KAAK;AACT,KAAA,CAAC;AAEF,IAAA,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC;;AAG/C,IAAA,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,EAAE,EAAE;QACjD,CAAC,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE,GAAG,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;QACpD,CAAC,CAAA,cAAA,EAAiB,SAAS,CAAA,CAAE,GAC3B,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI;QAC/C,CAAC,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;QACjE,CAAC,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;AAClE,KAAA,CAAC;;AAGF,IAAA,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,YAAY,EAAE;QAC3D,gBAAgB,EAAE,SAAS,KAAK,MAAM;QACtC,CAAC,CAAA,IAAA,EAAO,SAAS,CAAA,KAAA,CAAO,GAAG,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,MAAM;QAC1E,CAAC,CAAA,IAAA,EAAO,eAAe,CAAA,YAAA,CAAc,GACnC,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,IAAI;QAC3D,CAAC,CAAA,IAAA,EAAO,eAAe,CAAA,YAAA,CAAc,GACnC,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,IAAI;QAC3D,CAAC,CAAA,IAAA,EAAO,gBAAgB,CAAA,aAAA,CAAe,GACrC,gBAAgB,KAAK,SAAS,IAAI,gBAAgB,KAAK,IAAI;QAC7D,CAAC,CAAA,IAAA,EAAO,mBAAmB,CAAA,gBAAA,CAAkB,GAC3C,mBAAmB,KAAK,SAAS,IAAI,mBAAmB,KAAK,IAAI;QACnE,CAAC,CAAA,IAAA,EAAO,eAAe,CAAA,YAAA,CAAc,GACnC,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,IAAI;AAC5D,KAAA,CAAC;AAEF,IAAA,MAAM,WAAW,GAAG,UAAU,CAC5B,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,CACV;IAED,IAAI,OAAO,EAAE;AACX,QAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,gBAAgB,YAC9BA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,WAAW,KAAM,IAAI,EAAA,QAAA,EAClC,QAAQ,EAAA,CACL,EAAA,CACF;IAEV;;IAGA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,WAAW,EAAA,GAAM,IAAI,EAAA,QAAA,EAClC,QAAQ,EAAA,CACL;AAEV,CAAC;AAEM,MAAM,IAAI,GAAG,iBAAiB,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM;;"}
@@ -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, Fragment } from 'react/jsx-runtime';
3
4
  import { useIsHydrated } from './useIsHydrated.js';
4
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"ClientOnly.js","sources":["../../../src/helpers/ClientOnly.tsx"],"sourcesContent":["import React from 'react';\nimport { useIsHydrated } from './useIsHydrated';\n\n/**\n * Props for the ClientOnly component.\n */\nexport interface ClientOnlyProps {\n /**\n * Content to render once the page has hydrated. A function is called only\n * then, so an inline expression that reads `window`, `document` or\n * `localStorage` never runs on the server.\n */\n children?: React.ReactNode | (() => React.ReactNode);\n /**\n * Rendered on the server and during hydration instead of `children`, such\n * as a placeholder the same size as the content so the layout doesn't\n * shift when it arrives.\n * @defaultValue null\n */\n fallback?: React.ReactNode;\n}\n\n/**\n * Renders its children only in the browser, after hydration, and a `fallback` until then, so content that depends on browser-only state doesn't cause a hydration mismatch.\n *\n * The server render and the hydrating client render both show `fallback`,\n * which keeps them identical; the children replace it in the commit that\n * follows. In an app without server rendering the children show on the first\n * render.\n *\n * @function\n * @param {ClientOnlyProps} props - Props for the ClientOnly component.\n * @returns The children once hydrated, otherwise the fallback.\n *\n * @example\n * // The server's time zone is not the reader's.\n * <ClientOnly fallback={<Skeleton variant=\"lines\" lines={1} />}>\n * {() => (\n * <p>Times are shown in {Intl.DateTimeFormat().resolvedOptions().timeZone}.</p>\n * )}\n * </ClientOnly>\n */\nexport function ClientOnly({ children, fallback = null }: ClientOnlyProps) {\n const hydrated = useIsHydrated();\n if (!hydrated) return <>{fallback}</>;\n return <>{typeof children === 'function' ? children() : children}</>;\n}\n"],"names":["_jsx","_Fragment"],"mappings":";;;;AAsBA;;;;;;;;;;;;;;;;;;;AAmBG;AACG,SAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,EAAmB,EAAA;AACvE,IAAA,MAAM,QAAQ,GAAG,aAAa,EAAE;AAChC,IAAA,IAAI,CAAC,QAAQ;QAAE,OAAOA,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAI;AACrC,IAAA,OAAOD,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAG,OAAO,QAAQ,KAAK,UAAU,GAAG,QAAQ,EAAE,GAAG,QAAQ,GAAI;AACtE;;"}
1
+ {"version":3,"file":"ClientOnly.js","sources":["../../../src/helpers/ClientOnly.tsx"],"sourcesContent":["import React from 'react';\nimport { useIsHydrated } from './useIsHydrated';\n\n/**\n * Props for the ClientOnly component.\n */\nexport interface ClientOnlyProps {\n /**\n * Content to render once the page has hydrated. A function is called only\n * then, so an inline expression that reads `window`, `document` or\n * `localStorage` never runs on the server.\n */\n children?: React.ReactNode | (() => React.ReactNode);\n /**\n * Rendered on the server and during hydration instead of `children`, such\n * as a placeholder the same size as the content so the layout doesn't\n * shift when it arrives.\n * @defaultValue null\n */\n fallback?: React.ReactNode;\n}\n\n/**\n * Renders its children only in the browser, after hydration, and a `fallback` until then, so content that depends on browser-only state doesn't cause a hydration mismatch.\n *\n * The server render and the hydrating client render both show `fallback`,\n * which keeps them identical; the children replace it in the commit that\n * follows. In an app without server rendering the children show on the first\n * render.\n *\n * @function\n * @param {ClientOnlyProps} props - Props for the ClientOnly component.\n * @returns The children once hydrated, otherwise the fallback.\n *\n * @example\n * // The server's time zone is not the reader's.\n * <ClientOnly fallback={<Skeleton variant=\"lines\" lines={1} />}>\n * {() => (\n * <p>Times are shown in {Intl.DateTimeFormat().resolvedOptions().timeZone}.</p>\n * )}\n * </ClientOnly>\n */\nexport function ClientOnly({ children, fallback = null }: ClientOnlyProps) {\n const hydrated = useIsHydrated();\n if (!hydrated) return <>{fallback}</>;\n return <>{typeof children === 'function' ? children() : children}</>;\n}\n"],"names":["_jsx","_Fragment"],"mappings":";;;;;AAsBA;;;;;;;;;;;;;;;;;;;AAmBG;AACG,SAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,EAAmB,EAAA;AACvE,IAAA,MAAM,QAAQ,GAAG,aAAa,EAAE;AAChC,IAAA,IAAI,CAAC,QAAQ;QAAE,OAAOA,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAI;AACrC,IAAA,OAAOD,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAG,OAAO,QAAQ,KAAK,UAAU,GAAG,QAAQ,EAAE,GAAG,QAAQ,GAAI;AACtE;;"}
@@ -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 { createContext, useContext } from 'react';
4
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"Config.js","sources":["../../../src/helpers/Config.tsx"],"sourcesContent":["import React, { createContext, useContext, ReactNode } from 'react';\n\n/** Supported icon library identifiers. */\ntype IconLibrary = 'fa' | 'mdi' | 'ion' | 'material-icons' | 'material-symbols';\n\n/**\n * Shape of the configuration context value.\n */\nexport interface ConfigContextProps {\n /** Prefix applied to all Bulma class names. */\n classPrefix?: string;\n /** Default icon library for Icon components. */\n iconLibrary?: IconLibrary;\n /** Where portaled content goes when it has no target of its own. */\n portalContainer?: string | HTMLElement;\n}\n\nconst ConfigContext = createContext<ConfigContextProps>({});\n\n/**\n * Hook to access the bulma-ui configuration context.\n *\n * @function\n * @returns {ConfigContextProps} The current configuration values.\n */\nexport const useConfig = () => useContext(ConfigContext);\n\n/**\n * Props for the ConfigProvider component.\n */\nexport interface ConfigProviderProps {\n /** Child components to receive configuration. */\n children: ReactNode;\n /** Prefix applied to all Bulma class names. */\n classPrefix?: string;\n /** Default icon library for Icon components. */\n iconLibrary?: IconLibrary;\n /**\n * Where portaled content goes when it has no target of its own: what a\n * `Portal` without a `container` renders, and what the library's components\n * portal, such as Popover's `appendToBody` panel, a `Modal` with `portal`\n * set to `true`, or a `Toast`. An element, or a `document.querySelector`\n * selector. Unset, or a selector that matches nothing, that content goes to\n * `document.body`. A target a component is given, such as a `Toast`'s\n * `container`, still wins, and nothing portals that would otherwise render\n * in place.\n *\n * The overlays and panels this moves are `position: fixed`, so pick an\n * element with no ancestor that has a `transform`, `filter`,\n * `backdrop-filter`, `perspective`, `will-change: transform`, or a\n * `contain` that includes `paint` or `layout`. That ancestor becomes their\n * containing block, and they cover or line up against it instead of the\n * viewport. An ancestor that starts a stacking context, with a `z-index` or\n * `isolation: isolate`, keeps them inside it, under anything the page\n * stacks above it. `NotificationContainer`'s status region moves too, so\n * this also decides where its announcements come from, and an `aria-hidden`\n * ancestor silences them.\n *\n * A selector can't find an element inside a shadow root, so pass the\n * element itself there, held in state from a ref callback. Content that\n * portals before the element is set goes to `document.body` and moves when\n * it is, which remounts it, as `Portal`'s `container` describes.\n */\n portalContainer?: string | HTMLElement;\n}\n\n/**\n * ConfigProvider injects configuration into all child components via React context.\n *\n * A nested provider replaces the outer one's settings rather than adding to\n * them, so inside it any setting it leaves out is back to its default.\n *\n * @function\n * @param {ConfigProviderProps} props - Provider props.\n * @returns {JSX.Element} The context provider wrapping children.\n *\n * @example\n * <ConfigProvider classPrefix=\"my-\" iconLibrary=\"mdi\">\n * <App />\n * </ConfigProvider>\n */\nexport const ConfigProvider: React.FC<ConfigProviderProps> = ({\n classPrefix,\n iconLibrary,\n portalContainer,\n children,\n}) => {\n return (\n <ConfigContext.Provider\n value={{ classPrefix, iconLibrary, portalContainer }}\n >\n {children}\n </ConfigContext.Provider>\n );\n};\n\n/**\n * Utility hook to get the configured class prefix string.\n *\n * @function\n * @returns {string} The class prefix, or empty string if none configured.\n */\nexport const useClassPrefix = () => {\n const { classPrefix } = useConfig();\n return classPrefix || '';\n};\n\n/**\n * Hook that returns a function to prefix a class name with the configured prefix.\n *\n * @function\n * @returns {(className: string) => string} A function that applies the class prefix.\n */\nexport const usePrefixedClass = () => {\n const { classPrefix } = useConfig();\n return (className: string) =>\n classPrefix ? `${classPrefix}${className}` : className;\n};\n\n/**\n * Hook to get the default icon library from configuration.\n *\n * @function\n * @returns {IconLibrary | undefined} The configured icon library, or undefined.\n */\nexport const useIconLibrary = () => {\n const { iconLibrary } = useConfig();\n return iconLibrary;\n};\n"],"names":["_jsx"],"mappings":";;;;AAiBA,MAAM,aAAa,GAAG,aAAa,CAAqB,EAAE,CAAC;AAE3D;;;;;AAKG;AACI,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,aAAa;AAyCvD;;;;;;;;;;;;;;AAcG;AACI,MAAM,cAAc,GAAkC,CAAC,EAC5D,WAAW,EACX,WAAW,EACX,eAAe,EACf,QAAQ,GACT,KAAI;AACH,IAAA,QACEA,GAAA,CAAC,aAAa,CAAC,QAAQ,EAAA,EACrB,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,YAEnD,QAAQ,EAAA,CACc;AAE7B;AAEA;;;;;AAKG;AACI,MAAM,cAAc,GAAG,MAAK;AACjC,IAAA,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE;IACnC,OAAO,WAAW,IAAI,EAAE;AAC1B;AAEA;;;;;AAKG;AACI,MAAM,gBAAgB,GAAG,MAAK;AACnC,IAAA,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE;AACnC,IAAA,OAAO,CAAC,SAAiB,KACvB,WAAW,GAAG,CAAA,EAAG,WAAW,GAAG,SAAS,CAAA,CAAE,GAAG,SAAS;AAC1D;AAEA;;;;;AAKG;AACI,MAAM,cAAc,GAAG,MAAK;AACjC,IAAA,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE;AACnC,IAAA,OAAO,WAAW;AACpB;;"}
1
+ {"version":3,"file":"Config.js","sources":["../../../src/helpers/Config.tsx"],"sourcesContent":["import React, { createContext, useContext, ReactNode } from 'react';\n\n/** Supported icon library identifiers. */\ntype IconLibrary = 'fa' | 'mdi' | 'ion' | 'material-icons' | 'material-symbols';\n\n/**\n * Shape of the configuration context value.\n */\nexport interface ConfigContextProps {\n /** Prefix applied to all Bulma class names. */\n classPrefix?: string;\n /** Default icon library for Icon components. */\n iconLibrary?: IconLibrary;\n /** Where portaled content goes when it has no target of its own. */\n portalContainer?: string | HTMLElement;\n}\n\nconst ConfigContext = createContext<ConfigContextProps>({});\n\n/**\n * Hook to access the bulma-ui configuration context.\n *\n * @function\n * @returns {ConfigContextProps} The current configuration values.\n */\nexport const useConfig = () => useContext(ConfigContext);\n\n/**\n * Props for the ConfigProvider component.\n */\nexport interface ConfigProviderProps {\n /** Child components to receive configuration. */\n children: ReactNode;\n /** Prefix applied to all Bulma class names. */\n classPrefix?: string;\n /** Default icon library for Icon components. */\n iconLibrary?: IconLibrary;\n /**\n * Where portaled content goes when it has no target of its own: what a\n * `Portal` without a `container` renders, and what the library's components\n * portal, such as Popover's `appendToBody` panel, a `Modal` with `portal`\n * set to `true`, or a `Toast`. An element, or a `document.querySelector`\n * selector. Unset, or a selector that matches nothing, that content goes to\n * `document.body`. A target a component is given, such as a `Toast`'s\n * `container`, still wins, and nothing portals that would otherwise render\n * in place.\n *\n * The overlays and panels this moves are `position: fixed`, so pick an\n * element with no ancestor that has a `transform`, `filter`,\n * `backdrop-filter`, `perspective`, `will-change: transform`, or a\n * `contain` that includes `paint` or `layout`. That ancestor becomes their\n * containing block, and they cover or line up against it instead of the\n * viewport. An ancestor that starts a stacking context, with a `z-index` or\n * `isolation: isolate`, keeps them inside it, under anything the page\n * stacks above it. `NotificationContainer`'s status region moves too, so\n * this also decides where its announcements come from, and an `aria-hidden`\n * ancestor silences them.\n *\n * A selector can't find an element inside a shadow root, so pass the\n * element itself there, held in state from a ref callback. Content that\n * portals before the element is set goes to `document.body` and moves when\n * it is, which remounts it, as `Portal`'s `container` describes.\n */\n portalContainer?: string | HTMLElement;\n}\n\n/**\n * ConfigProvider injects configuration into all child components via React context.\n *\n * A nested provider replaces the outer one's settings rather than adding to\n * them, so inside it any setting it leaves out is back to its default.\n *\n * @function\n * @param {ConfigProviderProps} props - Provider props.\n * @returns {JSX.Element} The context provider wrapping children.\n *\n * @example\n * <ConfigProvider classPrefix=\"my-\" iconLibrary=\"mdi\">\n * <App />\n * </ConfigProvider>\n */\nexport const ConfigProvider: React.FC<ConfigProviderProps> = ({\n classPrefix,\n iconLibrary,\n portalContainer,\n children,\n}) => {\n return (\n <ConfigContext.Provider\n value={{ classPrefix, iconLibrary, portalContainer }}\n >\n {children}\n </ConfigContext.Provider>\n );\n};\n\n/**\n * Utility hook to get the configured class prefix string.\n *\n * @function\n * @returns {string} The class prefix, or empty string if none configured.\n */\nexport const useClassPrefix = () => {\n const { classPrefix } = useConfig();\n return classPrefix || '';\n};\n\n/**\n * Hook that returns a function to prefix a class name with the configured prefix.\n *\n * @function\n * @returns {(className: string) => string} A function that applies the class prefix.\n */\nexport const usePrefixedClass = () => {\n const { classPrefix } = useConfig();\n return (className: string) =>\n classPrefix ? `${classPrefix}${className}` : className;\n};\n\n/**\n * Hook to get the default icon library from configuration.\n *\n * @function\n * @returns {IconLibrary | undefined} The configured icon library, or undefined.\n */\nexport const useIconLibrary = () => {\n const { iconLibrary } = useConfig();\n return iconLibrary;\n};\n"],"names":["_jsx"],"mappings":";;;;;AAiBA,MAAM,aAAa,GAAG,aAAa,CAAqB,EAAE,CAAC;AAE3D;;;;;AAKG;AACI,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,aAAa;AAyCvD;;;;;;;;;;;;;;AAcG;AACI,MAAM,cAAc,GAAkC,CAAC,EAC5D,WAAW,EACX,WAAW,EACX,eAAe,EACf,QAAQ,GACT,KAAI;AACH,IAAA,QACEA,GAAA,CAAC,aAAa,CAAC,QAAQ,EAAA,EACrB,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,YAEnD,QAAQ,EAAA,CACc;AAE7B;AAEA;;;;;AAKG;AACI,MAAM,cAAc,GAAG,MAAK;AACjC,IAAA,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE;IACnC,OAAO,WAAW,IAAI,EAAE;AAC1B;AAEA;;;;;AAKG;AACI,MAAM,gBAAgB,GAAG,MAAK;AACnC,IAAA,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE;AACnC,IAAA,OAAO,CAAC,SAAiB,KACvB,WAAW,GAAG,CAAA,EAAG,WAAW,GAAG,SAAS,CAAA,CAAE,GAAG,SAAS;AAC1D;AAEA;;;;;AAKG;AACI,MAAM,cAAc,GAAG,MAAK;AACjC,IAAA,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE;AACnC,IAAA,OAAO,WAAW;AACpB;;"}
@@ -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, Fragment } from 'react/jsx-runtime';
3
4
  import { createContext, forwardRef, useContext, useMemo, useRef, useCallback, useState } from 'react';
4
5
  import { classNames } from './classNames.js';
@@ -1 +1 @@
1
- {"version":3,"file":"LocaleProvider.js","sources":["../../../src/helpers/LocaleProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { classNames } from './classNames';\nimport { useBulmaClasses, BulmaClassesProps } from './useBulmaClasses';\nimport { warnOnce } from './devWarnings';\nimport { canonicalLocale, localeDirection } from './localeInfo';\n\n/** A writing direction. */\nexport type TextDirection = 'ltr' | 'rtl';\n\n/** What the nearest `LocaleProvider` sets, both `undefined` outside one. */\nexport interface LocaleContextValue {\n /**\n * The locale, as a canonical BCP 47 tag such as `\"ar-EG\"`: the provider's\n * own, else the one an outer provider sets.\n */\n locale?: string;\n /**\n * The direction: the provider's own `dir`, else its own locale's, else the\n * one an outer provider sets.\n */\n dir?: TextDirection;\n}\n\nconst LocaleContext = createContext<LocaleContextValue | null>(null);\n\n/** The nearest provider's wrapper element, for `LocalePortalScope` to test targets against. */\nconst LocaleElementContext =\n createContext<React.RefObject<HTMLDivElement | null> | null>(null);\n\n/**\n * Props for the LocaleProvider component. The helper props, the other\n * attributes and the `ref` land on its `<div>`.\n */\nexport interface LocaleProviderProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'dir' | 'lang' | 'color'>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /**\n * A BCP 47 language tag, such as `\"de\"` or `\"ar-EG\"`. It becomes the\n * wrapper's `lang`, the default `locale` of the date and time pickers\n * inside, and, with no `dir`, the direction, from the way its script is\n * written. Unset, a nested provider keeps the outer one's. A tag `Intl`\n * refuses is ignored, with a warning in development.\n */\n locale?: string;\n /**\n * The direction, whatever the locale. Unset, it follows this provider's\n * `locale`, else an outer provider's direction, else the page's.\n */\n dir?: TextDirection;\n /** The part of the app it covers. */\n children?: React.ReactNode;\n}\n\n/** A tag in canonical form, or `undefined`, warning about one `Intl` refuses. */\nfunction validLocale(tag: string | undefined): string | undefined {\n try {\n return canonicalLocale(tag);\n } catch {\n warnOnce(\n `locale-provider-invalid:${tag}`,\n `[bestax-bulma] <LocaleProvider locale=\"${tag}\">: not a language ` +\n 'tag Intl accepts, so it is ignored. Use a BCP 47 tag such as ' +\n '\"en-US\", with a hyphen rather than an underscore.'\n );\n return undefined;\n }\n}\n\n/**\n * Sets the language and writing direction for the part of the app inside it, on a wrapper `<div>` and on what the library portals out of it.\n *\n * The wrapper carries `dir` and `lang`, so CSS and the components that read\n * the computed direction follow it, as they follow `<html dir>`. A `locale`\n * alone sets the direction of its script, and a `dir` sets the direction\n * whatever the locale. A nested provider keeps whatever it leaves unset.\n *\n * Inside it, the date and time pickers take its `locale` unless given their\n * own, and their week starts on the first day of the locale they use unless\n * `firstDayOfWeek` is set, and a picker with a `locale` of its own is read\n * like a nested provider. With a `locale`, the numbers the library writes,\n * such as page numbers and badge counts, follow it, and so does the\n * filtering in `Combobox`, `Autocomplete`, `Taginput` and `Command`, which then ignores\n * accents where the language treats letters as the same. The library's\n * portaled content, such as a `Popover` panel, a `Modal` with `portal`, a\n * `Toast` or a `Portal`'s children, keeps the same `dir` and `lang` though\n * it renders outside the wrapper: in a container outside the wrapper, it\n * sits in a `display: contents` element that carries them. Without a\n * provider none of this changes.\n *\n * @function\n * @param {LocaleProviderProps} props - Props for the LocaleProvider.\n * @returns {JSX.Element} The wrapper, inside the context.\n *\n * @example\n * <LocaleProvider locale=\"ar-EG\">\n * <App />\n * </LocaleProvider>\n */\nexport const LocaleProvider = forwardRef<HTMLDivElement, LocaleProviderProps>(\n (\n { locale: localeProp, dir: dirProp, className, children, ...props },\n ref\n ) => {\n const outer = useContext(LocaleContext);\n const ownLocale = useMemo(() => validLocale(localeProp), [localeProp]);\n const ownLocaleDir = useMemo(\n () => (ownLocale ? localeDirection(ownLocale) : undefined),\n [ownLocale]\n );\n const locale = ownLocale || outer?.locale;\n const dir = dirProp || ownLocaleDir || outer?.dir;\n const value = useMemo(() => ({ locale, dir }), [locale, dir]);\n\n const { bulmaHelperClasses, rest } = useBulmaClasses(props);\n\n // The wrapper, for portaled content to tell whether its target is inside\n // it, and the caller's ref. A callback ref's cleanup is held and run on\n // detach, as Toast and Modal do, since React 18 discards the return value.\n const elementRef = useRef<HTMLDivElement | null>(null);\n const consumerCleanupRef = useRef<(() => void) | null>(null);\n const setElement = useCallback(\n (node: HTMLDivElement | null) => {\n elementRef.current = node;\n if (typeof ref === 'function') {\n if (node === null) {\n const consumerCleanup = consumerCleanupRef.current;\n consumerCleanupRef.current = null;\n if (consumerCleanup) consumerCleanup();\n else ref(null);\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.current = node;\n }\n },\n [ref]\n );\n\n return (\n <LocaleContext.Provider value={value}>\n <LocaleElementContext.Provider value={elementRef}>\n <div\n ref={setElement}\n className={classNames(bulmaHelperClasses, className) || undefined}\n {...rest}\n dir={dir}\n lang={locale}\n >\n {children}\n </div>\n </LocaleElementContext.Provider>\n </LocaleContext.Provider>\n );\n }\n);\n\nLocaleProvider.displayName = 'LocaleProvider';\n\n/** What `useLocale` returns outside a provider, the same object each time. */\nconst noLocale: LocaleContextValue = {};\n\n/**\n * The locale and direction the nearest `LocaleProvider` sets, for an app's own `Intl` calls or its own portaled content; both are `undefined` outside one.\n *\n * It isn't the page's direction: with no provider, or one that sets no\n * direction, the page's `<html dir>` still decides. To act on the direction\n * an element is laid out in, read `getComputedStyle(element).direction`, as\n * the library's components do.\n *\n * @function\n * @returns {LocaleContextValue} The nearest provider's `locale` and `dir`.\n *\n * @example\n * const { locale } = useLocale();\n * const price = new Intl.NumberFormat(locale, {\n * style: 'currency',\n * currency: 'EUR',\n * }).format(12.5);\n */\nexport function useLocale(): LocaleContextValue {\n return useContext(LocaleContext) ?? noLocale;\n}\n\n/**\n * INTERNAL, deliberately not exported from `src/index.ts`. The nearest\n * provider's settings, or `null` outside any provider, so a caller can tell\n * \"no provider\" from \"a provider that sets nothing\".\n */\nexport function useLocaleScope(): LocaleContextValue | null {\n return useContext(LocaleContext);\n}\n\nconst displayContents: React.CSSProperties = { display: 'contents' };\n\n/** The `dir` and `lang` portaled content carries: a provider's, or a picker's own. */\nexport interface PortalLocale {\n /** The `lang` to carry, unset for none. */\n locale?: string;\n /** The `dir` to carry, unset for none. */\n dir?: string;\n}\n\n/**\n * INTERNAL, deliberately not exported from `src/index.ts`. Keeps the `dir`\n * and `lang` of the nearest provider, or the `scope` given in their place,\n * on content the library portals into `target`, which has left the\n * provider's wrapper behind.\n *\n * A target inside the provider's own wrapper gets the content as it is: it\n * inherits from the wrapper, and follows it when the provider changes.\n * Content that must be its container's direct child, a `<tr>` portaled into\n * a `<tbody>` there, stays one. Any other target, `document.body` included,\n * gets the content inside a `display: contents` element carrying the\n * values, which adds no box. So does content with a `scope` of its own, a\n * picker's panel, since the provider's values aren't its own.\n *\n * Which of the two is decided once, when the content mounts, and kept while\n * it stays: switching between them would put a different element in its\n * place and remount everything inside, losing typed text, focus and timers.\n * A change of locale or direction updates the wrapper's attributes instead.\n * A target is never left bare because something else, such as `<html>`,\n * happens to carry the same values, since that can stop being true without\n * the content remounting. Outside a provider it renders the children alone,\n * so nothing changes there.\n */\nexport function LocalePortalScope({\n children,\n target,\n scope,\n}: {\n children: React.ReactNode;\n /** The element the content is portaled into. */\n target: Element;\n /** Values to carry in place of the provider's, such as a picker's own. */\n scope?: PortalLocale;\n}) {\n const provider = useContext(LocaleContext);\n const element = useContext(LocaleElementContext);\n const [wrap] = useState(\n () => scope !== undefined || !element?.current?.contains(target)\n );\n if (!provider || !wrap) return <>{children}</>;\n const values = scope ?? provider;\n return (\n <div dir={values.dir} lang={values.locale} style={displayContents}>\n {children}\n </div>\n );\n}\n"],"names":["_jsx","_Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"LocaleProvider.js","sources":["../../../src/helpers/LocaleProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { classNames } from './classNames';\nimport { useBulmaClasses, BulmaClassesProps } from './useBulmaClasses';\nimport { warnOnce } from './devWarnings';\nimport { canonicalLocale, localeDirection } from './localeInfo';\n\n/** A writing direction. */\nexport type TextDirection = 'ltr' | 'rtl';\n\n/** What the nearest `LocaleProvider` sets, both `undefined` outside one. */\nexport interface LocaleContextValue {\n /**\n * The locale, as a canonical BCP 47 tag such as `\"ar-EG\"`: the provider's\n * own, else the one an outer provider sets.\n */\n locale?: string;\n /**\n * The direction: the provider's own `dir`, else its own locale's, else the\n * one an outer provider sets.\n */\n dir?: TextDirection;\n}\n\nconst LocaleContext = createContext<LocaleContextValue | null>(null);\n\n/** The nearest provider's wrapper element, for `LocalePortalScope` to test targets against. */\nconst LocaleElementContext =\n createContext<React.RefObject<HTMLDivElement | null> | null>(null);\n\n/**\n * Props for the LocaleProvider component. The helper props, the other\n * attributes and the `ref` land on its `<div>`.\n */\nexport interface LocaleProviderProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'dir' | 'lang' | 'color'>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /**\n * A BCP 47 language tag, such as `\"de\"` or `\"ar-EG\"`. It becomes the\n * wrapper's `lang`, the default `locale` of the date and time pickers\n * inside, and, with no `dir`, the direction, from the way its script is\n * written. Unset, a nested provider keeps the outer one's. A tag `Intl`\n * refuses is ignored, with a warning in development.\n */\n locale?: string;\n /**\n * The direction, whatever the locale. Unset, it follows this provider's\n * `locale`, else an outer provider's direction, else the page's.\n */\n dir?: TextDirection;\n /** The part of the app it covers. */\n children?: React.ReactNode;\n}\n\n/** A tag in canonical form, or `undefined`, warning about one `Intl` refuses. */\nfunction validLocale(tag: string | undefined): string | undefined {\n try {\n return canonicalLocale(tag);\n } catch {\n warnOnce(\n `locale-provider-invalid:${tag}`,\n `[bestax-bulma] <LocaleProvider locale=\"${tag}\">: not a language ` +\n 'tag Intl accepts, so it is ignored. Use a BCP 47 tag such as ' +\n '\"en-US\", with a hyphen rather than an underscore.'\n );\n return undefined;\n }\n}\n\n/**\n * Sets the language and writing direction for the part of the app inside it, on a wrapper `<div>` and on what the library portals out of it.\n *\n * The wrapper carries `dir` and `lang`, so CSS and the components that read\n * the computed direction follow it, as they follow `<html dir>`. A `locale`\n * alone sets the direction of its script, and a `dir` sets the direction\n * whatever the locale. A nested provider keeps whatever it leaves unset.\n *\n * Inside it, the date and time pickers take its `locale` unless given their\n * own, and their week starts on the first day of the locale they use unless\n * `firstDayOfWeek` is set, and a picker with a `locale` of its own is read\n * like a nested provider. With a `locale`, the numbers the library writes,\n * such as page numbers and badge counts, follow it, and so does the\n * filtering in `Combobox`, `Autocomplete`, `Taginput` and `Command`, which then ignores\n * accents where the language treats letters as the same. The library's\n * portaled content, such as a `Popover` panel, a `Modal` with `portal`, a\n * `Toast` or a `Portal`'s children, keeps the same `dir` and `lang` though\n * it renders outside the wrapper: in a container outside the wrapper, it\n * sits in a `display: contents` element that carries them. Without a\n * provider none of this changes.\n *\n * @function\n * @param {LocaleProviderProps} props - Props for the LocaleProvider.\n * @returns {JSX.Element} The wrapper, inside the context.\n *\n * @example\n * <LocaleProvider locale=\"ar-EG\">\n * <App />\n * </LocaleProvider>\n */\nexport const LocaleProvider = forwardRef<HTMLDivElement, LocaleProviderProps>(\n (\n { locale: localeProp, dir: dirProp, className, children, ...props },\n ref\n ) => {\n const outer = useContext(LocaleContext);\n const ownLocale = useMemo(() => validLocale(localeProp), [localeProp]);\n const ownLocaleDir = useMemo(\n () => (ownLocale ? localeDirection(ownLocale) : undefined),\n [ownLocale]\n );\n const locale = ownLocale || outer?.locale;\n const dir = dirProp || ownLocaleDir || outer?.dir;\n const value = useMemo(() => ({ locale, dir }), [locale, dir]);\n\n const { bulmaHelperClasses, rest } = useBulmaClasses(props);\n\n // The wrapper, for portaled content to tell whether its target is inside\n // it, and the caller's ref. A callback ref's cleanup is held and run on\n // detach, as Toast and Modal do, since React 18 discards the return value.\n const elementRef = useRef<HTMLDivElement | null>(null);\n const consumerCleanupRef = useRef<(() => void) | null>(null);\n const setElement = useCallback(\n (node: HTMLDivElement | null) => {\n elementRef.current = node;\n if (typeof ref === 'function') {\n if (node === null) {\n const consumerCleanup = consumerCleanupRef.current;\n consumerCleanupRef.current = null;\n if (consumerCleanup) consumerCleanup();\n else ref(null);\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.current = node;\n }\n },\n [ref]\n );\n\n return (\n <LocaleContext.Provider value={value}>\n <LocaleElementContext.Provider value={elementRef}>\n <div\n ref={setElement}\n className={classNames(bulmaHelperClasses, className) || undefined}\n {...rest}\n dir={dir}\n lang={locale}\n >\n {children}\n </div>\n </LocaleElementContext.Provider>\n </LocaleContext.Provider>\n );\n }\n);\n\nLocaleProvider.displayName = 'LocaleProvider';\n\n/** What `useLocale` returns outside a provider, the same object each time. */\nconst noLocale: LocaleContextValue = {};\n\n/**\n * The locale and direction the nearest `LocaleProvider` sets, for an app's own `Intl` calls or its own portaled content; both are `undefined` outside one.\n *\n * It isn't the page's direction: with no provider, or one that sets no\n * direction, the page's `<html dir>` still decides. To act on the direction\n * an element is laid out in, read `getComputedStyle(element).direction`, as\n * the library's components do.\n *\n * @function\n * @returns {LocaleContextValue} The nearest provider's `locale` and `dir`.\n *\n * @example\n * const { locale } = useLocale();\n * const price = new Intl.NumberFormat(locale, {\n * style: 'currency',\n * currency: 'EUR',\n * }).format(12.5);\n */\nexport function useLocale(): LocaleContextValue {\n return useContext(LocaleContext) ?? noLocale;\n}\n\n/**\n * INTERNAL, deliberately not exported from `src/index.ts`. The nearest\n * provider's settings, or `null` outside any provider, so a caller can tell\n * \"no provider\" from \"a provider that sets nothing\".\n */\nexport function useLocaleScope(): LocaleContextValue | null {\n return useContext(LocaleContext);\n}\n\nconst displayContents: React.CSSProperties = { display: 'contents' };\n\n/** The `dir` and `lang` portaled content carries: a provider's, or a picker's own. */\nexport interface PortalLocale {\n /** The `lang` to carry, unset for none. */\n locale?: string;\n /** The `dir` to carry, unset for none. */\n dir?: string;\n}\n\n/**\n * INTERNAL, deliberately not exported from `src/index.ts`. Keeps the `dir`\n * and `lang` of the nearest provider, or the `scope` given in their place,\n * on content the library portals into `target`, which has left the\n * provider's wrapper behind.\n *\n * A target inside the provider's own wrapper gets the content as it is: it\n * inherits from the wrapper, and follows it when the provider changes.\n * Content that must be its container's direct child, a `<tr>` portaled into\n * a `<tbody>` there, stays one. Any other target, `document.body` included,\n * gets the content inside a `display: contents` element carrying the\n * values, which adds no box. So does content with a `scope` of its own, a\n * picker's panel, since the provider's values aren't its own.\n *\n * Which of the two is decided once, when the content mounts, and kept while\n * it stays: switching between them would put a different element in its\n * place and remount everything inside, losing typed text, focus and timers.\n * A change of locale or direction updates the wrapper's attributes instead.\n * A target is never left bare because something else, such as `<html>`,\n * happens to carry the same values, since that can stop being true without\n * the content remounting. Outside a provider it renders the children alone,\n * so nothing changes there.\n */\nexport function LocalePortalScope({\n children,\n target,\n scope,\n}: {\n children: React.ReactNode;\n /** The element the content is portaled into. */\n target: Element;\n /** Values to carry in place of the provider's, such as a picker's own. */\n scope?: PortalLocale;\n}) {\n const provider = useContext(LocaleContext);\n const element = useContext(LocaleElementContext);\n const [wrap] = useState(\n () => scope !== undefined || !element?.current?.contains(target)\n );\n if (!provider || !wrap) return <>{children}</>;\n const values = scope ?? provider;\n return (\n <div dir={values.dir} lang={values.locale} style={displayContents}>\n {children}\n </div>\n );\n}\n"],"names":["_jsx","_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, Fragment } from 'react/jsx-runtime';
3
4
  import { useMemo, useEffect, useState } from 'react';
4
5
  import { classNames } from './classNames.js';