polpo 0.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/.eslintrc.cjs +9 -0
- package/.storybook/decorators.tsx +61 -0
- package/.storybook/main.ts +47 -0
- package/.storybook/manager-head.html +2 -0
- package/.storybook/manager.ts +7 -0
- package/.storybook/preview-head.html +2 -0
- package/.storybook/preview.ts +38 -0
- package/.storybook/theme.ts +47 -0
- package/.turbo/daemon/f5c5c8fb195b01d0-turbo.log.2024-05-26 +0 -0
- package/.turbo/turbo-build$colon$watch.log +96 -0
- package/.turbo/turbo-build-storybook.log +0 -0
- package/.turbo/turbo-build.log +77 -0
- package/.turbo/turbo-lint$colon$fix.log +2 -0
- package/.turbo/turbo-lint.log +4 -0
- package/README.md +68 -0
- package/dist/chunk-M4KRSYE7.js +3 -0
- package/dist/chunk-M4KRSYE7.js.map +1 -0
- package/dist/chunk-U5XSMSKZ.js +3 -0
- package/dist/chunk-U5XSMSKZ.js.map +1 -0
- package/dist/get-modal-position-DPftPoU2.d.cts +28 -0
- package/dist/get-modal-position-DPftPoU2.d.ts +28 -0
- package/dist/helpers.cjs +3 -0
- package/dist/helpers.cjs.map +1 -0
- package/dist/helpers.d.cts +15 -0
- package/dist/helpers.d.ts +15 -0
- package/dist/helpers.js +3 -0
- package/dist/helpers.js.map +1 -0
- package/dist/hooks.cjs +3 -0
- package/dist/hooks.cjs.map +1 -0
- package/dist/hooks.d.cts +121 -0
- package/dist/hooks.d.ts +121 -0
- package/dist/hooks.js +3 -0
- package/dist/hooks.js.map +1 -0
- package/dist/ui.cjs +1987 -0
- package/dist/ui.cjs.map +1 -0
- package/dist/ui.d.cts +3932 -0
- package/dist/ui.d.ts +3932 -0
- package/dist/ui.js +1987 -0
- package/dist/ui.js.map +1 -0
- package/package.json +98 -0
- package/src/components/accordion/accordion-item.stories.tsx +128 -0
- package/src/components/accordion/accordion-item.tsx +119 -0
- package/src/components/accordion/accordion.stories.tsx +74 -0
- package/src/components/accordion/accordion.style.ts +42 -0
- package/src/components/accordion/accordion.tsx +56 -0
- package/src/components/accordion/index.ts +2 -0
- package/src/components/buttons/button/button.stories.tsx +103 -0
- package/src/components/buttons/button/button.style.ts +147 -0
- package/src/components/buttons/button/button.tsx +119 -0
- package/src/components/buttons/button/index.ts +1 -0
- package/src/components/buttons/index.ts +1 -0
- package/src/components/cards/flip-card/flip-card.stories.tsx +61 -0
- package/src/components/cards/flip-card/flip-card.style.ts +45 -0
- package/src/components/cards/flip-card/flip-card.tsx +55 -0
- package/src/components/cards/flip-card/index.ts +1 -0
- package/src/components/cards/hover-card/hover-card.stories.tsx +45 -0
- package/src/components/cards/hover-card/hover-card.style.ts +13 -0
- package/src/components/cards/hover-card/hover-card.tsx +71 -0
- package/src/components/cards/hover-card/index.ts +1 -0
- package/src/components/cards/index.ts +3 -0
- package/src/components/cards/slide-card/index.ts +1 -0
- package/src/components/cards/slide-card/slide-card.stories.tsx +47 -0
- package/src/components/cards/slide-card/slide-card.tsx +42 -0
- package/src/components/form/checkbox/checkbox.stories.tsx +34 -0
- package/src/components/form/checkbox/checkbox.style.ts +75 -0
- package/src/components/form/checkbox/checkbox.tsx +76 -0
- package/src/components/form/checkbox/index.ts +1 -0
- package/src/components/form/controller/controller.tsx +42 -0
- package/src/components/form/controller/index.ts +1 -0
- package/src/components/form/date-picker/date-picker.stories.tsx +38 -0
- package/src/components/form/date-picker/date-picker.tsx +67 -0
- package/src/components/form/date-picker/index.ts +1 -0
- package/src/components/form/field/field.stories.tsx +49 -0
- package/src/components/form/field/field.style.ts +79 -0
- package/src/components/form/field/field.tsx +83 -0
- package/src/components/form/field/field.types.ts +28 -0
- package/src/components/form/field/index.ts +2 -0
- package/src/components/form/form.stories.types.tsx +50 -0
- package/src/components/form/form.types.ts +37 -0
- package/src/components/form/index.ts +14 -0
- package/src/components/form/input/index.ts +1 -0
- package/src/components/form/input/input.stories.tsx +41 -0
- package/src/components/form/input/input.tsx +73 -0
- package/src/components/form/input-color/index.ts +1 -0
- package/src/components/form/input-color/input-color.stories.tsx +46 -0
- package/src/components/form/input-color/input-color.style.ts +93 -0
- package/src/components/form/input-color/input-color.tsx +159 -0
- package/src/components/form/input-file/index.ts +1 -0
- package/src/components/form/input-file/input-file.stories.tsx +40 -0
- package/src/components/form/input-file/input-file.style.ts +143 -0
- package/src/components/form/input-file/input-file.tsx +214 -0
- package/src/components/form/input-password/index.ts +1 -0
- package/src/components/form/input-password/input-password.stories.tsx +37 -0
- package/src/components/form/input-password/input-password.tsx +83 -0
- package/src/components/form/radio/index.ts +1 -0
- package/src/components/form/radio/radio.stories.tsx +43 -0
- package/src/components/form/radio/radio.style.ts +58 -0
- package/src/components/form/radio/radio.tsx +76 -0
- package/src/components/form/select/index.ts +1 -0
- package/src/components/form/select/options.tsx +140 -0
- package/src/components/form/select/select-option.tsx +84 -0
- package/src/components/form/select/select.stories.tsx +89 -0
- package/src/components/form/select/select.style.ts +164 -0
- package/src/components/form/select/select.tsx +327 -0
- package/src/components/form/select/select.types.ts +93 -0
- package/src/components/form/slider/index.ts +1 -0
- package/src/components/form/slider/slider.stories.tsx +40 -0
- package/src/components/form/slider/slider.style.ts +90 -0
- package/src/components/form/slider/slider.tsx +108 -0
- package/src/components/form/switch/index.ts +1 -0
- package/src/components/form/switch/switch.stories.tsx +38 -0
- package/src/components/form/switch/switch.style.ts +120 -0
- package/src/components/form/switch/switch.tsx +111 -0
- package/src/components/form/textarea/index.ts +1 -0
- package/src/components/form/textarea/textarea.stories.tsx +43 -0
- package/src/components/form/textarea/textarea.style.ts +7 -0
- package/src/components/form/textarea/textarea.tsx +76 -0
- package/src/components/icon/icon.stories.tsx +63 -0
- package/src/components/icon/icon.tsx +64 -0
- package/src/components/icon/icons/index.ts +18 -0
- package/src/components/icon/icons/object.tsx +482 -0
- package/src/components/icon/icons/social.tsx +72 -0
- package/src/components/icon/icons/symbol.tsx +776 -0
- package/src/components/icon/index.ts +5 -0
- package/src/components/image/image.stories.tsx +25 -0
- package/src/components/image/image.tsx +7 -0
- package/src/components/image/index.ts +1 -0
- package/src/components/index.ts +16 -0
- package/src/components/infinity-scroll/index.ts +1 -0
- package/src/components/infinity-scroll/infinity-scroll.stories.tsx +75 -0
- package/src/components/infinity-scroll/infinity-scroll.style.ts +30 -0
- package/src/components/infinity-scroll/infinity-scroll.tsx +56 -0
- package/src/components/line/index.ts +1 -0
- package/src/components/line/line.stories.tsx +67 -0
- package/src/components/line/line.style.ts +57 -0
- package/src/components/line/line.tsx +76 -0
- package/src/components/loaders/index.ts +1 -0
- package/src/components/loaders/simple-loader/index.ts +1 -0
- package/src/components/loaders/simple-loader/simple-loader.stories.tsx +21 -0
- package/src/components/loaders/simple-loader/simple-loader.style.ts +13 -0
- package/src/components/loaders/simple-loader/simple-loader.tsx +15 -0
- package/src/components/modals/action-modal/action-modal.stories.tsx +134 -0
- package/src/components/modals/action-modal/action-modal.style.ts +129 -0
- package/src/components/modals/action-modal/action-modal.tsx +150 -0
- package/src/components/modals/action-modal/index.ts +1 -0
- package/src/components/modals/aside-modal/aside-modal.stories.tsx +82 -0
- package/src/components/modals/aside-modal/aside-modal.style.ts +108 -0
- package/src/components/modals/aside-modal/aside-modal.tsx +66 -0
- package/src/components/modals/aside-modal/index.ts +1 -0
- package/src/components/modals/confirmation-modal/confirmation-modal.stories.tsx +50 -0
- package/src/components/modals/confirmation-modal/confirmation-modal.style.ts +17 -0
- package/src/components/modals/confirmation-modal/confirmation-modal.tsx +43 -0
- package/src/components/modals/confirmation-modal/index.ts +1 -0
- package/src/components/modals/index.ts +4 -0
- package/src/components/modals/modal/index.ts +1 -0
- package/src/components/modals/modal/modal.style.ts +10 -0
- package/src/components/modals/modal/modal.tsx +132 -0
- package/src/components/ripple/index.ts +1 -0
- package/src/components/ripple/ripple.stories.tsx +38 -0
- package/src/components/ripple/ripple.style.ts +33 -0
- package/src/components/ripple/ripple.tsx +63 -0
- package/src/components/smart-table/index.ts +1 -0
- package/src/components/smart-table/smart-table.column.tsx +63 -0
- package/src/components/smart-table/smart-table.helpers.tsx +59 -0
- package/src/components/smart-table/smart-table.hooks.ts +27 -0
- package/src/components/smart-table/smart-table.row.tsx +29 -0
- package/src/components/smart-table/smart-table.stories.tsx +301 -0
- package/src/components/smart-table/smart-table.style.ts +102 -0
- package/src/components/smart-table/smart-table.tsx +112 -0
- package/src/components/smart-table/smart-table.types.ts +41 -0
- package/src/components/tabs/index.ts +1 -0
- package/src/components/tabs/tabs-container.stories.tsx +159 -0
- package/src/components/tabs/tabs-list.tsx +131 -0
- package/src/components/tabs/tabs.stories.tsx +68 -0
- package/src/components/tabs/tabs.style.ts +132 -0
- package/src/components/tabs/tabs.tsx +117 -0
- package/src/components/tag/index.ts +1 -0
- package/src/components/tag/tag.stories.tsx +49 -0
- package/src/components/tag/tag.style.ts +24 -0
- package/src/components/tag/tag.tsx +44 -0
- package/src/components/tooltips/click-to-copy/click-to-copy.stories.tsx +39 -0
- package/src/components/tooltips/click-to-copy/click-to-copy.tsx +41 -0
- package/src/components/tooltips/click-to-copy/index.ts +1 -0
- package/src/components/tooltips/index.ts +2 -0
- package/src/components/tooltips/tooltip/index.ts +1 -0
- package/src/components/tooltips/tooltip/tooltip.stories.tsx +35 -0
- package/src/components/tooltips/tooltip/tooltip.style.ts +62 -0
- package/src/components/tooltips/tooltip/tooltip.tsx +45 -0
- package/src/components/typography/index.ts +2 -0
- package/src/components/typography/typography.constants.ts +43 -0
- package/src/components/typography/typography.stories.tsx +106 -0
- package/src/components/typography/typography.style.ts +76 -0
- package/src/components/typography/typography.tsx +79 -0
- package/src/contexts/fetch-context/fetch-context.tsx +114 -0
- package/src/contexts/fetch-context/index.ts +1 -0
- package/src/contexts/form-context/form-context.tsx +43 -0
- package/src/contexts/form-context/index.ts +1 -0
- package/src/contexts/index.ts +3 -0
- package/src/contexts/theme-context/index.ts +3 -0
- package/src/contexts/theme-context/theme-context.tsx +158 -0
- package/src/contexts/theme-context/theme.animations.ts +180 -0
- package/src/contexts/theme-context/theme.defaults.ts +205 -0
- package/src/contexts/theme-context/theme.style.ts +78 -0
- package/src/contexts/theme-context/themes.ts +96 -0
- package/src/core/http-client.d.ts +11 -0
- package/src/core/http-client.d.ts.map +1 -0
- package/src/core/http-client.ts +47 -0
- package/src/core/index.d.ts +2 -0
- package/src/core/index.d.ts.map +1 -0
- package/src/core/index.ts +1 -0
- package/src/core/variants/color.ts +36 -0
- package/src/core/variants/index.ts +3 -0
- package/src/core/variants/radius.ts +56 -0
- package/src/core/variants/size.ts +44 -0
- package/src/helpers/format-bytes.ts +11 -0
- package/src/helpers/format-dates.ts +11 -0
- package/src/helpers/get-modal-position.ts +66 -0
- package/src/helpers/index.ts +4 -0
- package/src/helpers/text/index.ts +1 -0
- package/src/helpers/text/to-capitalize.ts +17 -0
- package/src/hooks/index.ts +23 -0
- package/src/hooks/use-async.ts +88 -0
- package/src/hooks/use-classnames.ts +13 -0
- package/src/hooks/use-constant.ts +3 -0
- package/src/hooks/use-debounce.ts +15 -0
- package/src/hooks/use-dimensions.ts +22 -0
- package/src/hooks/use-event-listener.ts +71 -0
- package/src/hooks/use-file-reader.ts +69 -0
- package/src/hooks/use-hover.ts +17 -0
- package/src/hooks/use-in-view.ts +20 -0
- package/src/hooks/use-input-handlers.ts +49 -0
- package/src/hooks/use-media-query.ts +25 -0
- package/src/hooks/use-modal-in-container.ts +94 -0
- package/src/hooks/use-mouse-position.ts +16 -0
- package/src/hooks/use-observer.ts +18 -0
- package/src/hooks/use-on-click-outside-ref.ts +17 -0
- package/src/hooks/use-online-status.ts +12 -0
- package/src/hooks/use-render-count.ts +11 -0
- package/src/hooks/use-safe-dispatch.ts +22 -0
- package/src/hooks/use-scroll.ts +31 -0
- package/src/hooks/use-state-history.ts +22 -0
- package/src/hooks/use-toggle-values.ts +14 -0
- package/src/hooks/use-toggle.ts +11 -0
- package/src/hooks/use-viewport.ts +38 -0
- package/src/index.ts +5 -0
- package/src/layouts/flex/flex.tsx +75 -0
- package/src/layouts/flex/index.ts +1 -0
- package/src/layouts/grid/grid.tsx +86 -0
- package/src/layouts/grid/index.ts +1 -0
- package/src/layouts/index.ts +3 -0
- package/src/layouts/section-layout/index.ts +1 -0
- package/src/layouts/section-layout/section-layout.stories.tsx +55 -0
- package/src/layouts/section-layout/section-layout.style.ts +21 -0
- package/src/layouts/section-layout/section-layout.tsx +46 -0
- package/src/stories/GettingStarted.mdx +66 -0
- package/src/types/generics.ts +68 -0
- package/src/types/index.ts +1 -0
- package/svg/Name=airplane, Category=object.svg +3 -0
- package/svg/Name=arrow-circle, Category=symbol.svg +3 -0
- package/svg/Name=arrow-down, Category=symbol.svg +3 -0
- package/svg/Name=arrow-left, Category=symbol.svg +3 -0
- package/svg/Name=arrow-right, Category=symbol.svg +3 -0
- package/svg/Name=arrow-up, Category=symbol.svg +3 -0
- package/svg/Name=bell, Category=object.svg +3 -0
- package/svg/Name=bicycle, Category=object.svg +3 -0
- package/svg/Name=book-open, Category=object.svg +3 -0
- package/svg/Name=book-solid, Category=object.svg +6 -0
- package/svg/Name=box-shadow, Category=symbol.svg +5 -0
- package/svg/Name=calendar, Category=object.svg +3 -0
- package/svg/Name=camera, Category=object.svg +3 -0
- package/svg/Name=caret-down, Category=symbol.svg +3 -0
- package/svg/Name=caret-left, Category=symbol.svg +3 -0
- package/svg/Name=caret-right, Category=symbol.svg +3 -0
- package/svg/Name=caret-up, Category=symbol.svg +3 -0
- package/svg/Name=checkmark, Category=symbol.svg +3 -0
- package/svg/Name=clean-computer, Category=object.svg +10 -0
- package/svg/Name=codepen, Category=social.svg +3 -0
- package/svg/Name=creative, Category=symbol.svg +5 -0
- package/svg/Name=cross, Category=symbol.svg +4 -0
- package/svg/Name=crossed-flags, Category=object.svg +4 -0
- package/svg/Name=cv, Category=symbol.svg +5 -0
- package/svg/Name=design-ui, Category=symbol.svg +9 -0
- package/svg/Name=document, Category=object.svg +3 -0
- package/svg/Name=door-closed, Category=object.svg +3 -0
- package/svg/Name=door-open, Category=object.svg +3 -0
- package/svg/Name=double-caret-down, Category=symbol.svg +4 -0
- package/svg/Name=double-caret-left, Category=symbol.svg +4 -0
- package/svg/Name=double-caret-righ, Category=symbol.svg +4 -0
- package/svg/Name=double-caret-up, Category=symbol.svg +4 -0
- package/svg/Name=download, Category=symbol.svg +5 -0
- package/svg/Name=dropper, Category=object.svg +5 -0
- package/svg/Name=envelope, Category=object.svg +3 -0
- package/svg/Name=exclamation-close, Category=symbol.svg +4 -0
- package/svg/Name=exclamation-open, Category=symbol.svg +4 -0
- package/svg/Name=external-link, Category=symbol.svg +3 -0
- package/svg/Name=eye, Category=object.svg +4 -0
- package/svg/Name=eye-hidden, Category=object.svg +7 -0
- package/svg/Name=facebook, Category=social.svg +3 -0
- package/svg/Name=form, Category=symbol.svg +8 -0
- package/svg/Name=game-control, Category=object.svg +3 -0
- package/svg/Name=gear, Category=object.svg +3 -0
- package/svg/Name=github, Category=social.svg +3 -0
- package/svg/Name=house, Category=object.svg +3 -0
- package/svg/Name=hyphen, Category=symbol.svg +3 -0
- package/svg/Name=info, Category=symbol.svg +3 -0
- package/svg/Name=instagram, Category=social.svg +3 -0
- package/svg/Name=link, Category=symbol.svg +5 -0
- package/svg/Name=linkedin, Category=social.svg +3 -0
- package/svg/Name=magnifying-glass, Category=object.svg +3 -0
- package/svg/Name=message, Category=symbol.svg +4 -0
- package/svg/Name=moon, Category=object.svg +5 -0
- package/svg/Name=order-list, Category=symbol.svg +7 -0
- package/svg/Name=pencil, Category=object.svg +3 -0
- package/svg/Name=pin-location, Category=symbol.svg +3 -0
- package/svg/Name=question-mark-close, Category=symbol.svg +3 -0
- package/svg/Name=question-mark-open, Category=symbol.svg +3 -0
- package/svg/Name=share, Category=symbol.svg +5 -0
- package/svg/Name=spinner, Category=symbol.svg +9 -0
- package/svg/Name=star, Category=object.svg +3 -0
- package/svg/Name=star-empty, Category=object.svg +3 -0
- package/svg/Name=sun, Category=object.svg +11 -0
- package/svg/Name=text-shadow, Category=symbol.svg +4 -0
- package/svg/Name=thinking, Category=symbol.svg +3 -0
- package/svg/Name=trash-can, Category=object.svg +4 -0
- package/svg/Name=upload, Category=symbol.svg +5 -0
- package/svg/Name=user, Category=symbol.svg +4 -0
- package/svg/Name=warning, Category=symbol.svg +5 -0
- package/svg/Name=whatsapp, Category=social.svg +3 -0
- package/svgconfig.json +4 -0
- package/tsconfig.json +14 -0
- package/tsup.config.cjs +21 -0
- package/vite.config.ts +13 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { RefObject, useEffect, useLayoutEffect, useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
function useEventListener<EventName extends keyof MediaQueryListEventMap>(
|
|
4
|
+
eventName: EventName,
|
|
5
|
+
callback: (event: MediaQueryListEventMap[EventName]) => void,
|
|
6
|
+
element: RefObject<MediaQueryList>,
|
|
7
|
+
options?: boolean | AddEventListenerOptions,
|
|
8
|
+
): void;
|
|
9
|
+
|
|
10
|
+
function useEventListener<EventName extends keyof WindowEventMap>(
|
|
11
|
+
eventName: EventName,
|
|
12
|
+
callback: (event: WindowEventMap[EventName]) => void,
|
|
13
|
+
element?: undefined,
|
|
14
|
+
options?: boolean | AddEventListenerOptions,
|
|
15
|
+
): void;
|
|
16
|
+
|
|
17
|
+
function useEventListener<EventName extends keyof HTMLElementEventMap, ElementRef extends HTMLElement = HTMLDivElement>(
|
|
18
|
+
eventName: EventName,
|
|
19
|
+
callback: (event: HTMLElementEventMap[EventName]) => void,
|
|
20
|
+
element: RefObject<ElementRef>,
|
|
21
|
+
options?: boolean | AddEventListenerOptions,
|
|
22
|
+
): void;
|
|
23
|
+
|
|
24
|
+
function useEventListener<EventName extends keyof DocumentEventMap>(
|
|
25
|
+
eventName: EventName,
|
|
26
|
+
callback: (event: DocumentEventMap[EventName]) => void,
|
|
27
|
+
element: RefObject<Document>,
|
|
28
|
+
options?: boolean | AddEventListenerOptions,
|
|
29
|
+
): void;
|
|
30
|
+
|
|
31
|
+
function useEventListener<
|
|
32
|
+
MediaQueryEventName extends keyof MediaQueryListEventMap,
|
|
33
|
+
WindowEventName extends keyof WindowEventMap,
|
|
34
|
+
ElementEventName extends keyof HTMLElementEventMap,
|
|
35
|
+
DocumentEventName extends keyof DocumentEventMap,
|
|
36
|
+
ElementRef extends HTMLElement | MediaQueryList | Document | Window | void = void,
|
|
37
|
+
>(
|
|
38
|
+
eventName: WindowEventName | DocumentEventName | ElementEventName | MediaQueryEventName,
|
|
39
|
+
callback: (
|
|
40
|
+
event:
|
|
41
|
+
| MediaQueryListEventMap[MediaQueryEventName]
|
|
42
|
+
| WindowEventMap[WindowEventName]
|
|
43
|
+
| HTMLElementEventMap[ElementEventName]
|
|
44
|
+
| DocumentEventMap[DocumentEventName]
|
|
45
|
+
| Event,
|
|
46
|
+
) => void,
|
|
47
|
+
element?: RefObject<ElementRef>,
|
|
48
|
+
options?: boolean | AddEventListenerOptions,
|
|
49
|
+
) {
|
|
50
|
+
const callbackRef = useRef<EventListener>(callback);
|
|
51
|
+
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
callbackRef.current = callback;
|
|
54
|
+
}, [callback]);
|
|
55
|
+
|
|
56
|
+
useLayoutEffect(() => {
|
|
57
|
+
const targetElement = element?.current ?? window;
|
|
58
|
+
|
|
59
|
+
if (!(targetElement && targetElement.addEventListener)) return;
|
|
60
|
+
|
|
61
|
+
const listener: typeof callback = event => callbackRef.current(event);
|
|
62
|
+
|
|
63
|
+
targetElement.addEventListener(eventName, listener, options);
|
|
64
|
+
|
|
65
|
+
return () => {
|
|
66
|
+
targetElement.removeEventListener(eventName, listener, options);
|
|
67
|
+
};
|
|
68
|
+
}, [eventName, element, options]);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export { useEventListener };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { formatBytes } from '@polpo/helpers';
|
|
4
|
+
|
|
5
|
+
export enum FileTypeEnum {
|
|
6
|
+
PNG = 'image/png',
|
|
7
|
+
PDF = 'application/pdf',
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export type FileResolvedT = {
|
|
11
|
+
name: string;
|
|
12
|
+
size: number;
|
|
13
|
+
formatSize: string;
|
|
14
|
+
type: FileTypeEnum;
|
|
15
|
+
url: FileReader['result'];
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const useFileReader = (inputFiles: Array<File>) => {
|
|
19
|
+
const [files, setFiles] = useState<Array<FileResolvedT>>([]);
|
|
20
|
+
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
const fileReaders: Array<FileReader> = [];
|
|
23
|
+
let isCancel = false;
|
|
24
|
+
|
|
25
|
+
if (!Array.isArray(inputFiles) || inputFiles.length === 0) {
|
|
26
|
+
setFiles([]);
|
|
27
|
+
} else {
|
|
28
|
+
const promises = inputFiles.map(file => {
|
|
29
|
+
return new Promise<FileResolvedT>((resolve, reject) => {
|
|
30
|
+
const fileReader = new FileReader();
|
|
31
|
+
fileReaders.push(fileReader);
|
|
32
|
+
fileReader.onload = (e: ProgressEvent<FileReader>) => {
|
|
33
|
+
if (e.target?.result) {
|
|
34
|
+
resolve({
|
|
35
|
+
name: file.name,
|
|
36
|
+
size: file.size,
|
|
37
|
+
formatSize: formatBytes(file.size),
|
|
38
|
+
type: file.type as FileTypeEnum,
|
|
39
|
+
url: e.target.result,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
fileReader.onabort = () => {
|
|
44
|
+
reject(new Error('File reading aborted'));
|
|
45
|
+
};
|
|
46
|
+
fileReader.onerror = () => {
|
|
47
|
+
reject(new Error('Failed to read file'));
|
|
48
|
+
};
|
|
49
|
+
fileReader.readAsDataURL(file);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
Promise.all(promises).then(files => {
|
|
54
|
+
if (!isCancel) {
|
|
55
|
+
setFiles(files);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return () => {
|
|
61
|
+
isCancel = true;
|
|
62
|
+
fileReaders.forEach(fileReader => {
|
|
63
|
+
fileReader.abort();
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
}, [inputFiles]);
|
|
67
|
+
|
|
68
|
+
return files;
|
|
69
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useCallback, useRef, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { useEventListener } from './use-event-listener';
|
|
4
|
+
|
|
5
|
+
export const useHover = () => {
|
|
6
|
+
const [isHovered, setIsHovered] = useState(false);
|
|
7
|
+
const ref = useRef<HTMLElement>(null);
|
|
8
|
+
|
|
9
|
+
const handleMouseEnter = useCallback(() => setIsHovered(true), []);
|
|
10
|
+
|
|
11
|
+
const handleMouseLeave = useCallback(() => setIsHovered(false), []);
|
|
12
|
+
|
|
13
|
+
useEventListener('mouseenter', handleMouseEnter, ref);
|
|
14
|
+
useEventListener('mouseleave', handleMouseLeave, ref);
|
|
15
|
+
|
|
16
|
+
return isHovered;
|
|
17
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
export const useInView = (initOptions: IntersectionObserverInit = {}) => {
|
|
4
|
+
const [inView, setInView] = useState(false);
|
|
5
|
+
const ref = useRef<Element>(null);
|
|
6
|
+
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
const observer = new IntersectionObserver(([entry]) => {
|
|
9
|
+
setInView(entry.isIntersecting);
|
|
10
|
+
}, initOptions);
|
|
11
|
+
|
|
12
|
+
ref.current && observer.observe(ref.current);
|
|
13
|
+
|
|
14
|
+
return () => {
|
|
15
|
+
observer.disconnect();
|
|
16
|
+
};
|
|
17
|
+
}, [initOptions]);
|
|
18
|
+
|
|
19
|
+
return { ref, inView };
|
|
20
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import React, { useCallback, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
type InputTypes = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;
|
|
4
|
+
|
|
5
|
+
type UseInputHandlersProps<T extends InputTypes> = {
|
|
6
|
+
onBlur?: (e: React.FocusEvent<T>) => void;
|
|
7
|
+
onFocus?: (e: React.FocusEvent<T>) => void;
|
|
8
|
+
onChange?: (e: React.ChangeEvent<T>) => void;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export const useInputHandlers = <T extends InputTypes>({
|
|
12
|
+
onBlur,
|
|
13
|
+
onFocus,
|
|
14
|
+
onChange,
|
|
15
|
+
}: UseInputHandlersProps<T> = {}) => {
|
|
16
|
+
const [isFocus, setIsFocus] = useState(false);
|
|
17
|
+
|
|
18
|
+
const handleFocus = useCallback(
|
|
19
|
+
(e: React.FocusEvent<T>) => {
|
|
20
|
+
setIsFocus(true);
|
|
21
|
+
onFocus && onFocus(e);
|
|
22
|
+
},
|
|
23
|
+
[onFocus],
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
const handleBlur = useCallback(
|
|
27
|
+
(e: React.FocusEvent<T>) => {
|
|
28
|
+
setIsFocus(false);
|
|
29
|
+
onBlur && onBlur(e);
|
|
30
|
+
},
|
|
31
|
+
[onBlur],
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const handleChange = useCallback(
|
|
35
|
+
(e: React.ChangeEvent<T>) => {
|
|
36
|
+
onChange && onChange(e);
|
|
37
|
+
},
|
|
38
|
+
[onChange],
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
isFocus,
|
|
43
|
+
handlers: {
|
|
44
|
+
onFocus: handleFocus,
|
|
45
|
+
onBlur: handleBlur,
|
|
46
|
+
onChange: handleChange,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
export const useMediaQuery = (query: string): boolean => {
|
|
4
|
+
const [matches, setMatches] = useState(false);
|
|
5
|
+
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const media = window.matchMedia(query);
|
|
8
|
+
|
|
9
|
+
if (media.matches !== matches) {
|
|
10
|
+
setMatches(media.matches);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const listener = () => {
|
|
14
|
+
setMatches(media.matches);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
media.addEventListener('change', listener);
|
|
18
|
+
|
|
19
|
+
return () => {
|
|
20
|
+
media.removeEventListener('change', listener);
|
|
21
|
+
};
|
|
22
|
+
}, [matches, query]);
|
|
23
|
+
|
|
24
|
+
return matches;
|
|
25
|
+
};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import React, { RefObject, useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { useEventListener } from './use-event-listener';
|
|
4
|
+
import { useObserver } from './use-observer';
|
|
5
|
+
import { useOnClickOutsideRef } from './use-on-click-outside-ref';
|
|
6
|
+
|
|
7
|
+
import { getModalPosition, GetModalPositionParams, PositionObject } from '@polpo/helpers';
|
|
8
|
+
|
|
9
|
+
const convertDOMRectToPosition = (rect: DOMRectReadOnly): PositionObject => ({
|
|
10
|
+
x: rect.x,
|
|
11
|
+
y: rect.y,
|
|
12
|
+
w: rect.width,
|
|
13
|
+
h: rect.height,
|
|
14
|
+
top: rect.top,
|
|
15
|
+
left: rect.left,
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
type useModalInContainerParams = Partial<
|
|
19
|
+
Pick<GetModalPositionParams, 'position' | 'distancePercentage' | 'offset' | 'windowOffset'>
|
|
20
|
+
> & {
|
|
21
|
+
closeOnClickOutside?: boolean;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const useModalInContainer = <Container extends HTMLElement, Modal extends HTMLElement = Container>({
|
|
25
|
+
closeOnClickOutside = true,
|
|
26
|
+
offset = 5,
|
|
27
|
+
windowOffset = 10,
|
|
28
|
+
position,
|
|
29
|
+
distancePercentage = 50,
|
|
30
|
+
}: useModalInContainerParams = {}) => {
|
|
31
|
+
const [isVisible, setIsVisible] = useState<boolean>(false);
|
|
32
|
+
const [modalStyle, setModalStyle] = useState<React.CSSProperties>({});
|
|
33
|
+
|
|
34
|
+
const modalRef = useRef<Modal>(null);
|
|
35
|
+
const containerRef = useRef<Container>(null);
|
|
36
|
+
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (closeOnClickOutside) {
|
|
39
|
+
document.documentElement.style.overflow = isVisible ? 'hidden' : 'auto';
|
|
40
|
+
}
|
|
41
|
+
}, [isVisible, closeOnClickOutside]);
|
|
42
|
+
|
|
43
|
+
useOnClickOutsideRef<Modal>(modalRef, () => {
|
|
44
|
+
if (isVisible && closeOnClickOutside) {
|
|
45
|
+
setIsVisible(false);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const getPosition = useCallback(
|
|
50
|
+
(modalRef: RefObject<HTMLElement>) => {
|
|
51
|
+
const modal = modalRef.current?.getClientRects()[0];
|
|
52
|
+
const container = containerRef.current?.getClientRects()[0];
|
|
53
|
+
|
|
54
|
+
if (!container || !modal) {
|
|
55
|
+
setModalStyle({});
|
|
56
|
+
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const nextStyles = getModalPosition({
|
|
61
|
+
c: convertDOMRectToPosition(container),
|
|
62
|
+
m: convertDOMRectToPosition(modal),
|
|
63
|
+
distancePercentage,
|
|
64
|
+
windowOffset,
|
|
65
|
+
position,
|
|
66
|
+
offset,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
setModalStyle(nextStyles);
|
|
70
|
+
},
|
|
71
|
+
[distancePercentage, windowOffset, position, offset],
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
const callback = useCallback(() => {
|
|
75
|
+
if (isVisible) {
|
|
76
|
+
getPosition(modalRef);
|
|
77
|
+
}
|
|
78
|
+
}, [getPosition, isVisible]);
|
|
79
|
+
|
|
80
|
+
useLayoutEffect(callback, [callback]);
|
|
81
|
+
|
|
82
|
+
useObserver<Container>(containerRef, callback);
|
|
83
|
+
useObserver<Modal>(modalRef, callback);
|
|
84
|
+
useEventListener('resize', callback);
|
|
85
|
+
useEventListener('scroll', callback, modalRef);
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
isVisible,
|
|
89
|
+
setIsVisible,
|
|
90
|
+
modalStyle,
|
|
91
|
+
containerRef,
|
|
92
|
+
modalRef,
|
|
93
|
+
};
|
|
94
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { useEventListener } from './use-event-listener';
|
|
4
|
+
|
|
5
|
+
export const useMousePosition = () => {
|
|
6
|
+
const [{ x, y }, setPosition] = useState({ x: 0, y: 0 });
|
|
7
|
+
|
|
8
|
+
const mouseMove = (e: React.MouseEvent) => {
|
|
9
|
+
const { clientX, clientY } = e;
|
|
10
|
+
setPosition({ x: clientX, y: clientY });
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
useEventListener('mousemove', mouseMove as unknown as EventListener);
|
|
14
|
+
|
|
15
|
+
return [x, y];
|
|
16
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
export const useObserver = <T extends HTMLElement>(ref: React.RefObject<T>, callback: () => void) => {
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
let observer = null;
|
|
6
|
+
|
|
7
|
+
if (callback && ref.current) {
|
|
8
|
+
observer = new ResizeObserver(callback);
|
|
9
|
+
observer.observe(ref.current);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
return () => {
|
|
13
|
+
if (observer) {
|
|
14
|
+
observer.disconnect();
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}, [ref, callback]);
|
|
18
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { RefObject } from 'react';
|
|
2
|
+
|
|
3
|
+
import { useEventListener } from './use-event-listener';
|
|
4
|
+
|
|
5
|
+
export const useOnClickOutsideRef = <T extends HTMLElement>(containerRef: RefObject<T>, callback: () => void) => {
|
|
6
|
+
useEventListener('keydown', e => {
|
|
7
|
+
if (e.key === 'Escape') {
|
|
8
|
+
callback();
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
useEventListener('mousedown', event => {
|
|
13
|
+
if (containerRef.current && !containerRef.current.contains(event.target as Node)) {
|
|
14
|
+
callback();
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { useEventListener } from './use-event-listener';
|
|
4
|
+
|
|
5
|
+
export const useOnlineStatus = () => {
|
|
6
|
+
const [online, setOnline] = useState(navigator.onLine);
|
|
7
|
+
|
|
8
|
+
useEventListener('online', () => setOnline(navigator.onLine));
|
|
9
|
+
useEventListener('offline', () => setOnline(navigator.onLine));
|
|
10
|
+
|
|
11
|
+
return online;
|
|
12
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React, { useCallback, useLayoutEffect, useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
export const useSafeDispatch = <T>(dispatch: React.Dispatch<T>): ((action: T) => void) => {
|
|
4
|
+
const mounted = useRef(false);
|
|
5
|
+
|
|
6
|
+
useLayoutEffect(() => {
|
|
7
|
+
mounted.current = true;
|
|
8
|
+
|
|
9
|
+
return () => {
|
|
10
|
+
mounted.current = false;
|
|
11
|
+
};
|
|
12
|
+
}, []);
|
|
13
|
+
|
|
14
|
+
return useCallback(
|
|
15
|
+
(...args: Parameters<React.Dispatch<T>>) => {
|
|
16
|
+
if (mounted.current) {
|
|
17
|
+
dispatch(...args);
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
[dispatch],
|
|
21
|
+
);
|
|
22
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
export const useScroll = () => {
|
|
4
|
+
const ref = useRef<HTMLElement>(null);
|
|
5
|
+
const [position, setPosition] = useState([0, 0]);
|
|
6
|
+
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
const element = ref.current;
|
|
9
|
+
|
|
10
|
+
const handleScroll = () => {
|
|
11
|
+
if (!element) return;
|
|
12
|
+
|
|
13
|
+
setPosition([element.scrollLeft, element.scrollTop]);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
if (element) {
|
|
17
|
+
element.addEventListener('scroll', handleScroll);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return () => {
|
|
21
|
+
if (element) {
|
|
22
|
+
element.removeEventListener('scroll', handleScroll);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}, []);
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
ref,
|
|
29
|
+
position,
|
|
30
|
+
};
|
|
31
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Dispatch, SetStateAction, useEffect, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
function useStateHistory<T>(initialState: T | (() => T)): [T, Dispatch<SetStateAction<T>>, Array<T>];
|
|
4
|
+
|
|
5
|
+
function useStateHistory<T = undefined>(): [T | undefined, Dispatch<SetStateAction<T | undefined>>, Array<T>];
|
|
6
|
+
|
|
7
|
+
function useStateHistory<T = undefined>(
|
|
8
|
+
initialState?: T | (() => T) | undefined,
|
|
9
|
+
): [T | undefined, Dispatch<SetStateAction<T | undefined>>, Array<T>] {
|
|
10
|
+
const [state, setState] = useState<T | undefined>(initialState);
|
|
11
|
+
const [history, setHistory] = useState<Array<T>>([]);
|
|
12
|
+
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
if (state !== undefined) {
|
|
15
|
+
setHistory(prevHistory => [...prevHistory, state]);
|
|
16
|
+
}
|
|
17
|
+
}, [state]);
|
|
18
|
+
|
|
19
|
+
return [state, setState, history];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { useStateHistory };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useCallback, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
export const useToggleValues = <T>(values: Array<T>, defaultIndex: number = 0): [T, (index?: number) => void] => {
|
|
4
|
+
const [index, setIndex] = useState(defaultIndex);
|
|
5
|
+
|
|
6
|
+
const toggle = useCallback(
|
|
7
|
+
(index?: number) => {
|
|
8
|
+
setIndex(index !== undefined ? index : prev => (prev + 1) % values.length);
|
|
9
|
+
},
|
|
10
|
+
[values.length],
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
return [values[index], toggle];
|
|
14
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useCallback, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
export const useToggle = (defaultValue: boolean = false) => {
|
|
4
|
+
const [value, setValue] = useState<boolean>(defaultValue);
|
|
5
|
+
|
|
6
|
+
const toggle = useCallback(() => {
|
|
7
|
+
setValue(prev => !prev);
|
|
8
|
+
}, []);
|
|
9
|
+
|
|
10
|
+
return [value, toggle, setValue];
|
|
11
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { useEventListener } from './use-event-listener';
|
|
4
|
+
|
|
5
|
+
enum ScreenOrientation {
|
|
6
|
+
PORTRAIT = 'portrait',
|
|
7
|
+
LANDSCAPE = 'landscape',
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
type UseViewportData = {
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
orientation: ScreenOrientation;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export const useViewport = (): UseViewportData => {
|
|
17
|
+
const getData = (): UseViewportData => {
|
|
18
|
+
const { innerWidth, innerHeight } = window;
|
|
19
|
+
|
|
20
|
+
return {
|
|
21
|
+
width: innerWidth,
|
|
22
|
+
height: innerHeight,
|
|
23
|
+
orientation: innerWidth > innerHeight ? ScreenOrientation.LANDSCAPE : ScreenOrientation.PORTRAIT,
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const [data, setData] = useState<UseViewportData>(getData);
|
|
28
|
+
|
|
29
|
+
useEventListener('resize', () => {
|
|
30
|
+
setData(getData());
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
setData(getData());
|
|
35
|
+
}, []);
|
|
36
|
+
|
|
37
|
+
return data;
|
|
38
|
+
};
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import React, { createElement } from 'react';
|
|
2
|
+
|
|
3
|
+
type FlexProps = {
|
|
4
|
+
tag?: keyof React.ReactHTML;
|
|
5
|
+
children?: React.ReactNode;
|
|
6
|
+
className?: string;
|
|
7
|
+
style?: React.CSSProperties;
|
|
8
|
+
direction?: React.CSSProperties['flexDirection'];
|
|
9
|
+
wrap?: React.CSSProperties['flexWrap'];
|
|
10
|
+
basis?: React.CSSProperties['flexBasis'];
|
|
11
|
+
grow?: React.CSSProperties['flexGrow'];
|
|
12
|
+
shrink?: React.CSSProperties['flexShrink'];
|
|
13
|
+
flow?: React.CSSProperties['flexFlow'];
|
|
14
|
+
pc?: React.CSSProperties['placeContent'];
|
|
15
|
+
pi?: React.CSSProperties['placeItems'];
|
|
16
|
+
ps?: React.CSSProperties['placeSelf'];
|
|
17
|
+
jc?: React.CSSProperties['justifyContent'];
|
|
18
|
+
ji?: React.CSSProperties['justifyItems'];
|
|
19
|
+
js?: React.CSSProperties['justifySelf'];
|
|
20
|
+
ac?: React.CSSProperties['alignContent'];
|
|
21
|
+
ai?: React.CSSProperties['alignItems'];
|
|
22
|
+
as?: React.CSSProperties['alignSelf'];
|
|
23
|
+
gap?: React.CSSProperties['gap'];
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export const Flex = ({
|
|
27
|
+
tag = 'section',
|
|
28
|
+
children,
|
|
29
|
+
className,
|
|
30
|
+
style,
|
|
31
|
+
direction,
|
|
32
|
+
wrap,
|
|
33
|
+
basis,
|
|
34
|
+
grow,
|
|
35
|
+
shrink,
|
|
36
|
+
flow,
|
|
37
|
+
pc,
|
|
38
|
+
pi,
|
|
39
|
+
ps,
|
|
40
|
+
jc,
|
|
41
|
+
ji,
|
|
42
|
+
js,
|
|
43
|
+
ac,
|
|
44
|
+
ai,
|
|
45
|
+
as,
|
|
46
|
+
gap,
|
|
47
|
+
}: FlexProps) => {
|
|
48
|
+
return createElement(
|
|
49
|
+
tag,
|
|
50
|
+
{
|
|
51
|
+
className,
|
|
52
|
+
style: {
|
|
53
|
+
...style,
|
|
54
|
+
...(direction ? { flexDirection: direction } : {}),
|
|
55
|
+
...(wrap ? { flexWrap: wrap } : {}),
|
|
56
|
+
...(basis ? { flexBasis: basis } : {}),
|
|
57
|
+
...(grow ? { flexGrow: grow } : {}),
|
|
58
|
+
...(shrink ? { flexShrink: shrink } : {}),
|
|
59
|
+
...(flow ? { flexFlow: flow } : {}),
|
|
60
|
+
...(pc ? { placeContent: pc } : {}),
|
|
61
|
+
...(pi ? { placeItems: pi } : {}),
|
|
62
|
+
...(ps ? { placeSelf: ps } : {}),
|
|
63
|
+
...(jc ? { justifyContent: jc } : {}),
|
|
64
|
+
...(ji ? { justifyItems: ji } : {}),
|
|
65
|
+
...(js ? { justifySelf: js } : {}),
|
|
66
|
+
...(ac ? { alignContent: ac } : {}),
|
|
67
|
+
...(ai ? { alignItems: ai } : {}),
|
|
68
|
+
...(as ? { alignSelf: as } : {}),
|
|
69
|
+
...(gap ? { gap: gap } : {}),
|
|
70
|
+
display: 'flex',
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
children,
|
|
74
|
+
);
|
|
75
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './flex';
|