@allxsmith/bestax-bulma 5.27.0 → 5.27.2

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 (348) hide show
  1. package/dist/bestax.css +1 -1
  2. package/dist/bestax.css.map +1 -1
  3. package/dist/esm/columns/Column.js +48 -0
  4. package/dist/esm/columns/Column.js.map +1 -0
  5. package/dist/esm/columns/Columns.js +53 -0
  6. package/dist/esm/columns/Columns.js.map +1 -0
  7. package/dist/esm/components/Avatar.js +299 -0
  8. package/dist/esm/components/Avatar.js.map +1 -0
  9. package/dist/esm/components/Avatars.js +81 -0
  10. package/dist/esm/components/Avatars.js.map +1 -0
  11. package/dist/esm/components/Badge.js +105 -0
  12. package/dist/esm/components/Badge.js.map +1 -0
  13. package/dist/esm/components/Breadcrumb.js +36 -0
  14. package/dist/esm/components/Breadcrumb.js.map +1 -0
  15. package/dist/esm/components/Card.js +252 -0
  16. package/dist/esm/components/Card.js.map +1 -0
  17. package/dist/esm/components/Carousel.js +351 -0
  18. package/dist/esm/components/Carousel.js.map +1 -0
  19. package/dist/esm/components/Collapse.js +193 -0
  20. package/dist/esm/components/Collapse.js.map +1 -0
  21. package/dist/esm/components/Collapses.js +99 -0
  22. package/dist/esm/components/Collapses.js.map +1 -0
  23. package/dist/esm/components/Dialog.js +230 -0
  24. package/dist/esm/components/Dialog.js.map +1 -0
  25. package/dist/esm/components/Dropdown.js +362 -0
  26. package/dist/esm/components/Dropdown.js.map +1 -0
  27. package/dist/esm/components/Loading.js +87 -0
  28. package/dist/esm/components/Loading.js.map +1 -0
  29. package/dist/esm/components/Menu.js +117 -0
  30. package/dist/esm/components/Menu.js.map +1 -0
  31. package/dist/esm/components/Message.js +56 -0
  32. package/dist/esm/components/Message.js.map +1 -0
  33. package/dist/esm/components/Modal.js +354 -0
  34. package/dist/esm/components/Modal.js.map +1 -0
  35. package/dist/esm/components/Navbar.js +287 -0
  36. package/dist/esm/components/Navbar.js.map +1 -0
  37. package/dist/esm/components/Pagination.js +191 -0
  38. package/dist/esm/components/Pagination.js.map +1 -0
  39. package/dist/esm/components/Panel.js +100 -0
  40. package/dist/esm/components/Panel.js.map +1 -0
  41. package/dist/esm/components/Popover.js +298 -0
  42. package/dist/esm/components/Popover.js.map +1 -0
  43. package/dist/esm/components/Reveal.js +157 -0
  44. package/dist/esm/components/Reveal.js.map +1 -0
  45. package/dist/esm/components/Sidebar.js +209 -0
  46. package/dist/esm/components/Sidebar.js.map +1 -0
  47. package/dist/esm/components/Steps.js +128 -0
  48. package/dist/esm/components/Steps.js.map +1 -0
  49. package/dist/esm/components/Tabs.js +335 -0
  50. package/dist/esm/components/Tabs.js.map +1 -0
  51. package/dist/esm/components/Toast.js +322 -0
  52. package/dist/esm/components/Toast.js.map +1 -0
  53. package/dist/esm/components/Tooltip.js +202 -0
  54. package/dist/esm/components/Tooltip.js.map +1 -0
  55. package/dist/esm/components/collapsesContext.js +12 -0
  56. package/dist/esm/components/collapsesContext.js.map +1 -0
  57. package/dist/esm/elements/Block.js +29 -0
  58. package/dist/esm/elements/Block.js.map +1 -0
  59. package/dist/esm/elements/Box.js +32 -0
  60. package/dist/esm/elements/Box.js.map +1 -0
  61. package/dist/esm/elements/Button.js +139 -0
  62. package/dist/esm/elements/Button.js.map +1 -0
  63. package/dist/esm/elements/Buttons.js +42 -0
  64. package/dist/esm/elements/Buttons.js.map +1 -0
  65. package/dist/esm/elements/Code.js +25 -0
  66. package/dist/esm/elements/Code.js.map +1 -0
  67. package/dist/esm/elements/Content.js +33 -0
  68. package/dist/esm/elements/Content.js.map +1 -0
  69. package/dist/esm/elements/Delete.js +35 -0
  70. package/dist/esm/elements/Delete.js.map +1 -0
  71. package/dist/esm/elements/Divider.js +27 -0
  72. package/dist/esm/elements/Divider.js.map +1 -0
  73. package/dist/esm/elements/Emphasis.js +25 -0
  74. package/dist/esm/elements/Emphasis.js.map +1 -0
  75. package/dist/esm/elements/Figure.js +58 -0
  76. package/dist/esm/elements/Figure.js.map +1 -0
  77. package/dist/esm/elements/Icon.js +256 -0
  78. package/dist/esm/elements/Icon.js.map +1 -0
  79. package/dist/esm/elements/IconText.js +36 -0
  80. package/dist/esm/elements/IconText.js.map +1 -0
  81. package/dist/esm/elements/Image.js +46 -0
  82. package/dist/esm/elements/Image.js.map +1 -0
  83. package/dist/esm/elements/Link.js +36 -0
  84. package/dist/esm/elements/Link.js.map +1 -0
  85. package/dist/esm/elements/LinkButton.js +37 -0
  86. package/dist/esm/elements/LinkButton.js.map +1 -0
  87. package/dist/esm/elements/ListItem.js +28 -0
  88. package/dist/esm/elements/ListItem.js.map +1 -0
  89. package/dist/esm/elements/Loader.js +37 -0
  90. package/dist/esm/elements/Loader.js.map +1 -0
  91. package/dist/esm/elements/Notification.js +316 -0
  92. package/dist/esm/elements/Notification.js.map +1 -0
  93. package/dist/esm/elements/OrderedList.js +31 -0
  94. package/dist/esm/elements/OrderedList.js.map +1 -0
  95. package/dist/esm/elements/Paragraph.js +28 -0
  96. package/dist/esm/elements/Paragraph.js.map +1 -0
  97. package/dist/esm/elements/Pre.js +25 -0
  98. package/dist/esm/elements/Pre.js.map +1 -0
  99. package/dist/esm/elements/Progress.js +33 -0
  100. package/dist/esm/elements/Progress.js.map +1 -0
  101. package/dist/esm/elements/Skeleton.js +30 -0
  102. package/dist/esm/elements/Skeleton.js.map +1 -0
  103. package/dist/esm/elements/Span.js +28 -0
  104. package/dist/esm/elements/Span.js.map +1 -0
  105. package/dist/esm/elements/Strong.js +25 -0
  106. package/dist/esm/elements/Strong.js.map +1 -0
  107. package/dist/esm/elements/SubTitle.js +51 -0
  108. package/dist/esm/elements/SubTitle.js.map +1 -0
  109. package/dist/esm/elements/Table.js +51 -0
  110. package/dist/esm/elements/Table.js.map +1 -0
  111. package/dist/esm/elements/Tag.js +49 -0
  112. package/dist/esm/elements/Tag.js.map +1 -0
  113. package/dist/esm/elements/Tags.js +34 -0
  114. package/dist/esm/elements/Tags.js.map +1 -0
  115. package/dist/esm/elements/Tbody.js +26 -0
  116. package/dist/esm/elements/Tbody.js.map +1 -0
  117. package/dist/esm/elements/Td.js +61 -0
  118. package/dist/esm/elements/Td.js.map +1 -0
  119. package/dist/esm/elements/Tfoot.js +26 -0
  120. package/dist/esm/elements/Tfoot.js.map +1 -0
  121. package/dist/esm/elements/Th.js +34 -0
  122. package/dist/esm/elements/Th.js.map +1 -0
  123. package/dist/esm/elements/Thead.js +26 -0
  124. package/dist/esm/elements/Thead.js.map +1 -0
  125. package/dist/esm/elements/Title.js +44 -0
  126. package/dist/esm/elements/Title.js.map +1 -0
  127. package/dist/esm/elements/Tr.js +31 -0
  128. package/dist/esm/elements/Tr.js.map +1 -0
  129. package/dist/esm/elements/UnorderedList.js +31 -0
  130. package/dist/esm/elements/UnorderedList.js.map +1 -0
  131. package/dist/esm/elements/iconProps.js +49 -0
  132. package/dist/esm/elements/iconProps.js.map +1 -0
  133. package/dist/esm/form/Autocomplete.js +279 -0
  134. package/dist/esm/form/Autocomplete.js.map +1 -0
  135. package/dist/esm/form/Checkbox.js +111 -0
  136. package/dist/esm/form/Checkbox.js.map +1 -0
  137. package/dist/esm/form/Checkboxes.js +90 -0
  138. package/dist/esm/form/Checkboxes.js.map +1 -0
  139. package/dist/esm/form/Control.js +79 -0
  140. package/dist/esm/form/Control.js.map +1 -0
  141. package/dist/esm/form/DateInput.js +88 -0
  142. package/dist/esm/form/DateInput.js.map +1 -0
  143. package/dist/esm/form/DateInputBase.js +263 -0
  144. package/dist/esm/form/DateInputBase.js.map +1 -0
  145. package/dist/esm/form/DateRangeInput.js +77 -0
  146. package/dist/esm/form/DateRangeInput.js.map +1 -0
  147. package/dist/esm/form/DateRangeInputBase.js +301 -0
  148. package/dist/esm/form/DateRangeInputBase.js.map +1 -0
  149. package/dist/esm/form/DateTimeInput.js +88 -0
  150. package/dist/esm/form/DateTimeInput.js.map +1 -0
  151. package/dist/esm/form/DateTimeInputBase.js +333 -0
  152. package/dist/esm/form/DateTimeInputBase.js.map +1 -0
  153. package/dist/esm/form/Field.js +167 -0
  154. package/dist/esm/form/Field.js.map +1 -0
  155. package/dist/esm/form/File.js +112 -0
  156. package/dist/esm/form/File.js.map +1 -0
  157. package/dist/esm/form/FormContext.js +194 -0
  158. package/dist/esm/form/FormContext.js.map +1 -0
  159. package/dist/esm/form/Input.js +88 -0
  160. package/dist/esm/form/Input.js.map +1 -0
  161. package/dist/esm/form/InputBase.js +40 -0
  162. package/dist/esm/form/InputBase.js.map +1 -0
  163. package/dist/esm/form/Numberinput.js +201 -0
  164. package/dist/esm/form/Numberinput.js.map +1 -0
  165. package/dist/esm/form/Radio.js +108 -0
  166. package/dist/esm/form/Radio.js.map +1 -0
  167. package/dist/esm/form/Radios.js +92 -0
  168. package/dist/esm/form/Radios.js.map +1 -0
  169. package/dist/esm/form/Rate.js +280 -0
  170. package/dist/esm/form/Rate.js.map +1 -0
  171. package/dist/esm/form/Select.js +81 -0
  172. package/dist/esm/form/Select.js.map +1 -0
  173. package/dist/esm/form/SelectBase.js +54 -0
  174. package/dist/esm/form/SelectBase.js.map +1 -0
  175. package/dist/esm/form/Slider.js +461 -0
  176. package/dist/esm/form/Slider.js.map +1 -0
  177. package/dist/esm/form/Switch.js +96 -0
  178. package/dist/esm/form/Switch.js.map +1 -0
  179. package/dist/esm/form/Taginput.js +351 -0
  180. package/dist/esm/form/Taginput.js.map +1 -0
  181. package/dist/esm/form/TextArea.js +77 -0
  182. package/dist/esm/form/TextArea.js.map +1 -0
  183. package/dist/esm/form/TextAreaBase.js +45 -0
  184. package/dist/esm/form/TextAreaBase.js.map +1 -0
  185. package/dist/esm/form/TimeInput.js +84 -0
  186. package/dist/esm/form/TimeInput.js.map +1 -0
  187. package/dist/esm/form/TimeInputBase.js +246 -0
  188. package/dist/esm/form/TimeInputBase.js.map +1 -0
  189. package/dist/esm/form/_pickerInternals/Calendar.js +760 -0
  190. package/dist/esm/form/_pickerInternals/Calendar.js.map +1 -0
  191. package/dist/esm/form/_pickerInternals/PickerPopover.js +95 -0
  192. package/dist/esm/form/_pickerInternals/PickerPopover.js.map +1 -0
  193. package/dist/esm/form/_pickerInternals/TimeWheels.js +721 -0
  194. package/dist/esm/form/_pickerInternals/TimeWheels.js.map +1 -0
  195. package/dist/esm/form/_pickerInternals/audioTick.js +109 -0
  196. package/dist/esm/form/_pickerInternals/audioTick.js.map +1 -0
  197. package/dist/esm/form/_pickerInternals/dateUtils.js +267 -0
  198. package/dist/esm/form/_pickerInternals/dateUtils.js.map +1 -0
  199. package/dist/esm/form/_pickerInternals/formatters.js +322 -0
  200. package/dist/esm/form/_pickerInternals/formatters.js.map +1 -0
  201. package/dist/esm/form/_pickerInternals/haptics.js +38 -0
  202. package/dist/esm/form/_pickerInternals/haptics.js.map +1 -0
  203. package/dist/esm/form/_pickerInternals/nativeInputSupport.js +25 -0
  204. package/dist/esm/form/_pickerInternals/nativeInputSupport.js.map +1 -0
  205. package/dist/esm/form/_pickerInternals/pickerTypes.js +50 -0
  206. package/dist/esm/form/_pickerInternals/pickerTypes.js.map +1 -0
  207. package/dist/esm/form/_pickerInternals/segmentMap.js +315 -0
  208. package/dist/esm/form/_pickerInternals/segmentMap.js.map +1 -0
  209. package/dist/esm/form/_pickerInternals/useNativeMobilePicker.js +49 -0
  210. package/dist/esm/form/_pickerInternals/useNativeMobilePicker.js.map +1 -0
  211. package/dist/esm/form/_pickerInternals/useSegmentedEntry.js +427 -0
  212. package/dist/esm/form/_pickerInternals/useSegmentedEntry.js.map +1 -0
  213. package/dist/esm/form/controlLoading.js +18 -0
  214. package/dist/esm/form/controlLoading.js.map +1 -0
  215. package/dist/esm/form/useAutoLabelId.js +88 -0
  216. package/dist/esm/form/useAutoLabelId.js.map +1 -0
  217. package/dist/esm/grid/Cell.js +35 -0
  218. package/dist/esm/grid/Cell.js.map +1 -0
  219. package/dist/esm/grid/Grid.js +51 -0
  220. package/dist/esm/grid/Grid.js.map +1 -0
  221. package/dist/esm/helpers/ClientOnly.js +33 -0
  222. package/dist/esm/helpers/ClientOnly.js.map +1 -0
  223. package/dist/esm/helpers/Config.js +60 -0
  224. package/dist/esm/helpers/Config.js.map +1 -0
  225. package/dist/esm/helpers/Theme.js +947 -0
  226. package/dist/esm/helpers/Theme.js.map +1 -0
  227. package/dist/esm/helpers/anchorAttrs.js +72 -0
  228. package/dist/esm/helpers/anchorAttrs.js.map +1 -0
  229. package/dist/esm/helpers/bulmaClassHelpers.js +415 -0
  230. package/dist/esm/helpers/bulmaClassHelpers.js.map +1 -0
  231. package/dist/esm/helpers/buttonType.js +24 -0
  232. package/dist/esm/helpers/buttonType.js.map +1 -0
  233. package/dist/esm/helpers/classNames.js +137 -0
  234. package/dist/esm/helpers/classNames.js.map +1 -0
  235. package/dist/esm/helpers/colorDeprecations.js +50 -0
  236. package/dist/esm/helpers/colorDeprecations.js.map +1 -0
  237. package/dist/esm/helpers/devWarnings.js +27 -0
  238. package/dist/esm/helpers/devWarnings.js.map +1 -0
  239. package/dist/esm/helpers/inertProps.js +27 -0
  240. package/dist/esm/helpers/inertProps.js.map +1 -0
  241. package/dist/esm/helpers/mergeBulmaStyles.js +20 -0
  242. package/dist/esm/helpers/mergeBulmaStyles.js.map +1 -0
  243. package/dist/esm/helpers/polymorphic.js +18 -0
  244. package/dist/esm/helpers/polymorphic.js.map +1 -0
  245. package/dist/esm/helpers/portal.js +76 -0
  246. package/dist/esm/helpers/portal.js.map +1 -0
  247. package/dist/esm/helpers/positionStacks.js +45 -0
  248. package/dist/esm/helpers/positionStacks.js.map +1 -0
  249. package/dist/esm/helpers/scrollLock.js +38 -0
  250. package/dist/esm/helpers/scrollLock.js.map +1 -0
  251. package/dist/esm/helpers/shadowDom.js +71 -0
  252. package/dist/esm/helpers/shadowDom.js.map +1 -0
  253. package/dist/esm/helpers/statusRegion.js +282 -0
  254. package/dist/esm/helpers/statusRegion.js.map +1 -0
  255. package/dist/esm/helpers/useAnchoredPosition.js +86 -0
  256. package/dist/esm/helpers/useAnchoredPosition.js.map +1 -0
  257. package/dist/esm/helpers/useBulmaClasses.js +158 -0
  258. package/dist/esm/helpers/useBulmaClasses.js.map +1 -0
  259. package/dist/esm/helpers/useClientLayoutEffect.js +13 -0
  260. package/dist/esm/helpers/useClientLayoutEffect.js.map +1 -0
  261. package/dist/esm/helpers/useColorClasses.js +84 -0
  262. package/dist/esm/helpers/useColorClasses.js.map +1 -0
  263. package/dist/esm/helpers/useFlexboxClasses.js +92 -0
  264. package/dist/esm/helpers/useFlexboxClasses.js.map +1 -0
  265. package/dist/esm/helpers/useFocusTrap.js +470 -0
  266. package/dist/esm/helpers/useFocusTrap.js.map +1 -0
  267. package/dist/esm/helpers/useIsHydrated.js +31 -0
  268. package/dist/esm/helpers/useIsHydrated.js.map +1 -0
  269. package/dist/esm/helpers/useOtherClasses.js +115 -0
  270. package/dist/esm/helpers/useOtherClasses.js.map +1 -0
  271. package/dist/esm/helpers/useSpacingClasses.js +82 -0
  272. package/dist/esm/helpers/useSpacingClasses.js.map +1 -0
  273. package/dist/esm/helpers/useTypographyClasses.js +93 -0
  274. package/dist/esm/helpers/useTypographyClasses.js.map +1 -0
  275. package/dist/esm/helpers/useVisibilityClasses.js +134 -0
  276. package/dist/esm/helpers/useVisibilityClasses.js.map +1 -0
  277. package/dist/esm/helpers/withSubComponents.js +24 -0
  278. package/dist/esm/helpers/withSubComponents.js.map +1 -0
  279. package/dist/esm/layout/Container.js +48 -0
  280. package/dist/esm/layout/Container.js.map +1 -0
  281. package/dist/esm/layout/Footer.js +33 -0
  282. package/dist/esm/layout/Footer.js.map +1 -0
  283. package/dist/esm/layout/Hero.js +90 -0
  284. package/dist/esm/layout/Hero.js.map +1 -0
  285. package/dist/esm/layout/Level.js +110 -0
  286. package/dist/esm/layout/Level.js.map +1 -0
  287. package/dist/esm/layout/Media.js +86 -0
  288. package/dist/esm/layout/Media.js.map +1 -0
  289. package/dist/esm/layout/Section.js +30 -0
  290. package/dist/esm/layout/Section.js.map +1 -0
  291. package/dist/extras.css +1 -1
  292. package/dist/extras.css.map +1 -1
  293. package/dist/index.cjs +187 -57
  294. package/dist/index.cjs.map +1 -1
  295. package/dist/index.esm.js +115 -17516
  296. package/dist/index.esm.js.map +1 -1
  297. package/dist/types/elements/Icon.d.ts +10 -7
  298. package/dist/types/form/Autocomplete.d.ts +1 -1
  299. package/dist/types/form/Checkboxes.d.ts +1 -1
  300. package/dist/types/form/DateInput.d.ts +1 -1
  301. package/dist/types/form/DateInputBase.d.ts +3 -4
  302. package/dist/types/form/DateRangeInput.d.ts +1 -1
  303. package/dist/types/form/DateTimeInput.d.ts +1 -1
  304. package/dist/types/form/DateTimeInputBase.d.ts +3 -4
  305. package/dist/types/form/Field.d.ts +2 -2
  306. package/dist/types/form/File.d.ts +4 -4
  307. package/dist/types/form/FormContext.d.ts +24 -2
  308. package/dist/types/form/Numberinput.d.ts +1 -1
  309. package/dist/types/form/Radios.d.ts +1 -1
  310. package/dist/types/form/Rate.d.ts +1 -1
  311. package/dist/types/form/Slider.d.ts +1 -1
  312. package/dist/types/form/Taginput.d.ts +1 -1
  313. package/dist/types/form/TimeInput.d.ts +1 -1
  314. package/dist/types/form/useAutoLabelId.d.ts +25 -4
  315. package/dist/types/helpers/Config.d.ts +3 -4
  316. package/dist/types/helpers/Theme.d.ts +44 -40
  317. package/dist/types-cjs/elements/Icon.d.ts +10 -7
  318. package/dist/types-cjs/form/Autocomplete.d.ts +1 -1
  319. package/dist/types-cjs/form/Checkboxes.d.ts +1 -1
  320. package/dist/types-cjs/form/DateInput.d.ts +1 -1
  321. package/dist/types-cjs/form/DateInputBase.d.ts +3 -4
  322. package/dist/types-cjs/form/DateRangeInput.d.ts +1 -1
  323. package/dist/types-cjs/form/DateTimeInput.d.ts +1 -1
  324. package/dist/types-cjs/form/DateTimeInputBase.d.ts +3 -4
  325. package/dist/types-cjs/form/Field.d.ts +2 -2
  326. package/dist/types-cjs/form/File.d.ts +4 -4
  327. package/dist/types-cjs/form/FormContext.d.ts +24 -2
  328. package/dist/types-cjs/form/Numberinput.d.ts +1 -1
  329. package/dist/types-cjs/form/Radios.d.ts +1 -1
  330. package/dist/types-cjs/form/Rate.d.ts +1 -1
  331. package/dist/types-cjs/form/Slider.d.ts +1 -1
  332. package/dist/types-cjs/form/Taginput.d.ts +1 -1
  333. package/dist/types-cjs/form/TimeInput.d.ts +1 -1
  334. package/dist/types-cjs/form/useAutoLabelId.d.ts +25 -4
  335. package/dist/types-cjs/helpers/Config.d.ts +3 -4
  336. package/dist/types-cjs/helpers/Theme.d.ts +44 -40
  337. package/dist/versions/bestax-no-dark-mode.css +1 -1
  338. package/dist/versions/bestax-no-dark-mode.css.map +1 -1
  339. package/dist/versions/bestax-no-helpers-prefixed.css +1 -1
  340. package/dist/versions/bestax-no-helpers-prefixed.css.map +1 -1
  341. package/dist/versions/bestax-no-helpers.css +1 -1
  342. package/dist/versions/bestax-no-helpers.css.map +1 -1
  343. package/dist/versions/bestax-prefixed.css +1 -1
  344. package/dist/versions/bestax-prefixed.css.map +1 -1
  345. package/package.json +1 -1
  346. package/src/scss/form/_dateinput.scss +37 -6
  347. package/src/scss/form/_datetimeinput.scss +7 -2
  348. package/src/scss/form/_picker-popover.scss +1 -4
