@allxsmith/bestax-bulma 5.56.0 → 5.57.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/esm/columns/Column.js +1 -0
- package/dist/esm/columns/Column.js.map +1 -1
- package/dist/esm/columns/Columns.js +1 -0
- package/dist/esm/columns/Columns.js.map +1 -1
- package/dist/esm/components/Avatar.js +1 -0
- package/dist/esm/components/Avatar.js.map +1 -1
- package/dist/esm/components/Avatars.js +1 -0
- package/dist/esm/components/Avatars.js.map +1 -1
- package/dist/esm/components/Badge.js +1 -0
- package/dist/esm/components/Badge.js.map +1 -1
- package/dist/esm/components/Breadcrumb.js +1 -0
- package/dist/esm/components/Breadcrumb.js.map +1 -1
- package/dist/esm/components/Card.js +1 -0
- package/dist/esm/components/Card.js.map +1 -1
- package/dist/esm/components/Carousel.js +1 -0
- package/dist/esm/components/Carousel.js.map +1 -1
- package/dist/esm/components/Collapse.js +1 -0
- package/dist/esm/components/Collapse.js.map +1 -1
- package/dist/esm/components/Collapses.js +1 -0
- package/dist/esm/components/Collapses.js.map +1 -1
- package/dist/esm/components/Command.js +1 -0
- package/dist/esm/components/Command.js.map +1 -1
- package/dist/esm/components/ContextMenu.js +1 -0
- package/dist/esm/components/ContextMenu.js.map +1 -1
- package/dist/esm/components/DataTable.js +1 -0
- package/dist/esm/components/DataTable.js.map +1 -1
- package/dist/esm/components/Dialog.js +1 -0
- package/dist/esm/components/Dialog.js.map +1 -1
- package/dist/esm/components/Dropdown.js +5 -1
- package/dist/esm/components/Dropdown.js.map +1 -1
- package/dist/esm/components/EmptyState.js +1 -0
- package/dist/esm/components/EmptyState.js.map +1 -1
- package/dist/esm/components/HoverCard.js +1 -0
- package/dist/esm/components/HoverCard.js.map +1 -1
- package/dist/esm/components/Loading.js +1 -0
- package/dist/esm/components/Loading.js.map +1 -1
- package/dist/esm/components/Menu.js +1 -0
- package/dist/esm/components/Menu.js.map +1 -1
- package/dist/esm/components/Message.js +1 -0
- package/dist/esm/components/Message.js.map +1 -1
- package/dist/esm/components/Modal.js +1 -0
- package/dist/esm/components/Modal.js.map +1 -1
- package/dist/esm/components/Navbar.js +1 -0
- package/dist/esm/components/Navbar.js.map +1 -1
- package/dist/esm/components/Pagination.js +1 -0
- package/dist/esm/components/Pagination.js.map +1 -1
- package/dist/esm/components/Panel.js +1 -0
- package/dist/esm/components/Panel.js.map +1 -1
- package/dist/esm/components/Popover.js +1 -0
- package/dist/esm/components/Popover.js.map +1 -1
- package/dist/esm/components/Reveal.js +1 -0
- package/dist/esm/components/Reveal.js.map +1 -1
- package/dist/esm/components/ScrollArea.js +1 -0
- package/dist/esm/components/ScrollArea.js.map +1 -1
- package/dist/esm/components/SegmentedControl.js +1 -0
- package/dist/esm/components/SegmentedControl.js.map +1 -1
- package/dist/esm/components/Sidebar.js +1 -0
- package/dist/esm/components/Sidebar.js.map +1 -1
- package/dist/esm/components/Steps.js +1 -0
- package/dist/esm/components/Steps.js.map +1 -1
- package/dist/esm/components/Tabs.js +1 -0
- package/dist/esm/components/Tabs.js.map +1 -1
- package/dist/esm/components/Timeline.js +1 -0
- package/dist/esm/components/Timeline.js.map +1 -1
- package/dist/esm/components/Toast.js +1 -0
- package/dist/esm/components/Toast.js.map +1 -1
- package/dist/esm/components/Tooltip.js +1 -0
- package/dist/esm/components/Tooltip.js.map +1 -1
- package/dist/esm/components/TreeView.js +1 -0
- package/dist/esm/components/TreeView.js.map +1 -1
- package/dist/esm/components/collapsesContext.js +1 -0
- package/dist/esm/components/collapsesContext.js.map +1 -1
- package/dist/esm/components/useDataTable.js +1 -0
- package/dist/esm/components/useDataTable.js.map +1 -1
- package/dist/esm/elements/Block.js +1 -0
- package/dist/esm/elements/Block.js.map +1 -1
- package/dist/esm/elements/Box.js +1 -0
- package/dist/esm/elements/Box.js.map +1 -1
- package/dist/esm/elements/Button.js +1 -0
- package/dist/esm/elements/Button.js.map +1 -1
- package/dist/esm/elements/Buttons.js +1 -0
- package/dist/esm/elements/Buttons.js.map +1 -1
- package/dist/esm/elements/Code.js +1 -0
- package/dist/esm/elements/Code.js.map +1 -1
- package/dist/esm/elements/ColorSwatch.js +1 -0
- package/dist/esm/elements/ColorSwatch.js.map +1 -1
- package/dist/esm/elements/Content.js +1 -0
- package/dist/esm/elements/Content.js.map +1 -1
- package/dist/esm/elements/Delete.js +1 -0
- package/dist/esm/elements/Delete.js.map +1 -1
- package/dist/esm/elements/DescriptionList.js +1 -0
- package/dist/esm/elements/DescriptionList.js.map +1 -1
- package/dist/esm/elements/Divider.js +1 -0
- package/dist/esm/elements/Divider.js.map +1 -1
- package/dist/esm/elements/Emphasis.js +1 -0
- package/dist/esm/elements/Emphasis.js.map +1 -1
- package/dist/esm/elements/Figure.js +1 -0
- package/dist/esm/elements/Figure.js.map +1 -1
- package/dist/esm/elements/Icon.js +1 -0
- package/dist/esm/elements/Icon.js.map +1 -1
- package/dist/esm/elements/IconText.js +1 -0
- package/dist/esm/elements/IconText.js.map +1 -1
- package/dist/esm/elements/Image.js +1 -0
- package/dist/esm/elements/Image.js.map +1 -1
- package/dist/esm/elements/Kbd.js +1 -0
- package/dist/esm/elements/Kbd.js.map +1 -1
- package/dist/esm/elements/Link.js +1 -0
- package/dist/esm/elements/Link.js.map +1 -1
- package/dist/esm/elements/LinkButton.js +1 -0
- package/dist/esm/elements/LinkButton.js.map +1 -1
- package/dist/esm/elements/ListItem.js +1 -0
- package/dist/esm/elements/ListItem.js.map +1 -1
- package/dist/esm/elements/Loader.js +1 -0
- package/dist/esm/elements/Loader.js.map +1 -1
- package/dist/esm/elements/Notification.js +1 -0
- package/dist/esm/elements/Notification.js.map +1 -1
- package/dist/esm/elements/OrderedList.js +1 -0
- package/dist/esm/elements/OrderedList.js.map +1 -1
- package/dist/esm/elements/Paragraph.js +1 -0
- package/dist/esm/elements/Paragraph.js.map +1 -1
- package/dist/esm/elements/Pre.js +1 -0
- package/dist/esm/elements/Pre.js.map +1 -1
- package/dist/esm/elements/Progress.js +1 -0
- package/dist/esm/elements/Progress.js.map +1 -1
- package/dist/esm/elements/RingProgress.js +1 -0
- package/dist/esm/elements/RingProgress.js.map +1 -1
- package/dist/esm/elements/Skeleton.js +1 -0
- package/dist/esm/elements/Skeleton.js.map +1 -1
- package/dist/esm/elements/Span.js +1 -0
- package/dist/esm/elements/Span.js.map +1 -1
- package/dist/esm/elements/Strong.js +1 -0
- package/dist/esm/elements/Strong.js.map +1 -1
- package/dist/esm/elements/SubTitle.js +1 -0
- package/dist/esm/elements/SubTitle.js.map +1 -1
- package/dist/esm/elements/Table.js +1 -0
- package/dist/esm/elements/Table.js.map +1 -1
- package/dist/esm/elements/Tag.js +1 -0
- package/dist/esm/elements/Tag.js.map +1 -1
- package/dist/esm/elements/Tags.js +1 -0
- package/dist/esm/elements/Tags.js.map +1 -1
- package/dist/esm/elements/Tbody.js +1 -0
- package/dist/esm/elements/Tbody.js.map +1 -1
- package/dist/esm/elements/Td.js +1 -0
- package/dist/esm/elements/Td.js.map +1 -1
- package/dist/esm/elements/Tfoot.js +1 -0
- package/dist/esm/elements/Tfoot.js.map +1 -1
- package/dist/esm/elements/Th.js +1 -0
- package/dist/esm/elements/Th.js.map +1 -1
- package/dist/esm/elements/Thead.js +1 -0
- package/dist/esm/elements/Thead.js.map +1 -1
- package/dist/esm/elements/Title.js +1 -0
- package/dist/esm/elements/Title.js.map +1 -1
- package/dist/esm/elements/ToggleButton.js +1 -0
- package/dist/esm/elements/ToggleButton.js.map +1 -1
- package/dist/esm/elements/Tr.js +1 -0
- package/dist/esm/elements/Tr.js.map +1 -1
- package/dist/esm/elements/UnorderedList.js +1 -0
- package/dist/esm/elements/UnorderedList.js.map +1 -1
- package/dist/esm/elements/iconProps.js +1 -0
- package/dist/esm/elements/iconProps.js.map +1 -1
- package/dist/esm/form/Autocomplete.js +1 -0
- package/dist/esm/form/Autocomplete.js.map +1 -1
- package/dist/esm/form/Checkbox.js +1 -0
- package/dist/esm/form/Checkbox.js.map +1 -1
- package/dist/esm/form/CheckboxCard.js +1 -0
- package/dist/esm/form/CheckboxCard.js.map +1 -1
- package/dist/esm/form/Checkboxes.js +1 -0
- package/dist/esm/form/Checkboxes.js.map +1 -1
- package/dist/esm/form/ColorInput.js +1 -0
- package/dist/esm/form/ColorInput.js.map +1 -1
- package/dist/esm/form/ColorInputBase.js +1 -0
- package/dist/esm/form/ColorInputBase.js.map +1 -1
- package/dist/esm/form/ColorPicker.js +1 -0
- package/dist/esm/form/ColorPicker.js.map +1 -1
- package/dist/esm/form/Combobox.js +1 -0
- package/dist/esm/form/Combobox.js.map +1 -1
- package/dist/esm/form/Control.js +1 -0
- package/dist/esm/form/Control.js.map +1 -1
- package/dist/esm/form/DateInput.js +1 -0
- package/dist/esm/form/DateInput.js.map +1 -1
- package/dist/esm/form/DateInputBase.js +1 -0
- package/dist/esm/form/DateInputBase.js.map +1 -1
- package/dist/esm/form/DateRangeInput.js +1 -0
- package/dist/esm/form/DateRangeInput.js.map +1 -1
- package/dist/esm/form/DateRangeInputBase.js +1 -0
- package/dist/esm/form/DateRangeInputBase.js.map +1 -1
- package/dist/esm/form/DateTimeInput.js +1 -0
- package/dist/esm/form/DateTimeInput.js.map +1 -1
- package/dist/esm/form/DateTimeInputBase.js +1 -0
- package/dist/esm/form/DateTimeInputBase.js.map +1 -1
- package/dist/esm/form/Dropzone.js +1 -0
- package/dist/esm/form/Dropzone.js.map +1 -1
- package/dist/esm/form/Field.js +1 -0
- package/dist/esm/form/Field.js.map +1 -1
- package/dist/esm/form/Fieldset.js +1 -0
- package/dist/esm/form/Fieldset.js.map +1 -1
- package/dist/esm/form/File.js +1 -0
- package/dist/esm/form/File.js.map +1 -1
- package/dist/esm/form/FormContext.js +1 -0
- package/dist/esm/form/FormContext.js.map +1 -1
- package/dist/esm/form/Input.js +1 -0
- package/dist/esm/form/Input.js.map +1 -1
- package/dist/esm/form/InputBase.js +1 -0
- package/dist/esm/form/InputBase.js.map +1 -1
- package/dist/esm/form/Numberinput.js +1 -0
- package/dist/esm/form/Numberinput.js.map +1 -1
- package/dist/esm/form/PinInput.js +1 -0
- package/dist/esm/form/PinInput.js.map +1 -1
- package/dist/esm/form/Radio.js +1 -0
- package/dist/esm/form/Radio.js.map +1 -1
- package/dist/esm/form/RadioCard.js +1 -0
- package/dist/esm/form/RadioCard.js.map +1 -1
- package/dist/esm/form/Radios.js +1 -0
- package/dist/esm/form/Radios.js.map +1 -1
- package/dist/esm/form/Rate.js +1 -0
- package/dist/esm/form/Rate.js.map +1 -1
- package/dist/esm/form/Select.js +1 -0
- package/dist/esm/form/Select.js.map +1 -1
- package/dist/esm/form/SelectBase.js +1 -0
- package/dist/esm/form/SelectBase.js.map +1 -1
- package/dist/esm/form/Slider.js +1 -0
- package/dist/esm/form/Slider.js.map +1 -1
- package/dist/esm/form/Switch.js +1 -0
- package/dist/esm/form/Switch.js.map +1 -1
- package/dist/esm/form/Taginput.js +1 -0
- package/dist/esm/form/Taginput.js.map +1 -1
- package/dist/esm/form/TextArea.js +1 -0
- package/dist/esm/form/TextArea.js.map +1 -1
- package/dist/esm/form/TextAreaBase.js +1 -0
- package/dist/esm/form/TextAreaBase.js.map +1 -1
- package/dist/esm/form/TimeInput.js +1 -0
- package/dist/esm/form/TimeInput.js.map +1 -1
- package/dist/esm/form/TimeInputBase.js +1 -0
- package/dist/esm/form/TimeInputBase.js.map +1 -1
- package/dist/esm/form/_colorInternals/EyeDropperButton.js +1 -0
- package/dist/esm/form/_colorInternals/EyeDropperButton.js.map +1 -1
- package/dist/esm/form/_colorInternals/pickerState.js +1 -0
- package/dist/esm/form/_colorInternals/pickerState.js.map +1 -1
- package/dist/esm/form/_pickerInternals/Calendar.js +1 -0
- package/dist/esm/form/_pickerInternals/Calendar.js.map +1 -1
- package/dist/esm/form/_pickerInternals/PickerPopover.js +1 -0
- package/dist/esm/form/_pickerInternals/PickerPopover.js.map +1 -1
- package/dist/esm/form/_pickerInternals/TimeWheels.js +1 -0
- package/dist/esm/form/_pickerInternals/TimeWheels.js.map +1 -1
- package/dist/esm/form/_pickerInternals/useLocaleDefaults.js +1 -0
- package/dist/esm/form/_pickerInternals/useLocaleDefaults.js.map +1 -1
- package/dist/esm/form/_pickerInternals/useNativeMobilePicker.js +1 -0
- package/dist/esm/form/_pickerInternals/useNativeMobilePicker.js.map +1 -1
- package/dist/esm/form/_pickerInternals/useSegmentedEntry.js +1 -0
- package/dist/esm/form/_pickerInternals/useSegmentedEntry.js.map +1 -1
- package/dist/esm/form/controlLoading.js +1 -0
- package/dist/esm/form/controlLoading.js.map +1 -1
- package/dist/esm/form/groupFieldset.js +1 -0
- package/dist/esm/form/groupFieldset.js.map +1 -1
- package/dist/esm/form/useAutoLabelId.js +1 -0
- package/dist/esm/form/useAutoLabelId.js.map +1 -1
- package/dist/esm/grid/Cell.js +1 -0
- package/dist/esm/grid/Cell.js.map +1 -1
- package/dist/esm/grid/Grid.js +1 -0
- package/dist/esm/grid/Grid.js.map +1 -1
- package/dist/esm/helpers/ClientOnly.js +1 -0
- package/dist/esm/helpers/ClientOnly.js.map +1 -1
- package/dist/esm/helpers/Config.js +1 -0
- package/dist/esm/helpers/Config.js.map +1 -1
- package/dist/esm/helpers/LocaleProvider.js +1 -0
- package/dist/esm/helpers/LocaleProvider.js.map +1 -1
- package/dist/esm/helpers/Theme.js +1 -0
- package/dist/esm/helpers/Theme.js.map +1 -1
- package/dist/esm/helpers/flattenChildren.js +1 -0
- package/dist/esm/helpers/flattenChildren.js.map +1 -1
- package/dist/esm/helpers/inertProps.js +1 -0
- package/dist/esm/helpers/inertProps.js.map +1 -1
- package/dist/esm/helpers/localeFormat.js +1 -0
- package/dist/esm/helpers/localeFormat.js.map +1 -1
- package/dist/esm/helpers/overlayStack.js +1 -0
- package/dist/esm/helpers/overlayStack.js.map +1 -1
- package/dist/esm/helpers/portal.js +1 -0
- package/dist/esm/helpers/portal.js.map +1 -1
- package/dist/esm/helpers/scrollLock.js +1 -0
- package/dist/esm/helpers/scrollLock.js.map +1 -1
- package/dist/esm/helpers/statusRegion.js +1 -0
- package/dist/esm/helpers/statusRegion.js.map +1 -1
- package/dist/esm/helpers/typeahead.js +1 -0
- package/dist/esm/helpers/typeahead.js.map +1 -1
- package/dist/esm/helpers/useAnchoredPosition.js +1 -0
- package/dist/esm/helpers/useAnchoredPosition.js.map +1 -1
- package/dist/esm/helpers/useBulmaClasses.js +1 -0
- package/dist/esm/helpers/useBulmaClasses.js.map +1 -1
- package/dist/esm/helpers/useClientLayoutEffect.js +1 -0
- package/dist/esm/helpers/useClientLayoutEffect.js.map +1 -1
- package/dist/esm/helpers/useColorClasses.js +1 -0
- package/dist/esm/helpers/useColorClasses.js.map +1 -1
- package/dist/esm/helpers/useComboboxEngine.js +1 -0
- package/dist/esm/helpers/useComboboxEngine.js.map +1 -1
- package/dist/esm/helpers/useContextMenuTrigger.js +1 -0
- package/dist/esm/helpers/useContextMenuTrigger.js.map +1 -1
- package/dist/esm/helpers/useFlexboxClasses.js +1 -0
- package/dist/esm/helpers/useFlexboxClasses.js.map +1 -1
- package/dist/esm/helpers/useFocusTrap.js +1 -0
- package/dist/esm/helpers/useFocusTrap.js.map +1 -1
- package/dist/esm/helpers/useHoverOpen.js +1 -0
- package/dist/esm/helpers/useHoverOpen.js.map +1 -1
- package/dist/esm/helpers/useInertSiblings.js +1 -0
- package/dist/esm/helpers/useInertSiblings.js.map +1 -1
- package/dist/esm/helpers/useIsHydrated.js +1 -0
- package/dist/esm/helpers/useIsHydrated.js.map +1 -1
- package/dist/esm/helpers/useLatestRef.js +1 -0
- package/dist/esm/helpers/useLatestRef.js.map +1 -1
- package/dist/esm/helpers/useMenuKeys.js +1 -0
- package/dist/esm/helpers/useMenuKeys.js.map +1 -1
- package/dist/esm/helpers/useOtherClasses.js +1 -0
- package/dist/esm/helpers/useOtherClasses.js.map +1 -1
- package/dist/esm/helpers/useSpacingClasses.js +1 -0
- package/dist/esm/helpers/useSpacingClasses.js.map +1 -1
- package/dist/esm/helpers/useTreeView.js +1 -0
- package/dist/esm/helpers/useTreeView.js.map +1 -1
- package/dist/esm/helpers/useTypographyClasses.js +1 -0
- package/dist/esm/helpers/useTypographyClasses.js.map +1 -1
- package/dist/esm/helpers/useVisibilityClasses.js +1 -0
- package/dist/esm/helpers/useVisibilityClasses.js.map +1 -1
- package/dist/esm/layout/Container.js +1 -0
- package/dist/esm/layout/Container.js.map +1 -1
- package/dist/esm/layout/Footer.js +1 -0
- package/dist/esm/layout/Footer.js.map +1 -1
- package/dist/esm/layout/Hero.js +1 -0
- package/dist/esm/layout/Hero.js.map +1 -1
- package/dist/esm/layout/Level.js +1 -0
- package/dist/esm/layout/Level.js.map +1 -1
- package/dist/esm/layout/Media.js +1 -0
- package/dist/esm/layout/Media.js.map +1 -1
- package/dist/esm/layout/Section.js +1 -0
- package/dist/esm/layout/Section.js.map +1 -1
- package/dist/esm/layout/Splitter.js +1 -0
- package/dist/esm/layout/Splitter.js.map +1 -1
- package/dist/index.cjs +4 -1
- package/dist/index.cjs.map +1 -1
- package/package.json +28 -27
|
@@ -1 +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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"}
|
|
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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"}
|
|
@@ -1 +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":"
|
|
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;;"}
|
|
@@ -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 { useRef, useReducer, useState, useEffect, useCallback } from 'react';
|
|
3
4
|
import { useClientLayoutEffect } from './useClientLayoutEffect.js';
|
|
4
5
|
import { getActiveElementInTree } from './shadowDom.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTreeView.js","sources":["../../../src/helpers/useTreeView.ts"],"sourcesContent":["// INTERNAL: deliberately not exported from src/index.ts.\nimport { useCallback, useEffect, useReducer, useRef, useState } from 'react';\nimport type React from 'react';\nimport type { TreeViewSelectionMode } from '../components/TreeView';\nimport { useClientLayoutEffect } from './useClientLayoutEffect';\nimport { getActiveElementInTree } from './shadowDom';\nimport { typeaheadMatch, typeaheadText, useTypeahead } from './typeahead';\n\n/** What an item tells the tree about itself when it registers. */\nexport interface TreeViewItemRecord {\n /** The value of the item it's in, or `null` at the top. */\n parent: string | null;\n disabled: boolean;\n /** It has children, or `hasChildren` says it will. */\n isParent: boolean;\n}\n\n/** An item as a key or a click on it sees it. */\nexport interface TreeViewItemInfo extends TreeViewItemRecord {\n value: string;\n open: boolean;\n /**\n * A failed load's row: what Enter, Space and a click on it do, in place of\n * what the mode says.\n */\n retry?: () => void;\n}\n\n/** A box's state: checked, unchecked or mixed. */\nexport type TreeViewCheckState = boolean | 'mixed';\n\n/**\n * Where an item sits among the items beside it, for its `aria-posinset` and\n * `aria-setsize`: its number, from 1, and how many there are.\n */\nexport interface TreeViewPosition {\n posinset: number;\n setsize: number;\n}\n\n/**\n * What an item shows of the selection: `selected` in a `single` tree,\n * `checked` in a `checkbox` tree, and neither with `none`.\n */\nexport interface TreeViewItemState {\n selected?: boolean;\n checked?: TreeViewCheckState;\n}\n\ntype Action = 'open' | 'select' | 'check';\n\n/**\n * What Enter, Space and a click on the row do in each mode, from the tables\n * in #1096. `open` opens or closes a parent and does nothing on a leaf. A\n * click on the chevron only ever opens or closes.\n */\nconst MODES: Record<\n TreeViewSelectionMode,\n { enter: Action[]; space: Action[]; click: Action[] }\n> = {\n none: { enter: ['open'], space: ['open'], click: ['open'] },\n single: { enter: ['select'], space: ['select'], click: ['select', 'open'] },\n checkbox: { enter: ['open'], space: ['check'], click: ['check'] },\n};\n\n/** Left and Right, swapped for a right-to-left page. */\nconst MIRRORED: Record<string, string> = {\n ArrowLeft: 'ArrowRight',\n ArrowRight: 'ArrowLeft',\n};\n\n/** An IME is composing, so the key belongs to it (`keyCode` 229 is Safari's word for it). */\nconst isComposing = (event: React.KeyboardEvent): boolean =>\n event.nativeEvent.isComposing || event.nativeEvent.keyCode === 229;\n\n/**\n * The items a tree knows, and their elements while they're on the page. A\n * loading item's row, or a failed load's, hands over its element under a key\n * of its own and has no record, so the keys reach it and nothing else counts it.\n */\ninterface Registry {\n records: Map<string, TreeViewItemRecord>;\n // By value, for an item whose ref lets go, which hands over no element.\n elements: Map<string, HTMLLIElement>;\n // Weak, so an element that leaves the page needn't be forgotten by hand.\n values: WeakMap<Element, string>;\n}\n\n/** The registry's items on the page, in document order. */\nconst shownIn = (tree: Element, { values }: Registry): HTMLElement[] =>\n Array.from(tree.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')).filter(\n element => values.has(element)\n );\n\n/** The item an item on the page sits in: its group's `<li>`, or none at the top. */\nfunction parentItemOf(element: Element): HTMLElement | null {\n const group = element.parentElement!;\n return group.getAttribute('role') === 'group' ? group.parentElement : null;\n}\n\n/** No positions: on the server, and until the tree has mounted. */\nconst NO_POSITIONS = new Map<string, TreeViewPosition>();\n\n/**\n * Each item's place among the items beside it, by its key, read off the\n * items on the page: the ones in the same group, or at the top. A loading or\n * failed load's row counts, as it does for a browser that works positions\n * out for itself, so the declared ones say what a browser would.\n */\nfunction positionsOf(\n shown: HTMLElement[],\n { values }: Registry\n): Map<string, TreeViewPosition> {\n const sets = new Map<Element | null, HTMLElement[]>();\n shown.forEach(element => {\n const set = sets.get(element.parentElement);\n if (set) set.push(element);\n else sets.set(element.parentElement, [element]);\n });\n const positions = new Map<string, TreeViewPosition>();\n sets.forEach(set =>\n set.forEach((element, at) =>\n positions.set(values.get(element)!, {\n posinset: at + 1,\n setsize: set.length,\n })\n )\n );\n return positions;\n}\n\n/** Whether two sets of positions say the same for every item. */\nfunction samePositions(\n a: Map<string, TreeViewPosition>,\n b: Map<string, TreeViewPosition>\n): boolean {\n return (\n a.size === b.size &&\n Array.from(a).every(([key, { posinset, setsize }]) => {\n const other = b.get(key);\n return other?.posinset === posinset && other.setsize === setsize;\n })\n );\n}\n\n/** The values of the items an item on the page is in, from the top. */\nfunction pathOf(element: Element, { values }: Registry): string[] {\n const path: string[] = [];\n for (let at = parentItemOf(element); at; at = parentItemOf(at)) {\n path.unshift(values.get(at)!);\n }\n return path;\n}\n\n/**\n * Every known item's check state, by the rules in #1096:\n *\n * - a disabled item is checked only when its own value is listed;\n * - an enabled item with no enabled items anywhere under it is checked when\n * it, or any item above it, is listed;\n * - any other enabled item follows the items of that second kind in its\n * branch: checked when they all are, unchecked when none is, mixed between.\n *\n * Also returns the items of the second kind, which are what a toggle sets.\n */\nfunction readChecks(\n records: Map<string, TreeViewItemRecord>,\n listed: Set<string>\n): { states: Map<string, TreeViewCheckState>; ends: string[] } {\n const kids = new Map<string | null, string[]>();\n records.forEach(({ parent }, value) => {\n kids.set(parent, [...(kids.get(parent) ?? []), value]);\n });\n const states = new Map<string, TreeViewCheckState>();\n const ends: string[] = [];\n // How many enabled ends the branch holds, and how many are checked.\n const visit = (value: string, above: boolean): [number, number] => {\n const marked = above || listed.has(value);\n let total = 0;\n let on = 0;\n for (const kid of kids.get(value) ?? []) {\n const [t, o] = visit(kid, marked);\n total += t;\n on += o;\n }\n if (records.get(value)!.disabled) {\n states.set(value, listed.has(value));\n return [total, on];\n }\n if (total === 0) {\n states.set(value, marked);\n ends.push(value);\n return [1, marked ? 1 : 0];\n }\n states.set(value, on === total ? true : on > 0 && 'mixed');\n return [total, on];\n };\n for (const top of kids.get(null) ?? []) visit(top, false);\n return { states, ends };\n}\n\n/**\n * The list a toggle of `value` leaves: it and every enabled item under it\n * take the opposite of its state (a mixed one checks), and the rest is read\n * back by the rules. That's every item that shows checked, parents\n * included, plus any listed value no item has.\n */\nfunction toggledList(\n records: Map<string, TreeViewItemRecord>,\n list: string[],\n value: string\n): string[] {\n const { states, ends } = readChecks(records, new Set(list));\n const to = states.get(value) !== true;\n // An end was reached from the top, so everything above it is known.\n const under = (end: string) => {\n for (let at: string | null = end; at !== null;) {\n if (at === value) return true;\n at = records.get(at)!.parent;\n }\n return false;\n };\n const seed = new Set(\n ends.filter(end => (under(end) ? to : states.get(end) === true))\n );\n records.forEach(({ disabled }, item) => {\n if (disabled && states.get(item) === true) seed.add(item);\n });\n const after = readChecks(records, seed).states;\n return [\n ...Array.from(after)\n .filter(([, state]) => state === true)\n .map(([item]) => item),\n ...list.filter(item => !records.has(item)),\n ];\n}\n\n/** A value the caller holds, or one this hook holds when the caller doesn't. */\nfunction useControlled<T>(controlled: T | undefined, initial: T) {\n const [own, setOwn] = useState(initial);\n const isControlled = controlled !== undefined;\n const set = (next: T) => {\n if (!isControlled) setOwn(next);\n };\n return [isControlled ? controlled : own, set] as const;\n}\n\n/** Options for `useTreeView`: the TreeView's own props. */\nexport interface TreeViewOptions {\n mode: TreeViewSelectionMode;\n selected?: string | null;\n defaultSelected: string | null;\n onSelectedChange?: (value: string) => void;\n checked?: string[];\n defaultChecked: string[];\n onCheckedChange?: (checked: string[]) => void;\n expanded?: string[];\n defaultExpanded: string[];\n onExpandedChange?: (expanded: string[]) => void;\n}\n\n/** What `useTreeView` hands the root and its items. */\nexport interface TreeViewEngine {\n /** For the `<ul role=\"tree\">`. */\n treeRef: React.MutableRefObject<HTMLUListElement | null>;\n /**\n * Whether a closed item still renders its children, drawing nothing, so a\n * check knows everything under it. Only a checkbox tree needs to.\n */\n rendersClosed: boolean;\n /** The item that holds `tabIndex={0}`. */\n tabStop: string | null;\n isOpen: (value: string) => boolean;\n /**\n * What the item shows of the selection. `path` is the values of the items\n * above it, which decide its box until the items have registered, as on\n * the server.\n */\n stateOf: (\n value: string,\n path: string[],\n disabled: boolean\n ) => TreeViewItemState;\n /**\n * Where the item with this key sits among the items beside it, read off\n * the page after each render and whenever items move. Nothing until the\n * tree has mounted, as on the server.\n */\n positionOf: (key: string) => TreeViewPosition | undefined;\n /** Records an item from its layout effect. Returns the function that forgets it. */\n register: (value: string, record: TreeViewItemRecord) => () => void;\n /** For each item's `<li>` ref: records it, and notices focus leaving with it. */\n setElement: (value: string, element: HTMLLIElement | null) => void;\n /** Focus arrived on the item's own `<li>`. */\n onFocus: (value: string, element: HTMLLIElement) => void;\n /** Focus left the item's own `<li>`. */\n onBlur: () => void;\n /** A key on the item's `<li>`, after its own `onKeyDown`. */\n onKeyDown: (\n event: React.KeyboardEvent<HTMLLIElement>,\n item: TreeViewItemInfo\n ) => void;\n /**\n * A click on the item's row, or with `onToggle` on its chevron. Focus and\n * the tab stop move to the item.\n */\n onClick: (\n element: HTMLLIElement,\n item: TreeViewItemInfo,\n onToggle: boolean\n ) => void;\n}\n\n/**\n * The open state, the selection, the keys, the tab stop, the positions and\n * the registry of a TreeView (#1096). Focus moves for real, with a roving\n * tabindex, rather than through `aria-activedescendant`. Each item's\n * position among the items beside it is declared rather than left to the\n * browser (#1171), read off the page once the tree has mounted.\n *\n * Every item registers its value, its parent and whether it's disabled from\n * a layout effect. In a checkbox tree a closed item's children still render\n * and register while drawing nothing, so the registry knows every item and a\n * check reaches all of them. The keys read the items on the page, in\n * document order, each time they need them.\n *\n * @function useTreeView\n * @param options - The TreeView's props.\n * @returns The state and handlers the root and its items wire up.\n */\nexport function useTreeView(options: TreeViewOptions): TreeViewEngine {\n // An own key only, so a name every object inherits, like `toString`, is a\n // mode the tree doesn't know too.\n const mode = Object.prototype.hasOwnProperty.call(MODES, options.mode)\n ? options.mode\n : 'none';\n const actions = MODES[mode];\n\n const [expanded, setExpanded] = useControlled(\n options.expanded,\n options.defaultExpanded\n );\n const [selection, setSelection] = useControlled(\n options.selected,\n options.defaultSelected\n );\n const [checkedList, setChecked] = useControlled(\n options.checked,\n options.defaultChecked\n );\n // Each is read in its own mode only.\n const selected = mode === 'single' ? selection : null;\n const listed = new Set(mode === 'checkbox' ? checkedList : []);\n\n const treeRef = useRef<HTMLUListElement | null>(null);\n const registryRef = useRef<Registry>({\n records: new Map(),\n elements: new Map(),\n values: new WeakMap(),\n });\n // Items register from their own effects, so they ask for a render to be read.\n const [, refresh] = useReducer((n: number) => n + 1, 0);\n const typeahead = useTypeahead();\n\n // The item with focus, and where the stop rests while focus is elsewhere:\n // `undefined` until the tree has mounted. With the values above it, for\n // when it goes away.\n const [focused, setFocused] = useState<string | null>(null);\n const [resting, setResting] = useState<string | null | undefined>();\n const restingPathRef = useRef<string[]>([]);\n // The values above an item that left the page with focus in it.\n const lostRef = useRef<string[] | null>(null);\n // Each item's place among the items beside it, by its key.\n const [positions, setPositions] = useState(NO_POSITIONS);\n\n const { records } = registryRef.current;\n const checks =\n mode === 'checkbox'\n ? // eslint-disable-next-line react-hooks/refs -- read in render on purpose: items write the registry from their layout effects and then ask for this render with `refresh`\n readChecks(records, listed).states\n : undefined;\n const tabStop = focused ?? (resting === undefined ? selected : resting);\n\n const isOpen = (value: string) => expanded.includes(value);\n\n const stateOf = (\n value: string,\n path: string[],\n disabled: boolean\n ): TreeViewItemState => {\n if (mode === 'single') {\n return disabled ? {} : { selected: value === selected };\n }\n if (checks) {\n // Until the items register, a value stands for its branch, and a\n // parent can't know it's mixed.\n const fromList =\n listed.has(value) || (!disabled && path.some(v => listed.has(v)));\n return { checked: checks.get(value) ?? fromList };\n }\n return {};\n };\n\n const changeOpen = (next: string[]) => {\n setExpanded(next);\n options.onExpandedChange?.(next);\n };\n\n const run: Record<Action, (item: TreeViewItemInfo) => void> = {\n open: ({ value, isParent, open }) => {\n if (isParent) {\n changeOpen(\n open ? expanded.filter(v => v !== value) : [...expanded, value]\n );\n }\n },\n select: ({ value }) => {\n if (value === selected) return;\n setSelection(value);\n options.onSelectedChange?.(value);\n },\n check: ({ value }) => {\n const next = toggledList(records, checkedList, value);\n setChecked(next);\n options.onCheckedChange?.(next);\n },\n };\n\n /** Disabled items are never selected, checked, opened or closed. */\n const act = (item: TreeViewItemInfo, list: Action[]) => {\n if (!item.disabled) list.forEach(action => run[action](item));\n };\n\n /** Enter, Space and a click on the row: a failed load's row retries. */\n const press = (item: TreeViewItemInfo, list: Action[]) => {\n if (item.retry) item.retry();\n else act(item, list);\n };\n\n // After every render, read each item's position off the page, and put the\n // stop where it belongs. While focus is in the tree it's the focused item.\n // Otherwise it's the selected item, or the first checked one on the page,\n // and failing that it stays where it was. An item that goes away hands it\n // to its nearest ancestor on the page, or to the first item, and focus goes\n // with it if it had focus.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- after every render on purpose: it reads the page, and sets state only when what it reads has changed\n useClientLayoutEffect(() => {\n const tree = treeRef.current!;\n const registry = registryRef.current;\n // Each item's element is read off the page with its value, rather than\n // out of `elements`, which holds one element per value: two items\n // sharing a value, which they shouldn't, can leave it without one the\n // page still has.\n const shown = shownIn(tree, registry);\n const placed = positionsOf(shown, registry);\n if (!samePositions(positions, placed)) setPositions(placed);\n const onPage = shown.map(element => registry.values.get(element)!);\n const elementOf = (value: string) => shown[onPage.indexOf(value)];\n const isShown = (value: string | null | undefined): value is string =>\n value != null && onPage.includes(value);\n const heir = (path: string[]) =>\n [...path].reverse().find(isShown) ?? onPage[0] ?? null;\n\n const lost = lostRef.current;\n lostRef.current = null;\n if (lost && !tree.contains(getActiveElementInTree(tree))) {\n const to = heir(lost);\n if (to) elementOf(to).focus();\n return;\n }\n if (focused !== null && !isShown(focused)) setFocused(null);\n\n const preferred = onPage.find(\n value => value === selected || checks?.get(value) === true\n );\n const next =\n preferred ?? (isShown(resting) ? resting : heir(restingPathRef.current));\n if (next !== resting) {\n setResting(next);\n restingPathRef.current = next ? pathOf(elementOf(next), registry) : [];\n }\n });\n\n // Items can also move without the tree rendering, such as children that a\n // component of the app sorts with state of its own. That changes no record,\n // so the page is watched for items coming, going and moving, and the\n // positions are read again.\n useEffect(() => {\n const tree = treeRef.current!;\n const observer = new MutationObserver(() => {\n const registry = registryRef.current;\n const placed = positionsOf(shownIn(tree, registry), registry);\n setPositions(current =>\n samePositions(current, placed) ? current : placed\n );\n });\n observer.observe(tree, { childList: true, subtree: true });\n return () => observer.disconnect();\n }, []);\n\n const register = useCallback((value: string, record: TreeViewItemRecord) => {\n const { records: known } = registryRef.current;\n known.set(value, record);\n refresh();\n return () => {\n if (known.get(value) !== record) return;\n known.delete(value);\n refresh();\n };\n }, []);\n\n const setElement = useCallback(\n (value: string, element: HTMLLIElement | null) => {\n const registry = registryRef.current;\n if (element) {\n registry.elements.set(value, element);\n registry.values.set(element, value);\n return;\n }\n const gone = registry.elements.get(value);\n if (!gone) return;\n // The ref lets go before the element leaves the page, so it can still\n // say whether focus was in it, and where it sat.\n if (!lostRef.current && gone.contains(getActiveElementInTree(gone))) {\n lostRef.current = [...pathOf(gone, registry), value];\n }\n registry.elements.delete(value);\n },\n []\n );\n\n const onFocus = (value: string, element: HTMLLIElement) => {\n setFocused(value);\n setResting(value);\n restingPathRef.current = pathOf(element, registryRef.current);\n };\n\n const onBlur = () => setFocused(null);\n\n const onKeyDown = (\n event: React.KeyboardEvent<HTMLLIElement>,\n item: TreeViewItemInfo\n ) => {\n const element = event.currentTarget;\n // A key on an item inside this one bubbles here too, and is its own.\n if (\n event.target !== element ||\n event.defaultPrevented ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n isComposing(event)\n ) {\n return;\n }\n const registry = registryRef.current;\n const items = shownIn(treeRef.current!, registry);\n const at = items.indexOf(element);\n const rtl = getComputedStyle(element).direction === 'rtl';\n const key = (rtl && MIRRORED[event.key]) || event.key;\n\n switch (key) {\n case 'ArrowDown':\n items[at + 1]?.focus();\n break;\n case 'ArrowUp':\n items[at - 1]?.focus();\n break;\n case 'Home':\n items[0].focus();\n break;\n case 'End':\n items[items.length - 1].focus();\n break;\n case 'ArrowRight': {\n const next = items[at + 1];\n if (!item.open) act(item, ['open']);\n else if (next && parentItemOf(next) === element) next.focus();\n break;\n }\n case 'ArrowLeft':\n if (item.open && !item.disabled) act(item, ['open']);\n else parentItemOf(element)?.focus();\n break;\n // A held key acts once.\n case 'Enter':\n if (!event.repeat) press(item, actions.enter);\n break;\n case ' ':\n if (!event.repeat) press(item, actions.space);\n break;\n case '*': {\n const closed: string[] = [];\n registry.records.forEach((record, value) => {\n if (\n record.parent === item.parent &&\n record.isParent &&\n !record.disabled &&\n !expanded.includes(value)\n ) {\n closed.push(value);\n }\n });\n if (closed.length) changeOpen([...expanded, ...closed]);\n break;\n }\n default:\n // Type-ahead takes a printable character. Anything else, Escape and\n // Tab included, is left to whatever is around the tree.\n if (event.key.length !== 1) return;\n typeaheadMatch(items, typeahead.type(event.key), at, el =>\n typeaheadText(el.firstElementChild!)\n )?.focus();\n }\n event.preventDefault();\n };\n\n const onClick = (\n element: HTMLLIElement,\n item: TreeViewItemInfo,\n onToggle: boolean\n ) => {\n element.focus();\n if (onToggle) act(item, ['open']);\n else press(item, actions.click);\n };\n\n return {\n treeRef,\n rendersClosed: mode === 'checkbox',\n tabStop,\n isOpen,\n stateOf,\n positionOf: key => positions.get(key),\n register,\n setElement,\n onFocus,\n onBlur,\n onKeyDown,\n onClick,\n };\n}\n"],"names":["isComposing"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useTreeView.js","sources":["../../../src/helpers/useTreeView.ts"],"sourcesContent":["// INTERNAL: deliberately not exported from src/index.ts.\nimport { useCallback, useEffect, useReducer, useRef, useState } from 'react';\nimport type React from 'react';\nimport type { TreeViewSelectionMode } from '../components/TreeView';\nimport { useClientLayoutEffect } from './useClientLayoutEffect';\nimport { getActiveElementInTree } from './shadowDom';\nimport { typeaheadMatch, typeaheadText, useTypeahead } from './typeahead';\n\n/** What an item tells the tree about itself when it registers. */\nexport interface TreeViewItemRecord {\n /** The value of the item it's in, or `null` at the top. */\n parent: string | null;\n disabled: boolean;\n /** It has children, or `hasChildren` says it will. */\n isParent: boolean;\n}\n\n/** An item as a key or a click on it sees it. */\nexport interface TreeViewItemInfo extends TreeViewItemRecord {\n value: string;\n open: boolean;\n /**\n * A failed load's row: what Enter, Space and a click on it do, in place of\n * what the mode says.\n */\n retry?: () => void;\n}\n\n/** A box's state: checked, unchecked or mixed. */\nexport type TreeViewCheckState = boolean | 'mixed';\n\n/**\n * Where an item sits among the items beside it, for its `aria-posinset` and\n * `aria-setsize`: its number, from 1, and how many there are.\n */\nexport interface TreeViewPosition {\n posinset: number;\n setsize: number;\n}\n\n/**\n * What an item shows of the selection: `selected` in a `single` tree,\n * `checked` in a `checkbox` tree, and neither with `none`.\n */\nexport interface TreeViewItemState {\n selected?: boolean;\n checked?: TreeViewCheckState;\n}\n\ntype Action = 'open' | 'select' | 'check';\n\n/**\n * What Enter, Space and a click on the row do in each mode, from the tables\n * in #1096. `open` opens or closes a parent and does nothing on a leaf. A\n * click on the chevron only ever opens or closes.\n */\nconst MODES: Record<\n TreeViewSelectionMode,\n { enter: Action[]; space: Action[]; click: Action[] }\n> = {\n none: { enter: ['open'], space: ['open'], click: ['open'] },\n single: { enter: ['select'], space: ['select'], click: ['select', 'open'] },\n checkbox: { enter: ['open'], space: ['check'], click: ['check'] },\n};\n\n/** Left and Right, swapped for a right-to-left page. */\nconst MIRRORED: Record<string, string> = {\n ArrowLeft: 'ArrowRight',\n ArrowRight: 'ArrowLeft',\n};\n\n/** An IME is composing, so the key belongs to it (`keyCode` 229 is Safari's word for it). */\nconst isComposing = (event: React.KeyboardEvent): boolean =>\n event.nativeEvent.isComposing || event.nativeEvent.keyCode === 229;\n\n/**\n * The items a tree knows, and their elements while they're on the page. A\n * loading item's row, or a failed load's, hands over its element under a key\n * of its own and has no record, so the keys reach it and nothing else counts it.\n */\ninterface Registry {\n records: Map<string, TreeViewItemRecord>;\n // By value, for an item whose ref lets go, which hands over no element.\n elements: Map<string, HTMLLIElement>;\n // Weak, so an element that leaves the page needn't be forgotten by hand.\n values: WeakMap<Element, string>;\n}\n\n/** The registry's items on the page, in document order. */\nconst shownIn = (tree: Element, { values }: Registry): HTMLElement[] =>\n Array.from(tree.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')).filter(\n element => values.has(element)\n );\n\n/** The item an item on the page sits in: its group's `<li>`, or none at the top. */\nfunction parentItemOf(element: Element): HTMLElement | null {\n const group = element.parentElement!;\n return group.getAttribute('role') === 'group' ? group.parentElement : null;\n}\n\n/** No positions: on the server, and until the tree has mounted. */\nconst NO_POSITIONS = new Map<string, TreeViewPosition>();\n\n/**\n * Each item's place among the items beside it, by its key, read off the\n * items on the page: the ones in the same group, or at the top. A loading or\n * failed load's row counts, as it does for a browser that works positions\n * out for itself, so the declared ones say what a browser would.\n */\nfunction positionsOf(\n shown: HTMLElement[],\n { values }: Registry\n): Map<string, TreeViewPosition> {\n const sets = new Map<Element | null, HTMLElement[]>();\n shown.forEach(element => {\n const set = sets.get(element.parentElement);\n if (set) set.push(element);\n else sets.set(element.parentElement, [element]);\n });\n const positions = new Map<string, TreeViewPosition>();\n sets.forEach(set =>\n set.forEach((element, at) =>\n positions.set(values.get(element)!, {\n posinset: at + 1,\n setsize: set.length,\n })\n )\n );\n return positions;\n}\n\n/** Whether two sets of positions say the same for every item. */\nfunction samePositions(\n a: Map<string, TreeViewPosition>,\n b: Map<string, TreeViewPosition>\n): boolean {\n return (\n a.size === b.size &&\n Array.from(a).every(([key, { posinset, setsize }]) => {\n const other = b.get(key);\n return other?.posinset === posinset && other.setsize === setsize;\n })\n );\n}\n\n/** The values of the items an item on the page is in, from the top. */\nfunction pathOf(element: Element, { values }: Registry): string[] {\n const path: string[] = [];\n for (let at = parentItemOf(element); at; at = parentItemOf(at)) {\n path.unshift(values.get(at)!);\n }\n return path;\n}\n\n/**\n * Every known item's check state, by the rules in #1096:\n *\n * - a disabled item is checked only when its own value is listed;\n * - an enabled item with no enabled items anywhere under it is checked when\n * it, or any item above it, is listed;\n * - any other enabled item follows the items of that second kind in its\n * branch: checked when they all are, unchecked when none is, mixed between.\n *\n * Also returns the items of the second kind, which are what a toggle sets.\n */\nfunction readChecks(\n records: Map<string, TreeViewItemRecord>,\n listed: Set<string>\n): { states: Map<string, TreeViewCheckState>; ends: string[] } {\n const kids = new Map<string | null, string[]>();\n records.forEach(({ parent }, value) => {\n kids.set(parent, [...(kids.get(parent) ?? []), value]);\n });\n const states = new Map<string, TreeViewCheckState>();\n const ends: string[] = [];\n // How many enabled ends the branch holds, and how many are checked.\n const visit = (value: string, above: boolean): [number, number] => {\n const marked = above || listed.has(value);\n let total = 0;\n let on = 0;\n for (const kid of kids.get(value) ?? []) {\n const [t, o] = visit(kid, marked);\n total += t;\n on += o;\n }\n if (records.get(value)!.disabled) {\n states.set(value, listed.has(value));\n return [total, on];\n }\n if (total === 0) {\n states.set(value, marked);\n ends.push(value);\n return [1, marked ? 1 : 0];\n }\n states.set(value, on === total ? true : on > 0 && 'mixed');\n return [total, on];\n };\n for (const top of kids.get(null) ?? []) visit(top, false);\n return { states, ends };\n}\n\n/**\n * The list a toggle of `value` leaves: it and every enabled item under it\n * take the opposite of its state (a mixed one checks), and the rest is read\n * back by the rules. That's every item that shows checked, parents\n * included, plus any listed value no item has.\n */\nfunction toggledList(\n records: Map<string, TreeViewItemRecord>,\n list: string[],\n value: string\n): string[] {\n const { states, ends } = readChecks(records, new Set(list));\n const to = states.get(value) !== true;\n // An end was reached from the top, so everything above it is known.\n const under = (end: string) => {\n for (let at: string | null = end; at !== null;) {\n if (at === value) return true;\n at = records.get(at)!.parent;\n }\n return false;\n };\n const seed = new Set(\n ends.filter(end => (under(end) ? to : states.get(end) === true))\n );\n records.forEach(({ disabled }, item) => {\n if (disabled && states.get(item) === true) seed.add(item);\n });\n const after = readChecks(records, seed).states;\n return [\n ...Array.from(after)\n .filter(([, state]) => state === true)\n .map(([item]) => item),\n ...list.filter(item => !records.has(item)),\n ];\n}\n\n/** A value the caller holds, or one this hook holds when the caller doesn't. */\nfunction useControlled<T>(controlled: T | undefined, initial: T) {\n const [own, setOwn] = useState(initial);\n const isControlled = controlled !== undefined;\n const set = (next: T) => {\n if (!isControlled) setOwn(next);\n };\n return [isControlled ? controlled : own, set] as const;\n}\n\n/** Options for `useTreeView`: the TreeView's own props. */\nexport interface TreeViewOptions {\n mode: TreeViewSelectionMode;\n selected?: string | null;\n defaultSelected: string | null;\n onSelectedChange?: (value: string) => void;\n checked?: string[];\n defaultChecked: string[];\n onCheckedChange?: (checked: string[]) => void;\n expanded?: string[];\n defaultExpanded: string[];\n onExpandedChange?: (expanded: string[]) => void;\n}\n\n/** What `useTreeView` hands the root and its items. */\nexport interface TreeViewEngine {\n /** For the `<ul role=\"tree\">`. */\n treeRef: React.MutableRefObject<HTMLUListElement | null>;\n /**\n * Whether a closed item still renders its children, drawing nothing, so a\n * check knows everything under it. Only a checkbox tree needs to.\n */\n rendersClosed: boolean;\n /** The item that holds `tabIndex={0}`. */\n tabStop: string | null;\n isOpen: (value: string) => boolean;\n /**\n * What the item shows of the selection. `path` is the values of the items\n * above it, which decide its box until the items have registered, as on\n * the server.\n */\n stateOf: (\n value: string,\n path: string[],\n disabled: boolean\n ) => TreeViewItemState;\n /**\n * Where the item with this key sits among the items beside it, read off\n * the page after each render and whenever items move. Nothing until the\n * tree has mounted, as on the server.\n */\n positionOf: (key: string) => TreeViewPosition | undefined;\n /** Records an item from its layout effect. Returns the function that forgets it. */\n register: (value: string, record: TreeViewItemRecord) => () => void;\n /** For each item's `<li>` ref: records it, and notices focus leaving with it. */\n setElement: (value: string, element: HTMLLIElement | null) => void;\n /** Focus arrived on the item's own `<li>`. */\n onFocus: (value: string, element: HTMLLIElement) => void;\n /** Focus left the item's own `<li>`. */\n onBlur: () => void;\n /** A key on the item's `<li>`, after its own `onKeyDown`. */\n onKeyDown: (\n event: React.KeyboardEvent<HTMLLIElement>,\n item: TreeViewItemInfo\n ) => void;\n /**\n * A click on the item's row, or with `onToggle` on its chevron. Focus and\n * the tab stop move to the item.\n */\n onClick: (\n element: HTMLLIElement,\n item: TreeViewItemInfo,\n onToggle: boolean\n ) => void;\n}\n\n/**\n * The open state, the selection, the keys, the tab stop, the positions and\n * the registry of a TreeView (#1096). Focus moves for real, with a roving\n * tabindex, rather than through `aria-activedescendant`. Each item's\n * position among the items beside it is declared rather than left to the\n * browser (#1171), read off the page once the tree has mounted.\n *\n * Every item registers its value, its parent and whether it's disabled from\n * a layout effect. In a checkbox tree a closed item's children still render\n * and register while drawing nothing, so the registry knows every item and a\n * check reaches all of them. The keys read the items on the page, in\n * document order, each time they need them.\n *\n * @function useTreeView\n * @param options - The TreeView's props.\n * @returns The state and handlers the root and its items wire up.\n */\nexport function useTreeView(options: TreeViewOptions): TreeViewEngine {\n // An own key only, so a name every object inherits, like `toString`, is a\n // mode the tree doesn't know too.\n const mode = Object.prototype.hasOwnProperty.call(MODES, options.mode)\n ? options.mode\n : 'none';\n const actions = MODES[mode];\n\n const [expanded, setExpanded] = useControlled(\n options.expanded,\n options.defaultExpanded\n );\n const [selection, setSelection] = useControlled(\n options.selected,\n options.defaultSelected\n );\n const [checkedList, setChecked] = useControlled(\n options.checked,\n options.defaultChecked\n );\n // Each is read in its own mode only.\n const selected = mode === 'single' ? selection : null;\n const listed = new Set(mode === 'checkbox' ? checkedList : []);\n\n const treeRef = useRef<HTMLUListElement | null>(null);\n const registryRef = useRef<Registry>({\n records: new Map(),\n elements: new Map(),\n values: new WeakMap(),\n });\n // Items register from their own effects, so they ask for a render to be read.\n const [, refresh] = useReducer((n: number) => n + 1, 0);\n const typeahead = useTypeahead();\n\n // The item with focus, and where the stop rests while focus is elsewhere:\n // `undefined` until the tree has mounted. With the values above it, for\n // when it goes away.\n const [focused, setFocused] = useState<string | null>(null);\n const [resting, setResting] = useState<string | null | undefined>();\n const restingPathRef = useRef<string[]>([]);\n // The values above an item that left the page with focus in it.\n const lostRef = useRef<string[] | null>(null);\n // Each item's place among the items beside it, by its key.\n const [positions, setPositions] = useState(NO_POSITIONS);\n\n const { records } = registryRef.current;\n const checks =\n mode === 'checkbox'\n ? // eslint-disable-next-line react-hooks/refs -- read in render on purpose: items write the registry from their layout effects and then ask for this render with `refresh`\n readChecks(records, listed).states\n : undefined;\n const tabStop = focused ?? (resting === undefined ? selected : resting);\n\n const isOpen = (value: string) => expanded.includes(value);\n\n const stateOf = (\n value: string,\n path: string[],\n disabled: boolean\n ): TreeViewItemState => {\n if (mode === 'single') {\n return disabled ? {} : { selected: value === selected };\n }\n if (checks) {\n // Until the items register, a value stands for its branch, and a\n // parent can't know it's mixed.\n const fromList =\n listed.has(value) || (!disabled && path.some(v => listed.has(v)));\n return { checked: checks.get(value) ?? fromList };\n }\n return {};\n };\n\n const changeOpen = (next: string[]) => {\n setExpanded(next);\n options.onExpandedChange?.(next);\n };\n\n const run: Record<Action, (item: TreeViewItemInfo) => void> = {\n open: ({ value, isParent, open }) => {\n if (isParent) {\n changeOpen(\n open ? expanded.filter(v => v !== value) : [...expanded, value]\n );\n }\n },\n select: ({ value }) => {\n if (value === selected) return;\n setSelection(value);\n options.onSelectedChange?.(value);\n },\n check: ({ value }) => {\n const next = toggledList(records, checkedList, value);\n setChecked(next);\n options.onCheckedChange?.(next);\n },\n };\n\n /** Disabled items are never selected, checked, opened or closed. */\n const act = (item: TreeViewItemInfo, list: Action[]) => {\n if (!item.disabled) list.forEach(action => run[action](item));\n };\n\n /** Enter, Space and a click on the row: a failed load's row retries. */\n const press = (item: TreeViewItemInfo, list: Action[]) => {\n if (item.retry) item.retry();\n else act(item, list);\n };\n\n // After every render, read each item's position off the page, and put the\n // stop where it belongs. While focus is in the tree it's the focused item.\n // Otherwise it's the selected item, or the first checked one on the page,\n // and failing that it stays where it was. An item that goes away hands it\n // to its nearest ancestor on the page, or to the first item, and focus goes\n // with it if it had focus.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- after every render on purpose: it reads the page, and sets state only when what it reads has changed\n useClientLayoutEffect(() => {\n const tree = treeRef.current!;\n const registry = registryRef.current;\n // Each item's element is read off the page with its value, rather than\n // out of `elements`, which holds one element per value: two items\n // sharing a value, which they shouldn't, can leave it without one the\n // page still has.\n const shown = shownIn(tree, registry);\n const placed = positionsOf(shown, registry);\n if (!samePositions(positions, placed)) setPositions(placed);\n const onPage = shown.map(element => registry.values.get(element)!);\n const elementOf = (value: string) => shown[onPage.indexOf(value)];\n const isShown = (value: string | null | undefined): value is string =>\n value != null && onPage.includes(value);\n const heir = (path: string[]) =>\n [...path].reverse().find(isShown) ?? onPage[0] ?? null;\n\n const lost = lostRef.current;\n lostRef.current = null;\n if (lost && !tree.contains(getActiveElementInTree(tree))) {\n const to = heir(lost);\n if (to) elementOf(to).focus();\n return;\n }\n if (focused !== null && !isShown(focused)) setFocused(null);\n\n const preferred = onPage.find(\n value => value === selected || checks?.get(value) === true\n );\n const next =\n preferred ?? (isShown(resting) ? resting : heir(restingPathRef.current));\n if (next !== resting) {\n setResting(next);\n restingPathRef.current = next ? pathOf(elementOf(next), registry) : [];\n }\n });\n\n // Items can also move without the tree rendering, such as children that a\n // component of the app sorts with state of its own. That changes no record,\n // so the page is watched for items coming, going and moving, and the\n // positions are read again.\n useEffect(() => {\n const tree = treeRef.current!;\n const observer = new MutationObserver(() => {\n const registry = registryRef.current;\n const placed = positionsOf(shownIn(tree, registry), registry);\n setPositions(current =>\n samePositions(current, placed) ? current : placed\n );\n });\n observer.observe(tree, { childList: true, subtree: true });\n return () => observer.disconnect();\n }, []);\n\n const register = useCallback((value: string, record: TreeViewItemRecord) => {\n const { records: known } = registryRef.current;\n known.set(value, record);\n refresh();\n return () => {\n if (known.get(value) !== record) return;\n known.delete(value);\n refresh();\n };\n }, []);\n\n const setElement = useCallback(\n (value: string, element: HTMLLIElement | null) => {\n const registry = registryRef.current;\n if (element) {\n registry.elements.set(value, element);\n registry.values.set(element, value);\n return;\n }\n const gone = registry.elements.get(value);\n if (!gone) return;\n // The ref lets go before the element leaves the page, so it can still\n // say whether focus was in it, and where it sat.\n if (!lostRef.current && gone.contains(getActiveElementInTree(gone))) {\n lostRef.current = [...pathOf(gone, registry), value];\n }\n registry.elements.delete(value);\n },\n []\n );\n\n const onFocus = (value: string, element: HTMLLIElement) => {\n setFocused(value);\n setResting(value);\n restingPathRef.current = pathOf(element, registryRef.current);\n };\n\n const onBlur = () => setFocused(null);\n\n const onKeyDown = (\n event: React.KeyboardEvent<HTMLLIElement>,\n item: TreeViewItemInfo\n ) => {\n const element = event.currentTarget;\n // A key on an item inside this one bubbles here too, and is its own.\n if (\n event.target !== element ||\n event.defaultPrevented ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n isComposing(event)\n ) {\n return;\n }\n const registry = registryRef.current;\n const items = shownIn(treeRef.current!, registry);\n const at = items.indexOf(element);\n const rtl = getComputedStyle(element).direction === 'rtl';\n const key = (rtl && MIRRORED[event.key]) || event.key;\n\n switch (key) {\n case 'ArrowDown':\n items[at + 1]?.focus();\n break;\n case 'ArrowUp':\n items[at - 1]?.focus();\n break;\n case 'Home':\n items[0].focus();\n break;\n case 'End':\n items[items.length - 1].focus();\n break;\n case 'ArrowRight': {\n const next = items[at + 1];\n if (!item.open) act(item, ['open']);\n else if (next && parentItemOf(next) === element) next.focus();\n break;\n }\n case 'ArrowLeft':\n if (item.open && !item.disabled) act(item, ['open']);\n else parentItemOf(element)?.focus();\n break;\n // A held key acts once.\n case 'Enter':\n if (!event.repeat) press(item, actions.enter);\n break;\n case ' ':\n if (!event.repeat) press(item, actions.space);\n break;\n case '*': {\n const closed: string[] = [];\n registry.records.forEach((record, value) => {\n if (\n record.parent === item.parent &&\n record.isParent &&\n !record.disabled &&\n !expanded.includes(value)\n ) {\n closed.push(value);\n }\n });\n if (closed.length) changeOpen([...expanded, ...closed]);\n break;\n }\n default:\n // Type-ahead takes a printable character. Anything else, Escape and\n // Tab included, is left to whatever is around the tree.\n if (event.key.length !== 1) return;\n typeaheadMatch(items, typeahead.type(event.key), at, el =>\n typeaheadText(el.firstElementChild!)\n )?.focus();\n }\n event.preventDefault();\n };\n\n const onClick = (\n element: HTMLLIElement,\n item: TreeViewItemInfo,\n onToggle: boolean\n ) => {\n element.focus();\n if (onToggle) act(item, ['open']);\n else press(item, actions.click);\n };\n\n return {\n treeRef,\n rendersClosed: mode === 'checkbox',\n tabStop,\n isOpen,\n stateOf,\n positionOf: key => positions.get(key),\n register,\n setElement,\n onFocus,\n onBlur,\n onKeyDown,\n onClick,\n };\n}\n"],"names":["isComposing"],"mappings":"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"}
|
|
@@ -1 +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":"
|
|
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;;"}
|
|
@@ -1 +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 /**\n * Hides the element. `'hidden'` takes it off the page, `'invisible'` hides\n * it and keeps its space, and `'sr-only'` (screen reader only) hides it\n * visually while screen readers still read it.\n */\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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"}
|
|
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 /**\n * Hides the element. `'hidden'` takes it off the page, `'invisible'` hides\n * it and keeps its space, and `'sr-only'` (screen reader only) hides it\n * visually while screen readers still read it.\n */\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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"}
|
|
@@ -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":"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<HTMLElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /**\n * HTML element to render (default: `div`). Bulma pages often put the\n * container on a landmark, such as `<main class=\"container\">` or\n * `<footer class=\"container\">`. A page has only one visible `main`, and a\n * `section` is a `region` landmark only once it has an accessible name\n * (`aria-label`, or `aria-labelledby` pointing at its heading).\n */\n as?:\n | 'div'\n | 'main'\n | 'section'\n | 'article'\n | 'aside'\n | 'header'\n | 'footer'\n | 'nav';\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 as: Tag = 'div',\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 <Tag\n className={containerClasses}\n style={mergeBulmaStyles(bulmaHelperStyles, style)}\n {...rest}\n >\n {children}\n </Tag>\n );\n};\n\nexport default Container;\n"],"names":["_jsx"],"mappings":"
|
|
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<HTMLElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /**\n * HTML element to render (default: `div`). Bulma pages often put the\n * container on a landmark, such as `<main class=\"container\">` or\n * `<footer class=\"container\">`. A page has only one visible `main`, and a\n * `section` is a `region` landmark only once it has an accessible name\n * (`aria-label`, or `aria-labelledby` pointing at its heading).\n */\n as?:\n | 'div'\n | 'main'\n | 'section'\n | 'article'\n | 'aside'\n | 'header'\n | 'footer'\n | 'nav';\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 as: Tag = 'div',\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 <Tag\n className={containerClasses}\n style={mergeBulmaStyles(bulmaHelperStyles, style)}\n {...rest}\n >\n {children}\n </Tag>\n );\n};\n\nexport default Container;\n"],"names":["_jsx"],"mappings":";;;;;;;AA0EA;;;;;;;AAOG;AACI,MAAM,SAAS,GAA6B,CAAC,EAClD,EAAE,EAAE,GAAG,GAAG,KAAK,EACf,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,IAAC,GAAG,EAAA,EACF,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,gBAAgB,CAAC,iBAAiB,EAAE,KAAK,CAAC,EAAA,GAC7C,IAAI,EAAA,QAAA,EAEP,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 { useBulmaClasses } from '../helpers/useBulmaClasses.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Footer.js","sources":["../../../src/layout/Footer.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 * Props for the Footer component.\n */\nexport interface FooterProps\n extends\n React.HTMLAttributes<HTMLElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** The HTML tag to render as. */\n as?: 'footer' | 'div';\n /** Bulma color modifier. */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /**\n * Background color. `scheme-*` values render as a dark-mode-safe inline\n * `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 /** Text color. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Content inside the footer. */\n children?: React.ReactNode;\n}\n\n/**\n * The `Footer` component provides a semantic and accessible site footer for your Bulma React UI.\n *\n * @function\n * @param {FooterProps} props - Props for the Footer component.\n * @returns {JSX.Element} The rendered footer element.\n * @see {@link https://bulma.io/documentation/layout/footer/ | Bulma Footer documentation}\n *\n * @example\n * <Footer>\n * <div className=\"content has-text-centered\">...</div>\n * </Footer>\n */\nexport const Footer: React.FC<FooterProps> = ({\n as = 'footer',\n className,\n children,\n color,\n bgColor,\n textColor,\n style,\n ...props\n}) => {\n const { bulmaHelperClasses, bulmaHelperStyles, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n const Tag = as;\n const mainClass = usePrefixedClassNames('footer');\n const footerClasses = classNames(mainClass, bulmaHelperClasses, className);\n return (\n <Tag\n className={footerClasses}\n style={mergeBulmaStyles(bulmaHelperStyles, style)}\n {...rest}\n >\n {children}\n </Tag>\n );\n};\n\nexport default Footer;\n"],"names":["_jsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Footer.js","sources":["../../../src/layout/Footer.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 * Props for the Footer component.\n */\nexport interface FooterProps\n extends\n React.HTMLAttributes<HTMLElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** The HTML tag to render as. */\n as?: 'footer' | 'div';\n /** Bulma color modifier. */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /**\n * Background color. `scheme-*` values render as a dark-mode-safe inline\n * `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 /** Text color. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Additional CSS classes. */\n className?: string;\n /** Content inside the footer. */\n children?: React.ReactNode;\n}\n\n/**\n * The `Footer` component provides a semantic and accessible site footer for your Bulma React UI.\n *\n * @function\n * @param {FooterProps} props - Props for the Footer component.\n * @returns {JSX.Element} The rendered footer element.\n * @see {@link https://bulma.io/documentation/layout/footer/ | Bulma Footer documentation}\n *\n * @example\n * <Footer>\n * <div className=\"content has-text-centered\">...</div>\n * </Footer>\n */\nexport const Footer: React.FC<FooterProps> = ({\n as = 'footer',\n className,\n children,\n color,\n bgColor,\n textColor,\n style,\n ...props\n}) => {\n const { bulmaHelperClasses, bulmaHelperStyles, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n const Tag = as;\n const mainClass = usePrefixedClassNames('footer');\n const footerClasses = classNames(mainClass, bulmaHelperClasses, className);\n return (\n <Tag\n className={footerClasses}\n style={mergeBulmaStyles(bulmaHelperStyles, style)}\n {...rest}\n >\n {children}\n </Tag>\n );\n};\n\nexport default Footer;\n"],"names":["_jsx"],"mappings":";;;;;;;AAwCA;;;;;;;;;;;;AAYG;AACI,MAAM,MAAM,GAA0B,CAAC,EAC5C,EAAE,GAAG,QAAQ,EACb,SAAS,EACT,QAAQ,EACR,KAAK,EACL,OAAO,EACP,SAAS,EACT,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;IACF,MAAM,GAAG,GAAG,EAAE;AACd,IAAA,MAAM,SAAS,GAAG,qBAAqB,CAAC,QAAQ,CAAC;IACjD,MAAM,aAAa,GAAG,UAAU,CAAC,SAAS,EAAE,kBAAkB,EAAE,SAAS,CAAC;IAC1E,QACEA,IAAC,GAAG,EAAA,EACF,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,gBAAgB,CAAC,iBAAiB,EAAE,KAAK,CAAC,EAAA,GAC7C,IAAI,EAAA,QAAA,EAEP,QAAQ,EAAA,CACL;AAEV;;"}
|
package/dist/esm/layout/Hero.js
CHANGED
|
@@ -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":"Hero.js","sources":["../../../src/layout/Hero.tsx"],"sourcesContent":["import React from 'react';\nimport { classNames, usePrefixedClassNames } from '../helpers/classNames';\nimport { withSubComponents } from '../helpers/withSubComponents';\nimport {\n useBulmaClasses,\n BulmaClassesProps,\n validColors,\n validSchemeColors,\n} from '../helpers/useBulmaClasses';\nimport { mergeBulmaStyles } from '../helpers/mergeBulmaStyles';\nimport { warnUnstyledColor } from '../helpers/colorDeprecations';\n\n/**\n * Possible values for Bulma hero size.\n */\nexport type HeroSize =\n 'small' | 'medium' | 'large' | 'fullheight' | 'fullheight-with-navbar';\n\n/**\n * Props for the Hero component.\n */\nexport interface HeroProps\n extends\n React.HTMLAttributes<HTMLElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /**\n * HTML element to render (default: `section`). Bulma pages often put the\n * hero on a landmark: `main` when the hero is the page's main content,\n * `header` for a banner above it, `footer` for one below it. A page has\n * only one visible `main`, and a `section` is a `region` landmark only once\n * it has an accessible name (`aria-label`, or `aria-labelledby` pointing at\n * its heading).\n */\n as?: 'section' | 'div' | 'main' | 'header' | 'footer' | 'article' | 'aside';\n /** Additional CSS classes. */\n className?: string;\n /**\n * Bulma color modifier for the hero section (renders `is-<color>`).\n *\n * Only `primary`, `link`, `info`, `success`, `warning`, `danger`, `black`,\n * `white`, `light`, and `dark` have shipped CSS for `.hero`. Every other\n * value the union accepts emits a class no CSS rule matches, so the hero\n * renders unstyled; those log a console warning in development and will be\n * removed from this union in the next major version.\n */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Hero size. */\n size?: HeroSize;\n /**\n * Bulma background color helper. `scheme-*` values render as a\n * dark-mode-safe inline `background-color: var(--bulma-scheme-*)` instead\n * of a class. The `scheme-invert*` values do not change text color — pair\n * them with a contrasting foreground.\n */\n bgColor?:\n | (typeof validColors)[number]\n | (typeof validSchemeColors)[number]\n | 'inherit'\n | 'current';\n /** Use fullheight hero with a navbar offset. */\n fullheightWithNavbar?: boolean;\n /** Hero content (often includes `Hero.Head`, `Hero.Body`, `Hero.Foot`). */\n children?: React.ReactNode;\n}\n\n/**\n * The `Hero` component provides a responsive, flexible, and visually striking section for your Bulma React UI.\n *\n * @function\n * @param {HeroProps} props - Props for the Hero component.\n * @returns {JSX.Element} The rendered hero.\n * @see {@link https://bulma.io/documentation/layout/hero/ | Bulma Hero documentation}\n */\nconst HeroComponent: React.FC<HeroProps> = ({\n as: Tag = 'section',\n className,\n color,\n size,\n bgColor,\n fullheightWithNavbar,\n children,\n style,\n ...props\n}) => {\n warnUnstyledColor('Hero', color, ['inherit', 'current']);\n\n const { bulmaHelperClasses, bulmaHelperStyles, rest } = useBulmaClasses({\n backgroundColor: bgColor,\n ...props,\n });\n\n const mainClass = usePrefixedClassNames('hero', {\n [`is-${color}`]: color,\n [`is-${size}`]: size && size !== 'fullheight-with-navbar',\n 'is-fullheight-with-navbar':\n fullheightWithNavbar || size === 'fullheight-with-navbar',\n });\n const heroClasses = classNames(mainClass, bulmaHelperClasses, className);\n\n return (\n <Tag\n className={heroClasses}\n style={mergeBulmaStyles(bulmaHelperStyles, style)}\n {...rest}\n >\n {children}\n </Tag>\n );\n};\n\n/**\n * Props for the HeroHead component.\n */\nexport interface HeroHeadProps\n extends\n React.HTMLAttributes<HTMLElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /**\n * HTML element to render (default: `div`). `nav` suits a head that holds\n * only the site's navigation. A `header` is a `banner` landmark only when\n * no `section`, `article`, `aside`, `nav` or `main` is around it, so inside\n * the default `<section>` hero it is not one: render the hero as a `div`\n * for that. A `header` may not sit inside another `header` or a `footer`.\n */\n as?: 'div' | 'header' | 'nav';\n /** Additional CSS classes. */\n className?: string;\n /** Bulma color modifier for text. */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /**\n * Background color. `scheme-*` values render as a dark-mode-safe inline\n * `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 /** Text color. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Content. */\n children?: React.ReactNode;\n}\n\n/**\n * Top bar for navigation or branding.\n *\n * @function\n * @param {HeroHeadProps} props - Props for the HeroHead component.\n * @returns {JSX.Element} The rendered hero head.\n */\nexport const HeroHead: React.FC<HeroHeadProps> = ({\n as: Tag = 'div',\n className,\n children,\n color,\n bgColor,\n textColor,\n style,\n ...props\n}) => {\n const { bulmaHelperClasses, bulmaHelperStyles, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n const mainClass = usePrefixedClassNames('hero-head');\n const heroHeadClasses = classNames(mainClass, bulmaHelperClasses, className);\n return (\n <Tag\n className={heroHeadClasses}\n style={mergeBulmaStyles(bulmaHelperStyles, style)}\n {...rest}\n >\n {children}\n </Tag>\n );\n};\n\n/**\n * Props for the HeroBody component.\n */\nexport interface HeroBodyProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Additional CSS classes. */\n className?: string;\n /** Bulma color modifier for text. */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /**\n * Background color. `scheme-*` values render as a dark-mode-safe inline\n * `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 /** Text color. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Content. */\n children?: React.ReactNode;\n}\n\n/**\n * Main content area, vertically centered by default.\n *\n * @function\n * @param {HeroBodyProps} props - Props for the HeroBody component.\n * @returns {JSX.Element} The rendered hero body.\n */\nexport const HeroBody: React.FC<HeroBodyProps> = ({\n className,\n children,\n color,\n bgColor,\n textColor,\n style,\n ...props\n}) => {\n const { bulmaHelperClasses, bulmaHelperStyles, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n const mainClass = usePrefixedClassNames('hero-body');\n const heroBodyClasses = classNames(mainClass, bulmaHelperClasses, className);\n return (\n <div\n className={heroBodyClasses}\n style={mergeBulmaStyles(bulmaHelperStyles, style)}\n {...rest}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Props for the HeroFoot component.\n */\nexport interface HeroFootProps\n extends\n React.HTMLAttributes<HTMLElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /**\n * HTML element to render (default: `div`). `nav` suits a foot that holds\n * tabs or links. A `footer` is a `contentinfo` landmark only when no\n * `section`, `article`, `aside`, `nav` or `main` is around it, so inside\n * the default `<section>` hero it is not one: render the hero as a `div`\n * for that. A `footer` may not sit inside another `footer` or a `header`.\n */\n as?: 'div' | 'footer' | 'nav';\n /** Additional CSS classes. */\n className?: string;\n /** Bulma color modifier for text. */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /**\n * Background color. `scheme-*` values render as a dark-mode-safe inline\n * `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 /** Text color. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Content. */\n children?: React.ReactNode;\n}\n\n/**\n * Bottom bar for tabs or actions.\n *\n * @function\n * @param {HeroFootProps} props - Props for the HeroFoot component.\n * @returns {JSX.Element} The rendered hero foot.\n */\nexport const HeroFoot: React.FC<HeroFootProps> = ({\n as: Tag = 'div',\n className,\n children,\n color,\n bgColor,\n textColor,\n style,\n ...props\n}) => {\n const { bulmaHelperClasses, bulmaHelperStyles, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n const mainClass = usePrefixedClassNames('hero-foot');\n const heroFootClasses = classNames(mainClass, bulmaHelperClasses, className);\n return (\n <Tag\n className={heroFootClasses}\n style={mergeBulmaStyles(bulmaHelperStyles, style)}\n {...rest}\n >\n {children}\n </Tag>\n );\n};\n\n// Attach subcomponents\nexport const Hero = withSubComponents(\n HeroComponent,\n {\n Head: HeroHead,\n Body: HeroBody,\n Foot: HeroFoot,\n },\n 'Hero'\n);\n\nexport default Hero;\n"],"names":["_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Hero.js","sources":["../../../src/layout/Hero.tsx"],"sourcesContent":["import React from 'react';\nimport { classNames, usePrefixedClassNames } from '../helpers/classNames';\nimport { withSubComponents } from '../helpers/withSubComponents';\nimport {\n useBulmaClasses,\n BulmaClassesProps,\n validColors,\n validSchemeColors,\n} from '../helpers/useBulmaClasses';\nimport { mergeBulmaStyles } from '../helpers/mergeBulmaStyles';\nimport { warnUnstyledColor } from '../helpers/colorDeprecations';\n\n/**\n * Possible values for Bulma hero size.\n */\nexport type HeroSize =\n 'small' | 'medium' | 'large' | 'fullheight' | 'fullheight-with-navbar';\n\n/**\n * Props for the Hero component.\n */\nexport interface HeroProps\n extends\n React.HTMLAttributes<HTMLElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /**\n * HTML element to render (default: `section`). Bulma pages often put the\n * hero on a landmark: `main` when the hero is the page's main content,\n * `header` for a banner above it, `footer` for one below it. A page has\n * only one visible `main`, and a `section` is a `region` landmark only once\n * it has an accessible name (`aria-label`, or `aria-labelledby` pointing at\n * its heading).\n */\n as?: 'section' | 'div' | 'main' | 'header' | 'footer' | 'article' | 'aside';\n /** Additional CSS classes. */\n className?: string;\n /**\n * Bulma color modifier for the hero section (renders `is-<color>`).\n *\n * Only `primary`, `link`, `info`, `success`, `warning`, `danger`, `black`,\n * `white`, `light`, and `dark` have shipped CSS for `.hero`. Every other\n * value the union accepts emits a class no CSS rule matches, so the hero\n * renders unstyled; those log a console warning in development and will be\n * removed from this union in the next major version.\n */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Hero size. */\n size?: HeroSize;\n /**\n * Bulma background color helper. `scheme-*` values render as a\n * dark-mode-safe inline `background-color: var(--bulma-scheme-*)` instead\n * of a class. The `scheme-invert*` values do not change text color — pair\n * them with a contrasting foreground.\n */\n bgColor?:\n | (typeof validColors)[number]\n | (typeof validSchemeColors)[number]\n | 'inherit'\n | 'current';\n /** Use fullheight hero with a navbar offset. */\n fullheightWithNavbar?: boolean;\n /** Hero content (often includes `Hero.Head`, `Hero.Body`, `Hero.Foot`). */\n children?: React.ReactNode;\n}\n\n/**\n * The `Hero` component provides a responsive, flexible, and visually striking section for your Bulma React UI.\n *\n * @function\n * @param {HeroProps} props - Props for the Hero component.\n * @returns {JSX.Element} The rendered hero.\n * @see {@link https://bulma.io/documentation/layout/hero/ | Bulma Hero documentation}\n */\nconst HeroComponent: React.FC<HeroProps> = ({\n as: Tag = 'section',\n className,\n color,\n size,\n bgColor,\n fullheightWithNavbar,\n children,\n style,\n ...props\n}) => {\n warnUnstyledColor('Hero', color, ['inherit', 'current']);\n\n const { bulmaHelperClasses, bulmaHelperStyles, rest } = useBulmaClasses({\n backgroundColor: bgColor,\n ...props,\n });\n\n const mainClass = usePrefixedClassNames('hero', {\n [`is-${color}`]: color,\n [`is-${size}`]: size && size !== 'fullheight-with-navbar',\n 'is-fullheight-with-navbar':\n fullheightWithNavbar || size === 'fullheight-with-navbar',\n });\n const heroClasses = classNames(mainClass, bulmaHelperClasses, className);\n\n return (\n <Tag\n className={heroClasses}\n style={mergeBulmaStyles(bulmaHelperStyles, style)}\n {...rest}\n >\n {children}\n </Tag>\n );\n};\n\n/**\n * Props for the HeroHead component.\n */\nexport interface HeroHeadProps\n extends\n React.HTMLAttributes<HTMLElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /**\n * HTML element to render (default: `div`). `nav` suits a head that holds\n * only the site's navigation. A `header` is a `banner` landmark only when\n * no `section`, `article`, `aside`, `nav` or `main` is around it, so inside\n * the default `<section>` hero it is not one: render the hero as a `div`\n * for that. A `header` may not sit inside another `header` or a `footer`.\n */\n as?: 'div' | 'header' | 'nav';\n /** Additional CSS classes. */\n className?: string;\n /** Bulma color modifier for text. */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /**\n * Background color. `scheme-*` values render as a dark-mode-safe inline\n * `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 /** Text color. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Content. */\n children?: React.ReactNode;\n}\n\n/**\n * Top bar for navigation or branding.\n *\n * @function\n * @param {HeroHeadProps} props - Props for the HeroHead component.\n * @returns {JSX.Element} The rendered hero head.\n */\nexport const HeroHead: React.FC<HeroHeadProps> = ({\n as: Tag = 'div',\n className,\n children,\n color,\n bgColor,\n textColor,\n style,\n ...props\n}) => {\n const { bulmaHelperClasses, bulmaHelperStyles, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n const mainClass = usePrefixedClassNames('hero-head');\n const heroHeadClasses = classNames(mainClass, bulmaHelperClasses, className);\n return (\n <Tag\n className={heroHeadClasses}\n style={mergeBulmaStyles(bulmaHelperStyles, style)}\n {...rest}\n >\n {children}\n </Tag>\n );\n};\n\n/**\n * Props for the HeroBody component.\n */\nexport interface HeroBodyProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Additional CSS classes. */\n className?: string;\n /** Bulma color modifier for text. */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /**\n * Background color. `scheme-*` values render as a dark-mode-safe inline\n * `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 /** Text color. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Content. */\n children?: React.ReactNode;\n}\n\n/**\n * Main content area, vertically centered by default.\n *\n * @function\n * @param {HeroBodyProps} props - Props for the HeroBody component.\n * @returns {JSX.Element} The rendered hero body.\n */\nexport const HeroBody: React.FC<HeroBodyProps> = ({\n className,\n children,\n color,\n bgColor,\n textColor,\n style,\n ...props\n}) => {\n const { bulmaHelperClasses, bulmaHelperStyles, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n const mainClass = usePrefixedClassNames('hero-body');\n const heroBodyClasses = classNames(mainClass, bulmaHelperClasses, className);\n return (\n <div\n className={heroBodyClasses}\n style={mergeBulmaStyles(bulmaHelperStyles, style)}\n {...rest}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Props for the HeroFoot component.\n */\nexport interface HeroFootProps\n extends\n React.HTMLAttributes<HTMLElement>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /**\n * HTML element to render (default: `div`). `nav` suits a foot that holds\n * tabs or links. A `footer` is a `contentinfo` landmark only when no\n * `section`, `article`, `aside`, `nav` or `main` is around it, so inside\n * the default `<section>` hero it is not one: render the hero as a `div`\n * for that. A `footer` may not sit inside another `footer` or a `header`.\n */\n as?: 'div' | 'footer' | 'nav';\n /** Additional CSS classes. */\n className?: string;\n /** Bulma color modifier for text. */\n color?: (typeof validColors)[number] | 'inherit' | 'current';\n /**\n * Background color. `scheme-*` values render as a dark-mode-safe inline\n * `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 /** Text color. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Content. */\n children?: React.ReactNode;\n}\n\n/**\n * Bottom bar for tabs or actions.\n *\n * @function\n * @param {HeroFootProps} props - Props for the HeroFoot component.\n * @returns {JSX.Element} The rendered hero foot.\n */\nexport const HeroFoot: React.FC<HeroFootProps> = ({\n as: Tag = 'div',\n className,\n children,\n color,\n bgColor,\n textColor,\n style,\n ...props\n}) => {\n const { bulmaHelperClasses, bulmaHelperStyles, rest } = useBulmaClasses({\n color: textColor ?? color,\n backgroundColor: bgColor,\n ...props,\n });\n const mainClass = usePrefixedClassNames('hero-foot');\n const heroFootClasses = classNames(mainClass, bulmaHelperClasses, className);\n return (\n <Tag\n className={heroFootClasses}\n style={mergeBulmaStyles(bulmaHelperStyles, style)}\n {...rest}\n >\n {children}\n </Tag>\n );\n};\n\n// Attach subcomponents\nexport const Hero = withSubComponents(\n HeroComponent,\n {\n Head: HeroHead,\n Body: HeroBody,\n Foot: HeroFoot,\n },\n 'Hero'\n);\n\nexport default Hero;\n"],"names":["_jsx"],"mappings":"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"}
|
package/dist/esm/layout/Level.js
CHANGED
|
@@ -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';
|