@wireservers-ui/react-natives 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/assets/logos/react-natives-icon-square-1024.png +0 -0
- package/assets/logos/react-natives-logo-1056x320.png +0 -0
- package/assets/logos/react-natives-logo-1280x320.png +0 -0
- package/assets/logos/react-natives-logo-1840x600.png +0 -0
- package/assets/logos/react-natives-logo-1980x600.png +0 -0
- package/assets/logos/react-natives-logo-2400x600.png +0 -0
- package/assets/logos/react-natives-logo-490x160.png +0 -0
- package/assets/logos/react-natives-logo-528x160.png +0 -0
- package/assets/logos/react-natives-logo-640x160.png +0 -0
- package/assets/logos/react-natives-logo-981x320.png +0 -0
- package/assets/logos/react-natives-logo.svg +45 -0
- package/assets/logos/react-natives-mark-1024.png +0 -0
- package/assets/logos/react-natives-mark-128.png +0 -0
- package/assets/logos/react-natives-mark-256.png +0 -0
- package/assets/logos/react-natives-mark-512.png +0 -0
- package/assets/logos/react-natives-mark.svg +42 -0
- package/package.json +57 -0
- package/src/accordion/accordion-content.tsx +30 -0
- package/src/accordion/accordion-icon.tsx +54 -0
- package/src/accordion/accordion-item.tsx +37 -0
- package/src/accordion/accordion-title-text.tsx +24 -0
- package/src/accordion/accordion-trigger.tsx +38 -0
- package/src/accordion/accordion.tsx +91 -0
- package/src/accordion/index.ts +24 -0
- package/src/accordion/styles.ts +74 -0
- package/src/accordion/types.ts +56 -0
- package/src/actionsheet/actionsheet-backdrop.tsx +23 -0
- package/src/actionsheet/actionsheet-content.tsx +19 -0
- package/src/actionsheet/actionsheet-drag-indicator-wrapper.tsx +19 -0
- package/src/actionsheet/actionsheet-drag-indicator.tsx +19 -0
- package/src/actionsheet/actionsheet-item-text.tsx +19 -0
- package/src/actionsheet/actionsheet-item.tsx +20 -0
- package/src/actionsheet/actionsheet-scroll-view.tsx +12 -0
- package/src/actionsheet/actionsheet.tsx +45 -0
- package/src/actionsheet/index.ts +20 -0
- package/src/actionsheet/styles.ts +25 -0
- package/src/actionsheet/types.ts +49 -0
- package/src/alert/alert-body.tsx +19 -0
- package/src/alert/alert-close-button.tsx +23 -0
- package/src/alert/alert-icon.tsx +40 -0
- package/src/alert/alert-text.tsx +22 -0
- package/src/alert/alert.tsx +33 -0
- package/src/alert/index.ts +15 -0
- package/src/alert/styles.ts +112 -0
- package/src/alert/types.ts +36 -0
- package/src/alert-dialog/alert-dialog.tsx +54 -0
- package/src/alert-dialog/index.ts +2 -0
- package/src/alert-dialog/styles.ts +40 -0
- package/src/alert-dialog/types.ts +40 -0
- package/src/aspect-ratio/aspect-ratio.tsx +20 -0
- package/src/aspect-ratio/index.ts +2 -0
- package/src/aspect-ratio/styles.ts +6 -0
- package/src/aspect-ratio/types.ts +7 -0
- package/src/avatar/avatar-badge.tsx +22 -0
- package/src/avatar/avatar-fallback-text.tsx +33 -0
- package/src/avatar/avatar-group.tsx +53 -0
- package/src/avatar/avatar-image.tsx +21 -0
- package/src/avatar/avatar.tsx +27 -0
- package/src/avatar/index.ts +14 -0
- package/src/avatar/styles.ts +94 -0
- package/src/avatar/types.ts +35 -0
- package/src/badge/badge-icon.tsx +20 -0
- package/src/badge/badge-text.tsx +24 -0
- package/src/badge/badge.tsx +39 -0
- package/src/badge/index.ts +11 -0
- package/src/badge/styles.ts +175 -0
- package/src/badge/types.ts +37 -0
- package/src/blockquote/blockquote.tsx +21 -0
- package/src/blockquote/index.ts +2 -0
- package/src/blockquote/styles.ts +11 -0
- package/src/blockquote/types.ts +6 -0
- package/src/box/box.tsx +19 -0
- package/src/box/index.ts +2 -0
- package/src/box/styles.ts +6 -0
- package/src/box/types.ts +6 -0
- package/src/breadcrumb/breadcrumb-item.tsx +20 -0
- package/src/breadcrumb/breadcrumb-link.tsx +20 -0
- package/src/breadcrumb/breadcrumb-text.tsx +19 -0
- package/src/breadcrumb/breadcrumb.tsx +43 -0
- package/src/breadcrumb/index.ts +12 -0
- package/src/breadcrumb/styles.ts +36 -0
- package/src/breadcrumb/types.ts +33 -0
- package/src/button/button-group.tsx +35 -0
- package/src/button/button-icon.tsx +37 -0
- package/src/button/button-spinner.tsx +12 -0
- package/src/button/button-text.tsx +27 -0
- package/src/button/button.tsx +42 -0
- package/src/button/index.ts +19 -0
- package/src/button/styles.ts +250 -0
- package/src/button/types.ts +67 -0
- package/src/calendar/calendar-day-cell.tsx +67 -0
- package/src/calendar/calendar-day-view.tsx +66 -0
- package/src/calendar/calendar-event.tsx +59 -0
- package/src/calendar/calendar-header.tsx +60 -0
- package/src/calendar/calendar-horizontal-view.tsx +372 -0
- package/src/calendar/calendar-legend.tsx +41 -0
- package/src/calendar/calendar-month-view.tsx +47 -0
- package/src/calendar/calendar-vertical-view.tsx +395 -0
- package/src/calendar/calendar-view-switcher.tsx +65 -0
- package/src/calendar/calendar-week-view.tsx +52 -0
- package/src/calendar/calendar.tsx +74 -0
- package/src/calendar/index.ts +27 -0
- package/src/calendar/styles.ts +367 -0
- package/src/calendar/types.ts +101 -0
- package/src/calendar/use-calendar.ts +170 -0
- package/src/calendar/utils.ts +278 -0
- package/src/card/card-body.tsx +22 -0
- package/src/card/card-footer.tsx +19 -0
- package/src/card/card-header.tsx +22 -0
- package/src/card/card.tsx +27 -0
- package/src/card/index.ts +13 -0
- package/src/card/styles.ts +54 -0
- package/src/card/types.ts +31 -0
- package/src/carousel/carousel.tsx +360 -0
- package/src/carousel/index.ts +2 -0
- package/src/carousel/styles.ts +21 -0
- package/src/carousel/types.ts +31 -0
- package/src/center/center.tsx +19 -0
- package/src/center/index.ts +2 -0
- package/src/center/styles.ts +6 -0
- package/src/center/types.ts +6 -0
- package/src/checkbox/checkbox-group.tsx +63 -0
- package/src/checkbox/checkbox-icon.tsx +35 -0
- package/src/checkbox/checkbox-indicator.tsx +30 -0
- package/src/checkbox/checkbox-label.tsx +24 -0
- package/src/checkbox/checkbox.tsx +86 -0
- package/src/checkbox/index.ts +14 -0
- package/src/checkbox/styles.ts +69 -0
- package/src/checkbox/types.ts +55 -0
- package/src/circular-progress/circular-progress.tsx +82 -0
- package/src/circular-progress/index.ts +2 -0
- package/src/circular-progress/styles.ts +31 -0
- package/src/circular-progress/types.ts +18 -0
- package/src/code/code.tsx +36 -0
- package/src/code/index.ts +2 -0
- package/src/code/styles.ts +25 -0
- package/src/code/types.ts +13 -0
- package/src/collapsible/collapsible.tsx +58 -0
- package/src/collapsible/index.ts +2 -0
- package/src/collapsible/styles.ts +5 -0
- package/src/collapsible/types.ts +21 -0
- package/src/color-picker/color-picker-box.tsx +115 -0
- package/src/color-picker/color-picker-slider.tsx +98 -0
- package/src/color-picker/color-picker.tsx +162 -0
- package/src/color-picker/color-utils.ts +215 -0
- package/src/color-picker/index.ts +34 -0
- package/src/color-picker/styles.ts +32 -0
- package/src/color-picker/types.ts +49 -0
- package/src/color-picker/use-pointer-drag.ts +80 -0
- package/src/container/container.tsx +19 -0
- package/src/container/index.ts +2 -0
- package/src/container/styles.ts +21 -0
- package/src/container/types.ts +10 -0
- package/src/date-picker/date-picker.tsx +136 -0
- package/src/date-picker/index.ts +15 -0
- package/src/date-picker/styles.ts +18 -0
- package/src/date-picker/types.ts +33 -0
- package/src/divider/divider.tsx +21 -0
- package/src/divider/index.ts +2 -0
- package/src/divider/styles.ts +14 -0
- package/src/divider/types.ts +7 -0
- package/src/drawer/drawer-backdrop.tsx +23 -0
- package/src/drawer/drawer-body.tsx +19 -0
- package/src/drawer/drawer-close-button.tsx +29 -0
- package/src/drawer/drawer-content.tsx +142 -0
- package/src/drawer/drawer-footer.tsx +19 -0
- package/src/drawer/drawer-header.tsx +19 -0
- package/src/drawer/drawer.tsx +54 -0
- package/src/drawer/index.ts +22 -0
- package/src/drawer/styles.ts +36 -0
- package/src/drawer/types.ts +62 -0
- package/src/empty/empty.tsx +53 -0
- package/src/empty/index.ts +2 -0
- package/src/empty/styles.ts +26 -0
- package/src/empty/types.ts +22 -0
- package/src/fab/fab-icon.tsx +20 -0
- package/src/fab/fab-label.tsx +22 -0
- package/src/fab/fab.tsx +45 -0
- package/src/fab/index.ts +11 -0
- package/src/fab/styles.ts +57 -0
- package/src/fab/types.ts +33 -0
- package/src/form-control/form-control-error-icon.tsx +25 -0
- package/src/form-control/form-control-error-message.tsx +40 -0
- package/src/form-control/form-control-helper-text.tsx +25 -0
- package/src/form-control/form-control-label-text.tsx +25 -0
- package/src/form-control/form-control-label.tsx +36 -0
- package/src/form-control/form-control.tsx +46 -0
- package/src/form-control/index.ts +20 -0
- package/src/form-control/styles.ts +105 -0
- package/src/form-control/types.ts +45 -0
- package/src/heading/heading.tsx +21 -0
- package/src/heading/index.ts +2 -0
- package/src/heading/styles.ts +24 -0
- package/src/heading/types.ts +19 -0
- package/src/icon/icon.tsx +21 -0
- package/src/icon/index.ts +2 -0
- package/src/icon/styles.ts +18 -0
- package/src/icon/types.ts +8 -0
- package/src/icon-button/icon-button.tsx +23 -0
- package/src/icon-button/index.ts +2 -0
- package/src/icon-button/styles.ts +78 -0
- package/src/icon-button/types.ts +15 -0
- package/src/image/image.tsx +20 -0
- package/src/image/index.ts +2 -0
- package/src/image/styles.ts +28 -0
- package/src/image/types.ts +11 -0
- package/src/index.ts +1039 -0
- package/src/input/index.ts +13 -0
- package/src/input/input-field.tsx +35 -0
- package/src/input/input-icon.tsx +25 -0
- package/src/input/input-slot.tsx +24 -0
- package/src/input/input.tsx +73 -0
- package/src/input/styles.ts +90 -0
- package/src/input/types.ts +39 -0
- package/src/kbd/index.ts +2 -0
- package/src/kbd/kbd.tsx +21 -0
- package/src/kbd/styles.ts +11 -0
- package/src/kbd/types.ts +7 -0
- package/src/link/index.ts +4 -0
- package/src/link/link-text.tsx +19 -0
- package/src/link/link.tsx +31 -0
- package/src/link/styles.ts +19 -0
- package/src/link/types.ts +13 -0
- package/src/list/index.ts +2 -0
- package/src/list/list.tsx +55 -0
- package/src/list/styles.ts +8 -0
- package/src/list/types.ts +17 -0
- package/src/menu/index.ts +2 -0
- package/src/menu/menu.tsx +99 -0
- package/src/menu/styles.ts +14 -0
- package/src/menu/types.ts +30 -0
- package/src/modal/index.ts +18 -0
- package/src/modal/modal-backdrop.tsx +23 -0
- package/src/modal/modal-body.tsx +19 -0
- package/src/modal/modal-close-button.tsx +29 -0
- package/src/modal/modal-content.tsx +22 -0
- package/src/modal/modal-footer.tsx +19 -0
- package/src/modal/modal-header.tsx +19 -0
- package/src/modal/modal.tsx +50 -0
- package/src/modal/styles.ts +37 -0
- package/src/modal/types.ts +49 -0
- package/src/nativewind-env.d.ts +1 -0
- package/src/number-input/index.ts +18 -0
- package/src/number-input/number-input.tsx +161 -0
- package/src/number-input/styles.ts +35 -0
- package/src/number-input/types.ts +44 -0
- package/src/overlay/index.ts +2 -0
- package/src/overlay/overlay.tsx +21 -0
- package/src/overlay/styles.ts +6 -0
- package/src/overlay/types.ts +7 -0
- package/src/pagination/index.ts +2 -0
- package/src/pagination/pagination.tsx +58 -0
- package/src/pagination/styles.ts +27 -0
- package/src/pagination/types.ts +19 -0
- package/src/password-input/index.ts +14 -0
- package/src/password-input/password-input.tsx +79 -0
- package/src/password-input/styles.ts +25 -0
- package/src/password-input/types.ts +24 -0
- package/src/pin-input/index.ts +12 -0
- package/src/pin-input/pin-input.tsx +96 -0
- package/src/pin-input/styles.ts +16 -0
- package/src/pin-input/types.ts +26 -0
- package/src/popover/index.ts +2 -0
- package/src/popover/popover.tsx +98 -0
- package/src/popover/styles.ts +31 -0
- package/src/popover/types.ts +46 -0
- package/src/portal/index.ts +2 -0
- package/src/portal/portal.tsx +8 -0
- package/src/portal/styles.ts +2 -0
- package/src/portal/types.ts +3 -0
- package/src/pressable/index.ts +2 -0
- package/src/pressable/pressable.tsx +20 -0
- package/src/pressable/styles.ts +10 -0
- package/src/pressable/types.ts +6 -0
- package/src/progress/index.ts +9 -0
- package/src/progress/progress-filled-track.tsx +26 -0
- package/src/progress/progress.tsx +52 -0
- package/src/progress/styles.ts +34 -0
- package/src/progress/types.ts +28 -0
- package/src/radio/index.ts +14 -0
- package/src/radio/radio-group.tsx +61 -0
- package/src/radio/radio-icon.tsx +24 -0
- package/src/radio/radio-indicator.tsx +30 -0
- package/src/radio/radio-label.tsx +24 -0
- package/src/radio/radio.tsx +68 -0
- package/src/radio/styles.ts +69 -0
- package/src/radio/types.ts +51 -0
- package/src/rating/index.ts +7 -0
- package/src/rating/rating.tsx +93 -0
- package/src/rating/styles.ts +13 -0
- package/src/rating/types.ts +29 -0
- package/src/search-input/index.ts +16 -0
- package/src/search-input/search-input.tsx +119 -0
- package/src/search-input/styles.ts +28 -0
- package/src/search-input/types.ts +31 -0
- package/src/segmented-control/index.ts +2 -0
- package/src/segmented-control/segmented-control.tsx +34 -0
- package/src/segmented-control/styles.ts +22 -0
- package/src/segmented-control/types.ts +22 -0
- package/src/select/index.ts +28 -0
- package/src/select/select-backdrop.tsx +25 -0
- package/src/select/select-content.tsx +49 -0
- package/src/select/select-drag-indicator.tsx +19 -0
- package/src/select/select-icon.tsx +25 -0
- package/src/select/select-input.tsx +32 -0
- package/src/select/select-item-text.tsx +30 -0
- package/src/select/select-item.tsx +72 -0
- package/src/select/select-portal.tsx +22 -0
- package/src/select/select-scroll-view.tsx +22 -0
- package/src/select/select-trigger.tsx +64 -0
- package/src/select/select.tsx +101 -0
- package/src/select/styles.ts +114 -0
- package/src/select/types.ts +92 -0
- package/src/skeleton/index.ts +2 -0
- package/src/skeleton/skeleton.tsx +29 -0
- package/src/skeleton/styles.ts +14 -0
- package/src/skeleton/types.ts +12 -0
- package/src/slider/index.ts +12 -0
- package/src/slider/slider-filled-track.tsx +31 -0
- package/src/slider/slider-thumb.tsx +52 -0
- package/src/slider/slider-track.tsx +154 -0
- package/src/slider/slider.tsx +193 -0
- package/src/slider/styles.ts +71 -0
- package/src/slider/types.ts +47 -0
- package/src/snackbar/index.ts +2 -0
- package/src/snackbar/snackbar.tsx +39 -0
- package/src/snackbar/styles.ts +29 -0
- package/src/snackbar/types.ts +21 -0
- package/src/spinner/index.ts +2 -0
- package/src/spinner/spinner.tsx +29 -0
- package/src/spinner/styles.ts +15 -0
- package/src/spinner/types.ts +10 -0
- package/src/stack/index.ts +2 -0
- package/src/stack/stack.tsx +49 -0
- package/src/stack/styles.ts +25 -0
- package/src/stack/types.ts +15 -0
- package/src/stat/index.ts +2 -0
- package/src/stat/stat.tsx +48 -0
- package/src/stat/styles.ts +34 -0
- package/src/stat/types.ts +24 -0
- package/src/stepper/index.ts +2 -0
- package/src/stepper/stepper.tsx +95 -0
- package/src/stepper/styles.ts +49 -0
- package/src/stepper/types.ts +20 -0
- package/src/switch/index.ts +2 -0
- package/src/switch/styles.ts +24 -0
- package/src/switch/switch.tsx +67 -0
- package/src/switch/types.ts +23 -0
- package/src/table/index.ts +2 -0
- package/src/table/styles.ts +12 -0
- package/src/table/table.tsx +52 -0
- package/src/table/types.ts +10 -0
- package/src/tabs/index.ts +18 -0
- package/src/tabs/styles.ts +113 -0
- package/src/tabs/tab-list.tsx +29 -0
- package/src/tabs/tab-panel.tsx +29 -0
- package/src/tabs/tab-panels.tsx +21 -0
- package/src/tabs/tab-text.tsx +26 -0
- package/src/tabs/tab.tsx +56 -0
- package/src/tabs/tabs.tsx +71 -0
- package/src/tabs/types.ts +53 -0
- package/src/tag/index.ts +14 -0
- package/src/tag/styles.ts +115 -0
- package/src/tag/tag-close-button.tsx +26 -0
- package/src/tag/tag-icon.tsx +20 -0
- package/src/tag/tag-text.tsx +22 -0
- package/src/tag/tag.tsx +40 -0
- package/src/tag/types.ts +33 -0
- package/src/tags-input/index.ts +18 -0
- package/src/tags-input/styles.ts +29 -0
- package/src/tags-input/tags-input.tsx +149 -0
- package/src/tags-input/types.ts +37 -0
- package/src/text/index.ts +2 -0
- package/src/text/styles.ts +54 -0
- package/src/text/text.tsx +51 -0
- package/src/text/types.ts +36 -0
- package/src/textarea/index.ts +2 -0
- package/src/textarea/styles.ts +37 -0
- package/src/textarea/textarea.tsx +68 -0
- package/src/textarea/types.ts +14 -0
- package/src/timeline/index.ts +2 -0
- package/src/timeline/styles.ts +57 -0
- package/src/timeline/timeline.tsx +52 -0
- package/src/timeline/types.ts +30 -0
- package/src/toast/index.ts +17 -0
- package/src/toast/styles.ts +118 -0
- package/src/toast/toast-description.tsx +22 -0
- package/src/toast/toast-provider.tsx +136 -0
- package/src/toast/toast-title.tsx +22 -0
- package/src/toast/toast.tsx +43 -0
- package/src/toast/types.ts +50 -0
- package/src/toast/use-toast.ts +7 -0
- package/src/toggle/index.ts +2 -0
- package/src/toggle/styles.ts +30 -0
- package/src/toggle/toggle.tsx +25 -0
- package/src/toggle/types.ts +15 -0
- package/src/toggle-group/index.ts +2 -0
- package/src/toggle-group/styles.ts +35 -0
- package/src/toggle-group/toggle-group.tsx +60 -0
- package/src/toggle-group/types.ts +29 -0
- package/src/tooltip/index.ts +11 -0
- package/src/tooltip/styles.ts +9 -0
- package/src/tooltip/tooltip-content.tsx +19 -0
- package/src/tooltip/tooltip-text.tsx +19 -0
- package/src/tooltip/tooltip.tsx +116 -0
- package/src/tooltip/types.ts +35 -0
- package/src/utils/brand.ts +5 -0
- package/src/utils/create-context.ts +17 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/types.ts +20 -0
- package/src/visually-hidden/index.ts +2 -0
- package/src/visually-hidden/styles.ts +6 -0
- package/src/visually-hidden/types.ts +6 -0
- package/src/visually-hidden/visually-hidden.tsx +22 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { View, Pressable, Text } from 'react-native';
|
|
3
|
+
import { createComponentContext } from '../utils/create-context';
|
|
4
|
+
import type { PaginationProps, PaginationItemProps, PaginationPreviousProps, PaginationNextProps, PaginationEllipsisProps, PaginationContextValue } from './types';
|
|
5
|
+
import { paginationStyle, paginationItemStyle, paginationItemTextStyle, paginationEllipsisStyle } from './styles';
|
|
6
|
+
|
|
7
|
+
export const [PaginationProvider, usePaginationContext] = createComponentContext<PaginationContextValue>('Pagination');
|
|
8
|
+
|
|
9
|
+
export const Pagination = React.forwardRef<React.ElementRef<typeof View>, PaginationProps>(
|
|
10
|
+
({ className, size = 'md', children, ...props }, ref) => {
|
|
11
|
+
return (
|
|
12
|
+
<PaginationProvider value={{ size }}>
|
|
13
|
+
<View ref={ref} className={paginationStyle({ class: className })} accessibilityRole="menu" {...props}>{children}</View>
|
|
14
|
+
</PaginationProvider>
|
|
15
|
+
);
|
|
16
|
+
},
|
|
17
|
+
);
|
|
18
|
+
Pagination.displayName = 'Pagination';
|
|
19
|
+
|
|
20
|
+
export const PaginationItem = React.forwardRef<React.ElementRef<typeof Pressable>, PaginationItemProps>(
|
|
21
|
+
({ className, isActive = false, isDisabled, children, ...props }, ref) => {
|
|
22
|
+
const { size } = usePaginationContext();
|
|
23
|
+
return (
|
|
24
|
+
<Pressable ref={ref} disabled={isDisabled} className={paginationItemStyle({ size, isActive, isDisabled, class: className })} accessibilityRole="button" {...props}>
|
|
25
|
+
{typeof children === 'string' || typeof children === 'number' ? (
|
|
26
|
+
<Text className={paginationItemTextStyle({ size, isActive })}>{children}</Text>
|
|
27
|
+
) : children}
|
|
28
|
+
</Pressable>
|
|
29
|
+
);
|
|
30
|
+
},
|
|
31
|
+
);
|
|
32
|
+
PaginationItem.displayName = 'PaginationItem';
|
|
33
|
+
|
|
34
|
+
export const PaginationPrevious = React.forwardRef<React.ElementRef<typeof Pressable>, PaginationPreviousProps>(
|
|
35
|
+
({ children = '‹', ...props }, ref) => {
|
|
36
|
+
return <PaginationItem ref={ref} {...props}>{children}</PaginationItem>;
|
|
37
|
+
},
|
|
38
|
+
);
|
|
39
|
+
PaginationPrevious.displayName = 'PaginationPrevious';
|
|
40
|
+
|
|
41
|
+
export const PaginationNext = React.forwardRef<React.ElementRef<typeof Pressable>, PaginationNextProps>(
|
|
42
|
+
({ children = '›', ...props }, ref) => {
|
|
43
|
+
return <PaginationItem ref={ref} {...props}>{children}</PaginationItem>;
|
|
44
|
+
},
|
|
45
|
+
);
|
|
46
|
+
PaginationNext.displayName = 'PaginationNext';
|
|
47
|
+
|
|
48
|
+
export const PaginationEllipsis = React.forwardRef<React.ElementRef<typeof View>, PaginationEllipsisProps>(
|
|
49
|
+
({ className, ...props }, ref) => {
|
|
50
|
+
const { size } = usePaginationContext();
|
|
51
|
+
return (
|
|
52
|
+
<View ref={ref} className={paginationEllipsisStyle({ size, class: className })} {...props}>
|
|
53
|
+
<Text className={paginationItemTextStyle({ size, isActive: false })}>…</Text>
|
|
54
|
+
</View>
|
|
55
|
+
);
|
|
56
|
+
},
|
|
57
|
+
);
|
|
58
|
+
PaginationEllipsis.displayName = 'PaginationEllipsis';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { tv } from 'tailwind-variants';
|
|
2
|
+
|
|
3
|
+
export const paginationStyle = tv({ base: 'flex-row items-center gap-1', variants: {} });
|
|
4
|
+
export const paginationItemStyle = tv({
|
|
5
|
+
base: 'items-center justify-center rounded-lg',
|
|
6
|
+
variants: {
|
|
7
|
+
size: { sm: 'h-8 w-8', md: 'h-10 w-10', lg: 'h-12 w-12' },
|
|
8
|
+
isActive: { true: 'bg-primary-500', false: 'bg-transparent' },
|
|
9
|
+
isDisabled: { true: 'opacity-50' },
|
|
10
|
+
},
|
|
11
|
+
defaultVariants: { size: 'md', isActive: false },
|
|
12
|
+
});
|
|
13
|
+
export const paginationItemTextStyle = tv({
|
|
14
|
+
base: 'font-medium',
|
|
15
|
+
variants: {
|
|
16
|
+
size: { sm: 'text-xs', md: 'text-sm', lg: 'text-base' },
|
|
17
|
+
isActive: { true: 'text-typography-0', false: 'text-typography-700' },
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: { size: 'md', isActive: false },
|
|
20
|
+
});
|
|
21
|
+
export const paginationEllipsisStyle = tv({
|
|
22
|
+
base: 'items-center justify-center',
|
|
23
|
+
variants: {
|
|
24
|
+
size: { sm: 'h-8 w-8', md: 'h-10 w-10', lg: 'h-12 w-12' },
|
|
25
|
+
},
|
|
26
|
+
defaultVariants: { size: 'md' },
|
|
27
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { View, Pressable, Text as RNText } from 'react-native';
|
|
2
|
+
|
|
3
|
+
export type PaginationSize = 'sm' | 'md' | 'lg';
|
|
4
|
+
|
|
5
|
+
export interface PaginationContextValue { size: PaginationSize; }
|
|
6
|
+
|
|
7
|
+
export interface PaginationProps extends React.ComponentPropsWithoutRef<typeof View> {
|
|
8
|
+
className?: string;
|
|
9
|
+
size?: PaginationSize;
|
|
10
|
+
}
|
|
11
|
+
export interface PaginationItemProps extends React.ComponentPropsWithoutRef<typeof Pressable> {
|
|
12
|
+
className?: string;
|
|
13
|
+
isActive?: boolean;
|
|
14
|
+
isDisabled?: boolean;
|
|
15
|
+
children: React.ReactNode;
|
|
16
|
+
}
|
|
17
|
+
export interface PaginationPreviousProps extends Omit<PaginationItemProps, 'isActive'> {}
|
|
18
|
+
export interface PaginationNextProps extends Omit<PaginationItemProps, 'isActive'> {}
|
|
19
|
+
export interface PaginationEllipsisProps extends React.ComponentPropsWithoutRef<typeof View> { className?: string; }
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export {
|
|
2
|
+
PasswordInput,
|
|
3
|
+
PasswordInputProvider,
|
|
4
|
+
usePasswordInputContext,
|
|
5
|
+
PasswordInputField,
|
|
6
|
+
PasswordInputToggle,
|
|
7
|
+
} from './password-input';
|
|
8
|
+
export type {
|
|
9
|
+
PasswordInputProps,
|
|
10
|
+
PasswordInputFieldProps,
|
|
11
|
+
PasswordInputToggleProps,
|
|
12
|
+
PasswordInputSize,
|
|
13
|
+
PasswordInputContextValue,
|
|
14
|
+
} from './types';
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { View, TextInput, Pressable, Text } from 'react-native';
|
|
3
|
+
import { createComponentContext } from '../utils/create-context';
|
|
4
|
+
import type {
|
|
5
|
+
PasswordInputProps,
|
|
6
|
+
PasswordInputFieldProps,
|
|
7
|
+
PasswordInputToggleProps,
|
|
8
|
+
PasswordInputContextValue,
|
|
9
|
+
} from './types';
|
|
10
|
+
import {
|
|
11
|
+
passwordInputStyle,
|
|
12
|
+
passwordInputFieldStyle,
|
|
13
|
+
passwordInputToggleStyle,
|
|
14
|
+
passwordInputToggleTextStyle,
|
|
15
|
+
} from './styles';
|
|
16
|
+
|
|
17
|
+
export const [PasswordInputProvider, usePasswordInputContext] =
|
|
18
|
+
createComponentContext<PasswordInputContextValue>('PasswordInput');
|
|
19
|
+
|
|
20
|
+
export const PasswordInput = React.forwardRef<
|
|
21
|
+
React.ElementRef<typeof View>,
|
|
22
|
+
PasswordInputProps
|
|
23
|
+
>(({ className, size = 'md', isDisabled = false, children, ...props }, ref) => {
|
|
24
|
+
const [isVisible, setIsVisible] = useState(false);
|
|
25
|
+
return (
|
|
26
|
+
<PasswordInputProvider
|
|
27
|
+
value={{ isVisible, onToggle: () => setIsVisible(!isVisible), size }}
|
|
28
|
+
>
|
|
29
|
+
<View
|
|
30
|
+
ref={ref}
|
|
31
|
+
className={passwordInputStyle({ size, isDisabled, class: className })}
|
|
32
|
+
{...props}
|
|
33
|
+
>
|
|
34
|
+
{children}
|
|
35
|
+
</View>
|
|
36
|
+
</PasswordInputProvider>
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
PasswordInput.displayName = 'PasswordInput';
|
|
40
|
+
|
|
41
|
+
export const PasswordInputField = React.forwardRef<
|
|
42
|
+
React.ElementRef<typeof TextInput>,
|
|
43
|
+
PasswordInputFieldProps
|
|
44
|
+
>(({ className, ...props }, ref) => {
|
|
45
|
+
const { isVisible, size } = usePasswordInputContext();
|
|
46
|
+
return (
|
|
47
|
+
<TextInput
|
|
48
|
+
ref={ref}
|
|
49
|
+
secureTextEntry={!isVisible}
|
|
50
|
+
className={passwordInputFieldStyle({ size, class: className })}
|
|
51
|
+
{...props}
|
|
52
|
+
/>
|
|
53
|
+
);
|
|
54
|
+
});
|
|
55
|
+
PasswordInputField.displayName = 'PasswordInputField';
|
|
56
|
+
|
|
57
|
+
export const PasswordInputToggle = React.forwardRef<
|
|
58
|
+
React.ElementRef<typeof Pressable>,
|
|
59
|
+
PasswordInputToggleProps
|
|
60
|
+
>(({ className, children, ...props }, ref) => {
|
|
61
|
+
const { isVisible, onToggle } = usePasswordInputContext();
|
|
62
|
+
return (
|
|
63
|
+
<Pressable
|
|
64
|
+
ref={ref}
|
|
65
|
+
onPress={onToggle}
|
|
66
|
+
className={passwordInputToggleStyle({ class: className })}
|
|
67
|
+
accessibilityRole="button"
|
|
68
|
+
accessibilityLabel={isVisible ? 'Hide password' : 'Show password'}
|
|
69
|
+
{...props}
|
|
70
|
+
>
|
|
71
|
+
{children ?? (
|
|
72
|
+
<Text className={passwordInputToggleTextStyle({})}>
|
|
73
|
+
{isVisible ? 'Hide' : 'Show'}
|
|
74
|
+
</Text>
|
|
75
|
+
)}
|
|
76
|
+
</Pressable>
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
PasswordInputToggle.displayName = 'PasswordInputToggle';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { tv } from 'tailwind-variants';
|
|
2
|
+
|
|
3
|
+
export const passwordInputStyle = tv({
|
|
4
|
+
base: 'flex-row items-center border border-outline-300 rounded-lg overflow-hidden bg-background-0',
|
|
5
|
+
variants: {
|
|
6
|
+
size: { sm: 'h-8', md: 'h-10', lg: 'h-12' },
|
|
7
|
+
isDisabled: { true: 'opacity-50' },
|
|
8
|
+
},
|
|
9
|
+
defaultVariants: { size: 'md' },
|
|
10
|
+
});
|
|
11
|
+
export const passwordInputFieldStyle = tv({
|
|
12
|
+
base: 'flex-1 text-typography-900 px-3',
|
|
13
|
+
variants: {
|
|
14
|
+
size: { sm: 'text-sm', md: 'text-base', lg: 'text-lg' },
|
|
15
|
+
},
|
|
16
|
+
defaultVariants: { size: 'md' },
|
|
17
|
+
});
|
|
18
|
+
export const passwordInputToggleStyle = tv({
|
|
19
|
+
base: 'items-center justify-center px-3',
|
|
20
|
+
variants: {},
|
|
21
|
+
});
|
|
22
|
+
export const passwordInputToggleTextStyle = tv({
|
|
23
|
+
base: 'text-xs font-medium text-typography-500',
|
|
24
|
+
variants: {},
|
|
25
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { View, TextInput, Pressable } from 'react-native';
|
|
2
|
+
|
|
3
|
+
export type PasswordInputSize = 'sm' | 'md' | 'lg';
|
|
4
|
+
|
|
5
|
+
export interface PasswordInputContextValue {
|
|
6
|
+
isVisible: boolean;
|
|
7
|
+
onToggle: () => void;
|
|
8
|
+
size: PasswordInputSize;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface PasswordInputProps
|
|
12
|
+
extends React.ComponentPropsWithoutRef<typeof View> {
|
|
13
|
+
className?: string;
|
|
14
|
+
size?: PasswordInputSize;
|
|
15
|
+
isDisabled?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface PasswordInputFieldProps
|
|
18
|
+
extends React.ComponentPropsWithoutRef<typeof TextInput> {
|
|
19
|
+
className?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface PasswordInputToggleProps
|
|
22
|
+
extends React.ComponentPropsWithoutRef<typeof Pressable> {
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { View, TextInput } from 'react-native';
|
|
3
|
+
import { createComponentContext } from '../utils/create-context';
|
|
4
|
+
import type {
|
|
5
|
+
PinInputProps,
|
|
6
|
+
PinInputFieldProps,
|
|
7
|
+
PinInputContextValue,
|
|
8
|
+
} from './types';
|
|
9
|
+
import { pinInputStyle, pinInputFieldStyle } from './styles';
|
|
10
|
+
|
|
11
|
+
export const [PinInputProvider, usePinInputContext] =
|
|
12
|
+
createComponentContext<PinInputContextValue>('PinInput');
|
|
13
|
+
|
|
14
|
+
export const PinInput = React.forwardRef<
|
|
15
|
+
React.ElementRef<typeof View>,
|
|
16
|
+
PinInputProps
|
|
17
|
+
>(
|
|
18
|
+
(
|
|
19
|
+
{
|
|
20
|
+
className,
|
|
21
|
+
length = 4,
|
|
22
|
+
value = '',
|
|
23
|
+
onChange,
|
|
24
|
+
size = 'md',
|
|
25
|
+
isDisabled = false,
|
|
26
|
+
children,
|
|
27
|
+
...props
|
|
28
|
+
},
|
|
29
|
+
ref,
|
|
30
|
+
) => {
|
|
31
|
+
const [internalValues, setInternalValues] = useState<string[]>(() => {
|
|
32
|
+
const arr = new Array(length).fill('');
|
|
33
|
+
value.split('').forEach((c, i) => {
|
|
34
|
+
if (i < length) arr[i] = c;
|
|
35
|
+
});
|
|
36
|
+
return arr;
|
|
37
|
+
});
|
|
38
|
+
const values = value
|
|
39
|
+
? value
|
|
40
|
+
.split('')
|
|
41
|
+
.concat(new Array(Math.max(0, length - value.length)).fill(''))
|
|
42
|
+
.slice(0, length)
|
|
43
|
+
: internalValues;
|
|
44
|
+
const onChangeAtIndex = (index: number, char: string) => {
|
|
45
|
+
const newValues = [...values];
|
|
46
|
+
newValues[index] = char.slice(-1);
|
|
47
|
+
setInternalValues(newValues);
|
|
48
|
+
onChange?.(newValues.join(''));
|
|
49
|
+
};
|
|
50
|
+
return (
|
|
51
|
+
<PinInputProvider
|
|
52
|
+
value={{ values, onChangeAtIndex, size, isDisabled, length }}
|
|
53
|
+
>
|
|
54
|
+
<View
|
|
55
|
+
ref={ref}
|
|
56
|
+
className={pinInputStyle({ class: className })}
|
|
57
|
+
{...props}
|
|
58
|
+
>
|
|
59
|
+
{children ??
|
|
60
|
+
Array.from({ length }, (_, i) => (
|
|
61
|
+
<PinInputField key={i} index={i} />
|
|
62
|
+
))}
|
|
63
|
+
</View>
|
|
64
|
+
</PinInputProvider>
|
|
65
|
+
);
|
|
66
|
+
},
|
|
67
|
+
);
|
|
68
|
+
PinInput.displayName = 'PinInput';
|
|
69
|
+
|
|
70
|
+
export const PinInputField = React.forwardRef<
|
|
71
|
+
React.ElementRef<typeof TextInput>,
|
|
72
|
+
PinInputFieldProps
|
|
73
|
+
>(({ className, index, ...props }, ref) => {
|
|
74
|
+
const { values, onChangeAtIndex, size, isDisabled } =
|
|
75
|
+
usePinInputContext();
|
|
76
|
+
const isFilled = !!values[index];
|
|
77
|
+
return (
|
|
78
|
+
<TextInput
|
|
79
|
+
ref={ref}
|
|
80
|
+
value={values[index] || ''}
|
|
81
|
+
onChangeText={(text) => onChangeAtIndex(index, text)}
|
|
82
|
+
maxLength={1}
|
|
83
|
+
keyboardType="number-pad"
|
|
84
|
+
editable={!isDisabled}
|
|
85
|
+
selectTextOnFocus
|
|
86
|
+
className={pinInputFieldStyle({
|
|
87
|
+
size,
|
|
88
|
+
isFilled,
|
|
89
|
+
isDisabled,
|
|
90
|
+
class: className,
|
|
91
|
+
})}
|
|
92
|
+
{...props}
|
|
93
|
+
/>
|
|
94
|
+
);
|
|
95
|
+
});
|
|
96
|
+
PinInputField.displayName = 'PinInputField';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { tv } from 'tailwind-variants';
|
|
2
|
+
|
|
3
|
+
export const pinInputStyle = tv({ base: 'flex-row gap-2', variants: {} });
|
|
4
|
+
export const pinInputFieldStyle = tv({
|
|
5
|
+
base: 'border border-outline-300 rounded-lg text-center text-typography-900 font-semibold bg-background-0',
|
|
6
|
+
variants: {
|
|
7
|
+
size: {
|
|
8
|
+
sm: 'h-8 w-8 text-sm',
|
|
9
|
+
md: 'h-10 w-10 text-base',
|
|
10
|
+
lg: 'h-12 w-12 text-lg',
|
|
11
|
+
},
|
|
12
|
+
isFilled: { true: 'border-primary-500' },
|
|
13
|
+
isDisabled: { true: 'opacity-50' },
|
|
14
|
+
},
|
|
15
|
+
defaultVariants: { size: 'md' },
|
|
16
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { View, TextInput } from 'react-native';
|
|
2
|
+
|
|
3
|
+
export type PinInputSize = 'sm' | 'md' | 'lg';
|
|
4
|
+
|
|
5
|
+
export interface PinInputContextValue {
|
|
6
|
+
values: string[];
|
|
7
|
+
onChangeAtIndex: (index: number, char: string) => void;
|
|
8
|
+
size: PinInputSize;
|
|
9
|
+
isDisabled: boolean;
|
|
10
|
+
length: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface PinInputProps
|
|
14
|
+
extends React.ComponentPropsWithoutRef<typeof View> {
|
|
15
|
+
className?: string;
|
|
16
|
+
length?: number;
|
|
17
|
+
value?: string;
|
|
18
|
+
onChange?: (value: string) => void;
|
|
19
|
+
size?: PinInputSize;
|
|
20
|
+
isDisabled?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface PinInputFieldProps
|
|
23
|
+
extends React.ComponentPropsWithoutRef<typeof TextInput> {
|
|
24
|
+
className?: string;
|
|
25
|
+
index: number;
|
|
26
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { Popover, PopoverProvider, usePopoverContext, PopoverTrigger, PopoverContent, PopoverArrow, PopoverHeader, PopoverBody, PopoverFooter, PopoverCloseButton } from './popover';
|
|
2
|
+
export type { PopoverProps, PopoverTriggerProps, PopoverContentProps, PopoverArrowProps, PopoverHeaderProps, PopoverBodyProps, PopoverFooterProps, PopoverCloseButtonProps, PopoverPlacement, PopoverContextValue } from './types';
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { View, Pressable, Modal, Platform } from 'react-native';
|
|
3
|
+
import { createComponentContext } from '../utils/create-context';
|
|
4
|
+
import type { PopoverProps, PopoverTriggerProps, PopoverContentProps, PopoverArrowProps, PopoverHeaderProps, PopoverBodyProps, PopoverFooterProps, PopoverCloseButtonProps, PopoverContextValue } from './types';
|
|
5
|
+
import { popoverContentStyle, popoverArrowStyle, popoverHeaderStyle, popoverBodyStyle, popoverFooterStyle, popoverCloseButtonStyle } from './styles';
|
|
6
|
+
|
|
7
|
+
export const [PopoverProvider, usePopoverContext] =
|
|
8
|
+
createComponentContext<PopoverContextValue>('Popover');
|
|
9
|
+
|
|
10
|
+
export const Popover: React.FC<PopoverProps> = ({ isOpen: controlledOpen, onOpenChange, defaultOpen = false, placement = 'bottom', children }) => {
|
|
11
|
+
const [internalOpen, setInternalOpen] = useState(defaultOpen);
|
|
12
|
+
const isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen;
|
|
13
|
+
|
|
14
|
+
const onToggle = () => {
|
|
15
|
+
const next = !isOpen;
|
|
16
|
+
setInternalOpen(next);
|
|
17
|
+
onOpenChange?.(next);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const onClose = () => {
|
|
21
|
+
setInternalOpen(false);
|
|
22
|
+
onOpenChange?.(false);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<PopoverProvider value={{ isOpen, onToggle, onClose, placement }}>
|
|
27
|
+
{children}
|
|
28
|
+
</PopoverProvider>
|
|
29
|
+
);
|
|
30
|
+
};
|
|
31
|
+
Popover.displayName = 'Popover';
|
|
32
|
+
|
|
33
|
+
export const PopoverTrigger: React.FC<PopoverTriggerProps> = ({ children }) => {
|
|
34
|
+
const { onToggle } = usePopoverContext();
|
|
35
|
+
|
|
36
|
+
// Inject onPress directly into the child element via cloneElement.
|
|
37
|
+
// This avoids wrapper nesting issues (Pressable inside Pressable, div onClick
|
|
38
|
+
// not bubbling through RN Web's Responder system, etc.).
|
|
39
|
+
if (React.isValidElement(children)) {
|
|
40
|
+
const child = children as React.ReactElement<any>;
|
|
41
|
+
const existingOnPress = child.props.onPress;
|
|
42
|
+
return React.cloneElement(child, {
|
|
43
|
+
onPress: existingOnPress
|
|
44
|
+
? (...args: any[]) => { existingOnPress(...args); onToggle(); }
|
|
45
|
+
: onToggle,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<Pressable onPress={onToggle}>
|
|
51
|
+
{children}
|
|
52
|
+
</Pressable>
|
|
53
|
+
);
|
|
54
|
+
};
|
|
55
|
+
PopoverTrigger.displayName = 'PopoverTrigger';
|
|
56
|
+
|
|
57
|
+
export const PopoverContent = React.forwardRef<React.ElementRef<typeof View>, PopoverContentProps>(({ className, children, ...props }, ref) => {
|
|
58
|
+
const { isOpen, onClose } = usePopoverContext();
|
|
59
|
+
if (!isOpen) return null;
|
|
60
|
+
return (
|
|
61
|
+
<Modal visible={isOpen} transparent animationType="fade" onRequestClose={onClose}>
|
|
62
|
+
<Pressable style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }} onPress={onClose}>
|
|
63
|
+
<Pressable onPress={(e) => e.stopPropagation()}>
|
|
64
|
+
<View ref={ref} className={popoverContentStyle({ class: className })} {...props}>
|
|
65
|
+
{children}
|
|
66
|
+
</View>
|
|
67
|
+
</Pressable>
|
|
68
|
+
</Pressable>
|
|
69
|
+
</Modal>
|
|
70
|
+
);
|
|
71
|
+
});
|
|
72
|
+
PopoverContent.displayName = 'PopoverContent';
|
|
73
|
+
|
|
74
|
+
export const PopoverArrow = React.forwardRef<React.ElementRef<typeof View>, PopoverArrowProps>(({ className, ...props }, ref) => {
|
|
75
|
+
return <View ref={ref} className={popoverArrowStyle({ class: className })} {...props} />;
|
|
76
|
+
});
|
|
77
|
+
PopoverArrow.displayName = 'PopoverArrow';
|
|
78
|
+
|
|
79
|
+
export const PopoverHeader = React.forwardRef<React.ElementRef<typeof View>, PopoverHeaderProps>(({ className, ...props }, ref) => {
|
|
80
|
+
return <View ref={ref} className={popoverHeaderStyle({ class: className })} {...props} />;
|
|
81
|
+
});
|
|
82
|
+
PopoverHeader.displayName = 'PopoverHeader';
|
|
83
|
+
|
|
84
|
+
export const PopoverBody = React.forwardRef<React.ElementRef<typeof View>, PopoverBodyProps>(({ className, ...props }, ref) => {
|
|
85
|
+
return <View ref={ref} className={popoverBodyStyle({ class: className })} {...props} />;
|
|
86
|
+
});
|
|
87
|
+
PopoverBody.displayName = 'PopoverBody';
|
|
88
|
+
|
|
89
|
+
export const PopoverFooter = React.forwardRef<React.ElementRef<typeof View>, PopoverFooterProps>(({ className, ...props }, ref) => {
|
|
90
|
+
return <View ref={ref} className={popoverFooterStyle({ class: className })} {...props} />;
|
|
91
|
+
});
|
|
92
|
+
PopoverFooter.displayName = 'PopoverFooter';
|
|
93
|
+
|
|
94
|
+
export const PopoverCloseButton = React.forwardRef<React.ElementRef<typeof Pressable>, PopoverCloseButtonProps>(({ className, ...props }, ref) => {
|
|
95
|
+
const { onClose } = usePopoverContext();
|
|
96
|
+
return <Pressable ref={ref} onPress={onClose} className={popoverCloseButtonStyle({ class: className })} accessibilityRole="button" accessibilityLabel="Close" {...props} />;
|
|
97
|
+
});
|
|
98
|
+
PopoverCloseButton.displayName = 'PopoverCloseButton';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { tv } from 'tailwind-variants';
|
|
2
|
+
|
|
3
|
+
export const popoverContentStyle = tv({
|
|
4
|
+
base: 'bg-background-0 rounded-lg p-4 shadow-hard-2 border border-outline-100',
|
|
5
|
+
variants: {},
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
export const popoverArrowStyle = tv({
|
|
9
|
+
base: 'w-3 h-3 bg-background-0 border border-outline-100 rotate-45',
|
|
10
|
+
variants: {},
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
export const popoverHeaderStyle = tv({
|
|
14
|
+
base: 'flex-row items-center justify-between mb-2',
|
|
15
|
+
variants: {},
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export const popoverBodyStyle = tv({
|
|
19
|
+
base: 'mb-2',
|
|
20
|
+
variants: {},
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
export const popoverFooterStyle = tv({
|
|
24
|
+
base: 'flex-row justify-end gap-2 mt-2',
|
|
25
|
+
variants: {},
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
export const popoverCloseButtonStyle = tv({
|
|
29
|
+
base: 'p-1 rounded',
|
|
30
|
+
variants: {},
|
|
31
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { View, Pressable } from 'react-native';
|
|
2
|
+
|
|
3
|
+
export type PopoverPlacement = 'top' | 'bottom' | 'left' | 'right';
|
|
4
|
+
|
|
5
|
+
export interface PopoverContextValue {
|
|
6
|
+
isOpen: boolean;
|
|
7
|
+
onToggle: () => void;
|
|
8
|
+
onClose: () => void;
|
|
9
|
+
placement: PopoverPlacement;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface PopoverProps {
|
|
13
|
+
isOpen?: boolean;
|
|
14
|
+
onOpenChange?: (open: boolean) => void;
|
|
15
|
+
defaultOpen?: boolean;
|
|
16
|
+
placement?: PopoverPlacement;
|
|
17
|
+
children: React.ReactNode;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface PopoverTriggerProps extends React.ComponentPropsWithoutRef<typeof Pressable> {
|
|
21
|
+
className?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface PopoverContentProps extends React.ComponentPropsWithoutRef<typeof View> {
|
|
25
|
+
className?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface PopoverArrowProps extends React.ComponentPropsWithoutRef<typeof View> {
|
|
29
|
+
className?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface PopoverHeaderProps extends React.ComponentPropsWithoutRef<typeof View> {
|
|
33
|
+
className?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface PopoverBodyProps extends React.ComponentPropsWithoutRef<typeof View> {
|
|
37
|
+
className?: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface PopoverFooterProps extends React.ComponentPropsWithoutRef<typeof View> {
|
|
41
|
+
className?: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface PopoverCloseButtonProps extends React.ComponentPropsWithoutRef<typeof Pressable> {
|
|
45
|
+
className?: string;
|
|
46
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Pressable as RNPressable } from 'react-native';
|
|
3
|
+
import type { PressableProps } from './types';
|
|
4
|
+
import { pressableStyle } from './styles';
|
|
5
|
+
|
|
6
|
+
export const Pressable = React.forwardRef<
|
|
7
|
+
React.ElementRef<typeof RNPressable>,
|
|
8
|
+
PressableProps
|
|
9
|
+
>(({ className, disabled, ...props }, ref) => {
|
|
10
|
+
return (
|
|
11
|
+
<RNPressable
|
|
12
|
+
ref={ref}
|
|
13
|
+
disabled={disabled}
|
|
14
|
+
className={pressableStyle({ isDisabled: !!disabled, class: className })}
|
|
15
|
+
{...props}
|
|
16
|
+
/>
|
|
17
|
+
);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
Pressable.displayName = 'Pressable';
|