@@ -0,0 +1,115 @@
1
+ /* @allxsmith/bestax-bulma — AI agents: see AGENTS.md in the package root, or https://bestax.io/llms.txt */
2
+ import { useMemo } from 'react';
3
+ import { classNames } from './classNames.js';
4
+ import { useConfig } from './Config.js';
5
+ import { validFloats, validAxisOverflows, validInteractions, validCursors, cursorClasses, validRadii, validShadows, validResponsives, validPositions, validAspectRatios, createBulmaClassHelpers } from './bulmaClassHelpers.js';
6
+
7
+ /**
8
+ * A hook that generates miscellaneous Bulma helper classes (float, overflow,
9
+ * overlay, interaction, cursor, radius, shadow, responsive, skeleton,
10
+ * clearfix, position, full height, and aspect ratio).
11
+ *
12
+ * @function useOtherClasses
13
+ * @param props - Miscellaneous Bulma helper props.
14
+ * @returns A space-separated string of helper classes.
15
+ * @example
16
+ * const otherClasses = useOtherClasses({ float: 'left', skeleton: true });
17
+ * // otherClasses: 'is-pulled-left is-skeleton'
18
+ */
19
+ const useOtherClasses = (props) => {
20
+ const { classPrefix } = useConfig();
21
+ const { float, overflow, overflowX, overflowY, overlay, interaction, cursor, radius, shadow, responsive, skeleton, clearfix, pos, relative, fullHeight, aspectRatio, } = props;
22
+ return useMemo(() => {
23
+ const { classes, addPrefixedClass, addClassNoViewport } = createBulmaClassHelpers(classPrefix);
24
+ // Other Helpers (no viewport support)
25
+ if (float) {
26
+ addClassNoViewport('is-pulled', float, validFloats);
27
+ }
28
+ // Bulma's overflow helpers are all `!important` at the same specificity
29
+ // and ordered by value rather than by axis, so a both-axes class beside an
30
+ // axis class would be settled by which value comes later in the
31
+ // stylesheet. Once an axis prop is set, both axes are written per axis
32
+ // instead: the axis prop wins its own, and `overflow` fills in the other,
33
+ // `clipped` being `overflow: hidden`.
34
+ const axisX = validAxisOverflows.find(v => v === overflowX);
35
+ const axisY = validAxisOverflows.find(v => v === overflowY);
36
+ if (axisX || axisY) {
37
+ const rest = overflow === 'clipped' ? 'hidden' : overflow;
38
+ addClassNoViewport('is-overflow-x', axisX ?? rest, validAxisOverflows);
39
+ addClassNoViewport('is-overflow-y', axisY ?? rest, validAxisOverflows);
40
+ }
41
+ else if (overflow === 'clipped') {
42
+ // The older helper, which keeps its own class.
43
+ addPrefixedClass('is-clipped');
44
+ }
45
+ else {
46
+ addClassNoViewport('is-overflow', overflow, validAxisOverflows);
47
+ }
48
+ if (overlay) {
49
+ addPrefixedClass('is-overlay');
50
+ }
51
+ if (interaction) {
52
+ addClassNoViewport('is', interaction, validInteractions);
53
+ }
54
+ if (cursor && validCursors.includes(cursor)) {
55
+ addPrefixedClass(cursorClasses[cursor]);
56
+ }
57
+ // `radiusless` is an `is-` helper that removes the radius; the sizes are
58
+ // Bulma's `has-radius-` helpers.
59
+ if (radius === 'radiusless') {
60
+ addPrefixedClass('is-radiusless');
61
+ }
62
+ else {
63
+ addClassNoViewport('has-radius', radius, validRadii);
64
+ }
65
+ if (shadow) {
66
+ addClassNoViewport('is', shadow, validShadows);
67
+ }
68
+ if (responsive) {
69
+ addClassNoViewport('is', responsive, validResponsives);
70
+ }
71
+ // Bulma Skeleton Helper
72
+ if (skeleton) {
73
+ addPrefixedClass('is-skeleton');
74
+ }
75
+ // Clearfix Helper
76
+ if (clearfix) {
77
+ addPrefixedClass('is-clearfix');
78
+ }
79
+ // Position Helpers. A valid `pos` decides the position on its own, so a
80
+ // `relative` beside it cannot add a second, conflicting one.
81
+ if (pos && validPositions.includes(pos)) {
82
+ addPrefixedClass(`is-position-${pos}`);
83
+ }
84
+ else if (relative) {
85
+ addPrefixedClass('is-relative');
86
+ }
87
+ // Full Height Helper
88
+ if (fullHeight) {
89
+ addPrefixedClass('is-full-height');
90
+ }
91
+ addClassNoViewport('is-aspect-ratio', aspectRatio, validAspectRatios);
92
+ return classNames(classes);
93
+ }, [
94
+ classPrefix,
95
+ float,
96
+ overflow,
97
+ overflowX,
98
+ overflowY,
99
+ overlay,
100
+ interaction,
101
+ cursor,
102
+ radius,
103
+ shadow,
104
+ responsive,
105
+ skeleton,
106
+ clearfix,
107
+ pos,
108
+ relative,
109
+ fullHeight,
110
+ aspectRatio,
111
+ ]);
112
+ };
113
+
114
+ export { useOtherClasses };
115
+ //# sourceMappingURL=useOtherClasses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOtherClasses.js","sources":["../../../src/helpers/useOtherClasses.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { classNames } from './classNames';\nimport { useConfig } from './Config';\nimport {\n createBulmaClassHelpers,\n cursorClasses,\n validAspectRatios,\n validAxisOverflows,\n validCursors,\n validFloats,\n validInteractions,\n validOverflows,\n validPositions,\n validRadii,\n validResponsives,\n validShadows,\n} from './bulmaClassHelpers';\n\n/**\n * Props for applying miscellaneous Bulma helper classes.\n */\nexport interface BulmaOtherProps {\n /** Float direction (e.g., 'left', 'right'). */\n float?: (typeof validFloats)[number];\n /**\n * Overflow behavior on both axes. `clipped` renders `is-clipped`; the CSS\n * keywords (`auto`, `clip`, `hidden`, `scroll`, `visible`) render\n * `is-overflow-<value>`.\n *\n * Beside `overflowX` or `overflowY`, the axis prop wins on its own axis and\n * `overflow` sets only the other one, with `clipped` counting as `hidden`:\n * `overflow=\"hidden\" overflowY=\"auto\"` clips sideways and scrolls down.\n */\n overflow?: (typeof validOverflows)[number];\n /**\n * Horizontal overflow behavior (e.g., 'auto', 'hidden'). Wins over\n * `overflow` on this axis.\n */\n overflowX?: (typeof validAxisOverflows)[number];\n /**\n * Vertical overflow behavior (e.g., 'auto', 'scroll'). Wins over `overflow`\n * on this axis.\n */\n overflowY?: (typeof validAxisOverflows)[number];\n /**\n * Covers the nearest positioned ancestor (`is-overlay`): `position:\n * absolute` with `top`, `right`, `bottom` and `left` at 0.\n *\n * `pos` and `relative` set `position` with `!important`, so beside\n * `overlay` either one replaces the `absolute` and keeps the zero offsets.\n * `pos=\"fixed\"` then covers the viewport instead of the ancestor. `sticky`,\n * `relative` and `static` put the element back in the normal flow, where it\n * covers nothing, and a sticky one sticks at every edge of its scroll\n * container.\n */\n overlay?: boolean;\n /** Interaction behavior (e.g., 'unselectable', 'clickable'). */\n interaction?: (typeof validInteractions)[number];\n /** Cursor style (e.g., 'pointer', 'help'). */\n cursor?: (typeof validCursors)[number];\n /**\n * Border radius. `radiusless` removes it (`is-radiusless`). `small`,\n * `normal`, `large` and `rounded` set one from Bulma's radius scale\n * (`has-radius-<value>`), where `rounded` is the pill shape.\n *\n * The class lands on the component's root element, so where an inner\n * element draws the radius, such as the `<img>` in `Image` or the\n * `<select>` in `Select`, that element keeps its own. The sizes are not\n * `!important`, unlike `radiusless`, so a component rule more specific than\n * one class still wins: an `isRounded` control stays a pill, and a joined\n * addon keeps its square inner corners.\n */\n radius?: (typeof validRadii)[number];\n /** Shadow style (e.g., 'shadowless'). */\n shadow?: (typeof validShadows)[number];\n /** Responsive behavior (e.g., 'mobile', 'narrow'). */\n responsive?: (typeof validResponsives)[number];\n /** Add Bulma skeleton class if true. */\n skeleton?: boolean;\n /** Applies clearfix to fix floating children if true. */\n clearfix?: boolean;\n /**\n * CSS `position` (`is-position-<value>`).\n *\n * Named `pos` because several components already have a `position` prop\n * of their own, for where they place a popup or a toast.\n *\n * It sets `position` and nothing else, so an element that is `absolute`,\n * `fixed` or `sticky` still needs its offsets (`top`, `left`, …) from your\n * own CSS. `sticky` in particular does nothing until one is set.\n *\n * When `pos` is set it decides the position, and `relative` adds nothing.\n * Beside `overlay` it replaces the overlay's `absolute` but not its zero\n * offsets; see `overlay`.\n */\n pos?: (typeof validPositions)[number];\n /**\n * Applies position: relative if true (`is-relative`). The shortcut for\n * `pos=\"relative\"`, kept working as it always has; `pos` wins when both are\n * set.\n */\n relative?: boolean;\n /** Applies height: 100% if true. */\n fullHeight?: boolean;\n /**\n * Fixed width-to-height ratio (`is-aspect-ratio-<value>`), e.g. `16by9`.\n * The height follows the width, so leave the height unset. Content taller\n * than the ratio allows grows the element unless `overflow` or `overflowY`\n * makes it scroll or clip.\n *\n * On `Image`, prefer its own `size` ratios, which also fit the picture to\n * the box; this class sizes only the wrapper.\n */\n aspectRatio?: (typeof validAspectRatios)[number];\n}\n\n/**\n * A hook that generates miscellaneous Bulma helper classes (float, overflow,\n * overlay, interaction, cursor, radius, shadow, responsive, skeleton,\n * clearfix, position, full height, and aspect ratio).\n *\n * @function useOtherClasses\n * @param props - Miscellaneous Bulma helper props.\n * @returns A space-separated string of helper classes.\n * @example\n * const otherClasses = useOtherClasses({ float: 'left', skeleton: true });\n * // otherClasses: 'is-pulled-left is-skeleton'\n */\nexport const useOtherClasses = (props: BulmaOtherProps): string => {\n const { classPrefix } = useConfig();\n\n const {\n float,\n overflow,\n overflowX,\n overflowY,\n overlay,\n interaction,\n cursor,\n radius,\n shadow,\n responsive,\n skeleton,\n clearfix,\n pos,\n relative,\n fullHeight,\n aspectRatio,\n } = props;\n\n return useMemo(() => {\n const { classes, addPrefixedClass, addClassNoViewport } =\n createBulmaClassHelpers(classPrefix);\n\n // Other Helpers (no viewport support)\n if (float) {\n addClassNoViewport('is-pulled', float, validFloats);\n }\n // Bulma's overflow helpers are all `!important` at the same specificity\n // and ordered by value rather than by axis, so a both-axes class beside an\n // axis class would be settled by which value comes later in the\n // stylesheet. Once an axis prop is set, both axes are written per axis\n // instead: the axis prop wins its own, and `overflow` fills in the other,\n // `clipped` being `overflow: hidden`.\n const axisX = validAxisOverflows.find(v => v === overflowX);\n const axisY = validAxisOverflows.find(v => v === overflowY);\n if (axisX || axisY) {\n const rest = overflow === 'clipped' ? 'hidden' : overflow;\n addClassNoViewport('is-overflow-x', axisX ?? rest, validAxisOverflows);\n addClassNoViewport('is-overflow-y', axisY ?? rest, validAxisOverflows);\n } else if (overflow === 'clipped') {\n // The older helper, which keeps its own class.\n addPrefixedClass('is-clipped');\n } else {\n addClassNoViewport('is-overflow', overflow, validAxisOverflows);\n }\n if (overlay) {\n addPrefixedClass('is-overlay');\n }\n if (interaction) {\n addClassNoViewport('is', interaction, validInteractions);\n }\n if (cursor && validCursors.includes(cursor)) {\n addPrefixedClass(cursorClasses[cursor]);\n }\n // `radiusless` is an `is-` helper that removes the radius; the sizes are\n // Bulma's `has-radius-` helpers.\n if (radius === 'radiusless') {\n addPrefixedClass('is-radiusless');\n } else {\n addClassNoViewport('has-radius', radius, validRadii);\n }\n if (shadow) {\n addClassNoViewport('is', shadow, validShadows);\n }\n if (responsive) {\n addClassNoViewport('is', responsive, validResponsives);\n }\n\n // Bulma Skeleton Helper\n if (skeleton) {\n addPrefixedClass('is-skeleton');\n }\n\n // Clearfix Helper\n if (clearfix) {\n addPrefixedClass('is-clearfix');\n }\n\n // Position Helpers. A valid `pos` decides the position on its own, so a\n // `relative` beside it cannot add a second, conflicting one.\n if (pos && validPositions.includes(pos)) {\n addPrefixedClass(`is-position-${pos}`);\n } else if (relative) {\n addPrefixedClass('is-relative');\n }\n\n // Full Height Helper\n if (fullHeight) {\n addPrefixedClass('is-full-height');\n }\n\n addClassNoViewport('is-aspect-ratio', aspectRatio, validAspectRatios);\n\n return classNames(classes);\n }, [\n classPrefix,\n float,\n overflow,\n overflowX,\n overflowY,\n overlay,\n interaction,\n cursor,\n radius,\n shadow,\n responsive,\n skeleton,\n clearfix,\n pos,\n relative,\n fullHeight,\n aspectRatio,\n ]);\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /* @allxsmith/bestax-bulma — AI agents: see AGENTS.md in the package root, or https://bestax.io/llms.txt */
2
+ import { useMemo } from 'react';
3
+ import { classNames } from './classNames.js';
4
+ import { useConfig } from './Config.js';
5
+ import { validSizes, validGaps, createBulmaClassHelpers } from './bulmaClassHelpers.js';
6
+
7
+ /**
8
+ * A gap step as the class reads it. Numbers are accepted for the steps, so
9
+ * `2` and `'2'` both become `'2'`; anything else is checked against
10
+ * `validGaps` by the caller.
11
+ */
12
+ const gapValue = (value) => typeof value === 'number' ? String(value) : value;
13
+ /**
14
+ * A hook that generates Bulma margin, padding and gap helper classes.
15
+ *
16
+ * @function useSpacingClasses
17
+ * @param props - Spacing-related Bulma helper props.
18
+ * @returns A space-separated string of spacing helper classes.
19
+ * @example
20
+ * const spacingClasses = useSpacingClasses({ m: '2', px: '4' });
21
+ * // spacingClasses: 'm-2 px-4'
22
+ */
23
+ const useSpacingClasses = (props) => {
24
+ const { classPrefix } = useConfig();
25
+ const { m, mt, mr, mb, ml, mx, my, p, pt, pr, pb, pl, px, py, gap, columnGap, rowGap, gapless, } = props;
26
+ return useMemo(() => {
27
+ const { classes, addClassNoViewport, addPrefixedClass } = createBulmaClassHelpers(classPrefix);
28
+ // Spacing (no viewport support in Bulma)
29
+ addClassNoViewport('m', m, validSizes);
30
+ addClassNoViewport('mt', mt, validSizes);
31
+ addClassNoViewport('mr', mr, validSizes);
32
+ addClassNoViewport('mb', mb, validSizes);
33
+ addClassNoViewport('ml', ml, validSizes);
34
+ addClassNoViewport('mx', mx, validSizes);
35
+ addClassNoViewport('my', my, validSizes);
36
+ addClassNoViewport('p', p, validSizes);
37
+ addClassNoViewport('pt', pt, validSizes);
38
+ addClassNoViewport('pr', pr, validSizes);
39
+ addClassNoViewport('pb', pb, validSizes);
40
+ addClassNoViewport('pl', pl, validSizes);
41
+ addClassNoViewport('px', px, validSizes);
42
+ addClassNoViewport('py', py, validSizes);
43
+ // Gap (no viewport support in Bulma). `gapless` and `is-gap-*` both set
44
+ // the `gap` shorthand at one class of specificity, so beside each other
45
+ // the stylesheet's rule order would decide. A valid `gap` settles it on
46
+ // its own. The axis props need no such care: Bulma declares every
47
+ // `is-column-gap-*` and `is-row-gap-*` after the shorthands, so each wins
48
+ // its own axis over `gap` and `gapless` alike.
49
+ const gapStep = gapValue(gap);
50
+ const hasGap = validGaps.some(v => v === gapStep);
51
+ addClassNoViewport('is-gap', gapStep, validGaps);
52
+ if (gapless && !hasGap) {
53
+ addPrefixedClass('is-gapless');
54
+ }
55
+ addClassNoViewport('is-column-gap', gapValue(columnGap), validGaps);
56
+ addClassNoViewport('is-row-gap', gapValue(rowGap), validGaps);
57
+ return classNames(classes);
58
+ }, [
59
+ classPrefix,
60
+ m,
61
+ mt,
62
+ mr,
63
+ mb,
64
+ ml,
65
+ mx,
66
+ my,
67
+ p,
68
+ pt,
69
+ pr,
70
+ pb,
71
+ pl,
72
+ px,
73
+ py,
74
+ gap,
75
+ columnGap,
76
+ rowGap,
77
+ gapless,
78
+ ]);
79
+ };
80
+
81
+ export { useSpacingClasses };
82
+ //# sourceMappingURL=useSpacingClasses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSpacingClasses.js","sources":["../../../src/helpers/useSpacingClasses.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { classNames } from './classNames';\nimport { useConfig } from './Config';\nimport {\n createBulmaClassHelpers,\n validGaps,\n validSizes,\n type BulmaGapStep,\n} from './bulmaClassHelpers';\n\n/**\n * Props for applying Bulma margin, padding and gap helper classes.\n */\nexport interface BulmaSpacingProps {\n /** Margin (e.g., '0', '1'). */\n m?: (typeof validSizes)[number];\n /** Margin top. */\n mt?: (typeof validSizes)[number];\n /** Margin right. */\n mr?: (typeof validSizes)[number];\n /** Margin bottom. */\n mb?: (typeof validSizes)[number];\n /** Margin left. */\n ml?: (typeof validSizes)[number];\n /** Margin horizontal (left and right). */\n mx?: (typeof validSizes)[number];\n /** Margin vertical (top and bottom). */\n my?: (typeof validSizes)[number];\n /** Padding (e.g., '0', '1'). */\n p?: (typeof validSizes)[number];\n /** Padding top. */\n pt?: (typeof validSizes)[number];\n /** Padding right. */\n pr?: (typeof validSizes)[number];\n /** Padding bottom. */\n pb?: (typeof validSizes)[number];\n /** Padding left. */\n pl?: (typeof validSizes)[number];\n /** Padding horizontal (left and right). */\n px?: (typeof validSizes)[number];\n /** Padding vertical (top and bottom). */\n py?: (typeof validSizes)[number];\n /**\n * Space between the children of a flex or grid container (`is-gap-<value>`),\n * on Bulma's gap scale: each whole step is 0.5rem, so `gap=\"2\"` is 1rem, with\n * half steps such as `\"1.5\"` between them. Also takes the step as a number.\n *\n * It sets the CSS `gap`, which does nothing unless the element lays its\n * children out as flex or grid, so pair it with `display=\"flex\"` on most\n * components. The scale is not the margin scale: `m=\"2\"` is 0.5rem.\n *\n * `Grid` and `Columns` declare their own `gap`. `Grid`'s renders the same\n * class; `Columns`' is the columns gutter (`is-<value>`) and takes whole\n * steps only.\n */\n gap?: BulmaGapStep;\n /**\n * Space between columns only (`is-column-gap-<value>`), on the same scale as\n * `gap`. Beside `gap` or `gapless`, it wins on its own axis.\n */\n columnGap?: BulmaGapStep;\n /**\n * Space between rows only (`is-row-gap-<value>`), on the same scale as\n * `gap`. Beside `gap` or `gapless`, it wins on its own axis.\n */\n rowGap?: BulmaGapStep;\n /**\n * Removes the gap between children (`is-gapless`), the shortcut for\n * `gap=\"0\"`; a valid `gap` wins when both are set. `Columns` is the\n * exception: its `gap` is its gutter, and there `gapless` is Bulma's gapless\n * columns modifier, the same as `isGapless`.\n */\n gapless?: boolean;\n}\n\n/**\n * A gap step as the class reads it. Numbers are accepted for the steps, so\n * `2` and `'2'` both become `'2'`; anything else is checked against\n * `validGaps` by the caller.\n */\nconst gapValue = (value: BulmaGapStep | undefined): string | undefined =>\n typeof value === 'number' ? String(value) : value;\n\n/**\n * A hook that generates Bulma margin, padding and gap helper classes.\n *\n * @function useSpacingClasses\n * @param props - Spacing-related Bulma helper props.\n * @returns A space-separated string of spacing helper classes.\n * @example\n * const spacingClasses = useSpacingClasses({ m: '2', px: '4' });\n * // spacingClasses: 'm-2 px-4'\n */\nexport const useSpacingClasses = (props: BulmaSpacingProps): string => {\n const { classPrefix } = useConfig();\n\n const {\n m,\n mt,\n mr,\n mb,\n ml,\n mx,\n my,\n p,\n pt,\n pr,\n pb,\n pl,\n px,\n py,\n gap,\n columnGap,\n rowGap,\n gapless,\n } = props;\n\n return useMemo(() => {\n const { classes, addClassNoViewport, addPrefixedClass } =\n createBulmaClassHelpers(classPrefix);\n\n // Spacing (no viewport support in Bulma)\n addClassNoViewport('m', m, validSizes);\n addClassNoViewport('mt', mt, validSizes);\n addClassNoViewport('mr', mr, validSizes);\n addClassNoViewport('mb', mb, validSizes);\n addClassNoViewport('ml', ml, validSizes);\n addClassNoViewport('mx', mx, validSizes);\n addClassNoViewport('my', my, validSizes);\n addClassNoViewport('p', p, validSizes);\n addClassNoViewport('pt', pt, validSizes);\n addClassNoViewport('pr', pr, validSizes);\n addClassNoViewport('pb', pb, validSizes);\n addClassNoViewport('pl', pl, validSizes);\n addClassNoViewport('px', px, validSizes);\n addClassNoViewport('py', py, validSizes);\n\n // Gap (no viewport support in Bulma). `gapless` and `is-gap-*` both set\n // the `gap` shorthand at one class of specificity, so beside each other\n // the stylesheet's rule order would decide. A valid `gap` settles it on\n // its own. The axis props need no such care: Bulma declares every\n // `is-column-gap-*` and `is-row-gap-*` after the shorthands, so each wins\n // its own axis over `gap` and `gapless` alike.\n const gapStep = gapValue(gap);\n const hasGap = validGaps.some(v => v === gapStep);\n addClassNoViewport('is-gap', gapStep, validGaps);\n if (gapless && !hasGap) {\n addPrefixedClass('is-gapless');\n }\n addClassNoViewport('is-column-gap', gapValue(columnGap), validGaps);\n addClassNoViewport('is-row-gap', gapValue(rowGap), validGaps);\n\n return classNames(classes);\n }, [\n classPrefix,\n m,\n mt,\n mr,\n mb,\n ml,\n mx,\n my,\n p,\n pt,\n pr,\n pb,\n pl,\n px,\n py,\n gap,\n columnGap,\n rowGap,\n gapless,\n ]);\n};\n"],"names":[],"mappings":";;;;;;AA2EA;;;;AAIG;AACH,MAAM,QAAQ,GAAG,CAAC,KAA+B,KAC/C,OAAO,KAAK,KAAK,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK;AAEnD;;;;;;;;;AASG;AACI,MAAM,iBAAiB,GAAG,CAAC,KAAwB,KAAY;AACpE,IAAA,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE;AAEnC,IAAA,MAAM,EACJ,CAAC,EACD,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,CAAC,EACD,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,GAAG,EACH,SAAS,EACT,MAAM,EACN,OAAO,GACR,GAAG,KAAK;IAET,OAAO,OAAO,CAAC,MAAK;AAClB,QAAA,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,GACrD,uBAAuB,CAAC,WAAW,CAAC;;AAGtC,QAAA,kBAAkB,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC;AACtC,QAAA,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC;AACxC,QAAA,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC;AACxC,QAAA,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC;AACxC,QAAA,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC;AACxC,QAAA,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC;AACxC,QAAA,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC;AACxC,QAAA,kBAAkB,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC;AACtC,QAAA,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC;AACxC,QAAA,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC;AACxC,QAAA,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC;AACxC,QAAA,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC;AACxC,QAAA,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC;AACxC,QAAA,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC;;;;;;;AAQxC,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC;AAC7B,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC;AACjD,QAAA,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;AAChD,QAAA,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE;YACtB,gBAAgB,CAAC,YAAY,CAAC;QAChC;QACA,kBAAkB,CAAC,eAAe,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;QACnE,kBAAkB,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;AAE7D,QAAA,OAAO,UAAU,CAAC,OAAO,CAAC;AAC5B,IAAA,CAAC,EAAE;QACD,WAAW;QACX,CAAC;QACD,EAAE;QACF,EAAE;QACF,EAAE;QACF,EAAE;QACF,EAAE;QACF,EAAE;QACF,CAAC;QACD,EAAE;QACF,EAAE;QACF,EAAE;QACF,EAAE;QACF,EAAE;QACF,EAAE;QACF,GAAG;QACH,SAAS;QACT,MAAM;QACN,OAAO;AACR,KAAA,CAAC;AACJ;;"}
@@ -0,0 +1,93 @@
1
+ /* @allxsmith/bestax-bulma — AI agents: see AGENTS.md in the package root, or https://bestax.io/llms.txt */
2
+ import { useMemo } from 'react';
3
+ import { classNames } from './classNames.js';
4
+ import { useConfig } from './Config.js';
5
+ import { validTextSizes, validAlignments, validTextTransforms, validTextWeights, validFontFamilies, createBulmaClassHelpers } from './bulmaClassHelpers.js';
6
+
7
+ /**
8
+ * Viewports Bulma generates `is-size-*` classes for. Unlike text alignment,
9
+ * text size ships no `-only` bands (`tablet-only`/`desktop-only`/`widescreen-only`),
10
+ * so the `viewport` prop's suffix is limited to these on the `is-size` path.
11
+ */
12
+ const sizeSupportedViewports = [
13
+ 'mobile',
14
+ 'tablet',
15
+ 'touch',
16
+ 'desktop',
17
+ 'widescreen',
18
+ 'fullhd',
19
+ ];
20
+ /**
21
+ * A hook that generates Bulma typography helper classes, including
22
+ * viewport-specific text size and alignment variants.
23
+ *
24
+ * @function useTypographyClasses
25
+ * @param props - Typography-related Bulma helper props.
26
+ * @returns A space-separated string of typography helper classes.
27
+ * @example
28
+ * const typographyClasses = useTypographyClasses({
29
+ * textSize: '3',
30
+ * textWeight: 'bold',
31
+ * });
32
+ * // typographyClasses: 'is-size-3 has-text-weight-bold'
33
+ */
34
+ const useTypographyClasses = (props) => {
35
+ const { classPrefix } = useConfig();
36
+ const { textSize, textAlign, textTransform, textWeight, fontFamily, viewport, textSizeMobile, textSizeTablet, textSizeDesktop, textSizeWidescreen, textSizeFullhd, textAlignMobile, textAlignTablet, textAlignDesktop, textAlignWidescreen, textAlignFullhd, } = props;
37
+ return useMemo(() => {
38
+ const { classes, addPrefixedClass, addClass, addClassNoViewport } = createBulmaClassHelpers(classPrefix, viewport);
39
+ // Typography
40
+ // Bulma emits `is-size-*` for the six main/`touch` breakpoints but not the
41
+ // three `-only` bands, so restrict the viewport suffix to the ones it ships
42
+ // — otherwise `viewport="tablet-only"` would render a dead `is-size-N-tablet-only`.
43
+ addClass('is-size', textSize, validTextSizes, true, sizeSupportedViewports); // supports viewport (no `-only` bands)
44
+ addClass('has-text', textAlign, validAlignments, true); // supports viewport (all bands)
45
+ addClassNoViewport('is', textTransform, validTextTransforms); // no viewport support
46
+ addClassNoViewport('has-text-weight', textWeight, validTextWeights); // no viewport support
47
+ addClassNoViewport('is-family', fontFamily, validFontFamilies); // no viewport support
48
+ // Viewport-specific text sizes
49
+ const addViewportSpecificTextSizeClass = (value, viewportSuffix) => {
50
+ if (value && validTextSizes.includes(value)) {
51
+ addPrefixedClass(`is-size-${value}${viewportSuffix}`);
52
+ }
53
+ };
54
+ addViewportSpecificTextSizeClass(textSizeMobile, '-mobile');
55
+ addViewportSpecificTextSizeClass(textSizeTablet, '-tablet');
56
+ addViewportSpecificTextSizeClass(textSizeDesktop, '-desktop');
57
+ addViewportSpecificTextSizeClass(textSizeWidescreen, '-widescreen');
58
+ addViewportSpecificTextSizeClass(textSizeFullhd, '-fullhd');
59
+ // Viewport-specific text alignment
60
+ const addViewportSpecificTextAlignClass = (value, viewportSuffix) => {
61
+ if (value && validAlignments.includes(value)) {
62
+ addPrefixedClass(`has-text-${value}${viewportSuffix}`);
63
+ }
64
+ };
65
+ addViewportSpecificTextAlignClass(textAlignMobile, '-mobile');
66
+ addViewportSpecificTextAlignClass(textAlignTablet, '-tablet');
67
+ addViewportSpecificTextAlignClass(textAlignDesktop, '-desktop');
68
+ addViewportSpecificTextAlignClass(textAlignWidescreen, '-widescreen');
69
+ addViewportSpecificTextAlignClass(textAlignFullhd, '-fullhd');
70
+ return classNames(classes);
71
+ }, [
72
+ classPrefix,
73
+ textSize,
74
+ textAlign,
75
+ textTransform,
76
+ textWeight,
77
+ fontFamily,
78
+ viewport,
79
+ textSizeMobile,
80
+ textSizeTablet,
81
+ textSizeDesktop,
82
+ textSizeWidescreen,
83
+ textSizeFullhd,
84
+ textAlignMobile,
85
+ textAlignTablet,
86
+ textAlignDesktop,
87
+ textAlignWidescreen,
88
+ textAlignFullhd,
89
+ ]);
90
+ };
91
+
92
+ export { useTypographyClasses };
93
+ //# sourceMappingURL=useTypographyClasses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTypographyClasses.js","sources":["../../../src/helpers/useTypographyClasses.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { classNames } from './classNames';\nimport { useConfig } from './Config';\nimport {\n createBulmaClassHelpers,\n validTextSizes,\n validAlignments,\n validTextTransforms,\n validTextWeights,\n validFontFamilies,\n BulmaViewportProps,\n} from './bulmaClassHelpers';\n\n/**\n * Viewports Bulma generates `is-size-*` classes for. Unlike text alignment,\n * text size ships no `-only` bands (`tablet-only`/`desktop-only`/`widescreen-only`),\n * so the `viewport` prop's suffix is limited to these on the `is-size` path.\n */\nconst sizeSupportedViewports = [\n 'mobile',\n 'tablet',\n 'touch',\n 'desktop',\n 'widescreen',\n 'fullhd',\n] as const;\n\n/**\n * Props for applying Bulma typography helper classes.\n */\nexport interface BulmaTypographyProps extends BulmaViewportProps {\n /** Text size (e.g., '1', '2'). */\n textSize?: (typeof validTextSizes)[number];\n /** Text alignment (e.g., 'centered', 'left'). */\n textAlign?: (typeof validAlignments)[number];\n /** Text transformation (e.g., 'uppercase', 'italic'). */\n textTransform?: (typeof validTextTransforms)[number];\n /** Text weight (e.g., 'light', 'bold'). */\n textWeight?: (typeof validTextWeights)[number];\n /** Font family (e.g., 'sans-serif', 'code'). */\n fontFamily?: (typeof validFontFamilies)[number];\n /** Text size for mobile viewport (up to 768px). */\n textSizeMobile?: (typeof validTextSizes)[number];\n /** Text size for tablet viewport (769px - 1023px). */\n textSizeTablet?: (typeof validTextSizes)[number];\n /** Text size for desktop viewport (1024px - 1215px). */\n textSizeDesktop?: (typeof validTextSizes)[number];\n /** Text size for widescreen viewport (1216px - 1407px). */\n textSizeWidescreen?: (typeof validTextSizes)[number];\n /** Text size for fullhd viewport (1408px and above). */\n textSizeFullhd?: (typeof validTextSizes)[number];\n /** Text alignment for mobile viewport (up to 768px). */\n textAlignMobile?: (typeof validAlignments)[number];\n /** Text alignment for tablet viewport (769px - 1023px). */\n textAlignTablet?: (typeof validAlignments)[number];\n /** Text alignment for desktop viewport (1024px - 1215px). */\n textAlignDesktop?: (typeof validAlignments)[number];\n /** Text alignment for widescreen viewport (1216px - 1407px). */\n textAlignWidescreen?: (typeof validAlignments)[number];\n /** Text alignment for fullhd viewport (1408px and above). */\n textAlignFullhd?: (typeof validAlignments)[number];\n}\n\n/**\n * A hook that generates Bulma typography helper classes, including\n * viewport-specific text size and alignment variants.\n *\n * @function useTypographyClasses\n * @param props - Typography-related Bulma helper props.\n * @returns A space-separated string of typography helper classes.\n * @example\n * const typographyClasses = useTypographyClasses({\n * textSize: '3',\n * textWeight: 'bold',\n * });\n * // typographyClasses: 'is-size-3 has-text-weight-bold'\n */\nexport const useTypographyClasses = (props: BulmaTypographyProps): string => {\n const { classPrefix } = useConfig();\n\n const {\n textSize,\n textAlign,\n textTransform,\n textWeight,\n fontFamily,\n viewport,\n textSizeMobile,\n textSizeTablet,\n textSizeDesktop,\n textSizeWidescreen,\n textSizeFullhd,\n textAlignMobile,\n textAlignTablet,\n textAlignDesktop,\n textAlignWidescreen,\n textAlignFullhd,\n } = props;\n\n return useMemo(() => {\n const { classes, addPrefixedClass, addClass, addClassNoViewport } =\n createBulmaClassHelpers(classPrefix, viewport);\n\n // Typography\n // Bulma emits `is-size-*` for the six main/`touch` breakpoints but not the\n // three `-only` bands, so restrict the viewport suffix to the ones it ships\n // — otherwise `viewport=\"tablet-only\"` would render a dead `is-size-N-tablet-only`.\n addClass('is-size', textSize, validTextSizes, true, sizeSupportedViewports); // supports viewport (no `-only` bands)\n addClass('has-text', textAlign, validAlignments, true); // supports viewport (all bands)\n addClassNoViewport('is', textTransform, validTextTransforms); // no viewport support\n addClassNoViewport('has-text-weight', textWeight, validTextWeights); // no viewport support\n addClassNoViewport('is-family', fontFamily, validFontFamilies); // no viewport support\n\n // Viewport-specific text sizes\n const addViewportSpecificTextSizeClass = (\n value: string | undefined,\n viewportSuffix: string\n ) => {\n if (value && (validTextSizes as readonly string[]).includes(value)) {\n addPrefixedClass(`is-size-${value}${viewportSuffix}`);\n }\n };\n\n addViewportSpecificTextSizeClass(textSizeMobile, '-mobile');\n addViewportSpecificTextSizeClass(textSizeTablet, '-tablet');\n addViewportSpecificTextSizeClass(textSizeDesktop, '-desktop');\n addViewportSpecificTextSizeClass(textSizeWidescreen, '-widescreen');\n addViewportSpecificTextSizeClass(textSizeFullhd, '-fullhd');\n\n // Viewport-specific text alignment\n const addViewportSpecificTextAlignClass = (\n value: string | undefined,\n viewportSuffix: string\n ) => {\n if (value && (validAlignments as readonly string[]).includes(value)) {\n addPrefixedClass(`has-text-${value}${viewportSuffix}`);\n }\n };\n\n addViewportSpecificTextAlignClass(textAlignMobile, '-mobile');\n addViewportSpecificTextAlignClass(textAlignTablet, '-tablet');\n addViewportSpecificTextAlignClass(textAlignDesktop, '-desktop');\n addViewportSpecificTextAlignClass(textAlignWidescreen, '-widescreen');\n addViewportSpecificTextAlignClass(textAlignFullhd, '-fullhd');\n\n return classNames(classes);\n }, [\n classPrefix,\n textSize,\n textAlign,\n textTransform,\n textWeight,\n fontFamily,\n viewport,\n textSizeMobile,\n textSizeTablet,\n textSizeDesktop,\n textSizeWidescreen,\n textSizeFullhd,\n textAlignMobile,\n textAlignTablet,\n textAlignDesktop,\n textAlignWidescreen,\n textAlignFullhd,\n ]);\n};\n"],"names":[],"mappings":";;;;;;AAaA;;;;AAIG;AACH,MAAM,sBAAsB,GAAG;IAC7B,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,SAAS;IACT,YAAY;IACZ,QAAQ;CACA;AAsCV;;;;;;;;;;;;;AAaG;AACI,MAAM,oBAAoB,GAAG,CAAC,KAA2B,KAAY;AAC1E,IAAA,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE;AAEnC,IAAA,MAAM,EACJ,QAAQ,EACR,SAAS,EACT,aAAa,EACb,UAAU,EACV,UAAU,EACV,QAAQ,EACR,cAAc,EACd,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,GAChB,GAAG,KAAK;IAET,OAAO,OAAO,CAAC,MAAK;AAClB,QAAA,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAC/D,uBAAuB,CAAC,WAAW,EAAE,QAAQ,CAAC;;;;;AAMhD,QAAA,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,sBAAsB,CAAC,CAAC;QAC5E,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;QACvD,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAC;QAC7D,kBAAkB,CAAC,iBAAiB,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC;QACpE,kBAAkB,CAAC,WAAW,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;;AAG/D,QAAA,MAAM,gCAAgC,GAAG,CACvC,KAAyB,EACzB,cAAsB,KACpB;YACF,IAAI,KAAK,IAAK,cAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAClE,gBAAA,gBAAgB,CAAC,CAAA,QAAA,EAAW,KAAK,GAAG,cAAc,CAAA,CAAE,CAAC;YACvD;AACF,QAAA,CAAC;AAED,QAAA,gCAAgC,CAAC,cAAc,EAAE,SAAS,CAAC;AAC3D,QAAA,gCAAgC,CAAC,cAAc,EAAE,SAAS,CAAC;AAC3D,QAAA,gCAAgC,CAAC,eAAe,EAAE,UAAU,CAAC;AAC7D,QAAA,gCAAgC,CAAC,kBAAkB,EAAE,aAAa,CAAC;AACnE,QAAA,gCAAgC,CAAC,cAAc,EAAE,SAAS,CAAC;;AAG3D,QAAA,MAAM,iCAAiC,GAAG,CACxC,KAAyB,EACzB,cAAsB,KACpB;YACF,IAAI,KAAK,IAAK,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACnE,gBAAA,gBAAgB,CAAC,CAAA,SAAA,EAAY,KAAK,GAAG,cAAc,CAAA,CAAE,CAAC;YACxD;AACF,QAAA,CAAC;AAED,QAAA,iCAAiC,CAAC,eAAe,EAAE,SAAS,CAAC;AAC7D,QAAA,iCAAiC,CAAC,eAAe,EAAE,SAAS,CAAC;AAC7D,QAAA,iCAAiC,CAAC,gBAAgB,EAAE,UAAU,CAAC;AAC/D,QAAA,iCAAiC,CAAC,mBAAmB,EAAE,aAAa,CAAC;AACrE,QAAA,iCAAiC,CAAC,eAAe,EAAE,SAAS,CAAC;AAE7D,QAAA,OAAO,UAAU,CAAC,OAAO,CAAC;AAC5B,IAAA,CAAC,EAAE;QACD,WAAW;QACX,QAAQ;QACR,SAAS;QACT,aAAa;QACb,UAAU;QACV,UAAU;QACV,QAAQ;QACR,cAAc;QACd,cAAc;QACd,eAAe;QACf,kBAAkB;QAClB,cAAc;QACd,eAAe;QACf,eAAe;QACf,gBAAgB;QAChB,mBAAmB;QACnB,eAAe;AAChB,KAAA,CAAC;AACJ;;"}
@@ -0,0 +1,134 @@
1
+ /* @allxsmith/bestax-bulma — AI agents: see AGENTS.md in the package root, or https://bestax.io/llms.txt */
2
+ import { useMemo } from 'react';
3
+ import { classNames } from './classNames.js';
4
+ import { useConfig } from './Config.js';
5
+ import { validViewports, validDisplays, validVisibilities, createBulmaClassHelpers } from './bulmaClassHelpers.js';
6
+
7
+ /**
8
+ * A hook that generates Bulma visibility and display helper classes. This hook
9
+ * owns all display class emission, including viewport-specific display props,
10
+ * the legacy display/viewport combination, and `display: 'none'` mapping to
11
+ * `is-hidden`.
12
+ *
13
+ * @function useVisibilityClasses
14
+ * @param props - Visibility- and display-related Bulma helper props.
15
+ * @returns A space-separated string of visibility and display helper classes.
16
+ * @example
17
+ * const visibilityClasses = useVisibilityClasses({
18
+ * display: 'flex',
19
+ * visibilityMobile: 'hidden',
20
+ * });
21
+ * // visibilityClasses: 'is-hidden-mobile is-flex'
22
+ */
23
+ const useVisibilityClasses = (props) => {
24
+ const { classPrefix } = useConfig();
25
+ const { visibility, visibilityMobile, visibilityTablet, visibilityTabletOnly, visibilityTouch, visibilityDesktop, visibilityDesktopOnly, visibilityWidescreen, visibilityWidescreenOnly, visibilityFullhd, display, displayMobile, displayTablet, displayTabletOnly, displayTouch, displayDesktop, displayDesktopOnly, displayWidescreen, displayWidescreenOnly, displayFullhd, viewport, } = props;
26
+ return useMemo(() => {
27
+ const { classes, addPrefixedClass, addClass } = createBulmaClassHelpers(classPrefix, viewport);
28
+ // Viewport-specific visibility
29
+ const addViewportSpecificVisibilityClass = (value, viewportSuffix) => {
30
+ if (value === 'hidden') {
31
+ addPrefixedClass(`is-hidden${viewportSuffix}`);
32
+ }
33
+ else if (value === 'sr-only') {
34
+ addPrefixedClass(`is-sr-only${viewportSuffix}`);
35
+ }
36
+ else if (value === 'invisible') {
37
+ addPrefixedClass(`is-invisible${viewportSuffix}`);
38
+ }
39
+ };
40
+ addViewportSpecificVisibilityClass(visibilityMobile, '-mobile');
41
+ addViewportSpecificVisibilityClass(visibilityTablet, '-tablet');
42
+ addViewportSpecificVisibilityClass(visibilityTabletOnly, '-tablet-only');
43
+ addViewportSpecificVisibilityClass(visibilityTouch, '-touch');
44
+ addViewportSpecificVisibilityClass(visibilityDesktop, '-desktop');
45
+ addViewportSpecificVisibilityClass(visibilityDesktopOnly, '-desktop-only');
46
+ addViewportSpecificVisibilityClass(visibilityWidescreen, '-widescreen');
47
+ addViewportSpecificVisibilityClass(visibilityWidescreenOnly, '-widescreen-only');
48
+ addViewportSpecificVisibilityClass(visibilityFullhd, '-fullhd');
49
+ // Visibility and Display
50
+ // Handle viewport-specific display properties first (they take precedence)
51
+ const addDisplayClass = (displayValue, viewportSuffix) => {
52
+ if (displayValue) {
53
+ if (displayValue === 'none') {
54
+ addPrefixedClass(`is-hidden${viewportSuffix}`);
55
+ }
56
+ else if (validDisplays.includes(displayValue)) {
57
+ addPrefixedClass(`is-${displayValue}${viewportSuffix}`);
58
+ }
59
+ }
60
+ };
61
+ // Apply viewport-specific display classes
62
+ addDisplayClass(displayMobile, '-mobile');
63
+ addDisplayClass(displayTablet, '-tablet');
64
+ addDisplayClass(displayTabletOnly, '-tablet-only');
65
+ addDisplayClass(displayTouch, '-touch');
66
+ addDisplayClass(displayDesktop, '-desktop');
67
+ addDisplayClass(displayDesktopOnly, '-desktop-only');
68
+ addDisplayClass(displayWidescreen, '-widescreen');
69
+ addDisplayClass(displayWidescreenOnly, '-widescreen-only');
70
+ addDisplayClass(displayFullhd, '-fullhd');
71
+ // Apply legacy display/viewport combination if no viewport-specific display props are set
72
+ const hasViewportSpecificDisplay = !!(displayMobile ||
73
+ displayTablet ||
74
+ displayTabletOnly ||
75
+ displayTouch ||
76
+ displayDesktop ||
77
+ displayDesktopOnly ||
78
+ displayWidescreen ||
79
+ displayWidescreenOnly ||
80
+ displayFullhd);
81
+ if (!hasViewportSpecificDisplay) {
82
+ // Legacy display handling
83
+ if (display === 'none') {
84
+ if (viewport && validViewports.includes(viewport)) {
85
+ addPrefixedClass(`is-hidden-${viewport}`);
86
+ }
87
+ else {
88
+ addPrefixedClass('is-hidden');
89
+ }
90
+ }
91
+ else {
92
+ addClass('is', display, [...validDisplays], true); // display supports viewport
93
+ }
94
+ }
95
+ // Visibility (always applied regardless of display settings)
96
+ if (visibility) {
97
+ if ((visibility === 'hidden' || visibility === 'invisible') &&
98
+ viewport &&
99
+ validViewports.includes(viewport)) {
100
+ addPrefixedClass(`is-${visibility}-${viewport}`);
101
+ }
102
+ else if (validVisibilities.includes(visibility)) {
103
+ addPrefixedClass(`is-${visibility}`);
104
+ }
105
+ }
106
+ return classNames(classes);
107
+ }, [
108
+ classPrefix,
109
+ visibility,
110
+ visibilityMobile,
111
+ visibilityTablet,
112
+ visibilityTabletOnly,
113
+ visibilityTouch,
114
+ visibilityDesktop,
115
+ visibilityDesktopOnly,
116
+ visibilityWidescreen,
117
+ visibilityWidescreenOnly,
118
+ visibilityFullhd,
119
+ display,
120
+ displayMobile,
121
+ displayTablet,
122
+ displayTabletOnly,
123
+ displayTouch,
124
+ displayDesktop,
125
+ displayDesktopOnly,
126
+ displayWidescreen,
127
+ displayWidescreenOnly,
128
+ displayFullhd,
129
+ viewport,
130
+ ]);
131
+ };
132
+
133
+ export { useVisibilityClasses };
134
+ //# sourceMappingURL=useVisibilityClasses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVisibilityClasses.js","sources":["../../../src/helpers/useVisibilityClasses.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { classNames } from './classNames';\nimport { useConfig } from './Config';\nimport {\n createBulmaClassHelpers,\n validDisplays,\n validVisibilities,\n validViewports,\n BulmaViewportProps,\n BulmaDisplayProps,\n} from './bulmaClassHelpers';\n\n/**\n * Props for applying Bulma visibility and display helper classes.\n */\nexport interface BulmaVisibilityProps\n extends BulmaViewportProps, BulmaDisplayProps {\n /** Visibility (e.g., 'hidden', 'sr-only'). */\n visibility?: (typeof validVisibilities)[number];\n /** Visibility for mobile viewport (up to 768px). */\n visibilityMobile?: (typeof validVisibilities)[number];\n /** Visibility for tablet viewport (769px - 1023px). */\n visibilityTablet?: (typeof validVisibilities)[number];\n /** Visibility for tablet-only viewport (769px - 1023px, excludes desktop+). */\n visibilityTabletOnly?: (typeof validVisibilities)[number];\n /** Visibility for touch viewport (up to 1023px; mobile + tablet). */\n visibilityTouch?: (typeof validVisibilities)[number];\n /** Visibility for desktop viewport (1024px - 1215px). */\n visibilityDesktop?: (typeof validVisibilities)[number];\n /** Visibility for desktop-only viewport (1024px - 1215px, excludes widescreen+). */\n visibilityDesktopOnly?: (typeof validVisibilities)[number];\n /** Visibility for widescreen viewport (1216px - 1407px). */\n visibilityWidescreen?: (typeof validVisibilities)[number];\n /** Visibility for widescreen-only viewport (1216px - 1407px, excludes fullhd). */\n visibilityWidescreenOnly?: (typeof validVisibilities)[number];\n /** Visibility for fullhd viewport (1408px and above). */\n visibilityFullhd?: (typeof validVisibilities)[number];\n}\n\n/**\n * A hook that generates Bulma visibility and display helper classes. This hook\n * owns all display class emission, including viewport-specific display props,\n * the legacy display/viewport combination, and `display: 'none'` mapping to\n * `is-hidden`.\n *\n * @function useVisibilityClasses\n * @param props - Visibility- and display-related Bulma helper props.\n * @returns A space-separated string of visibility and display helper classes.\n * @example\n * const visibilityClasses = useVisibilityClasses({\n * display: 'flex',\n * visibilityMobile: 'hidden',\n * });\n * // visibilityClasses: 'is-hidden-mobile is-flex'\n */\nexport const useVisibilityClasses = (props: BulmaVisibilityProps): string => {\n const { classPrefix } = useConfig();\n\n const {\n visibility,\n visibilityMobile,\n visibilityTablet,\n visibilityTabletOnly,\n visibilityTouch,\n visibilityDesktop,\n visibilityDesktopOnly,\n visibilityWidescreen,\n visibilityWidescreenOnly,\n visibilityFullhd,\n display,\n displayMobile,\n displayTablet,\n displayTabletOnly,\n displayTouch,\n displayDesktop,\n displayDesktopOnly,\n displayWidescreen,\n displayWidescreenOnly,\n displayFullhd,\n viewport,\n } = props;\n\n return useMemo(() => {\n const { classes, addPrefixedClass, addClass } = createBulmaClassHelpers(\n classPrefix,\n viewport\n );\n\n // Viewport-specific visibility\n const addViewportSpecificVisibilityClass = (\n value: string | undefined,\n viewportSuffix: string\n ) => {\n if (value === 'hidden') {\n addPrefixedClass(`is-hidden${viewportSuffix}`);\n } else if (value === 'sr-only') {\n addPrefixedClass(`is-sr-only${viewportSuffix}`);\n } else if (value === 'invisible') {\n addPrefixedClass(`is-invisible${viewportSuffix}`);\n }\n };\n\n addViewportSpecificVisibilityClass(visibilityMobile, '-mobile');\n addViewportSpecificVisibilityClass(visibilityTablet, '-tablet');\n addViewportSpecificVisibilityClass(visibilityTabletOnly, '-tablet-only');\n addViewportSpecificVisibilityClass(visibilityTouch, '-touch');\n addViewportSpecificVisibilityClass(visibilityDesktop, '-desktop');\n addViewportSpecificVisibilityClass(visibilityDesktopOnly, '-desktop-only');\n addViewportSpecificVisibilityClass(visibilityWidescreen, '-widescreen');\n addViewportSpecificVisibilityClass(\n visibilityWidescreenOnly,\n '-widescreen-only'\n );\n addViewportSpecificVisibilityClass(visibilityFullhd, '-fullhd');\n\n // Visibility and Display\n // Handle viewport-specific display properties first (they take precedence)\n const addDisplayClass = (\n displayValue: string | undefined,\n viewportSuffix: string\n ) => {\n if (displayValue) {\n if (displayValue === 'none') {\n addPrefixedClass(`is-hidden${viewportSuffix}`);\n } else if (\n (validDisplays as readonly string[]).includes(displayValue)\n ) {\n addPrefixedClass(`is-${displayValue}${viewportSuffix}`);\n }\n }\n };\n\n // Apply viewport-specific display classes\n addDisplayClass(displayMobile, '-mobile');\n addDisplayClass(displayTablet, '-tablet');\n addDisplayClass(displayTabletOnly, '-tablet-only');\n addDisplayClass(displayTouch, '-touch');\n addDisplayClass(displayDesktop, '-desktop');\n addDisplayClass(displayDesktopOnly, '-desktop-only');\n addDisplayClass(displayWidescreen, '-widescreen');\n addDisplayClass(displayWidescreenOnly, '-widescreen-only');\n addDisplayClass(displayFullhd, '-fullhd');\n\n // Apply legacy display/viewport combination if no viewport-specific display props are set\n const hasViewportSpecificDisplay = !!(\n displayMobile ||\n displayTablet ||\n displayTabletOnly ||\n displayTouch ||\n displayDesktop ||\n displayDesktopOnly ||\n displayWidescreen ||\n displayWidescreenOnly ||\n displayFullhd\n );\n\n if (!hasViewportSpecificDisplay) {\n // Legacy display handling\n if (display === 'none') {\n if (viewport && validViewports.includes(viewport)) {\n addPrefixedClass(`is-hidden-${viewport}`);\n } else {\n addPrefixedClass('is-hidden');\n }\n } else {\n addClass('is', display, [...validDisplays], true); // display supports viewport\n }\n }\n\n // Visibility (always applied regardless of display settings)\n if (visibility) {\n if (\n (visibility === 'hidden' || visibility === 'invisible') &&\n viewport &&\n validViewports.includes(viewport)\n ) {\n addPrefixedClass(`is-${visibility}-${viewport}`);\n } else if (validVisibilities.includes(visibility)) {\n addPrefixedClass(`is-${visibility}`);\n }\n }\n\n return classNames(classes);\n }, [\n classPrefix,\n visibility,\n visibilityMobile,\n visibilityTablet,\n visibilityTabletOnly,\n visibilityTouch,\n visibilityDesktop,\n visibilityDesktopOnly,\n visibilityWidescreen,\n visibilityWidescreenOnly,\n visibilityFullhd,\n display,\n displayMobile,\n displayTablet,\n displayTabletOnly,\n displayTouch,\n displayDesktop,\n displayDesktopOnly,\n displayWidescreen,\n displayWidescreenOnly,\n displayFullhd,\n viewport,\n ]);\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /* @allxsmith/bestax-bulma — AI agents: see AGENTS.md in the package root, or https://bestax.io/llms.txt */
2
+ /**
3
+ * Attaches compound sub-components as statics on a base component and
4
+ * optionally sets the parent's displayName.
5
+ *
6
+ * Internal helper — it MUST mutate and return the same function object
7
+ * (`Object.assign`), never wrap the base in a new function: identity checks
8
+ * like `child.type === ModalCard` (Modal) and Field's displayName-based
9
+ * child detection rely on the attached component being the same object as
10
+ * the separately exported one.
11
+ *
12
+ * displayName is only ever set on the parent (and only when provided) —
13
+ * sub-components keep whatever displayName they declare themselves.
14
+ */
15
+ function withSubComponents(base, subs, displayName) {
16
+ const compound = Object.assign(base, subs);
17
+ if (displayName !== undefined) {
18
+ compound.displayName = displayName;
19
+ }
20
+ return compound;
21
+ }
22
+
23
+ export { withSubComponents };
24
+ //# sourceMappingURL=withSubComponents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withSubComponents.js","sources":["../../../src/helpers/withSubComponents.ts"],"sourcesContent":["/**\n * Attaches compound sub-components as statics on a base component and\n * optionally sets the parent's displayName.\n *\n * Internal helper — it MUST mutate and return the same function object\n * (`Object.assign`), never wrap the base in a new function: identity checks\n * like `child.type === ModalCard` (Modal) and Field's displayName-based\n * child detection rely on the attached component being the same object as\n * the separately exported one.\n *\n * displayName is only ever set on the parent (and only when provided) —\n * sub-components keep whatever displayName they declare themselves.\n */\nexport function withSubComponents<\n Base extends { displayName?: string },\n Subs extends Record<string, unknown>,\n>(base: Base, subs: Subs, displayName?: string): Base & Subs {\n const compound = Object.assign(base, subs) as Base & Subs;\n if (displayName !== undefined) {\n compound.displayName = displayName;\n }\n return compound;\n}\n"],"names":[],"mappings":";AAAA;;;;;;;;;;;;AAYG;SACa,iBAAiB,CAG/B,IAAU,EAAE,IAAU,EAAE,WAAoB,EAAA;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAgB;AACzD,IAAA,IAAI,WAAW,KAAK,SAAS,EAAE;AAC7B,QAAA,QAAQ,CAAC,WAAW,GAAG,WAAW;IACpC;AACA,IAAA,OAAO,QAAQ;AACjB;;"}
@@ -0,0 +1,48 @@
1
+ /* @allxsmith/bestax-bulma — AI agents: see AGENTS.md in the package root, or https://bestax.io/llms.txt */
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import { usePrefixedClassNames, classNames } from '../helpers/classNames.js';
4
+ import { useBulmaClasses } from '../helpers/useBulmaClasses.js';
5
+ import { mergeBulmaStyles } from '../helpers/mergeBulmaStyles.js';
6
+
7
+ /**
8
+ * The `Container` component provides a responsive and flexible layout wrapper for your Bulma React UI.
9
+ *
10
+ * @function
11
+ * @param {ContainerProps} props - Props for the Container component.
12
+ * @returns {JSX.Element} The rendered container.
13
+ * @see {@link https://bulma.io/documentation/layout/container/ | Bulma Container documentation}
14
+ */
15
+ const Container = ({ className, textColor, color, bgColor, fluid, widescreen, fullhd, breakpoint, isMax, children, style, ...props }) => {
16
+ const { bulmaHelperClasses, bulmaHelperStyles, rest } = useBulmaClasses({
17
+ color: textColor ?? color,
18
+ backgroundColor: bgColor,
19
+ ...props,
20
+ });
21
+ // Only allow isMax for supported breakpoints
22
+ const validMaxBreakpoints = [
23
+ 'tablet',
24
+ 'desktop',
25
+ 'widescreen',
26
+ ];
27
+ let breakpointClass;
28
+ if (breakpoint) {
29
+ if (isMax && validMaxBreakpoints.includes(breakpoint)) {
30
+ breakpointClass = `is-max-${breakpoint}`;
31
+ }
32
+ else if (!isMax) {
33
+ breakpointClass = `is-${breakpoint}`;
34
+ }
35
+ }
36
+ const mainClass = usePrefixedClassNames('container');
37
+ const containerModifiers = usePrefixedClassNames('', {
38
+ 'is-fluid': fluid,
39
+ 'is-widescreen': widescreen,
40
+ 'is-fullhd': fullhd,
41
+ });
42
+ const prefixedBreakpointClass = usePrefixedClassNames(breakpointClass || '');
43
+ const containerClasses = classNames(mainClass, containerModifiers, prefixedBreakpointClass, className, bulmaHelperClasses);
44
+ return (jsx("div", { className: containerClasses, style: mergeBulmaStyles(bulmaHelperStyles, style), ...rest, children: children }));
45
+ };
46
+
47
+ export { Container };
48
+ //# sourceMappingURL=Container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Container.js","sources":["../../../src/layout/Container.tsx"],"sourcesContent":["import React from 'react';\nimport classNames, { usePrefixedClassNames } from '../helpers/classNames';\nimport {\n useBulmaClasses,\n BulmaClassesProps,\n validColors,\n validSchemeColors,\n} from '../helpers/useBulmaClasses';\nimport { mergeBulmaStyles } from '../helpers/mergeBulmaStyles';\n\n/**\n * Bulma container breakpoints.\n */\nexport type ContainerBreakpoint = 'tablet' | 'desktop' | 'widescreen';\n\n/**\n * Props for the Container component.\n */\nexport interface ContainerProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Additional CSS classes. */\n className?: string;\n /** Text color helper. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /**\n * Text color alias: renders `has-text-<color>`, exactly like `textColor`.\n * Not a filled variant (no `.container.is-<color>` CSS exists). Prefer\n * `textColor`, which takes precedence when both are set; use `bgColor` for\n * a colored surface.\n */\n color?: 'primary' | 'link' | 'info' | 'success' | 'warning' | 'danger';\n /**\n * Background color helper. `scheme-*` values render as a dark-mode-safe\n * inline `background-color: var(--bulma-scheme-*)` instead of a class. The\n * `scheme-invert*` values do not change text color — pair them with a\n * contrasting foreground.\n */\n bgColor?:\n | (typeof validColors)[number]\n | (typeof validSchemeColors)[number]\n | 'inherit'\n | 'current';\n /** Makes the container full-width with a 32px gap on each side. */\n fluid?: boolean;\n /** Makes the container full-width until the `widescreen` breakpoint. */\n widescreen?: boolean;\n /** Makes the container full-width until the `fullhd` breakpoint. */\n fullhd?: boolean;\n /** Responsive breakpoint for container (`is-tablet`, `is-desktop`, `is-widescreen`). */\n breakpoint?: ContainerBreakpoint;\n /** Uses Bulma's `is-max-*` class for the specified breakpoint, limiting max width. */\n isMax?: boolean;\n /** Content inside the container. */\n children?: React.ReactNode;\n}\n\n/**\n * The `Container` component provides a responsive and flexible layout wrapper for your Bulma React UI.\n *\n * @function\n * @param {ContainerProps} props - Props for the Container component.\n * @returns {JSX.Element} The rendered container.\n * @see {@link https://bulma.io/documentation/layout/container/ | Bulma Container documentation}\n */\nexport const Container: React.FC<ContainerProps> = ({\n className,\n textColor,\n color,\n bgColor,\n fluid,\n widescreen,\n fullhd,\n breakpoint,\n isMax,\n children,\n style,\n ...props\n}) => {\n const { bulmaHelperClasses, bulmaHelperStyles, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n\n // Only allow isMax for supported breakpoints\n const validMaxBreakpoints: ContainerBreakpoint[] = [\n 'tablet',\n 'desktop',\n 'widescreen',\n ];\n let breakpointClass: string | undefined;\n if (breakpoint) {\n if (isMax && validMaxBreakpoints.includes(breakpoint)) {\n breakpointClass = `is-max-${breakpoint}`;\n } else if (!isMax) {\n breakpointClass = `is-${breakpoint}`;\n }\n }\n\n const mainClass = usePrefixedClassNames('container');\n const containerModifiers = usePrefixedClassNames('', {\n 'is-fluid': fluid,\n 'is-widescreen': widescreen,\n 'is-fullhd': fullhd,\n });\n const prefixedBreakpointClass = usePrefixedClassNames(breakpointClass || '');\n\n const containerClasses = classNames(\n mainClass,\n containerModifiers,\n prefixedBreakpointClass,\n className,\n bulmaHelperClasses\n );\n\n return (\n <div\n className={containerClasses}\n style={mergeBulmaStyles(bulmaHelperStyles, style)}\n {...rest}\n >\n {children}\n </div>\n );\n};\n\nexport default Container;\n"],"names":["_jsx"],"mappings":";;;;;;AA0DA;;;;;;;AAOG;AACI,MAAM,SAAS,GAA6B,CAAC,EAClD,SAAS,EACT,SAAS,EACT,KAAK,EACL,OAAO,EACP,KAAK,EACL,UAAU,EACV,MAAM,EACN,UAAU,EACV,KAAK,EACL,QAAQ,EACR,KAAK,EACL,GAAG,KAAK,EACT,KAAI;IACH,MAAM,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC;QACtE,KAAK,EAAE,SAAS,IAAI,KAAK;AACzB,QAAA,eAAe,EAAE,OAAO;AACxB,QAAA,GAAG,KAAK;AACT,KAAA,CAAC;;AAGF,IAAA,MAAM,mBAAmB,GAA0B;QACjD,QAAQ;QACR,SAAS;QACT,YAAY;KACb;AACD,IAAA,IAAI,eAAmC;IACvC,IAAI,UAAU,EAAE;QACd,IAAI,KAAK,IAAI,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AACrD,YAAA,eAAe,GAAG,CAAA,OAAA,EAAU,UAAU,CAAA,CAAE;QAC1C;aAAO,IAAI,CAAC,KAAK,EAAE;AACjB,YAAA,eAAe,GAAG,CAAA,GAAA,EAAM,UAAU,CAAA,CAAE;QACtC;IACF;AAEA,IAAA,MAAM,SAAS,GAAG,qBAAqB,CAAC,WAAW,CAAC;AACpD,IAAA,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,EAAE,EAAE;AACnD,QAAA,UAAU,EAAE,KAAK;AACjB,QAAA,eAAe,EAAE,UAAU;AAC3B,QAAA,WAAW,EAAE,MAAM;AACpB,KAAA,CAAC;IACF,MAAM,uBAAuB,GAAG,qBAAqB,CAAC,eAAe,IAAI,EAAE,CAAC;AAE5E,IAAA,MAAM,gBAAgB,GAAG,UAAU,CACjC,SAAS,EACT,kBAAkB,EAClB,uBAAuB,EACvB,SAAS,EACT,kBAAkB,CACnB;IAED,QACEA,aACE,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,gBAAgB,CAAC,iBAAiB,EAAE,KAAK,CAAC,EAAA,GAC7C,IAAI,YAEP,QAAQ,EAAA,CACL;AAEV;;"}