@wireservers-ui/react-natives 1.0.0 → 1.0.1-rc2
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/LICENSE +21 -0
- package/README.md +214 -98
- package/bin/cli.js +374 -0
- package/package.json +27 -48
- package/src/accordion/accordion-content.tsx +30 -30
- package/src/accordion/accordion-icon.tsx +54 -54
- package/src/accordion/accordion-item.tsx +37 -37
- package/src/accordion/accordion-title-text.tsx +24 -24
- package/src/accordion/accordion-trigger.tsx +38 -38
- package/src/accordion/accordion.tsx +91 -91
- package/src/accordion/index.ts +24 -24
- package/src/accordion/styles.ts +74 -74
- package/src/accordion/types.ts +56 -56
- package/src/actionsheet/actionsheet-backdrop.tsx +23 -23
- package/src/actionsheet/actionsheet-content.tsx +19 -19
- package/src/actionsheet/actionsheet-drag-indicator-wrapper.tsx +19 -19
- package/src/actionsheet/actionsheet-drag-indicator.tsx +19 -19
- package/src/actionsheet/actionsheet-item-text.tsx +19 -19
- package/src/actionsheet/actionsheet-item.tsx +20 -20
- package/src/actionsheet/actionsheet-scroll-view.tsx +12 -12
- package/src/actionsheet/actionsheet.tsx +45 -45
- package/src/actionsheet/index.ts +20 -20
- package/src/actionsheet/styles.ts +25 -25
- package/src/actionsheet/types.ts +49 -49
- package/src/alert/alert-body.tsx +19 -19
- package/src/alert/alert-close-button.tsx +23 -23
- package/src/alert/alert-icon.tsx +40 -40
- package/src/alert/alert-text.tsx +22 -22
- package/src/alert/alert.tsx +33 -33
- package/src/alert/index.ts +15 -15
- package/src/alert/styles.ts +112 -112
- package/src/alert/types.ts +36 -36
- package/src/alert-dialog/alert-dialog.tsx +54 -54
- package/src/alert-dialog/index.ts +2 -2
- package/src/alert-dialog/styles.ts +40 -40
- package/src/alert-dialog/types.ts +40 -40
- package/src/aspect-ratio/aspect-ratio.tsx +20 -20
- package/src/aspect-ratio/index.ts +2 -2
- package/src/aspect-ratio/styles.ts +6 -6
- package/src/aspect-ratio/types.ts +7 -7
- package/src/avatar/avatar-badge.tsx +22 -22
- package/src/avatar/avatar-fallback-text.tsx +33 -33
- package/src/avatar/avatar-group.tsx +53 -53
- package/src/avatar/avatar-image.tsx +21 -21
- package/src/avatar/avatar.tsx +27 -27
- package/src/avatar/index.ts +14 -14
- package/src/avatar/styles.ts +94 -94
- package/src/avatar/types.ts +35 -35
- package/src/badge/badge-icon.tsx +20 -20
- package/src/badge/badge-text.tsx +24 -24
- package/src/badge/badge.tsx +39 -39
- package/src/badge/index.ts +11 -11
- package/src/badge/styles.ts +175 -175
- package/src/badge/types.ts +37 -37
- package/src/blockquote/blockquote.tsx +21 -21
- package/src/blockquote/index.ts +2 -2
- package/src/blockquote/styles.ts +11 -11
- package/src/blockquote/types.ts +6 -6
- package/src/box/box.tsx +19 -19
- package/src/box/index.ts +2 -2
- package/src/box/styles.ts +6 -6
- package/src/box/types.ts +6 -6
- package/src/breadcrumb/breadcrumb-item.tsx +20 -20
- package/src/breadcrumb/breadcrumb-link.tsx +20 -20
- package/src/breadcrumb/breadcrumb-text.tsx +19 -19
- package/src/breadcrumb/breadcrumb.tsx +43 -43
- package/src/breadcrumb/index.ts +12 -12
- package/src/breadcrumb/styles.ts +36 -36
- package/src/breadcrumb/types.ts +33 -33
- package/src/button/button-group.tsx +35 -35
- package/src/button/button-icon.tsx +37 -37
- package/src/button/button-spinner.tsx +12 -12
- package/src/button/button-text.tsx +27 -27
- package/src/button/button.tsx +42 -42
- package/src/button/index.ts +19 -19
- package/src/button/styles.ts +250 -250
- package/src/button/types.ts +67 -67
- package/src/calendar/calendar-day-cell.tsx +67 -67
- package/src/calendar/calendar-day-view.tsx +66 -66
- package/src/calendar/calendar-event.tsx +59 -59
- package/src/calendar/calendar-header.tsx +60 -60
- package/src/calendar/calendar-horizontal-view.tsx +372 -372
- package/src/calendar/calendar-legend.tsx +41 -41
- package/src/calendar/calendar-month-view.tsx +47 -47
- package/src/calendar/calendar-vertical-view.tsx +395 -395
- package/src/calendar/calendar-view-switcher.tsx +65 -65
- package/src/calendar/calendar-week-view.tsx +52 -52
- package/src/calendar/calendar.tsx +74 -74
- package/src/calendar/index.ts +27 -27
- package/src/calendar/styles.ts +367 -367
- package/src/calendar/types.ts +101 -101
- package/src/calendar/use-calendar.ts +170 -170
- package/src/calendar/utils.ts +278 -278
- package/src/card/card-body.tsx +22 -22
- package/src/card/card-footer.tsx +19 -19
- package/src/card/card-header.tsx +22 -22
- package/src/card/card.tsx +27 -27
- package/src/card/index.ts +13 -13
- package/src/card/styles.ts +54 -54
- package/src/card/types.ts +31 -31
- package/src/carousel/carousel.tsx +436 -436
- package/src/carousel/index.ts +2 -2
- package/src/carousel/styles.ts +21 -21
- package/src/carousel/types.ts +41 -41
- package/src/center/center.tsx +19 -19
- package/src/center/index.ts +2 -2
- package/src/center/styles.ts +6 -6
- package/src/center/types.ts +6 -6
- package/src/checkbox/checkbox-group.tsx +63 -63
- package/src/checkbox/checkbox-icon.tsx +35 -35
- package/src/checkbox/checkbox-indicator.tsx +30 -30
- package/src/checkbox/checkbox-label.tsx +24 -24
- package/src/checkbox/checkbox.tsx +86 -86
- package/src/checkbox/index.ts +14 -14
- package/src/checkbox/styles.ts +69 -69
- package/src/checkbox/types.ts +55 -55
- package/src/circular-progress/circular-progress.tsx +82 -82
- package/src/circular-progress/index.ts +2 -2
- package/src/circular-progress/styles.ts +31 -31
- package/src/circular-progress/types.ts +18 -18
- package/src/code/code.tsx +36 -36
- package/src/code/index.ts +2 -2
- package/src/code/styles.ts +25 -25
- package/src/code/types.ts +13 -13
- package/src/collapsible/collapsible.tsx +58 -58
- package/src/collapsible/index.ts +2 -2
- package/src/collapsible/styles.ts +5 -5
- package/src/collapsible/types.ts +21 -21
- package/src/color-picker/color-picker-box.tsx +115 -115
- package/src/color-picker/color-picker-slider.tsx +98 -98
- package/src/color-picker/color-picker.tsx +162 -162
- package/src/color-picker/color-utils.ts +215 -215
- package/src/color-picker/index.ts +34 -34
- package/src/color-picker/styles.ts +32 -32
- package/src/color-picker/types.ts +49 -49
- package/src/color-picker/use-pointer-drag.ts +80 -80
- package/src/container/container.tsx +19 -19
- package/src/container/index.ts +2 -2
- package/src/container/styles.ts +21 -21
- package/src/container/types.ts +10 -10
- package/src/date-picker/date-picker.tsx +136 -136
- package/src/date-picker/index.ts +15 -15
- package/src/date-picker/styles.ts +18 -18
- package/src/date-picker/types.ts +33 -33
- package/src/divider/divider.tsx +21 -21
- package/src/divider/index.ts +2 -2
- package/src/divider/styles.ts +14 -14
- package/src/divider/types.ts +7 -7
- package/src/drawer/drawer-backdrop.tsx +23 -23
- package/src/drawer/drawer-body.tsx +19 -19
- package/src/drawer/drawer-close-button.tsx +29 -29
- package/src/drawer/drawer-content.tsx +142 -142
- package/src/drawer/drawer-footer.tsx +19 -19
- package/src/drawer/drawer-header.tsx +19 -19
- package/src/drawer/drawer.tsx +54 -54
- package/src/drawer/index.ts +22 -22
- package/src/drawer/styles.ts +36 -36
- package/src/drawer/types.ts +62 -62
- package/src/empty/empty.tsx +53 -53
- package/src/empty/index.ts +2 -2
- package/src/empty/styles.ts +26 -26
- package/src/empty/types.ts +22 -22
- package/src/fab/fab-icon.tsx +20 -20
- package/src/fab/fab-label.tsx +22 -22
- package/src/fab/fab.tsx +45 -45
- package/src/fab/index.ts +11 -11
- package/src/fab/styles.ts +57 -57
- package/src/fab/types.ts +33 -33
- package/src/form-control/form-control-error-icon.tsx +25 -25
- package/src/form-control/form-control-error-message.tsx +40 -40
- package/src/form-control/form-control-helper-text.tsx +25 -25
- package/src/form-control/form-control-label-text.tsx +25 -25
- package/src/form-control/form-control-label.tsx +36 -36
- package/src/form-control/form-control.tsx +46 -46
- package/src/form-control/index.ts +20 -20
- package/src/form-control/styles.ts +105 -105
- package/src/form-control/types.ts +45 -45
- package/src/heading/heading.tsx +21 -21
- package/src/heading/index.ts +2 -2
- package/src/heading/styles.ts +24 -24
- package/src/heading/types.ts +19 -19
- package/src/icon/icon.tsx +21 -21
- package/src/icon/index.ts +2 -2
- package/src/icon/styles.ts +18 -18
- package/src/icon/types.ts +8 -8
- package/src/icon-button/icon-button.tsx +23 -23
- package/src/icon-button/index.ts +2 -2
- package/src/icon-button/styles.ts +78 -78
- package/src/icon-button/types.ts +15 -15
- package/src/image/image.tsx +20 -20
- package/src/image/index.ts +2 -2
- package/src/image/styles.ts +28 -28
- package/src/image/types.ts +11 -11
- package/src/index.ts +1039 -1039
- package/src/input/index.ts +13 -13
- package/src/input/input-field.tsx +35 -35
- package/src/input/input-icon.tsx +25 -25
- package/src/input/input-slot.tsx +24 -24
- package/src/input/input.tsx +73 -73
- package/src/input/styles.ts +90 -90
- package/src/input/types.ts +39 -39
- package/src/kbd/index.ts +2 -2
- package/src/kbd/kbd.tsx +21 -21
- package/src/kbd/styles.ts +11 -11
- package/src/kbd/types.ts +7 -7
- package/src/link/index.ts +4 -4
- package/src/link/link-text.tsx +19 -19
- package/src/link/link.tsx +31 -31
- package/src/link/styles.ts +19 -19
- package/src/link/types.ts +13 -13
- package/src/list/index.ts +2 -2
- package/src/list/list.tsx +55 -55
- package/src/list/styles.ts +8 -8
- package/src/list/types.ts +17 -17
- package/src/menu/index.ts +2 -2
- package/src/menu/menu.tsx +99 -99
- package/src/menu/styles.ts +14 -14
- package/src/menu/types.ts +30 -30
- package/src/modal/index.ts +18 -18
- package/src/modal/modal-backdrop.tsx +23 -23
- package/src/modal/modal-body.tsx +19 -19
- package/src/modal/modal-close-button.tsx +29 -29
- package/src/modal/modal-content.tsx +22 -22
- package/src/modal/modal-footer.tsx +19 -19
- package/src/modal/modal-header.tsx +19 -19
- package/src/modal/modal.tsx +50 -50
- package/src/modal/styles.ts +37 -37
- package/src/modal/types.ts +49 -49
- package/src/nativewind-env.d.ts +1 -1
- package/src/number-input/index.ts +18 -18
- package/src/number-input/number-input.tsx +161 -161
- package/src/number-input/styles.ts +35 -35
- package/src/number-input/types.ts +44 -44
- package/src/overlay/index.ts +2 -2
- package/src/overlay/overlay.tsx +21 -21
- package/src/overlay/styles.ts +6 -6
- package/src/overlay/types.ts +7 -7
- package/src/pagination/index.ts +2 -2
- package/src/pagination/pagination.tsx +58 -58
- package/src/pagination/styles.ts +27 -27
- package/src/pagination/types.ts +19 -19
- package/src/password-input/index.ts +14 -14
- package/src/password-input/password-input.tsx +79 -79
- package/src/password-input/styles.ts +25 -25
- package/src/password-input/types.ts +24 -24
- package/src/pin-input/index.ts +12 -12
- package/src/pin-input/pin-input.tsx +96 -96
- package/src/pin-input/styles.ts +16 -16
- package/src/pin-input/types.ts +26 -26
- package/src/popover/index.ts +2 -2
- package/src/popover/popover.tsx +98 -98
- package/src/popover/styles.ts +31 -31
- package/src/popover/types.ts +46 -46
- package/src/portal/index.ts +2 -2
- package/src/portal/portal.tsx +8 -8
- package/src/portal/styles.ts +2 -2
- package/src/portal/types.ts +3 -3
- package/src/pressable/index.ts +2 -2
- package/src/pressable/pressable.tsx +20 -20
- package/src/pressable/styles.ts +10 -10
- package/src/pressable/types.ts +6 -6
- package/src/progress/index.ts +9 -9
- package/src/progress/progress-filled-track.tsx +26 -26
- package/src/progress/progress.tsx +52 -52
- package/src/progress/styles.ts +34 -34
- package/src/progress/types.ts +28 -28
- package/src/radio/index.ts +14 -14
- package/src/radio/radio-group.tsx +61 -61
- package/src/radio/radio-icon.tsx +24 -24
- package/src/radio/radio-indicator.tsx +30 -30
- package/src/radio/radio-label.tsx +24 -24
- package/src/radio/radio.tsx +68 -68
- package/src/radio/styles.ts +69 -69
- package/src/radio/types.ts +51 -51
- package/src/rating/index.ts +7 -7
- package/src/rating/rating.tsx +93 -93
- package/src/rating/styles.ts +13 -13
- package/src/rating/types.ts +29 -29
- package/src/search-input/index.ts +16 -16
- package/src/search-input/search-input.tsx +119 -119
- package/src/search-input/styles.ts +28 -28
- package/src/search-input/types.ts +31 -31
- package/src/segmented-control/index.ts +2 -2
- package/src/segmented-control/segmented-control.tsx +34 -34
- package/src/segmented-control/styles.ts +22 -22
- package/src/segmented-control/types.ts +22 -22
- package/src/select/index.ts +28 -28
- package/src/select/select-backdrop.tsx +25 -25
- package/src/select/select-content.tsx +49 -49
- package/src/select/select-drag-indicator.tsx +19 -19
- package/src/select/select-icon.tsx +25 -25
- package/src/select/select-input.tsx +32 -32
- package/src/select/select-item-text.tsx +30 -30
- package/src/select/select-item.tsx +72 -72
- package/src/select/select-portal.tsx +22 -22
- package/src/select/select-scroll-view.tsx +22 -22
- package/src/select/select-trigger.tsx +64 -64
- package/src/select/select.tsx +101 -101
- package/src/select/styles.ts +114 -114
- package/src/select/types.ts +92 -92
- package/src/skeleton/index.ts +2 -2
- package/src/skeleton/skeleton.tsx +29 -29
- package/src/skeleton/styles.ts +14 -14
- package/src/skeleton/types.ts +12 -12
- package/src/slider/index.ts +12 -12
- package/src/slider/slider-filled-track.tsx +31 -31
- package/src/slider/slider-thumb.tsx +52 -52
- package/src/slider/slider-track.tsx +154 -154
- package/src/slider/slider.tsx +193 -193
- package/src/slider/styles.ts +71 -71
- package/src/slider/types.ts +47 -47
- package/src/snackbar/index.ts +2 -2
- package/src/snackbar/snackbar.tsx +39 -39
- package/src/snackbar/styles.ts +29 -29
- package/src/snackbar/types.ts +21 -21
- package/src/spinner/index.ts +2 -2
- package/src/spinner/spinner.tsx +29 -29
- package/src/spinner/styles.ts +15 -15
- package/src/spinner/types.ts +10 -10
- package/src/stack/index.ts +2 -2
- package/src/stack/stack.tsx +49 -49
- package/src/stack/styles.ts +25 -25
- package/src/stack/types.ts +15 -15
- package/src/stat/index.ts +2 -2
- package/src/stat/stat.tsx +48 -48
- package/src/stat/styles.ts +34 -34
- package/src/stat/types.ts +24 -24
- package/src/stepper/index.ts +2 -2
- package/src/stepper/stepper.tsx +95 -95
- package/src/stepper/styles.ts +49 -49
- package/src/stepper/types.ts +20 -20
- package/src/switch/index.ts +2 -2
- package/src/switch/styles.ts +24 -24
- package/src/switch/switch.tsx +67 -67
- package/src/switch/types.ts +23 -23
- package/src/table/index.ts +2 -2
- package/src/table/styles.ts +12 -12
- package/src/table/table.tsx +52 -52
- package/src/table/types.ts +10 -10
- package/src/tabs/index.ts +18 -18
- package/src/tabs/styles.ts +113 -113
- package/src/tabs/tab-list.tsx +29 -29
- package/src/tabs/tab-panel.tsx +29 -29
- package/src/tabs/tab-panels.tsx +21 -21
- package/src/tabs/tab-text.tsx +26 -26
- package/src/tabs/tab.tsx +56 -56
- package/src/tabs/tabs.tsx +71 -71
- package/src/tabs/types.ts +53 -53
- package/src/tag/index.ts +14 -14
- package/src/tag/styles.ts +115 -115
- package/src/tag/tag-close-button.tsx +26 -26
- package/src/tag/tag-icon.tsx +20 -20
- package/src/tag/tag-text.tsx +22 -22
- package/src/tag/tag.tsx +40 -40
- package/src/tag/types.ts +33 -33
- package/src/tags-input/index.ts +18 -18
- package/src/tags-input/styles.ts +29 -29
- package/src/tags-input/tags-input.tsx +149 -149
- package/src/tags-input/types.ts +37 -37
- package/src/text/index.ts +2 -2
- package/src/text/styles.ts +54 -54
- package/src/text/text.tsx +51 -51
- package/src/text/types.ts +36 -36
- package/src/textarea/index.ts +2 -2
- package/src/textarea/styles.ts +37 -37
- package/src/textarea/textarea.tsx +68 -68
- package/src/textarea/types.ts +14 -14
- package/src/timeline/index.ts +2 -2
- package/src/timeline/styles.ts +57 -57
- package/src/timeline/timeline.tsx +52 -52
- package/src/timeline/types.ts +30 -30
- package/src/toast/index.ts +17 -17
- package/src/toast/styles.ts +118 -118
- package/src/toast/toast-description.tsx +22 -22
- package/src/toast/toast-provider.tsx +136 -136
- package/src/toast/toast-title.tsx +22 -22
- package/src/toast/toast.tsx +43 -43
- package/src/toast/types.ts +50 -50
- package/src/toast/use-toast.ts +7 -7
- package/src/toggle/index.ts +2 -2
- package/src/toggle/styles.ts +30 -30
- package/src/toggle/toggle.tsx +25 -25
- package/src/toggle/types.ts +15 -15
- package/src/toggle-group/index.ts +2 -2
- package/src/toggle-group/styles.ts +35 -35
- package/src/toggle-group/toggle-group.tsx +60 -60
- package/src/toggle-group/types.ts +29 -29
- package/src/tooltip/index.ts +11 -11
- package/src/tooltip/styles.ts +9 -9
- package/src/tooltip/tooltip-content.tsx +19 -19
- package/src/tooltip/tooltip-text.tsx +19 -19
- package/src/tooltip/tooltip.tsx +116 -116
- package/src/tooltip/types.ts +35 -35
- package/src/utils/brand.ts +5 -5
- package/src/utils/create-context.ts +17 -17
- package/src/utils/index.ts +8 -8
- package/src/utils/types.ts +20 -20
- package/src/visually-hidden/index.ts +2 -2
- package/src/visually-hidden/styles.ts +6 -6
- package/src/visually-hidden/types.ts +6 -6
- package/src/visually-hidden/visually-hidden.tsx +22 -22
- package/tailwind-preset.js +203 -203
|
@@ -1,96 +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';
|
|
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';
|
package/src/pin-input/styles.ts
CHANGED
|
@@ -1,16 +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
|
-
});
|
|
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
|
+
});
|
package/src/pin-input/types.ts
CHANGED
|
@@ -1,26 +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
|
-
}
|
|
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
|
+
}
|
package/src/popover/index.ts
CHANGED
|
@@ -1,2 +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';
|
|
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';
|
package/src/popover/popover.tsx
CHANGED
|
@@ -1,98 +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';
|
|
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';
|
package/src/popover/styles.ts
CHANGED
|
@@ -1,31 +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
|
-
});
|
|
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
|
+
});
|
package/src/popover/types.ts
CHANGED
|
@@ -1,46 +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
|
-
}
|
|
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
|
+
}
|
package/src/portal/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Portal } from './portal';
|
|
2
|
-
export type { PortalProps } from './types';
|
|
1
|
+
export { Portal } from './portal';
|
|
2
|
+
export type { PortalProps } from './types';
|
package/src/portal/portal.tsx
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import type { PortalProps } from './types';
|
|
3
|
-
|
|
4
|
-
export function Portal({ children }: PortalProps) {
|
|
5
|
-
return <>{children}</>;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
Portal.displayName = 'Portal';
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { PortalProps } from './types';
|
|
3
|
+
|
|
4
|
+
export function Portal({ children }: PortalProps) {
|
|
5
|
+
return <>{children}</>;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
Portal.displayName = 'Portal';
|