loon-bulma-react 2025.0.34 → 2025.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/deploy-example.yml +43 -0
- package/.github/workflows/run-test.yml +31 -0
- package/.prettierignore +5 -0
- package/.prettierrc.json +19 -0
- package/dist/classes/Console.d.ts +29 -0
- package/dist/classes/FetchWrapper.d.ts +124 -0
- package/dist/components/AspectRatio/AspectRatio.d.ts +28 -0
- package/dist/components/Block/Block.d.ts +9 -0
- package/dist/components/Box/BorderBox.d.ts +29 -0
- package/dist/components/Box/Box.d.ts +20 -0
- package/dist/components/Button/Button.d.ts +84 -0
- package/dist/components/ButtonGroup/ButtonGroup.d.ts +26 -0
- package/dist/components/Calendar/CalendarItems/CalendarColoredItem.d.ts +18 -0
- package/dist/components/Calendar/CalendarItems/CalendarItem.d.ts +18 -0
- package/dist/components/Calendar/DayContainer.d.ts +25 -0
- package/dist/components/Calendar/EventDescriptions.d.ts +33 -0
- package/dist/components/Calendar/Fourweeks/FourweeksView.d.ts +23 -0
- package/dist/components/Calendar/Mini/MiniView.d.ts +24 -0
- package/dist/components/Calendar/Month/MonthView.d.ts +23 -0
- package/dist/components/Calendar/Planning/PlanningView.d.ts +42 -0
- package/dist/components/Calendar/Props.d.ts +58 -0
- package/dist/components/Calendar/Week/AlldayContainer.d.ts +19 -0
- package/dist/components/Calendar/Week/HourRow.d.ts +30 -0
- package/dist/components/Calendar/Week/WeekView.d.ts +24 -0
- package/dist/components/Calendar/calendar.functions.d.ts +10 -0
- package/dist/components/Calendar/index.d.ts +15 -0
- package/dist/components/CodeBlock/CodeBlock.d.ts +49 -0
- package/dist/components/Columns/Column.d.ts +207 -0
- package/dist/components/Columns/Columns.d.ts +35 -0
- package/dist/components/Container/Container.d.ts +44 -0
- package/dist/components/Content/Content.d.ts +22 -0
- package/dist/components/DataTable/DataTable.d.ts +187 -0
- package/dist/components/Divider/Divider.d.ts +8 -0
- package/dist/components/Dropdown/Dropdown.d.ts +25 -0
- package/dist/components/Footer/Footer.d.ts +22 -0
- package/dist/components/Help/Help.d.ts +19 -0
- package/dist/components/Hero/Hero.d.ts +104 -0
- package/dist/components/Icon/Icon.d.ts +82 -0
- package/dist/components/Image/Image.d.ts +28 -0
- package/dist/components/Indicator/Indicator.d.ts +25 -0
- package/dist/components/Kbd/Kbd.d.ts +30 -0
- package/dist/components/Label/Label.d.ts +11 -0
- package/dist/components/Link/Link.d.ts +44 -0
- package/dist/components/Menu/Menu.d.ts +64 -0
- package/dist/components/Message/Message.d.ts +49 -0
- package/dist/components/Modal/Modal.d.ts +74 -0
- package/dist/components/Notification/Notification.d.ts +38 -0
- package/dist/components/Pagination/Pagination.d.ts +56 -0
- package/dist/components/Panel/Panel.d.ts +98 -0
- package/dist/components/ProgressBar/ProgressBar.d.ts +28 -0
- package/dist/components/QuickView/QuickView.d.ts +61 -0
- package/dist/components/ScrollArea/ScrollArea.d.ts +76 -0
- package/dist/components/Section/Section.d.ts +21 -0
- package/dist/components/SimpleTable/SimpleTable.d.ts +121 -0
- package/dist/components/Steps/Steps.d.ts +61 -0
- package/dist/components/TabBar/TabBar.d.ts +47 -0
- package/dist/components/Tag/Tag.d.ts +54 -0
- package/dist/components/TimeLine/TimeLine.d.ts +62 -0
- package/dist/components/Titles/Titles.d.ts +71 -0
- package/dist/components/ToggleBar/ToggleBar.d.ts +80 -0
- package/dist/components/Tooltip/Tooltip.d.ts +49 -0
- package/dist/components/TreeView/TreeView.d.ts +48 -0
- package/dist/contexts/ActionSheet/ActionSheetContextProvider.d.ts +76 -0
- package/dist/contexts/AppProvider/AppProviders.d.ts +18 -0
- package/dist/contexts/ColorSchemeProvider/ColorSchemeProvider.d.ts +15 -0
- package/dist/contexts/Confirm/ConfirmContextProvider.d.ts +60 -0
- package/dist/contexts/DefaultsProvider/DefaultsProvider.d.ts +94 -0
- package/dist/contexts/DialogsProvider/DialogsProvider.d.ts +4 -0
- package/dist/contexts/KeysProvider/KeysProvider.d.ts +35 -0
- package/dist/contexts/ModalProvider/ModalProvider.d.ts +11 -0
- package/dist/contexts/ModeProvider/ModeProvider.d.ts +14 -0
- package/dist/contexts/Notifier/Notifier.d.ts +81 -0
- package/dist/contexts/Prompt/PromptContextProvider.d.ts +71 -0
- package/dist/forms/Checkbox/Checkbox.d.ts +47 -0
- package/dist/forms/ComboBox/ComboBox.d.ts +44 -0
- package/dist/forms/ComboBox/MultiComboBox.d.ts +44 -0
- package/dist/forms/ComboBox/useComboBoxScroll.d.ts +4 -0
- package/dist/forms/Currency/CurrencyInput.d.ts +47 -0
- package/dist/forms/Datetimes/DateInput.d.ts +37 -0
- package/dist/forms/Datetimes/DateTimeInput.d.ts +44 -0
- package/dist/forms/Datetimes/TimeInput.d.ts +42 -0
- package/dist/forms/File/FileInput.d.ts +71 -0
- package/dist/forms/Input.d.ts +223 -0
- package/dist/forms/MaskedInput/MaskedInput.d.ts +46 -0
- package/dist/forms/Numeric/NumberInput.d.ts +14 -0
- package/dist/forms/Numeric/RangeInput.d.ts +21 -0
- package/dist/forms/Others/ColorInput.d.ts +56 -0
- package/dist/forms/Others/HiddenInput.d.ts +29 -0
- package/dist/forms/Others/TelephoneInput.d.ts +14 -0
- package/dist/forms/Others/URLInput.d.ts +14 -0
- package/dist/forms/Periodes/MonthInput.d.ts +43 -0
- package/dist/forms/Periodes/WeekInput.d.ts +43 -0
- package/dist/forms/Radio/Radio.d.ts +97 -0
- package/dist/forms/Select/Select.d.ts +132 -0
- package/dist/forms/TagsInput/TagsInput.d.ts +44 -0
- package/dist/forms/Text/EmailInput.d.ts +14 -0
- package/dist/forms/Text/FormattedInput.d.ts +54 -0
- package/dist/forms/Text/PasswordInput.d.ts +19 -0
- package/dist/forms/Text/TextArea.d.ts +31 -0
- package/dist/forms/Text/TextEditor.d.ts +36 -0
- package/dist/forms/Text/TextInput.d.ts +30 -0
- package/dist/hooks/useCaretPosition.d.ts +8 -0
- package/dist/hooks/useClickOutside.d.ts +15 -0
- package/dist/hooks/useClipboard.d.ts +21 -0
- package/dist/hooks/useContextMenu.d.ts +29 -0
- package/dist/hooks/useCookieState.d.ts +37 -0
- package/dist/hooks/useDebounced.hooks.d.ts +55 -0
- package/dist/hooks/useFetchApi.d.ts +65 -0
- package/dist/hooks/useHotkeys.d.ts +44 -0
- package/dist/hooks/useIndexedDb.d.ts +89 -0
- package/dist/hooks/useLocalStoredState.d.ts +36 -0
- package/dist/hooks/usePagination.d.ts +25 -0
- package/dist/hooks/usePropState.d.ts +16 -0
- package/dist/hooks/useScrollIntoView.d.ts +59 -0
- package/dist/hooks/useSessionStoredState.d.ts +38 -0
- package/dist/hooks/useToggle.d.ts +16 -0
- package/dist/hooks/useUncontrolled.d.ts +44 -0
- package/dist/hooks/useValidatedState.d.ts +21 -0
- package/dist/index.d.ts +169 -5773
- package/dist/index.js +37319 -55
- package/dist/internal_functions/createIconsInternal.d.ts +17 -0
- package/dist/internal_functions/getAlignmentClass.d.ts +16 -0
- package/dist/internal_functions/getColorClass.d.ts +23 -0
- package/dist/internal_functions/getPositionClass.d.ts +2 -0
- package/dist/internal_functions/getSizeClass.d.ts +23 -0
- package/dist/internal_functions/index.d.ts +8 -0
- package/{styles → dist/styles}/_all.scss +3 -1
- package/dist/styles/tooltip.scss +32 -0
- package/dist/test-data.d.ts +9 -0
- package/dist/types/index.d.ts +111 -0
- package/dist/utils/JSDateTime.class.d.ts +510 -0
- package/dist/utils/JSDuration.class.d.ts +79 -0
- package/dist/utils/calculateTxtColor.function.d.ts +14 -0
- package/dist/utils/colors.d.ts +26 -0
- package/dist/utils/colorscheme.d.ts +5 -0
- package/dist/utils/compare.d.ts +7 -0
- package/dist/utils/deserialize.function.d.ts +2 -0
- package/dist/utils/hasBSN.function.d.ts +27 -0
- package/dist/utils/isIBAN.function.d.ts +24 -0
- package/dist/utils/math.d.ts +22 -0
- package/dist/utils/operators.d.ts +192 -0
- package/dist/utils/serialize.function.d.ts +2 -0
- package/dist/utils/sorting.d.ts +34 -0
- package/dist/utils/string.utils.d.ts +72 -0
- package/eslint.config.js +108 -0
- package/index.html +16 -0
- package/jest.config.ts +12 -0
- package/lib/classes/Console.ts +78 -0
- package/lib/classes/FetchWrapper.ts +392 -0
- package/lib/components/AspectRatio/AspectRatio.test.tsx +67 -0
- package/lib/components/AspectRatio/AspectRatio.tsx +40 -0
- package/lib/components/Block/Block.test.tsx +24 -0
- package/lib/components/Block/Block.tsx +13 -0
- package/lib/components/Box/BorderBox.test.tsx +24 -0
- package/lib/components/Box/BorderBox.tsx +79 -0
- package/lib/components/Box/Box.test.tsx +24 -0
- package/lib/components/Box/Box.tsx +30 -0
- package/lib/components/Button/Button.test.tsx +871 -0
- package/lib/components/Button/Button.tsx +217 -0
- package/lib/components/ButtonGroup/ButtonGroup.test.tsx +115 -0
- package/lib/components/ButtonGroup/ButtonGroup.tsx +130 -0
- package/lib/components/Calendar/CalendarItems/CalendarColoredItem.tsx +63 -0
- package/lib/components/Calendar/CalendarItems/CalendarItem.tsx +49 -0
- package/lib/components/Calendar/DayContainer.tsx +115 -0
- package/lib/components/Calendar/EventDescriptions.tsx +131 -0
- package/lib/components/Calendar/Fourweeks/FourweeksView.test.tsx +262 -0
- package/lib/components/Calendar/Fourweeks/FourweeksView.tsx +169 -0
- package/lib/components/Calendar/Mini/MiniView.tsx +127 -0
- package/lib/components/Calendar/Month/MonthView.test.tsx +266 -0
- package/lib/components/Calendar/Month/MonthView.tsx +178 -0
- package/lib/components/Calendar/Planning/PlanningView.tsx +195 -0
- package/lib/components/Calendar/Props.tsx +64 -0
- package/lib/components/Calendar/Week/AlldayContainer.tsx +38 -0
- package/lib/components/Calendar/Week/HourRow.tsx +159 -0
- package/lib/components/Calendar/Week/WeekView.test.tsx +291 -0
- package/lib/components/Calendar/Week/WeekView.tsx +176 -0
- package/lib/components/Calendar/calendar.functions.ts +32 -0
- package/lib/components/Calendar/index.ts +17 -0
- package/lib/components/CodeBlock/CodeBlock.tsx +128 -0
- package/lib/components/Columns/Column.test.tsx +145 -0
- package/lib/components/Columns/Column.tsx +316 -0
- package/lib/components/Columns/Columns.test.tsx +95 -0
- package/lib/components/Columns/Columns.tsx +62 -0
- package/lib/components/Container/Container.test.tsx +87 -0
- package/lib/components/Container/Container.tsx +140 -0
- package/lib/components/Content/Content.test.tsx +51 -0
- package/lib/components/Content/Content.tsx +31 -0
- package/lib/components/DataTable/DataTable.test.tsx +403 -0
- package/lib/components/DataTable/DataTable.tsx +726 -0
- package/lib/components/Divider/Divider.tsx +18 -0
- package/lib/components/Dropdown/Dropdown.tsx +112 -0
- package/lib/components/Footer/Footer.test.tsx +42 -0
- package/lib/components/Footer/Footer.tsx +34 -0
- package/lib/components/Help/Help.test.tsx +83 -0
- package/lib/components/Help/Help.tsx +25 -0
- package/lib/components/Hero/Hero.test.tsx +222 -0
- package/lib/components/Hero/Hero.tsx +214 -0
- package/lib/components/Icon/Icon.test.tsx +157 -0
- package/lib/components/Icon/Icon.tsx +192 -0
- package/lib/components/Image/Image.test.tsx +72 -0
- package/lib/components/Image/Image.tsx +60 -0
- package/lib/components/Indicator/Indicator.test.tsx +68 -0
- package/lib/components/Indicator/Indicator.tsx +46 -0
- package/lib/components/Kbd/Kbd.test.tsx +49 -0
- package/lib/components/Kbd/Kbd.tsx +51 -0
- package/lib/components/Label/Label.tsx +21 -0
- package/lib/components/Link/Link.test.tsx +84 -0
- package/lib/components/Link/Link.tsx +87 -0
- package/lib/components/Menu/Menu.test.tsx +154 -0
- package/lib/components/Menu/Menu.tsx +264 -0
- package/lib/components/Message/Message.test.tsx +112 -0
- package/lib/components/Message/Message.tsx +154 -0
- package/lib/components/Modal/Modal.test.tsx +188 -0
- package/lib/components/Modal/Modal.tsx +188 -0
- package/lib/components/Notification/Notification.test.tsx +175 -0
- package/lib/components/Notification/Notification.tsx +110 -0
- package/lib/components/Pagination/Pagination.tsx +143 -0
- package/lib/components/Panel/Panel.tsx +225 -0
- package/lib/components/ProgressBar/ProgressBar.test.tsx +92 -0
- package/lib/components/ProgressBar/ProgressBar.tsx +42 -0
- package/lib/components/QuickView/QuickView.test.tsx +81 -0
- package/lib/components/QuickView/QuickView.tsx +122 -0
- package/lib/components/ScrollArea/ScrollArea.test.tsx +682 -0
- package/lib/components/ScrollArea/ScrollArea.tsx +183 -0
- package/lib/components/Section/Section.test.tsx +24 -0
- package/lib/components/Section/Section.tsx +32 -0
- package/lib/components/SimpleTable/SimpleTable.test.tsx +135 -0
- package/lib/components/SimpleTable/SimpleTable.tsx +327 -0
- package/lib/components/Steps/Steps.test.tsx +356 -0
- package/lib/components/Steps/Steps.tsx +164 -0
- package/lib/components/TabBar/TabBar.test.tsx +134 -0
- package/lib/components/TabBar/TabBar.tsx +125 -0
- package/lib/components/Tag/Tag.test.tsx +184 -0
- package/lib/components/Tag/Tag.tsx +131 -0
- package/lib/components/TimeLine/TimeLine.test.tsx +149 -0
- package/lib/components/TimeLine/TimeLine.tsx +116 -0
- package/lib/components/Titles/Titles.test.tsx +53 -0
- package/lib/components/Titles/Titles.tsx +205 -0
- package/lib/components/ToggleBar/ToggleBar.test.tsx +228 -0
- package/lib/components/ToggleBar/ToggleBar.tsx +208 -0
- package/lib/components/Tooltip/Tooltip.test.tsx +61 -0
- package/lib/components/Tooltip/Tooltip.tsx +203 -0
- package/lib/components/TreeView/TreeView.tsx +233 -0
- package/lib/contexts/ActionSheet/ActionSheetContextProvider.test.tsx +24 -0
- package/lib/contexts/ActionSheet/ActionSheetContextProvider.tsx +237 -0
- package/lib/contexts/AppProvider/AppProviders.tsx +56 -0
- package/lib/contexts/ColorSchemeProvider/ColorSchemeProvider.tsx +49 -0
- package/lib/contexts/Confirm/ConfirmContextProvider.test.tsx +24 -0
- package/lib/contexts/Confirm/ConfirmContextProvider.tsx +227 -0
- package/lib/contexts/DefaultsProvider/DefaultsProvider.tsx +178 -0
- package/lib/contexts/DialogsProvider/DialogsProvider.tsx +14 -0
- package/lib/contexts/KeysProvider/KeysProvider.tsx +344 -0
- package/lib/contexts/ModalProvider/ModalProvider.tsx +59 -0
- package/lib/contexts/ModeProvider/ModeProvider.tsx +26 -0
- package/lib/contexts/Notifier/Notifier.test.tsx +342 -0
- package/lib/contexts/Notifier/Notifier.tsx +209 -0
- package/lib/contexts/Prompt/PromptContextProvider.test.tsx +24 -0
- package/lib/contexts/Prompt/PromptContextProvider.tsx +280 -0
- package/lib/forms/Checkbox/Checkbox.test.tsx +171 -0
- package/lib/forms/Checkbox/Checkbox.tsx +256 -0
- package/lib/forms/ComboBox/ComboBox.test.tsx +24 -0
- package/lib/forms/ComboBox/ComboBox.tsx +464 -0
- package/lib/forms/ComboBox/MultiComboBox.test.tsx +30 -0
- package/lib/forms/ComboBox/MultiComboBox.tsx +282 -0
- package/lib/forms/ComboBox/useComboBoxScroll.test.ts +30 -0
- package/lib/forms/ComboBox/useComboBoxScroll.ts +35 -0
- package/lib/forms/Currency/CurrencyInput.test.tsx +131 -0
- package/lib/forms/Currency/CurrencyInput.tsx +269 -0
- package/lib/forms/Datetimes/DateInput.test.tsx +198 -0
- package/lib/forms/Datetimes/DateInput.tsx +56 -0
- package/lib/forms/Datetimes/DateTimeInput.test.tsx +223 -0
- package/lib/forms/Datetimes/DateTimeInput.tsx +102 -0
- package/lib/forms/Datetimes/TimeInput.test.tsx +218 -0
- package/lib/forms/Datetimes/TimeInput.tsx +100 -0
- package/lib/forms/File/FileInput.test.tsx +175 -0
- package/lib/forms/File/FileInput.tsx +240 -0
- package/lib/forms/Input.test.tsx +158 -0
- package/lib/forms/Input.tsx +542 -0
- package/lib/forms/MaskedInput/MaskedInput.tsx +651 -0
- package/lib/forms/Numeric/NumberInput.test.tsx +233 -0
- package/lib/forms/Numeric/NumberInput.tsx +171 -0
- package/lib/forms/Numeric/RangeInput.test.tsx +187 -0
- package/lib/forms/Numeric/RangeInput.tsx +166 -0
- package/lib/forms/Others/ColorInput.test.tsx +181 -0
- package/lib/forms/Others/ColorInput.tsx +117 -0
- package/lib/forms/Others/HiddenInput.test.tsx +25 -0
- package/lib/forms/Others/HiddenInput.tsx +46 -0
- package/lib/forms/Others/TelephoneInput.test.tsx +153 -0
- package/lib/forms/Others/TelephoneInput.tsx +26 -0
- package/lib/forms/Others/URLInput.test.tsx +153 -0
- package/lib/forms/Others/URLInput.tsx +30 -0
- package/lib/forms/Periodes/MonthInput.test.tsx +119 -0
- package/lib/forms/Periodes/MonthInput.tsx +63 -0
- package/lib/forms/Periodes/WeekInput.test.tsx +119 -0
- package/lib/forms/Periodes/WeekInput.tsx +63 -0
- package/lib/forms/Radio/Radio.test.tsx +322 -0
- package/lib/forms/Radio/Radio.tsx +347 -0
- package/lib/forms/Select/Select.test.tsx +223 -0
- package/lib/forms/Select/Select.tsx +405 -0
- package/lib/forms/TagsInput/TagsInput.test.tsx +27 -0
- package/lib/forms/TagsInput/TagsInput.tsx +289 -0
- package/lib/forms/Text/EmailInput.test.tsx +153 -0
- package/lib/forms/Text/EmailInput.tsx +29 -0
- package/lib/forms/Text/FormattedInput.tsx +271 -0
- package/lib/forms/Text/PasswordInput.test.tsx +160 -0
- package/lib/forms/Text/PasswordInput.tsx +154 -0
- package/lib/forms/Text/TextArea.test.tsx +164 -0
- package/lib/forms/Text/TextArea.tsx +169 -0
- package/lib/forms/Text/TextEditor.test.tsx +12 -0
- package/lib/forms/Text/TextEditor.tsx +612 -0
- package/lib/forms/Text/TextInput.test.tsx +147 -0
- package/lib/forms/Text/TextInput.tsx +60 -0
- package/lib/hooks/useCaretPosition.test.tsx +31 -0
- package/lib/hooks/useCaretPosition.tsx +23 -0
- package/lib/hooks/useClickOutside.test.tsx +101 -0
- package/lib/hooks/useClickOutside.ts +44 -0
- package/lib/hooks/useClipboard.ts +59 -0
- package/lib/hooks/useContextMenu.tsx +74 -0
- package/lib/hooks/useCookieState.tsx +117 -0
- package/lib/hooks/useDebounced.hooks.test.ts +70 -0
- package/lib/hooks/useDebounced.hooks.ts +110 -0
- package/lib/hooks/useFetchApi.ts +91 -0
- package/lib/hooks/useHotkeys.test.tsx +111 -0
- package/lib/hooks/useHotkeys.ts +139 -0
- package/lib/hooks/useIndexedDb.tsx +337 -0
- package/lib/hooks/useLocalStoredState.test.tsx +98 -0
- package/lib/hooks/useLocalStoredState.ts +86 -0
- package/lib/hooks/usePagination.test.ts +113 -0
- package/lib/hooks/usePagination.ts +96 -0
- package/lib/hooks/usePropState.ts +25 -0
- package/lib/hooks/useScrollIntoView.ts +250 -0
- package/lib/hooks/useSessionStoredState.ts +87 -0
- package/lib/hooks/useToggle.test.tsx +52 -0
- package/lib/hooks/useToggle.ts +30 -0
- package/lib/hooks/useUncontrolled.test.ts +52 -0
- package/lib/hooks/useUncontrolled.ts +65 -0
- package/lib/hooks/useValidatedState.test.tsx +37 -0
- package/lib/hooks/useValidatedState.ts +37 -0
- package/lib/index.ts +246 -0
- package/lib/internal_functions/createIconsInternal.tsx +94 -0
- package/lib/internal_functions/getAlignmentClass.ts +37 -0
- package/lib/internal_functions/getColorClass.ts +73 -0
- package/lib/internal_functions/getPositionClass.ts +15 -0
- package/lib/internal_functions/getSizeClass.ts +57 -0
- package/lib/internal_functions/index.ts +9 -0
- package/lib/styles/_all.scss +457 -0
- package/lib/styles/bulma-box.scss +135 -0
- package/lib/styles/button.scss +565 -0
- package/lib/styles/buttons.scss +19 -0
- package/lib/styles/calendar.scss +148 -0
- package/lib/styles/checkradio.scss +662 -0
- package/lib/styles/datalist.scss +27 -0
- package/lib/styles/divider.scss +30 -0
- package/lib/styles/dropdown.scss +175 -0
- package/lib/styles/extra-inputs.scss +77 -0
- package/lib/styles/hero.scss +285 -0
- package/lib/styles/indicators.scss +142 -0
- package/lib/styles/keyboard.scss +15 -0
- package/lib/styles/linkbutton.scss +40 -0
- package/lib/styles/menu.scss +164 -0
- package/lib/styles/mini-calendar.scss +70 -0
- package/lib/styles/notifier-container.scss +27 -0
- package/lib/styles/panel.scss +222 -0
- package/lib/styles/quickview.scss +140 -0
- package/lib/styles/range-sliders.scss +298 -0
- package/lib/styles/select.scss +144 -0
- package/lib/styles/steps.scss +288 -0
- package/lib/styles/table.scss +330 -0
- package/lib/styles/tabs.scss +271 -0
- package/lib/styles/timeline.scss +314 -0
- package/lib/styles/tooltip.scss +32 -0
- package/lib/styles/treeview.scss +37 -0
- package/lib/test-data.ts +9002 -0
- package/lib/types/index.tsx +180 -0
- package/lib/types/react-app-env.d.ts +1 -0
- package/lib/types/typings.d.ts +373 -0
- package/lib/utils/JSDateTime.class.test.ts +890 -0
- package/lib/utils/JSDateTime.class.ts +766 -0
- package/lib/utils/JSDuration.class.test.ts +98 -0
- package/lib/utils/JSDuration.class.ts +159 -0
- package/lib/utils/calculateTxtColor.function.test.ts +53 -0
- package/lib/utils/calculateTxtColor.function.ts +56 -0
- package/lib/utils/colors.test.ts +78 -0
- package/lib/utils/colors.ts +178 -0
- package/lib/utils/colorscheme.ts +26 -0
- package/lib/utils/compare.test.ts +137 -0
- package/lib/utils/compare.ts +32 -0
- package/lib/utils/deserialize.function.test.ts +15 -0
- package/lib/utils/deserialize.function.ts +9 -0
- package/lib/utils/hasBSN.function.test.ts +27 -0
- package/lib/utils/hasBSN.function.ts +53 -0
- package/lib/utils/isIBAN.function.test.ts +25 -0
- package/lib/utils/isIBAN.function.ts +131 -0
- package/lib/utils/math.test.ts +70 -0
- package/lib/utils/math.ts +32 -0
- package/lib/utils/operators.test.ts +619 -0
- package/lib/utils/operators.ts +242 -0
- package/lib/utils/serialize.function.test.ts +13 -0
- package/lib/utils/serialize.function.ts +9 -0
- package/lib/utils/sorting.test.ts +114 -0
- package/lib/utils/sorting.ts +50 -0
- package/lib/utils/string.utils.test.ts +85 -0
- package/lib/utils/string.utils.ts +146 -0
- package/lib/vite-env.d.ts +1 -0
- package/package.json +55 -83
- package/public/vite.svg +1 -0
- package/src/App.tsx +77 -0
- package/src/AppHero.tsx +102 -0
- package/src/Console.ts +28 -0
- package/src/MOCK_DATA.ts +10014 -0
- package/src/Tabs/AspectRatioTab.tsx +235 -0
- package/src/Tabs/ButtonsAndTags.tsx +843 -0
- package/src/Tabs/CalendarTab.tsx +560 -0
- package/src/Tabs/ContextsTab.tsx +820 -0
- package/src/Tabs/DataTableTab.tsx +291 -0
- package/src/Tabs/FunctionsTab.tsx +947 -0
- package/src/Tabs/HooksTab.tsx +1008 -0
- package/src/Tabs/InputsTab.tsx +2319 -0
- package/src/Tabs/LayoutsTab.tsx +751 -0
- package/src/Tabs/Nieuw.tsx +440 -0
- package/src/Tabs/NotificationTab.tsx +301 -0
- package/src/Tabs/OverigeTab.tsx +1631 -0
- package/src/Tabs/ReadmeTab.tsx +260 -0
- package/src/Tabs/TestTab.tsx +44 -0
- package/src/Tabs/datatable.css +7 -0
- package/src/Tabs/index.ts +14 -0
- package/src/assets/react.svg +1 -0
- package/src/components/Chevrons.tsx +15 -0
- package/src/components/CodeVoorbeeld.tsx +41 -0
- package/src/components/Nieuwsblok.tsx +22 -0
- package/src/main.tsx +10 -0
- package/src/styles/example-styles.scss +8 -0
- package/src/styles.css +14244 -0
- package/src/styles.css.map +1 -0
- package/src/vite-env.d.ts +1 -0
- package/tsconfig.app.json +32 -0
- package/tsconfig.build.json +132 -0
- package/tsconfig.json +11 -0
- package/tsconfig.node.json +30 -0
- package/vite.config.ts +52 -0
- package/dist/index.cjs +0 -283
- package/dist/index.d.cts +0 -5773
- package/styles/tooltip.scss +0 -201
- /package/{styles → dist/styles}/bulma-box.scss +0 -0
- /package/{styles → dist/styles}/button.scss +0 -0
- /package/{styles → dist/styles}/buttons.scss +0 -0
- /package/{styles → dist/styles}/calendar.scss +0 -0
- /package/{styles → dist/styles}/checkradio.scss +0 -0
- /package/{styles → dist/styles}/datalist.scss +0 -0
- /package/{styles → dist/styles}/divider.scss +0 -0
- /package/{styles → dist/styles}/dropdown.scss +0 -0
- /package/{styles → dist/styles}/extra-inputs.scss +0 -0
- /package/{styles → dist/styles}/hero.scss +0 -0
- /package/{styles → dist/styles}/indicators.scss +0 -0
- /package/{styles → dist/styles}/keyboard.scss +0 -0
- /package/{styles → dist/styles}/linkbutton.scss +0 -0
- /package/{styles → dist/styles}/menu.scss +0 -0
- /package/{styles → dist/styles}/mini-calendar.scss +0 -0
- /package/{styles → dist/styles}/notifier-container.scss +0 -0
- /package/{styles → dist/styles}/panel.scss +0 -0
- /package/{styles → dist/styles}/quickview.scss +0 -0
- /package/{styles → dist/styles}/range-sliders.scss +0 -0
- /package/{styles → dist/styles}/select.scss +0 -0
- /package/{styles → dist/styles}/steps.scss +0 -0
- /package/{styles → dist/styles}/table.scss +0 -0
- /package/{styles → dist/styles}/tabs.scss +0 -0
- /package/{styles → dist/styles}/timeline.scss +0 -0
- /package/{styles → dist/styles}/treeview.scss +0 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/* eslint-disable testing-library/no-node-access */
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { render, screen } from '@testing-library/react';
|
|
4
|
+
import '@testing-library/jest-dom';
|
|
5
|
+
import user from '@testing-library/user-event';
|
|
6
|
+
|
|
7
|
+
import { ToggleBar } from './ToggleBar';
|
|
8
|
+
import { faHorseHead } from '@fortawesome/free-solid-svg-icons';
|
|
9
|
+
import { Icon } from '../Icon/Icon';
|
|
10
|
+
|
|
11
|
+
describe('Test <ToggleBar>', () => {
|
|
12
|
+
test('Should be a function', () => expect(ToggleBar).toBeInstanceOf(Function));
|
|
13
|
+
test('Should export .Item & .OnOffItem on ToggleBar', () => {
|
|
14
|
+
expect(ToggleBar.Item).toBeInstanceOf(Function);
|
|
15
|
+
expect(ToggleBar.OnOffItem).toBeInstanceOf(Function);
|
|
16
|
+
render(
|
|
17
|
+
<>
|
|
18
|
+
<ToggleBar.Item>item</ToggleBar.Item>
|
|
19
|
+
<ToggleBar.OnOffItem>on/off</ToggleBar.OnOffItem>
|
|
20
|
+
</>
|
|
21
|
+
);
|
|
22
|
+
});
|
|
23
|
+
test('Should render with toggle-items', async () => {
|
|
24
|
+
const mockToggle = jest.fn();
|
|
25
|
+
render(
|
|
26
|
+
<ToggleBar onToggle={mockToggle}>
|
|
27
|
+
<ToggleBar.Item>A</ToggleBar.Item>
|
|
28
|
+
<ToggleBar.Item identifier="B">
|
|
29
|
+
<Icon icon={faHorseHead} />B
|
|
30
|
+
</ToggleBar.Item>
|
|
31
|
+
<ToggleBar.Item>
|
|
32
|
+
<span>C</span>
|
|
33
|
+
</ToggleBar.Item>
|
|
34
|
+
</ToggleBar>
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
const A = screen.getByText('A');
|
|
38
|
+
const B = screen.getByText('B');
|
|
39
|
+
const C = screen.getByText('C');
|
|
40
|
+
|
|
41
|
+
await user.click(B);
|
|
42
|
+
expect(mockToggle).toHaveBeenCalledTimes(1);
|
|
43
|
+
expect(mockToggle).toHaveBeenCalledWith('B');
|
|
44
|
+
|
|
45
|
+
await user.click(A);
|
|
46
|
+
expect(mockToggle).toHaveBeenCalledTimes(2);
|
|
47
|
+
expect(mockToggle).toHaveBeenCalledWith('A');
|
|
48
|
+
|
|
49
|
+
await user.click(C);
|
|
50
|
+
expect(mockToggle).toHaveBeenCalledTimes(3);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('Should render with on/off-toggle-items', async () => {
|
|
54
|
+
const mockFnA = jest.fn();
|
|
55
|
+
const mockFnB = jest.fn();
|
|
56
|
+
const mockFnC = jest.fn();
|
|
57
|
+
render(
|
|
58
|
+
<ToggleBar>
|
|
59
|
+
<ToggleBar.OnOffItem toggled={true} onToggle={mockFnA}>
|
|
60
|
+
A
|
|
61
|
+
</ToggleBar.OnOffItem>
|
|
62
|
+
<ToggleBar.OnOffItem toggled={false} onToggle={mockFnB}>
|
|
63
|
+
B
|
|
64
|
+
</ToggleBar.OnOffItem>
|
|
65
|
+
<ToggleBar.OnOffItem toggled={false} onToggle={mockFnC}>
|
|
66
|
+
C
|
|
67
|
+
</ToggleBar.OnOffItem>
|
|
68
|
+
</ToggleBar>
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
const A = screen.getByText('A');
|
|
72
|
+
const B = screen.getByText('B');
|
|
73
|
+
const C = screen.getByText('C');
|
|
74
|
+
|
|
75
|
+
await user.click(A);
|
|
76
|
+
expect(mockFnA).toHaveBeenCalledTimes(1);
|
|
77
|
+
expect(mockFnA).toHaveBeenCalledWith(false, 'A');
|
|
78
|
+
await user.click(B);
|
|
79
|
+
expect(mockFnB).toHaveBeenCalledTimes(1);
|
|
80
|
+
expect(mockFnB).toHaveBeenCalledWith(true, 'B');
|
|
81
|
+
await user.click(C);
|
|
82
|
+
expect(mockFnC).toHaveBeenCalledTimes(1);
|
|
83
|
+
expect(mockFnC).toHaveBeenCalledWith(true, 'C');
|
|
84
|
+
|
|
85
|
+
expect(mockFnA).toHaveBeenCalledTimes(1);
|
|
86
|
+
expect(mockFnB).toHaveBeenCalledTimes(1);
|
|
87
|
+
expect(mockFnC).toHaveBeenCalledTimes(1);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
describe('test size prop', () => {
|
|
91
|
+
test(' size "s"', () => {
|
|
92
|
+
const mockToggle = jest.fn();
|
|
93
|
+
render(
|
|
94
|
+
<ToggleBar onToggle={mockToggle} size="s">
|
|
95
|
+
<ToggleBar.Item>A</ToggleBar.Item>
|
|
96
|
+
<ToggleBar.Item>
|
|
97
|
+
<Icon icon={faHorseHead} />B
|
|
98
|
+
</ToggleBar.Item>
|
|
99
|
+
<ToggleBar.Item>
|
|
100
|
+
<span>C</span>
|
|
101
|
+
</ToggleBar.Item>
|
|
102
|
+
</ToggleBar>
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
const bar = screen.getByText('A');
|
|
106
|
+
expect(bar).toHaveClass('tab');
|
|
107
|
+
expect(bar.parentElement?.parentElement?.parentElement).toHaveClass('tabs', 'is-small');
|
|
108
|
+
expect(bar).toBeInstanceOf(HTMLSpanElement);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test('size "m" (default), centered', () => {
|
|
112
|
+
const mockToggle = jest.fn();
|
|
113
|
+
render(
|
|
114
|
+
<ToggleBar onToggle={mockToggle} size="m" alignment="c" rounded>
|
|
115
|
+
<ToggleBar.Item>A</ToggleBar.Item>
|
|
116
|
+
<ToggleBar.Item>
|
|
117
|
+
<Icon icon={faHorseHead} />B
|
|
118
|
+
</ToggleBar.Item>
|
|
119
|
+
<ToggleBar.Item>
|
|
120
|
+
<span>C</span>
|
|
121
|
+
</ToggleBar.Item>
|
|
122
|
+
</ToggleBar>
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
const bar = screen.getByText('A');
|
|
126
|
+
expect(bar).toHaveClass('tab');
|
|
127
|
+
expect(bar.parentElement?.parentElement?.parentElement).toHaveClass('tabs', 'is-normal');
|
|
128
|
+
expect(bar).toBeInstanceOf(HTMLSpanElement);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test('size "l", right-aligned', () => {
|
|
132
|
+
const mockToggle = jest.fn();
|
|
133
|
+
render(
|
|
134
|
+
<ToggleBar onToggle={mockToggle} size="l" alignment="r">
|
|
135
|
+
<ToggleBar.Item>A</ToggleBar.Item>
|
|
136
|
+
<ToggleBar.Item>
|
|
137
|
+
<Icon icon={faHorseHead} />B
|
|
138
|
+
</ToggleBar.Item>
|
|
139
|
+
<ToggleBar.Item>
|
|
140
|
+
<span>C</span>
|
|
141
|
+
</ToggleBar.Item>
|
|
142
|
+
</ToggleBar>
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
const bar = screen.getByText('A');
|
|
146
|
+
expect(bar).toHaveClass('tab');
|
|
147
|
+
expect(bar.parentElement?.parentElement?.parentElement).toHaveClass('tabs', 'is-medium');
|
|
148
|
+
expect(bar).toBeInstanceOf(HTMLSpanElement);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test('size "xl"', () => {
|
|
152
|
+
const mockToggle = jest.fn();
|
|
153
|
+
render(
|
|
154
|
+
<ToggleBar onToggle={mockToggle} size="xl">
|
|
155
|
+
<ToggleBar.Item>A</ToggleBar.Item>
|
|
156
|
+
<ToggleBar.Item>
|
|
157
|
+
<Icon icon={faHorseHead} />B
|
|
158
|
+
</ToggleBar.Item>
|
|
159
|
+
<ToggleBar.Item>
|
|
160
|
+
<span>C</span>
|
|
161
|
+
</ToggleBar.Item>
|
|
162
|
+
</ToggleBar>
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
const bar = screen.getByText('A');
|
|
166
|
+
expect(bar).toHaveClass('tab');
|
|
167
|
+
expect(bar.parentElement?.parentElement?.parentElement).toHaveClass('tabs', 'is-large');
|
|
168
|
+
expect(bar).toBeInstanceOf(HTMLSpanElement);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
describe('test disabled prop', () => {
|
|
173
|
+
test('Toggle Item', async () => {
|
|
174
|
+
const mockToggle = jest.fn();
|
|
175
|
+
render(
|
|
176
|
+
<ToggleBar onToggle={mockToggle}>
|
|
177
|
+
<ToggleBar.Item disabled>A</ToggleBar.Item>
|
|
178
|
+
</ToggleBar>
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
const A = screen.getByText('A');
|
|
182
|
+
expect(A).not.toHaveClass('is-toggled');
|
|
183
|
+
await user.click(A);
|
|
184
|
+
expect(A).not.toHaveClass('is-toggled');
|
|
185
|
+
expect(mockToggle).not.toHaveBeenCalled();
|
|
186
|
+
});
|
|
187
|
+
test('Toggle OnOffItem', async () => {
|
|
188
|
+
const mockToggle = jest.fn();
|
|
189
|
+
render(
|
|
190
|
+
<ToggleBar onToggle={mockToggle}>
|
|
191
|
+
<ToggleBar.OnOffItem disabled>A</ToggleBar.OnOffItem>
|
|
192
|
+
</ToggleBar>
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
const A = screen.getByText('A');
|
|
196
|
+
expect(A).not.toHaveClass('is-toggled');
|
|
197
|
+
await user.click(A);
|
|
198
|
+
expect(A).not.toHaveClass('is-toggled');
|
|
199
|
+
expect(mockToggle).not.toHaveBeenCalled();
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
describe('test color props', () => {
|
|
204
|
+
test('ToggleBar.Item', () => {
|
|
205
|
+
const mockToggle = jest.fn();
|
|
206
|
+
render(
|
|
207
|
+
<ToggleBar onToggle={mockToggle}>
|
|
208
|
+
<ToggleBar.Item>I</ToggleBar.Item>
|
|
209
|
+
<ToggleBar.Item>P</ToggleBar.Item>
|
|
210
|
+
<ToggleBar.Item>W</ToggleBar.Item>
|
|
211
|
+
</ToggleBar>
|
|
212
|
+
);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
test('ToggleBar.OnOffItem', () => {
|
|
216
|
+
const mockToggle = jest.fn();
|
|
217
|
+
render(
|
|
218
|
+
<ToggleBar onToggle={mockToggle}>
|
|
219
|
+
<ToggleBar.OnOffItem>D</ToggleBar.OnOffItem>
|
|
220
|
+
<ToggleBar.OnOffItem>S</ToggleBar.OnOffItem>
|
|
221
|
+
<ToggleBar.OnOffItem>I</ToggleBar.OnOffItem>
|
|
222
|
+
<ToggleBar.OnOffItem>P</ToggleBar.OnOffItem>
|
|
223
|
+
<ToggleBar.OnOffItem>W</ToggleBar.OnOffItem>
|
|
224
|
+
</ToggleBar>
|
|
225
|
+
);
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
});
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { DefaultsContext } from '@lib/contexts/DefaultsProvider/DefaultsProvider';
|
|
2
|
+
import { getSizeClass, getAlignmentClass } from '@lib/internal_functions';
|
|
3
|
+
import { AlignmentProp, SizeProp } from '@lib/types';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
|
|
6
|
+
type ToggleBarProps = {
|
|
7
|
+
/** De beginwaarde (default = undefined)
|
|
8
|
+
* Deze property wordt alleen voor ToggleItems gebruikt. voor OnOffToggleItems kan dat per item geset worden
|
|
9
|
+
* Om een waarde van buitenaf te zete, gebruik je de 'value'-prop
|
|
10
|
+
*/
|
|
11
|
+
initialValue?: string;
|
|
12
|
+
/** De beginwaarde, alsd ie van buitenaf aangepast mag worden. gebruik 'initialValue' voor alleen een beginwaarde */
|
|
13
|
+
value?: string;
|
|
14
|
+
/** ToggleItems */
|
|
15
|
+
children: React.ReactNode;
|
|
16
|
+
/** Callback voor toggelen */
|
|
17
|
+
onToggle?: (toggledItem: string) => void;
|
|
18
|
+
/** Zijn de randen afgerond of vierkant (default true) */
|
|
19
|
+
rounded?: boolean;
|
|
20
|
+
/** Alignment van de container */
|
|
21
|
+
alignment?: AlignmentProp;
|
|
22
|
+
/** Size van de buttons (default = 's') */
|
|
23
|
+
size?: SizeProp;
|
|
24
|
+
/** Extra classes voor de toggle-bar */
|
|
25
|
+
className?: string;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
type ToggleItemProps = {
|
|
29
|
+
/** Content van een Toggle Item */
|
|
30
|
+
children: React.ReactNode;
|
|
31
|
+
/** Is dit item disabled? */
|
|
32
|
+
disabled?: boolean;
|
|
33
|
+
/** Selectie-naam voor dit toggle-item. ALs undefined wordt de children-string-content gebruikt */
|
|
34
|
+
identifier?: string;
|
|
35
|
+
/** Tooltip voor dit toggle-item */
|
|
36
|
+
title?: string;
|
|
37
|
+
onClick?: (toggledItem?: string) => void;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
type InternToggleItemProps = ToggleItemProps & {
|
|
41
|
+
toggled: boolean;
|
|
42
|
+
onToggleClick: (toggledItem: string) => void;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
type OnOffToggleItemProps = ToggleItemProps & {
|
|
46
|
+
/** Set de initiele waarde van dit toggle item */
|
|
47
|
+
toggled?: boolean;
|
|
48
|
+
/** onToggle callback, deze 'cancelt' de OnToggle van de <ItemToggleBar> voor dit item */
|
|
49
|
+
onToggle?: (on: boolean, item: string) => void;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
type InternOnOffToggleItemProps = OnOffToggleItemProps & {
|
|
53
|
+
children: React.ReactNode;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Een groep van bij-elkaar-horende buttons waar er maar 1 van actief kan zijn.
|
|
58
|
+
* Om elk toggle-item APART te kunnen togglen, gebruik je de ItemToggleBar Component.
|
|
59
|
+
* De Togglebar gebruikt de default size voor Buttons
|
|
60
|
+
* @param props
|
|
61
|
+
* @returns een Toggle bar
|
|
62
|
+
* @example
|
|
63
|
+
* <ToggleBar onToggle={handleToggle} initialValue={calendarView}>
|
|
64
|
+
* <ToggleBar.Item>WeekView</ToggleBar.Item>
|
|
65
|
+
* <ToggleBar.Item>MonthView</ToggleBar.Item>
|
|
66
|
+
* </ToggleBar>
|
|
67
|
+
*
|
|
68
|
+
* <ToggleBar >
|
|
69
|
+
* <ToggleBar.OnOffItem onToggle={handleToggle2} identifier="1">
|
|
70
|
+
* Toggle 2
|
|
71
|
+
* </ToggleBar.OnOffItem>
|
|
72
|
+
* <ToggleBar.OnOffItem toggled={true} onToggle={handleToggle3} identifier="2">
|
|
73
|
+
* Toggle 3
|
|
74
|
+
* </ToggleBar.OnOffItem>
|
|
75
|
+
* </ToggleBar>
|
|
76
|
+
*/
|
|
77
|
+
const ToggleBar = ({
|
|
78
|
+
size: sizeProp,
|
|
79
|
+
rounded = false,
|
|
80
|
+
alignment = 'l',
|
|
81
|
+
value,
|
|
82
|
+
initialValue,
|
|
83
|
+
children: nodes,
|
|
84
|
+
className: classes,
|
|
85
|
+
onToggle,
|
|
86
|
+
}: ToggleBarProps) => {
|
|
87
|
+
let { defaults } = React.useContext(DefaultsContext);
|
|
88
|
+
let size = sizeProp ?? defaults.button.size;
|
|
89
|
+
|
|
90
|
+
let className = 'tabs is-toggle';
|
|
91
|
+
className += getSizeClass(size);
|
|
92
|
+
className += getAlignmentClass(alignment);
|
|
93
|
+
if (rounded) className += ' is-toggle-rounded';
|
|
94
|
+
if (classes) className += ' ' + classes;
|
|
95
|
+
|
|
96
|
+
let [toggledItem, setToggledItem] = React.useState<string | undefined>(value ?? initialValue);
|
|
97
|
+
let genericID = React.useId();
|
|
98
|
+
let children = React.Children.map(nodes, (child: any, index: number) => {
|
|
99
|
+
let toggleName: string =
|
|
100
|
+
child.props?.identifier ??
|
|
101
|
+
React.Children.map(child.props.children, (child: any) => {
|
|
102
|
+
if (typeof child === 'string') return child;
|
|
103
|
+
else if (typeof child.type === 'string') return child.type;
|
|
104
|
+
else return genericID;
|
|
105
|
+
})?.join('') ??
|
|
106
|
+
'' + index;
|
|
107
|
+
|
|
108
|
+
if (child.type === ToggleItem)
|
|
109
|
+
return <InternToggleItem {...child.props} toggled={toggledItem == toggleName} identifier={toggleName} onToggleClick={handleToggle} />;
|
|
110
|
+
else if (child.type === OnOffToggleItem) return <InternOnOffToggleItem {...child.props} identifier={toggleName} />;
|
|
111
|
+
|
|
112
|
+
return child;
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
React.useEffect(() => {
|
|
116
|
+
if (value !== undefined && toggledItem !== value) setToggledItem(value);
|
|
117
|
+
}, [value, toggledItem]);
|
|
118
|
+
|
|
119
|
+
function handleToggle(item: string) {
|
|
120
|
+
if (toggledItem == item) return;
|
|
121
|
+
onToggle && onToggle(item);
|
|
122
|
+
setToggledItem(item);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return (
|
|
126
|
+
<div className={className}>
|
|
127
|
+
<ul>{children}</ul>
|
|
128
|
+
</div>
|
|
129
|
+
);
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
/** Toggle item */
|
|
133
|
+
const ToggleItem = (props: ToggleItemProps) => <button disabled={props.disabled}>{props.children}</button>;
|
|
134
|
+
/** ALLEEN VOOR INTERN GEBRUIK!
|
|
135
|
+
* Deze component vervang het ToggleItem
|
|
136
|
+
*/
|
|
137
|
+
function InternToggleItem({ disabled, title, toggled, children, identifier, onClick, onToggleClick }: InternToggleItemProps) {
|
|
138
|
+
let className = '';
|
|
139
|
+
if (disabled) className += ' is-disabled';
|
|
140
|
+
if (toggled) className += ' is-active';
|
|
141
|
+
|
|
142
|
+
function handleToggle() {
|
|
143
|
+
if (onClick) onClick(identifier);
|
|
144
|
+
if (!disabled) onToggleClick(identifier!);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return (
|
|
148
|
+
<li title={title} className={className} onClick={handleToggle} id={identifier}>
|
|
149
|
+
<span className="tab">{children}</span>
|
|
150
|
+
</li>
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** On Off Toggle Item - zelfbepalend */
|
|
155
|
+
const OnOffToggleItem = (props: OnOffToggleItemProps) => <button>{props.children}</button>;
|
|
156
|
+
/** INTERN GEBRUIKT - NIET EXPORTEREN
|
|
157
|
+
* Deze component vervangt de OnOfToggleItem
|
|
158
|
+
*/
|
|
159
|
+
function InternOnOffToggleItem({
|
|
160
|
+
title,
|
|
161
|
+
identifier,
|
|
162
|
+
onToggle,
|
|
163
|
+
toggled: toggledProp = false,
|
|
164
|
+
disabled = false,
|
|
165
|
+
children,
|
|
166
|
+
}: OnOffToggleItemProps & InternOnOffToggleItemProps) {
|
|
167
|
+
let [toggled, setToggled] = React.useState<boolean>(toggledProp);
|
|
168
|
+
|
|
169
|
+
let classes = '';
|
|
170
|
+
if (toggled) classes += 'is-active';
|
|
171
|
+
if (disabled) classes += ' is-disabled';
|
|
172
|
+
|
|
173
|
+
React.useEffect(() => {
|
|
174
|
+
if (toggledProp !== undefined) setToggled(toggledProp);
|
|
175
|
+
}, [toggledProp]);
|
|
176
|
+
|
|
177
|
+
function handleToggle() {
|
|
178
|
+
if (!disabled) {
|
|
179
|
+
if (onToggle) onToggle(!toggled, identifier!);
|
|
180
|
+
setToggled(!toggled);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return (
|
|
185
|
+
<li title={title} id={identifier!} className={classes} onClick={() => handleToggle()}>
|
|
186
|
+
<span className="tab">{children}</span>
|
|
187
|
+
</li>
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Item binnen de ToggleBar. Een van de ToggleItems in een ToggleBar kan maar actief zijn.
|
|
193
|
+
* @param props
|
|
194
|
+
* @returns een item in de togglebar waarvan er maar 1 actief kan zijn
|
|
195
|
+
* @example <ToggleBar.Item>Item 2</ToggleBar.Item>
|
|
196
|
+
*/
|
|
197
|
+
ToggleBar.Item = ToggleItem;
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Een zelf-toggelend item in een ToggleBar. OnOffToggleItems regelen zelf de toggle-state.
|
|
201
|
+
* @param props
|
|
202
|
+
* @returns een losstaand toggle-baar item.
|
|
203
|
+
* @example <ToggleBar.OnoffItem onToggle={handleToggle} identifier="1">Toggle 1</ToggleBar.OnoffItem>
|
|
204
|
+
*/
|
|
205
|
+
ToggleBar.OnOffItem = OnOffToggleItem;
|
|
206
|
+
|
|
207
|
+
export { ToggleBar };
|
|
208
|
+
export type { ToggleBarProps, ToggleItemProps, OnOffToggleItemProps };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { render, screen } from '@testing-library/react';
|
|
4
|
+
import '@testing-library/jest-dom';
|
|
5
|
+
import { Tooltip } from './Tooltip';
|
|
6
|
+
import { ColorProp } from '../../loon-react-bulma-types';
|
|
7
|
+
import user from '@testing-library/user-event';
|
|
8
|
+
|
|
9
|
+
describe('Test <Tooltip>...</Tooltip>', () => {
|
|
10
|
+
test('It should be a function', () => expect(Tooltip).toBeInstanceOf(Function));
|
|
11
|
+
|
|
12
|
+
describe('Test rendering', () => {
|
|
13
|
+
test('It should render with string-content', () => {
|
|
14
|
+
render(
|
|
15
|
+
<Tooltip content="Tooltip Test 1">
|
|
16
|
+
<button>Button</button>
|
|
17
|
+
</Tooltip>
|
|
18
|
+
);
|
|
19
|
+
const button = screen.getByText('Button');
|
|
20
|
+
expect(button).toBeInTheDocument();
|
|
21
|
+
expect(button).toBeInstanceOf(HTMLButtonElement);
|
|
22
|
+
});
|
|
23
|
+
test('It should render with React Node-content', () => {
|
|
24
|
+
render(
|
|
25
|
+
<Tooltip content={<div>Tooltip Test 1</div>}>
|
|
26
|
+
<button>Button</button>
|
|
27
|
+
</Tooltip>
|
|
28
|
+
);
|
|
29
|
+
const button = screen.getByText('Button');
|
|
30
|
+
expect(button).toBeInTheDocument();
|
|
31
|
+
expect(button).toBeInstanceOf(HTMLButtonElement);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('Test hovering', async () => {
|
|
36
|
+
render(
|
|
37
|
+
<Tooltip content="Tooltip Test 1">
|
|
38
|
+
<button title="button">Button</button>
|
|
39
|
+
</Tooltip>
|
|
40
|
+
);
|
|
41
|
+
const button = screen.getByText('Button');
|
|
42
|
+
await user.hover(button);
|
|
43
|
+
const tooltip = screen.getByText('Tooltip Test 1');
|
|
44
|
+
expect(tooltip).toBeInTheDocument();
|
|
45
|
+
|
|
46
|
+
await user.unhover(button);
|
|
47
|
+
expect(tooltip).not.toBeInTheDocument();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe('Test colors', () => {
|
|
51
|
+
['p', 'i', 'l', 's', 'w', 'd'].forEach((color) => {
|
|
52
|
+
test(`It should render with color ${color}`, () => {
|
|
53
|
+
render(
|
|
54
|
+
<Tooltip content="Tooltip Test 1" color={color as ColorProp}>
|
|
55
|
+
<button title="button">Button</button>
|
|
56
|
+
</Tooltip>
|
|
57
|
+
);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
});
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// No external tooltip dependency
|
|
2
|
+
|
|
3
|
+
import { PositionProp } from '@lib/index';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
|
|
6
|
+
/** actions die de tooltip kan doen */
|
|
7
|
+
type ActionType = 'hover' | 'focus' | 'click' | 'contextMenu';
|
|
8
|
+
|
|
9
|
+
/** props bij de Tooltip component */
|
|
10
|
+
type TooltipProps = {
|
|
11
|
+
/** className voor de container van de tooltip (dat is een `<span>`) */
|
|
12
|
+
className?: string | undefined;
|
|
13
|
+
/** Styling-object voor de container van de tooltip (dat is een `<span>`) */
|
|
14
|
+
style?: React.CSSProperties | undefined;
|
|
15
|
+
/** de inhoud van de tooltip, een string of een component. __LET OP!__: maximale width van 300px */
|
|
16
|
+
content?: React.ReactNode | undefined;
|
|
17
|
+
/** Waar moet de tooltip op worden weergegeven? */
|
|
18
|
+
children: React.ReactNode;
|
|
19
|
+
/** Waar moeten we de tooltip tonen? (default = `rt`, right-top)
|
|
20
|
+
* - `t` = top
|
|
21
|
+
* - `b` = bottom
|
|
22
|
+
* - `l` = left
|
|
23
|
+
* - `r` = right
|
|
24
|
+
* - `tl` of `lt` = top left
|
|
25
|
+
* - `tr` of `rt` = top right
|
|
26
|
+
* - `bl` of `lb` = bottom left
|
|
27
|
+
* - `br` of `rb` = bottom right
|
|
28
|
+
*/
|
|
29
|
+
placement?: PositionProp | 'tl' | 'bl' | 'tr' | 'br' | 'lt' | 'lb' | 'rt' | 'rb' | undefined;
|
|
30
|
+
/** Op welke (meer dan 1 mogelijk) moet de tooltip getoont worden? (Default = `hover`)
|
|
31
|
+
* @example triggers={['hover', 'click']}
|
|
32
|
+
* @example triggers="click"
|
|
33
|
+
*/
|
|
34
|
+
triggers?: ActionType | Array<ActionType> | undefined;
|
|
35
|
+
/** Moet de pijl getoont worden? (Default = `false`) */
|
|
36
|
+
hideArrow?: boolean | undefined;
|
|
37
|
+
/** setten van de display-pattribute voor de tooltip-children. Soms heb je wat anders nodig. Default = 'inline-block' */
|
|
38
|
+
display?:
|
|
39
|
+
| 'inline-block'
|
|
40
|
+
| 'block'
|
|
41
|
+
| 'inline'
|
|
42
|
+
| 'flex'
|
|
43
|
+
| 'inline-flex'
|
|
44
|
+
| 'grid'
|
|
45
|
+
| 'inline-grid'
|
|
46
|
+
| 'contents'
|
|
47
|
+
| 'none'
|
|
48
|
+
| 'initial'
|
|
49
|
+
| 'inherit'
|
|
50
|
+
| 'unset'
|
|
51
|
+
| undefined;
|
|
52
|
+
/** Hoe lang moet de tooltip wachten voordat hij getoont wordt? (Default = 0.2)
|
|
53
|
+
* - number: delay voor show & hide
|
|
54
|
+
* - [number, number]: [delayShow, delayHide]
|
|
55
|
+
*/
|
|
56
|
+
delay?: number | [number, number];
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const MOUSE_DELAY = 0.2;
|
|
60
|
+
|
|
61
|
+
const placements = {
|
|
62
|
+
top: {
|
|
63
|
+
style: { bottom: '100%', left: '50%', transform: 'translateX(-50%)', marginBottom: 8 },
|
|
64
|
+
arrow: { top: '100%', left: '50%', transform: 'translateX(-50%) rotate(180deg)' },
|
|
65
|
+
},
|
|
66
|
+
bottom: {
|
|
67
|
+
style: { top: '100%', left: '50%', transform: 'translateX(-50%)', marginTop: 8 },
|
|
68
|
+
arrow: { bottom: '100%', left: '50%', transform: 'translateX(-50%)' },
|
|
69
|
+
},
|
|
70
|
+
left: {
|
|
71
|
+
style: { right: '100%', top: '50%', transform: 'translateY(-50%)', marginRight: 8 },
|
|
72
|
+
arrow: { left: '100%', top: '50%', transform: 'translateY(-50%) rotate(90deg)' }, // FIXED
|
|
73
|
+
},
|
|
74
|
+
right: {
|
|
75
|
+
style: { left: '100%', top: '50%', transform: 'translateY(-50%)', marginLeft: 8 },
|
|
76
|
+
arrow: { right: '100%', top: '50%', transform: 'translateY(-50%) rotate(-90deg)' }, // FIXED
|
|
77
|
+
},
|
|
78
|
+
leftTop: { style: { right: '100%', top: 0, marginRight: 8 }, arrow: { left: '100%', top: 8, transform: 'rotate(90deg)' } }, // FIXED
|
|
79
|
+
leftBottom: { style: { right: '100%', bottom: 0, marginRight: 8 }, arrow: { left: '100%', bottom: 8, transform: 'rotate(90deg)' } }, // FIXED
|
|
80
|
+
rightTop: { style: { left: '100%', top: 0, marginLeft: 8 }, arrow: { right: '100%', top: 8, transform: 'rotate(-90deg)' } }, // FIXED
|
|
81
|
+
rightBottom: { style: { left: '100%', bottom: 0, marginLeft: 8 }, arrow: { right: '100%', bottom: 8, transform: 'rotate(-90deg)' } }, // FIXED
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Tooltip component
|
|
86
|
+
* @example <TT content="Tooltip content">Hover me</TT>
|
|
87
|
+
* @example <TT content="Tooltip content" placement="t">Hover me</TT>
|
|
88
|
+
* @example <TT content={<>Tooltip content</>} placement="b">Hover me</TT>
|
|
89
|
+
* @example <TT content="Tooltip content" triggers={['click', 'contextMenu']}>Click or RightClick me</TT>
|
|
90
|
+
*/
|
|
91
|
+
|
|
92
|
+
function TT({
|
|
93
|
+
className,
|
|
94
|
+
children,
|
|
95
|
+
style = {},
|
|
96
|
+
content = undefined,
|
|
97
|
+
hideArrow = false,
|
|
98
|
+
triggers = 'hover',
|
|
99
|
+
placement: plcmnt = 'rt',
|
|
100
|
+
display = 'inline-block',
|
|
101
|
+
delay = [MOUSE_DELAY, MOUSE_DELAY],
|
|
102
|
+
}: TooltipProps) {
|
|
103
|
+
// Placement mapping
|
|
104
|
+
type PlacementKey = 'top' | 'bottom' | 'left' | 'right' | 'leftTop' | 'leftBottom' | 'rightTop' | 'rightBottom';
|
|
105
|
+
|
|
106
|
+
let placement: PlacementKey = React.useMemo(() => {
|
|
107
|
+
if (plcmnt === 'r') return 'right';
|
|
108
|
+
if (plcmnt === 't') return 'top';
|
|
109
|
+
if (plcmnt === 'b') return 'bottom';
|
|
110
|
+
if (plcmnt === 'l') return 'left';
|
|
111
|
+
if (plcmnt === 'lt' || plcmnt === 'tl') return 'leftTop';
|
|
112
|
+
if (plcmnt === 'lb' || plcmnt === 'bl') return 'leftBottom';
|
|
113
|
+
if (plcmnt === 'rt' || plcmnt === 'tr') return 'rightTop';
|
|
114
|
+
if (plcmnt === 'rb' || plcmnt === 'br') return 'rightBottom';
|
|
115
|
+
return 'rightTop';
|
|
116
|
+
}, [plcmnt]);
|
|
117
|
+
|
|
118
|
+
let [visible, setVisible] = React.useState(false);
|
|
119
|
+
let showTimeout = React.useRef<NodeJS.Timeout | null>(null);
|
|
120
|
+
let hideTimeout = React.useRef<NodeJS.Timeout | null>(null);
|
|
121
|
+
|
|
122
|
+
let [delayShow, delayHide] = React.useMemo(() => {
|
|
123
|
+
if (typeof delay === 'number') return [delay, delay];
|
|
124
|
+
else if (Array.isArray(delay) && delay.length === 2) return delay;
|
|
125
|
+
else return [MOUSE_DELAY, MOUSE_DELAY];
|
|
126
|
+
}, [delay]);
|
|
127
|
+
|
|
128
|
+
// Triggers normalization
|
|
129
|
+
let triggerList = Array.isArray(triggers) ? triggers : [triggers];
|
|
130
|
+
|
|
131
|
+
// Show/hide logic
|
|
132
|
+
function showTooltip() {
|
|
133
|
+
if (hideTimeout.current) clearTimeout(hideTimeout.current);
|
|
134
|
+
showTimeout.current = setTimeout(() => setVisible(true), delayShow * 1000);
|
|
135
|
+
}
|
|
136
|
+
function hideTooltip() {
|
|
137
|
+
if (showTimeout.current) clearTimeout(showTimeout.current);
|
|
138
|
+
hideTimeout.current = setTimeout(() => setVisible(false), delayHide * 1000);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Event handlers
|
|
142
|
+
let eventHandlers: Record<string, any> = {};
|
|
143
|
+
if (triggerList.includes('hover')) {
|
|
144
|
+
eventHandlers.onMouseEnter = showTooltip;
|
|
145
|
+
eventHandlers.onMouseLeave = hideTooltip;
|
|
146
|
+
}
|
|
147
|
+
if (triggerList.includes('focus')) {
|
|
148
|
+
eventHandlers.onFocus = showTooltip;
|
|
149
|
+
eventHandlers.onBlur = hideTooltip;
|
|
150
|
+
}
|
|
151
|
+
if (triggerList.includes('click')) eventHandlers.onClick = () => setVisible((v) => !v);
|
|
152
|
+
|
|
153
|
+
if (triggerList.includes('contextMenu'))
|
|
154
|
+
eventHandlers.onContextMenu = (e: React.MouseEvent) => {
|
|
155
|
+
e.preventDefault();
|
|
156
|
+
setVisible((v) => !v);
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
// Hide tooltip on scroll or resize
|
|
160
|
+
React.useEffect(() => {
|
|
161
|
+
if (!visible) return;
|
|
162
|
+
|
|
163
|
+
function hide() {
|
|
164
|
+
setVisible(false);
|
|
165
|
+
}
|
|
166
|
+
window.addEventListener('scroll', hide, true);
|
|
167
|
+
window.addEventListener('resize', hide);
|
|
168
|
+
return () => {
|
|
169
|
+
window.removeEventListener('scroll', hide, true);
|
|
170
|
+
window.removeEventListener('resize', hide);
|
|
171
|
+
};
|
|
172
|
+
}, [visible]);
|
|
173
|
+
|
|
174
|
+
// Tooltip content
|
|
175
|
+
const tooltipContent = (
|
|
176
|
+
<div
|
|
177
|
+
className="lbr-tooltip-inner"
|
|
178
|
+
style={{
|
|
179
|
+
...placements[placement]?.style,
|
|
180
|
+
}}
|
|
181
|
+
role="tooltip"
|
|
182
|
+
>
|
|
183
|
+
{content}
|
|
184
|
+
{!hideArrow && (
|
|
185
|
+
<span
|
|
186
|
+
className="lbr-tooltip-arrow"
|
|
187
|
+
style={{
|
|
188
|
+
...placements[placement]?.arrow,
|
|
189
|
+
}}
|
|
190
|
+
/>
|
|
191
|
+
)}
|
|
192
|
+
</div>
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
return (
|
|
196
|
+
<span className={className} style={{ ...style, position: 'relative', display }} tabIndex={triggerList.includes('focus') ? 0 : undefined} {...eventHandlers}>
|
|
197
|
+
{children}
|
|
198
|
+
{content && visible && tooltipContent}
|
|
199
|
+
</span>
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export { TT as Tooltip };
|