@wireservers-ui/react-natives 2.0.0 → 2.0.2-rc.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/CHANGELOG.md +87 -58
- package/LICENSE +21 -21
- package/README.md +642 -598
- package/bin/cli.js +83 -5
- package/bin/init.js +470 -0
- package/package.json +1 -1
- 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 +212 -203
package/src/kbd/types.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { View } from 'react-native';
|
|
2
|
-
|
|
3
|
-
export interface KbdProps
|
|
4
|
-
extends React.ComponentPropsWithoutRef<typeof View> {
|
|
5
|
-
className?: string;
|
|
6
|
-
children: React.ReactNode;
|
|
7
|
-
}
|
|
1
|
+
import type { View } from 'react-native';
|
|
2
|
+
|
|
3
|
+
export interface KbdProps
|
|
4
|
+
extends React.ComponentPropsWithoutRef<typeof View> {
|
|
5
|
+
className?: string;
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
}
|
package/src/link/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { Link } from './link';
|
|
2
|
-
export { LinkText } from './link-text';
|
|
3
|
-
|
|
4
|
-
export type { LinkProps, LinkTextProps } from './types';
|
|
1
|
+
export { Link } from './link';
|
|
2
|
+
export { LinkText } from './link-text';
|
|
3
|
+
|
|
4
|
+
export type { LinkProps, LinkTextProps } from './types';
|
package/src/link/link-text.tsx
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Text } from 'react-native';
|
|
3
|
-
import type { LinkTextProps } from './types';
|
|
4
|
-
import { linkTextStyle } from './styles';
|
|
5
|
-
|
|
6
|
-
export const LinkText = React.forwardRef<
|
|
7
|
-
React.ElementRef<typeof Text>,
|
|
8
|
-
LinkTextProps
|
|
9
|
-
>(({ className, ...props }, ref) => {
|
|
10
|
-
return (
|
|
11
|
-
<Text
|
|
12
|
-
ref={ref}
|
|
13
|
-
className={linkTextStyle({ class: className })}
|
|
14
|
-
{...props}
|
|
15
|
-
/>
|
|
16
|
-
);
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
LinkText.displayName = 'LinkText';
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Text } from 'react-native';
|
|
3
|
+
import type { LinkTextProps } from './types';
|
|
4
|
+
import { linkTextStyle } from './styles';
|
|
5
|
+
|
|
6
|
+
export const LinkText = React.forwardRef<
|
|
7
|
+
React.ElementRef<typeof Text>,
|
|
8
|
+
LinkTextProps
|
|
9
|
+
>(({ className, ...props }, ref) => {
|
|
10
|
+
return (
|
|
11
|
+
<Text
|
|
12
|
+
ref={ref}
|
|
13
|
+
className={linkTextStyle({ class: className })}
|
|
14
|
+
{...props}
|
|
15
|
+
/>
|
|
16
|
+
);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
LinkText.displayName = 'LinkText';
|
package/src/link/link.tsx
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import React, { useCallback } from 'react';
|
|
2
|
-
import { Linking, Pressable } from 'react-native';
|
|
3
|
-
import type { LinkProps } from './types';
|
|
4
|
-
import { linkStyle } from './styles';
|
|
5
|
-
|
|
6
|
-
export const Link = React.forwardRef<
|
|
7
|
-
React.ElementRef<typeof Pressable>,
|
|
8
|
-
LinkProps
|
|
9
|
-
>(({ className, href, isExternal, onPress, ...props }, ref) => {
|
|
10
|
-
const handlePress = useCallback(
|
|
11
|
-
(e: any) => {
|
|
12
|
-
onPress?.(e);
|
|
13
|
-
if (href && isExternal) {
|
|
14
|
-
Linking.openURL(href);
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
[href, isExternal, onPress],
|
|
18
|
-
);
|
|
19
|
-
|
|
20
|
-
return (
|
|
21
|
-
<Pressable
|
|
22
|
-
ref={ref}
|
|
23
|
-
role="link"
|
|
24
|
-
onPress={handlePress}
|
|
25
|
-
className={linkStyle({ class: className })}
|
|
26
|
-
{...props}
|
|
27
|
-
/>
|
|
28
|
-
);
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
Link.displayName = 'Link';
|
|
1
|
+
import React, { useCallback } from 'react';
|
|
2
|
+
import { Linking, Pressable } from 'react-native';
|
|
3
|
+
import type { LinkProps } from './types';
|
|
4
|
+
import { linkStyle } from './styles';
|
|
5
|
+
|
|
6
|
+
export const Link = React.forwardRef<
|
|
7
|
+
React.ElementRef<typeof Pressable>,
|
|
8
|
+
LinkProps
|
|
9
|
+
>(({ className, href, isExternal, onPress, ...props }, ref) => {
|
|
10
|
+
const handlePress = useCallback(
|
|
11
|
+
(e: any) => {
|
|
12
|
+
onPress?.(e);
|
|
13
|
+
if (href && isExternal) {
|
|
14
|
+
Linking.openURL(href);
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
[href, isExternal, onPress],
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<Pressable
|
|
22
|
+
ref={ref}
|
|
23
|
+
role="link"
|
|
24
|
+
onPress={handlePress}
|
|
25
|
+
className={linkStyle({ class: className })}
|
|
26
|
+
{...props}
|
|
27
|
+
/>
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
Link.displayName = 'Link';
|
package/src/link/styles.ts
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { tv } from 'tailwind-variants';
|
|
2
|
-
|
|
3
|
-
export const linkStyle = tv({
|
|
4
|
-
base: 'web:cursor-pointer',
|
|
5
|
-
});
|
|
6
|
-
|
|
7
|
-
export const linkTextStyle = tv({
|
|
8
|
-
base: 'text-primary-600 underline data-[hover=true]:text-primary-700 data-[active=true]:text-primary-800',
|
|
9
|
-
variants: {
|
|
10
|
-
size: {
|
|
11
|
-
sm: 'text-sm',
|
|
12
|
-
md: 'text-base',
|
|
13
|
-
lg: 'text-lg',
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
defaultVariants: {
|
|
17
|
-
size: 'md',
|
|
18
|
-
},
|
|
19
|
-
});
|
|
1
|
+
import { tv } from 'tailwind-variants';
|
|
2
|
+
|
|
3
|
+
export const linkStyle = tv({
|
|
4
|
+
base: 'web:cursor-pointer',
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
export const linkTextStyle = tv({
|
|
8
|
+
base: 'text-primary-600 underline data-[hover=true]:text-primary-700 data-[active=true]:text-primary-800',
|
|
9
|
+
variants: {
|
|
10
|
+
size: {
|
|
11
|
+
sm: 'text-sm',
|
|
12
|
+
md: 'text-base',
|
|
13
|
+
lg: 'text-lg',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
defaultVariants: {
|
|
17
|
+
size: 'md',
|
|
18
|
+
},
|
|
19
|
+
});
|
package/src/link/types.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type { Pressable, Text as RNText } from 'react-native';
|
|
2
|
-
|
|
3
|
-
export interface LinkProps
|
|
4
|
-
extends React.ComponentPropsWithoutRef<typeof Pressable> {
|
|
5
|
-
className?: string;
|
|
6
|
-
href?: string;
|
|
7
|
-
isExternal?: boolean;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export interface LinkTextProps
|
|
11
|
-
extends React.ComponentPropsWithoutRef<typeof RNText> {
|
|
12
|
-
className?: string;
|
|
13
|
-
}
|
|
1
|
+
import type { Pressable, Text as RNText } from 'react-native';
|
|
2
|
+
|
|
3
|
+
export interface LinkProps
|
|
4
|
+
extends React.ComponentPropsWithoutRef<typeof Pressable> {
|
|
5
|
+
className?: string;
|
|
6
|
+
href?: string;
|
|
7
|
+
isExternal?: boolean;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface LinkTextProps
|
|
11
|
+
extends React.ComponentPropsWithoutRef<typeof RNText> {
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
package/src/list/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { List, ListProvider, useListContext, ListItem, ListItemText, ListItemDescription, ListItemIcon } from './list';
|
|
2
|
-
export type { ListProps, ListItemProps, ListItemTextProps, ListItemDescriptionProps, ListItemIconProps, ListVariant, ListContextValue } from './types';
|
|
1
|
+
export { List, ListProvider, useListContext, ListItem, ListItemText, ListItemDescription, ListItemIcon } from './list';
|
|
2
|
+
export type { ListProps, ListItemProps, ListItemTextProps, ListItemDescriptionProps, ListItemIconProps, ListVariant, ListContextValue } from './types';
|
package/src/list/list.tsx
CHANGED
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { View, Text } from 'react-native';
|
|
3
|
-
import { createComponentContext } from '../utils/create-context';
|
|
4
|
-
import type { ListProps, ListItemProps, ListItemTextProps, ListItemDescriptionProps, ListItemIconProps, ListContextValue } from './types';
|
|
5
|
-
import { listStyle, listItemStyle, listItemBulletStyle, listItemTextStyle, listItemDescriptionStyle, listItemIconStyle } from './styles';
|
|
6
|
-
|
|
7
|
-
export const [ListProvider, useListContext] = createComponentContext<ListContextValue>('List');
|
|
8
|
-
|
|
9
|
-
export const List = React.forwardRef<React.ElementRef<typeof View>, ListProps>(
|
|
10
|
-
({ className, variant = 'unordered', children, ...props }, ref) => {
|
|
11
|
-
let itemIndex = 0;
|
|
12
|
-
const indexedChildren = React.Children.map(children, (child) => {
|
|
13
|
-
if (React.isValidElement(child) && (child.type as any).displayName === 'ListItem') {
|
|
14
|
-
return React.cloneElement(child as React.ReactElement<any>, { index: itemIndex++ });
|
|
15
|
-
}
|
|
16
|
-
return child;
|
|
17
|
-
});
|
|
18
|
-
return (
|
|
19
|
-
<ListProvider value={{ variant }}>
|
|
20
|
-
<View ref={ref} className={listStyle({ class: className })} accessibilityRole="list" {...props}>{indexedChildren}</View>
|
|
21
|
-
</ListProvider>
|
|
22
|
-
);
|
|
23
|
-
},
|
|
24
|
-
);
|
|
25
|
-
List.displayName = 'List';
|
|
26
|
-
|
|
27
|
-
export const ListItem = React.forwardRef<React.ElementRef<typeof View>, ListItemProps>(
|
|
28
|
-
({ className, index, children, ...props }, ref) => {
|
|
29
|
-
const { variant } = useListContext();
|
|
30
|
-
return (
|
|
31
|
-
<View ref={ref} className={listItemStyle({ class: className })} accessibilityRole="text" {...props}>
|
|
32
|
-
<Text className={listItemBulletStyle({})}>
|
|
33
|
-
{variant === 'ordered' && index !== undefined ? `${index + 1}.` : '\u2022'}
|
|
34
|
-
</Text>
|
|
35
|
-
<View style={{ flex: 1 }}>{children}</View>
|
|
36
|
-
</View>
|
|
37
|
-
);
|
|
38
|
-
},
|
|
39
|
-
);
|
|
40
|
-
ListItem.displayName = 'ListItem';
|
|
41
|
-
|
|
42
|
-
export const ListItemText = React.forwardRef<React.ElementRef<typeof Text>, ListItemTextProps>(({ className, ...props }, ref) => {
|
|
43
|
-
return <Text ref={ref} className={listItemTextStyle({ class: className })} {...props} />;
|
|
44
|
-
});
|
|
45
|
-
ListItemText.displayName = 'ListItemText';
|
|
46
|
-
|
|
47
|
-
export const ListItemDescription = React.forwardRef<React.ElementRef<typeof Text>, ListItemDescriptionProps>(({ className, ...props }, ref) => {
|
|
48
|
-
return <Text ref={ref} className={listItemDescriptionStyle({ class: className })} {...props} />;
|
|
49
|
-
});
|
|
50
|
-
ListItemDescription.displayName = 'ListItemDescription';
|
|
51
|
-
|
|
52
|
-
export const ListItemIcon = React.forwardRef<any, ListItemIconProps>(({ as: AsComp, className, ...props }, ref) => {
|
|
53
|
-
return <AsComp ref={ref} className={listItemIconStyle({ class: className })} {...props} />;
|
|
54
|
-
});
|
|
55
|
-
ListItemIcon.displayName = 'ListItemIcon';
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { View, Text } from 'react-native';
|
|
3
|
+
import { createComponentContext } from '../utils/create-context';
|
|
4
|
+
import type { ListProps, ListItemProps, ListItemTextProps, ListItemDescriptionProps, ListItemIconProps, ListContextValue } from './types';
|
|
5
|
+
import { listStyle, listItemStyle, listItemBulletStyle, listItemTextStyle, listItemDescriptionStyle, listItemIconStyle } from './styles';
|
|
6
|
+
|
|
7
|
+
export const [ListProvider, useListContext] = createComponentContext<ListContextValue>('List');
|
|
8
|
+
|
|
9
|
+
export const List = React.forwardRef<React.ElementRef<typeof View>, ListProps>(
|
|
10
|
+
({ className, variant = 'unordered', children, ...props }, ref) => {
|
|
11
|
+
let itemIndex = 0;
|
|
12
|
+
const indexedChildren = React.Children.map(children, (child) => {
|
|
13
|
+
if (React.isValidElement(child) && (child.type as any).displayName === 'ListItem') {
|
|
14
|
+
return React.cloneElement(child as React.ReactElement<any>, { index: itemIndex++ });
|
|
15
|
+
}
|
|
16
|
+
return child;
|
|
17
|
+
});
|
|
18
|
+
return (
|
|
19
|
+
<ListProvider value={{ variant }}>
|
|
20
|
+
<View ref={ref} className={listStyle({ class: className })} accessibilityRole="list" {...props}>{indexedChildren}</View>
|
|
21
|
+
</ListProvider>
|
|
22
|
+
);
|
|
23
|
+
},
|
|
24
|
+
);
|
|
25
|
+
List.displayName = 'List';
|
|
26
|
+
|
|
27
|
+
export const ListItem = React.forwardRef<React.ElementRef<typeof View>, ListItemProps>(
|
|
28
|
+
({ className, index, children, ...props }, ref) => {
|
|
29
|
+
const { variant } = useListContext();
|
|
30
|
+
return (
|
|
31
|
+
<View ref={ref} className={listItemStyle({ class: className })} accessibilityRole="text" {...props}>
|
|
32
|
+
<Text className={listItemBulletStyle({})}>
|
|
33
|
+
{variant === 'ordered' && index !== undefined ? `${index + 1}.` : '\u2022'}
|
|
34
|
+
</Text>
|
|
35
|
+
<View style={{ flex: 1 }}>{children}</View>
|
|
36
|
+
</View>
|
|
37
|
+
);
|
|
38
|
+
},
|
|
39
|
+
);
|
|
40
|
+
ListItem.displayName = 'ListItem';
|
|
41
|
+
|
|
42
|
+
export const ListItemText = React.forwardRef<React.ElementRef<typeof Text>, ListItemTextProps>(({ className, ...props }, ref) => {
|
|
43
|
+
return <Text ref={ref} className={listItemTextStyle({ class: className })} {...props} />;
|
|
44
|
+
});
|
|
45
|
+
ListItemText.displayName = 'ListItemText';
|
|
46
|
+
|
|
47
|
+
export const ListItemDescription = React.forwardRef<React.ElementRef<typeof Text>, ListItemDescriptionProps>(({ className, ...props }, ref) => {
|
|
48
|
+
return <Text ref={ref} className={listItemDescriptionStyle({ class: className })} {...props} />;
|
|
49
|
+
});
|
|
50
|
+
ListItemDescription.displayName = 'ListItemDescription';
|
|
51
|
+
|
|
52
|
+
export const ListItemIcon = React.forwardRef<any, ListItemIconProps>(({ as: AsComp, className, ...props }, ref) => {
|
|
53
|
+
return <AsComp ref={ref} className={listItemIconStyle({ class: className })} {...props} />;
|
|
54
|
+
});
|
|
55
|
+
ListItemIcon.displayName = 'ListItemIcon';
|
package/src/list/styles.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { tv } from 'tailwind-variants';
|
|
2
|
-
|
|
3
|
-
export const listStyle = tv({ base: 'gap-1', variants: {} });
|
|
4
|
-
export const listItemStyle = tv({ base: 'flex-row items-start gap-2 py-1', variants: {} });
|
|
5
|
-
export const listItemBulletStyle = tv({ base: 'text-typography-400 mt-0.5', variants: {} });
|
|
6
|
-
export const listItemTextStyle = tv({ base: 'text-sm text-typography-700 flex-1', variants: {} });
|
|
7
|
-
export const listItemDescriptionStyle = tv({ base: 'text-xs text-typography-400', variants: {} });
|
|
8
|
-
export const listItemIconStyle = tv({ base: 'h-4 w-4 text-typography-400 mt-0.5', variants: {} });
|
|
1
|
+
import { tv } from 'tailwind-variants';
|
|
2
|
+
|
|
3
|
+
export const listStyle = tv({ base: 'gap-1', variants: {} });
|
|
4
|
+
export const listItemStyle = tv({ base: 'flex-row items-start gap-2 py-1', variants: {} });
|
|
5
|
+
export const listItemBulletStyle = tv({ base: 'text-typography-400 mt-0.5', variants: {} });
|
|
6
|
+
export const listItemTextStyle = tv({ base: 'text-sm text-typography-700 flex-1', variants: {} });
|
|
7
|
+
export const listItemDescriptionStyle = tv({ base: 'text-xs text-typography-400', variants: {} });
|
|
8
|
+
export const listItemIconStyle = tv({ base: 'h-4 w-4 text-typography-400 mt-0.5', variants: {} });
|
package/src/list/types.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import type { View, Text as RNText } from 'react-native';
|
|
2
|
-
|
|
3
|
-
export type ListVariant = 'unordered' | 'ordered';
|
|
4
|
-
|
|
5
|
-
export interface ListContextValue { variant: ListVariant; }
|
|
6
|
-
|
|
7
|
-
export interface ListProps extends React.ComponentPropsWithoutRef<typeof View> {
|
|
8
|
-
className?: string;
|
|
9
|
-
variant?: ListVariant;
|
|
10
|
-
}
|
|
11
|
-
export interface ListItemProps extends React.ComponentPropsWithoutRef<typeof View> {
|
|
12
|
-
className?: string;
|
|
13
|
-
index?: number;
|
|
14
|
-
}
|
|
15
|
-
export interface ListItemTextProps extends React.ComponentPropsWithoutRef<typeof RNText> { className?: string; }
|
|
16
|
-
export interface ListItemDescriptionProps extends React.ComponentPropsWithoutRef<typeof RNText> { className?: string; }
|
|
17
|
-
export interface ListItemIconProps { as: React.ElementType; className?: string; }
|
|
1
|
+
import type { View, Text as RNText } from 'react-native';
|
|
2
|
+
|
|
3
|
+
export type ListVariant = 'unordered' | 'ordered';
|
|
4
|
+
|
|
5
|
+
export interface ListContextValue { variant: ListVariant; }
|
|
6
|
+
|
|
7
|
+
export interface ListProps extends React.ComponentPropsWithoutRef<typeof View> {
|
|
8
|
+
className?: string;
|
|
9
|
+
variant?: ListVariant;
|
|
10
|
+
}
|
|
11
|
+
export interface ListItemProps extends React.ComponentPropsWithoutRef<typeof View> {
|
|
12
|
+
className?: string;
|
|
13
|
+
index?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface ListItemTextProps extends React.ComponentPropsWithoutRef<typeof RNText> { className?: string; }
|
|
16
|
+
export interface ListItemDescriptionProps extends React.ComponentPropsWithoutRef<typeof RNText> { className?: string; }
|
|
17
|
+
export interface ListItemIconProps { as: React.ElementType; className?: string; }
|
package/src/menu/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Menu, MenuProvider, useMenuContext, MenuTrigger, MenuContent, MenuItem, MenuItemText, MenuItemIcon, MenuSeparator, MenuGroup, MenuGroupTitle } from './menu';
|
|
2
|
-
export type { MenuProps, MenuTriggerProps, MenuContentProps, MenuItemProps, MenuItemTextProps, MenuItemIconProps, MenuSeparatorProps, MenuGroupProps, MenuGroupTitleProps, MenuContextValue } from './types';
|
|
1
|
+
export { Menu, MenuProvider, useMenuContext, MenuTrigger, MenuContent, MenuItem, MenuItemText, MenuItemIcon, MenuSeparator, MenuGroup, MenuGroupTitle } from './menu';
|
|
2
|
+
export type { MenuProps, MenuTriggerProps, MenuContentProps, MenuItemProps, MenuItemTextProps, MenuItemIconProps, MenuSeparatorProps, MenuGroupProps, MenuGroupTitleProps, MenuContextValue } from './types';
|
package/src/menu/menu.tsx
CHANGED
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
import React, { useState, useRef } from 'react';
|
|
2
|
-
import { View, Pressable, Text, Modal } from 'react-native';
|
|
3
|
-
import { createComponentContext } from '../utils/create-context';
|
|
4
|
-
import type { MenuProps, MenuTriggerProps, MenuContentProps, MenuItemProps, MenuItemTextProps, MenuItemIconProps, MenuSeparatorProps, MenuGroupProps, MenuGroupTitleProps, MenuContextValue, MenuTriggerRect } from './types';
|
|
5
|
-
import { menuContentStyle, menuItemStyle, menuItemTextStyle, menuItemIconStyle, menuSeparatorStyle, menuGroupStyle, menuGroupTitleStyle } from './styles';
|
|
6
|
-
|
|
7
|
-
export const [MenuProvider, useMenuContext] = createComponentContext<MenuContextValue>('Menu');
|
|
8
|
-
|
|
9
|
-
export const Menu: React.FC<MenuProps> = ({ isOpen: controlledOpen, onOpenChange, defaultOpen = false, children }) => {
|
|
10
|
-
const [internalOpen, setInternalOpen] = useState(defaultOpen);
|
|
11
|
-
const [triggerRect, setTriggerRect] = useState<MenuTriggerRect>({ pageX: 0, pageY: 0, width: 0, height: 0 });
|
|
12
|
-
const isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen;
|
|
13
|
-
const onToggle = () => { const next = !isOpen; setInternalOpen(next); onOpenChange?.(next); };
|
|
14
|
-
const onClose = () => { setInternalOpen(false); onOpenChange?.(false); };
|
|
15
|
-
return (
|
|
16
|
-
<MenuProvider value={{ isOpen, onToggle, onClose, triggerRect, setTriggerRect }}>
|
|
17
|
-
{children}
|
|
18
|
-
</MenuProvider>
|
|
19
|
-
);
|
|
20
|
-
};
|
|
21
|
-
Menu.displayName = 'Menu';
|
|
22
|
-
|
|
23
|
-
export const MenuTrigger = React.forwardRef<React.ElementRef<typeof Pressable>, MenuTriggerProps>(({ children }) => {
|
|
24
|
-
const { onToggle, setTriggerRect } = useMenuContext();
|
|
25
|
-
const triggerRef = useRef<View>(null);
|
|
26
|
-
|
|
27
|
-
const handlePress = () => {
|
|
28
|
-
triggerRef.current?.measure((_x, _y, width, height, pageX, pageY) => {
|
|
29
|
-
setTriggerRect({ pageX, pageY, width, height });
|
|
30
|
-
onToggle();
|
|
31
|
-
});
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
const child = React.Children.only(children) as React.ReactElement<any>;
|
|
35
|
-
return (
|
|
36
|
-
<View ref={triggerRef}>
|
|
37
|
-
{React.cloneElement(child, { onPress: handlePress })}
|
|
38
|
-
</View>
|
|
39
|
-
);
|
|
40
|
-
});
|
|
41
|
-
MenuTrigger.displayName = 'MenuTrigger';
|
|
42
|
-
|
|
43
|
-
export const MenuContent = React.forwardRef<React.ElementRef<typeof View>, MenuContentProps>(({ className, children, style, ...props }, ref) => {
|
|
44
|
-
const { isOpen, onClose, triggerRect } = useMenuContext();
|
|
45
|
-
if (!isOpen) return null;
|
|
46
|
-
|
|
47
|
-
return (
|
|
48
|
-
<Modal visible transparent animationType="none" onRequestClose={onClose}>
|
|
49
|
-
<Pressable style={{ flex: 1 }} onPress={onClose}>
|
|
50
|
-
<Pressable onPress={(e) => e.stopPropagation()}>
|
|
51
|
-
<View
|
|
52
|
-
ref={ref}
|
|
53
|
-
className={menuContentStyle({ class: className })}
|
|
54
|
-
style={[{ position: 'absolute', top: triggerRect.pageY + triggerRect.height + 4, left: triggerRect.pageX }, style]}
|
|
55
|
-
{...props}
|
|
56
|
-
>
|
|
57
|
-
{children}
|
|
58
|
-
</View>
|
|
59
|
-
</Pressable>
|
|
60
|
-
</Pressable>
|
|
61
|
-
</Modal>
|
|
62
|
-
);
|
|
63
|
-
});
|
|
64
|
-
MenuContent.displayName = 'MenuContent';
|
|
65
|
-
|
|
66
|
-
export const MenuItem = React.forwardRef<React.ElementRef<typeof Pressable>, MenuItemProps>(({ className, isDisabled, children, ...props }, ref) => {
|
|
67
|
-
const { onClose } = useMenuContext();
|
|
68
|
-
return (
|
|
69
|
-
<Pressable ref={ref} disabled={isDisabled} onPress={() => { props.onPress?.(undefined as any); onClose(); }} className={menuItemStyle({ isDisabled, class: className })} {...props}>
|
|
70
|
-
{children}
|
|
71
|
-
</Pressable>
|
|
72
|
-
);
|
|
73
|
-
});
|
|
74
|
-
MenuItem.displayName = 'MenuItem';
|
|
75
|
-
|
|
76
|
-
export const MenuItemText = React.forwardRef<React.ElementRef<typeof Text>, MenuItemTextProps>(({ className, ...props }, ref) => {
|
|
77
|
-
return <Text ref={ref} className={menuItemTextStyle({ class: className })} {...props} />;
|
|
78
|
-
});
|
|
79
|
-
MenuItemText.displayName = 'MenuItemText';
|
|
80
|
-
|
|
81
|
-
export const MenuItemIcon = React.forwardRef<any, MenuItemIconProps>(({ as: AsComp, className, ...props }, ref) => {
|
|
82
|
-
return <AsComp ref={ref} className={menuItemIconStyle({ class: className })} {...props} />;
|
|
83
|
-
});
|
|
84
|
-
MenuItemIcon.displayName = 'MenuItemIcon';
|
|
85
|
-
|
|
86
|
-
export const MenuSeparator = React.forwardRef<React.ElementRef<typeof View>, MenuSeparatorProps>(({ className, ...props }, ref) => {
|
|
87
|
-
return <View ref={ref} className={menuSeparatorStyle({ class: className })} {...props} />;
|
|
88
|
-
});
|
|
89
|
-
MenuSeparator.displayName = 'MenuSeparator';
|
|
90
|
-
|
|
91
|
-
export const MenuGroup = React.forwardRef<React.ElementRef<typeof View>, MenuGroupProps>(({ className, ...props }, ref) => {
|
|
92
|
-
return <View ref={ref} className={menuGroupStyle({ class: className })} {...props} />;
|
|
93
|
-
});
|
|
94
|
-
MenuGroup.displayName = 'MenuGroup';
|
|
95
|
-
|
|
96
|
-
export const MenuGroupTitle = React.forwardRef<React.ElementRef<typeof Text>, MenuGroupTitleProps>(({ className, ...props }, ref) => {
|
|
97
|
-
return <Text ref={ref} className={menuGroupTitleStyle({ class: className })} {...props} />;
|
|
98
|
-
});
|
|
99
|
-
MenuGroupTitle.displayName = 'MenuGroupTitle';
|
|
1
|
+
import React, { useState, useRef } from 'react';
|
|
2
|
+
import { View, Pressable, Text, Modal } from 'react-native';
|
|
3
|
+
import { createComponentContext } from '../utils/create-context';
|
|
4
|
+
import type { MenuProps, MenuTriggerProps, MenuContentProps, MenuItemProps, MenuItemTextProps, MenuItemIconProps, MenuSeparatorProps, MenuGroupProps, MenuGroupTitleProps, MenuContextValue, MenuTriggerRect } from './types';
|
|
5
|
+
import { menuContentStyle, menuItemStyle, menuItemTextStyle, menuItemIconStyle, menuSeparatorStyle, menuGroupStyle, menuGroupTitleStyle } from './styles';
|
|
6
|
+
|
|
7
|
+
export const [MenuProvider, useMenuContext] = createComponentContext<MenuContextValue>('Menu');
|
|
8
|
+
|
|
9
|
+
export const Menu: React.FC<MenuProps> = ({ isOpen: controlledOpen, onOpenChange, defaultOpen = false, children }) => {
|
|
10
|
+
const [internalOpen, setInternalOpen] = useState(defaultOpen);
|
|
11
|
+
const [triggerRect, setTriggerRect] = useState<MenuTriggerRect>({ pageX: 0, pageY: 0, width: 0, height: 0 });
|
|
12
|
+
const isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen;
|
|
13
|
+
const onToggle = () => { const next = !isOpen; setInternalOpen(next); onOpenChange?.(next); };
|
|
14
|
+
const onClose = () => { setInternalOpen(false); onOpenChange?.(false); };
|
|
15
|
+
return (
|
|
16
|
+
<MenuProvider value={{ isOpen, onToggle, onClose, triggerRect, setTriggerRect }}>
|
|
17
|
+
{children}
|
|
18
|
+
</MenuProvider>
|
|
19
|
+
);
|
|
20
|
+
};
|
|
21
|
+
Menu.displayName = 'Menu';
|
|
22
|
+
|
|
23
|
+
export const MenuTrigger = React.forwardRef<React.ElementRef<typeof Pressable>, MenuTriggerProps>(({ children }) => {
|
|
24
|
+
const { onToggle, setTriggerRect } = useMenuContext();
|
|
25
|
+
const triggerRef = useRef<View>(null);
|
|
26
|
+
|
|
27
|
+
const handlePress = () => {
|
|
28
|
+
triggerRef.current?.measure((_x, _y, width, height, pageX, pageY) => {
|
|
29
|
+
setTriggerRect({ pageX, pageY, width, height });
|
|
30
|
+
onToggle();
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const child = React.Children.only(children) as React.ReactElement<any>;
|
|
35
|
+
return (
|
|
36
|
+
<View ref={triggerRef}>
|
|
37
|
+
{React.cloneElement(child, { onPress: handlePress })}
|
|
38
|
+
</View>
|
|
39
|
+
);
|
|
40
|
+
});
|
|
41
|
+
MenuTrigger.displayName = 'MenuTrigger';
|
|
42
|
+
|
|
43
|
+
export const MenuContent = React.forwardRef<React.ElementRef<typeof View>, MenuContentProps>(({ className, children, style, ...props }, ref) => {
|
|
44
|
+
const { isOpen, onClose, triggerRect } = useMenuContext();
|
|
45
|
+
if (!isOpen) return null;
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<Modal visible transparent animationType="none" onRequestClose={onClose}>
|
|
49
|
+
<Pressable style={{ flex: 1 }} onPress={onClose}>
|
|
50
|
+
<Pressable onPress={(e) => e.stopPropagation()}>
|
|
51
|
+
<View
|
|
52
|
+
ref={ref}
|
|
53
|
+
className={menuContentStyle({ class: className })}
|
|
54
|
+
style={[{ position: 'absolute', top: triggerRect.pageY + triggerRect.height + 4, left: triggerRect.pageX }, style]}
|
|
55
|
+
{...props}
|
|
56
|
+
>
|
|
57
|
+
{children}
|
|
58
|
+
</View>
|
|
59
|
+
</Pressable>
|
|
60
|
+
</Pressable>
|
|
61
|
+
</Modal>
|
|
62
|
+
);
|
|
63
|
+
});
|
|
64
|
+
MenuContent.displayName = 'MenuContent';
|
|
65
|
+
|
|
66
|
+
export const MenuItem = React.forwardRef<React.ElementRef<typeof Pressable>, MenuItemProps>(({ className, isDisabled, children, ...props }, ref) => {
|
|
67
|
+
const { onClose } = useMenuContext();
|
|
68
|
+
return (
|
|
69
|
+
<Pressable ref={ref} disabled={isDisabled} onPress={() => { props.onPress?.(undefined as any); onClose(); }} className={menuItemStyle({ isDisabled, class: className })} {...props}>
|
|
70
|
+
{children}
|
|
71
|
+
</Pressable>
|
|
72
|
+
);
|
|
73
|
+
});
|
|
74
|
+
MenuItem.displayName = 'MenuItem';
|
|
75
|
+
|
|
76
|
+
export const MenuItemText = React.forwardRef<React.ElementRef<typeof Text>, MenuItemTextProps>(({ className, ...props }, ref) => {
|
|
77
|
+
return <Text ref={ref} className={menuItemTextStyle({ class: className })} {...props} />;
|
|
78
|
+
});
|
|
79
|
+
MenuItemText.displayName = 'MenuItemText';
|
|
80
|
+
|
|
81
|
+
export const MenuItemIcon = React.forwardRef<any, MenuItemIconProps>(({ as: AsComp, className, ...props }, ref) => {
|
|
82
|
+
return <AsComp ref={ref} className={menuItemIconStyle({ class: className })} {...props} />;
|
|
83
|
+
});
|
|
84
|
+
MenuItemIcon.displayName = 'MenuItemIcon';
|
|
85
|
+
|
|
86
|
+
export const MenuSeparator = React.forwardRef<React.ElementRef<typeof View>, MenuSeparatorProps>(({ className, ...props }, ref) => {
|
|
87
|
+
return <View ref={ref} className={menuSeparatorStyle({ class: className })} {...props} />;
|
|
88
|
+
});
|
|
89
|
+
MenuSeparator.displayName = 'MenuSeparator';
|
|
90
|
+
|
|
91
|
+
export const MenuGroup = React.forwardRef<React.ElementRef<typeof View>, MenuGroupProps>(({ className, ...props }, ref) => {
|
|
92
|
+
return <View ref={ref} className={menuGroupStyle({ class: className })} {...props} />;
|
|
93
|
+
});
|
|
94
|
+
MenuGroup.displayName = 'MenuGroup';
|
|
95
|
+
|
|
96
|
+
export const MenuGroupTitle = React.forwardRef<React.ElementRef<typeof Text>, MenuGroupTitleProps>(({ className, ...props }, ref) => {
|
|
97
|
+
return <Text ref={ref} className={menuGroupTitleStyle({ class: className })} {...props} />;
|
|
98
|
+
});
|
|
99
|
+
MenuGroupTitle.displayName = 'MenuGroupTitle';
|
package/src/menu/styles.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { tv } from 'tailwind-variants';
|
|
2
|
-
|
|
3
|
-
export const menuContentStyle = tv({ base: 'bg-background-0 rounded-lg py-1 shadow-hard-2 border border-outline-100 min-w-[180px]', variants: {} });
|
|
4
|
-
export const menuItemStyle = tv({
|
|
5
|
-
base: 'flex-row items-center px-3 py-2.5 gap-2',
|
|
6
|
-
variants: {
|
|
7
|
-
isDisabled: { true: 'opacity-50' },
|
|
8
|
-
},
|
|
9
|
-
});
|
|
10
|
-
export const menuItemTextStyle = tv({ base: 'text-sm text-typography-700 flex-1', variants: {} });
|
|
11
|
-
export const menuItemIconStyle = tv({ base: 'h-4 w-4 text-typography-500', variants: {} });
|
|
12
|
-
export const menuSeparatorStyle = tv({ base: 'h-px bg-outline-100 my-1', variants: {} });
|
|
13
|
-
export const menuGroupStyle = tv({ base: '', variants: {} });
|
|
14
|
-
export const menuGroupTitleStyle = tv({ base: 'px-3 py-1.5 text-xs font-semibold text-typography-400 uppercase', variants: {} });
|
|
1
|
+
import { tv } from 'tailwind-variants';
|
|
2
|
+
|
|
3
|
+
export const menuContentStyle = tv({ base: 'bg-background-0 rounded-lg py-1 shadow-hard-2 border border-outline-100 min-w-[180px]', variants: {} });
|
|
4
|
+
export const menuItemStyle = tv({
|
|
5
|
+
base: 'flex-row items-center px-3 py-2.5 gap-2',
|
|
6
|
+
variants: {
|
|
7
|
+
isDisabled: { true: 'opacity-50' },
|
|
8
|
+
},
|
|
9
|
+
});
|
|
10
|
+
export const menuItemTextStyle = tv({ base: 'text-sm text-typography-700 flex-1', variants: {} });
|
|
11
|
+
export const menuItemIconStyle = tv({ base: 'h-4 w-4 text-typography-500', variants: {} });
|
|
12
|
+
export const menuSeparatorStyle = tv({ base: 'h-px bg-outline-100 my-1', variants: {} });
|
|
13
|
+
export const menuGroupStyle = tv({ base: '', variants: {} });
|
|
14
|
+
export const menuGroupTitleStyle = tv({ base: 'px-3 py-1.5 text-xs font-semibold text-typography-400 uppercase', variants: {} });
|