@react-native-reusables/cli 0.0.17 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/README.md +2 -37
  2. package/__generated/components/ui/accordion.tsx +1 -1
  3. package/__generated/components/ui/alert-dialog.tsx +2 -3
  4. package/__generated/components/ui/aspect-ratio.tsx +1 -1
  5. package/__generated/components/ui/avatar.tsx +17 -13
  6. package/__generated/components/ui/badge.tsx +2 -2
  7. package/__generated/components/ui/card.tsx +1 -1
  8. package/__generated/components/ui/checkbox.tsx +2 -3
  9. package/__generated/components/ui/collapsible.tsx +1 -1
  10. package/__generated/components/ui/context-menu.tsx +3 -11
  11. package/__generated/components/ui/dialog.tsx +2 -3
  12. package/__generated/components/ui/dropdown-menu.tsx +1 -1
  13. package/__generated/components/ui/hover-card.tsx +1 -1
  14. package/__generated/components/ui/label.tsx +1 -1
  15. package/__generated/components/ui/menubar.tsx +1 -1
  16. package/__generated/components/ui/navigation-menu.tsx +6 -4
  17. package/__generated/components/ui/popover.tsx +1 -1
  18. package/__generated/components/ui/progress.tsx +14 -10
  19. package/__generated/components/ui/radio-group.tsx +1 -1
  20. package/__generated/components/ui/select.tsx +13 -12
  21. package/__generated/components/ui/separator.tsx +1 -1
  22. package/__generated/components/ui/switch.tsx +1 -2
  23. package/__generated/components/ui/table.tsx +1 -1
  24. package/__generated/components/ui/tabs.tsx +1 -1
  25. package/__generated/components/ui/text.tsx +2 -2
  26. package/__generated/components/ui/toggle-group.tsx +1 -1
  27. package/__generated/components/ui/toggle.tsx +1 -1
  28. package/__generated/components/ui/tooltip.tsx +1 -2
  29. package/__generated/components/ui/typography.tsx +2 -2
  30. package/dist/index.js +3 -3
  31. package/dist/index.js.map +1 -1
  32. package/package.json +2 -34
  33. package/__generated/components/primitives/accordion/accordion.tsx +0 -216
  34. package/__generated/components/primitives/accordion/accordion.web.tsx +0 -295
  35. package/__generated/components/primitives/accordion/index.ts +0 -1
  36. package/__generated/components/primitives/accordion/types.ts +0 -45
  37. package/__generated/components/primitives/alert-dialog/alert-dialog.tsx +0 -237
  38. package/__generated/components/primitives/alert-dialog/alert-dialog.web.tsx +0 -256
  39. package/__generated/components/primitives/alert-dialog/index.ts +0 -1
  40. package/__generated/components/primitives/alert-dialog/types.ts +0 -48
  41. package/__generated/components/primitives/aspect-ratio.tsx +0 -23
  42. package/__generated/components/primitives/avatar/index.tsx +0 -95
  43. package/__generated/components/primitives/avatar/types.ts +0 -10
  44. package/__generated/components/primitives/checkbox/checkbox.tsx +0 -101
  45. package/__generated/components/primitives/checkbox/checkbox.web.tsx +0 -114
  46. package/__generated/components/primitives/checkbox/index.ts +0 -1
  47. package/__generated/components/primitives/checkbox/types.ts +0 -11
  48. package/__generated/components/primitives/collapsible/collapsible.tsx +0 -119
  49. package/__generated/components/primitives/collapsible/collapsible.web.tsx +0 -157
  50. package/__generated/components/primitives/collapsible/index.ts +0 -1
  51. package/__generated/components/primitives/collapsible/types.ts +0 -18
  52. package/__generated/components/primitives/context-menu/context-menu.tsx +0 -626
  53. package/__generated/components/primitives/context-menu/context-menu.web.tsx +0 -504
  54. package/__generated/components/primitives/context-menu/index.ts +0 -1
  55. package/__generated/components/primitives/context-menu/types.ts +0 -82
  56. package/__generated/components/primitives/dialog/dialog.tsx +0 -211
  57. package/__generated/components/primitives/dialog/dialog.web.tsx +0 -197
  58. package/__generated/components/primitives/dialog/index.ts +0 -1
  59. package/__generated/components/primitives/dialog/types.ts +0 -60
  60. package/__generated/components/primitives/dropdown-menu/dropdown-menu.tsx +0 -584
  61. package/__generated/components/primitives/dropdown-menu/dropdown-menu.web.tsx +0 -521
  62. package/__generated/components/primitives/dropdown-menu/index.ts +0 -1
  63. package/__generated/components/primitives/dropdown-menu/types.ts +0 -71
  64. package/__generated/components/primitives/hooks/index.ts +0 -3
  65. package/__generated/components/primitives/hooks/useAugmentedRef.tsx +0 -29
  66. package/__generated/components/primitives/hooks/useControllableState.tsx +0 -75
  67. package/__generated/components/primitives/hooks/useRelativePosition.tsx +0 -227
  68. package/__generated/components/primitives/hover-card/hover-card.tsx +0 -271
  69. package/__generated/components/primitives/hover-card/hover-card.web.tsx +0 -145
  70. package/__generated/components/primitives/hover-card/index.ts +0 -1
  71. package/__generated/components/primitives/hover-card/types.ts +0 -42
  72. package/__generated/components/primitives/label/index.ts +0 -1
  73. package/__generated/components/primitives/label/label.tsx +0 -31
  74. package/__generated/components/primitives/label/label.web.tsx +0 -36
  75. package/__generated/components/primitives/label/types.ts +0 -15
  76. package/__generated/components/primitives/menubar/index.ts +0 -1
  77. package/__generated/components/primitives/menubar/menubar.tsx +0 -624
  78. package/__generated/components/primitives/menubar/menubar.web.tsx +0 -543
  79. package/__generated/components/primitives/menubar/types.ts +0 -76
  80. package/__generated/components/primitives/navigation-menu/index.ts +0 -1
  81. package/__generated/components/primitives/navigation-menu/navigation-menu.tsx +0 -315
  82. package/__generated/components/primitives/navigation-menu/navigation-menu.web.tsx +0 -264
  83. package/__generated/components/primitives/navigation-menu/types.ts +0 -49
  84. package/__generated/components/primitives/popover/index.ts +0 -1
  85. package/__generated/components/primitives/popover/popover.tsx +0 -286
  86. package/__generated/components/primitives/popover/popover.web.tsx +0 -179
  87. package/__generated/components/primitives/popover/types.ts +0 -30
  88. package/__generated/components/primitives/portal.tsx +0 -82
  89. package/__generated/components/primitives/progress/index.ts +0 -1
  90. package/__generated/components/primitives/progress/progress.tsx +0 -59
  91. package/__generated/components/primitives/progress/progress.web.tsx +0 -36
  92. package/__generated/components/primitives/progress/types.ts +0 -7
  93. package/__generated/components/primitives/radio-group/index.ts +0 -1
  94. package/__generated/components/primitives/radio-group/radio-group.tsx +0 -116
  95. package/__generated/components/primitives/radio-group/radio-group.web.tsx +0 -78
  96. package/__generated/components/primitives/radio-group/types.ts +0 -15
  97. package/__generated/components/primitives/select/index.ts +0 -1
  98. package/__generated/components/primitives/select/select.tsx +0 -455
  99. package/__generated/components/primitives/select/select.web.tsx +0 -319
  100. package/__generated/components/primitives/select/types.ts +0 -87
  101. package/__generated/components/primitives/separator/index.tsx +0 -23
  102. package/__generated/components/primitives/separator/types.ts +0 -6
  103. package/__generated/components/primitives/slider/index.ts +0 -1
  104. package/__generated/components/primitives/slider/slider.tsx +0 -89
  105. package/__generated/components/primitives/slider/slider.web.tsx +0 -67
  106. package/__generated/components/primitives/slider/types.ts +0 -24
  107. package/__generated/components/primitives/slot.tsx +0 -187
  108. package/__generated/components/primitives/switch/index.ts +0 -1
  109. package/__generated/components/primitives/switch/switch.tsx +0 -65
  110. package/__generated/components/primitives/switch/switch.web.tsx +0 -67
  111. package/__generated/components/primitives/switch/types.ts +0 -11
  112. package/__generated/components/primitives/table.tsx +0 -55
  113. package/__generated/components/primitives/tabs/index.ts +0 -1
  114. package/__generated/components/primitives/tabs/tabs.tsx +0 -133
  115. package/__generated/components/primitives/tabs/tabs.web.tsx +0 -97
  116. package/__generated/components/primitives/tabs/types.ts +0 -24
  117. package/__generated/components/primitives/toast/index.tsx +0 -128
  118. package/__generated/components/primitives/toast/types.ts +0 -7
  119. package/__generated/components/primitives/toggle/index.ts +0 -1
  120. package/__generated/components/primitives/toggle/toggle.tsx +0 -37
  121. package/__generated/components/primitives/toggle/toggle.web.tsx +0 -26
  122. package/__generated/components/primitives/toggle/types.ts +0 -7
  123. package/__generated/components/primitives/toggle-group/index.ts +0 -1
  124. package/__generated/components/primitives/toggle-group/toggle-group.tsx +0 -125
  125. package/__generated/components/primitives/toggle-group/toggle-group.web.tsx +0 -124
  126. package/__generated/components/primitives/toggle-group/types.ts +0 -37
  127. package/__generated/components/primitives/toolbar/index.ts +0 -1
  128. package/__generated/components/primitives/toolbar/toolbar.tsx +0 -125
  129. package/__generated/components/primitives/toolbar/toolbar.web.tsx +0 -129
  130. package/__generated/components/primitives/toolbar/types.ts +0 -39
  131. package/__generated/components/primitives/tooltip/index.ts +0 -1
  132. package/__generated/components/primitives/tooltip/tooltip.tsx +0 -271
  133. package/__generated/components/primitives/tooltip/tooltip.web.tsx +0 -167
  134. package/__generated/components/primitives/tooltip/types.ts +0 -44
  135. package/__generated/components/primitives/types.ts +0 -105
  136. package/__generated/components/primitives/utils.ts +0 -61
@@ -1,286 +0,0 @@
1
- import { useControllableState, useRelativePosition, type LayoutPosition } from '@rnr/hooks';
2
- import { Portal as RNPPortal } from '@rnr/portal';
3
- import * as Slot from '@rnr/slot';
4
- import type {
5
- PositionedContentProps,
6
- PressableRef,
7
- SlottablePressableProps,
8
- SlottableViewProps,
9
- ViewRef,
10
- } from '@rnr/types';
11
- import * as React from 'react';
12
- import {
13
- BackHandler,
14
- Pressable,
15
- View,
16
- type GestureResponderEvent,
17
- type LayoutChangeEvent,
18
- type LayoutRectangle,
19
- } from 'react-native';
20
- import type {
21
- PopoverOverlayProps,
22
- PopoverPortalProps,
23
- PopoverRootProps,
24
- RootContext,
25
- } from './types';
26
-
27
- interface IRootContext extends RootContext {
28
- triggerPosition: LayoutPosition | null;
29
- setTriggerPosition: (triggerPosition: LayoutPosition | null) => void;
30
- contentLayout: LayoutRectangle | null;
31
- setContentLayout: (contentLayout: LayoutRectangle | null) => void;
32
- nativeID: string;
33
- }
34
-
35
- const RootContext = React.createContext<IRootContext | null>(null);
36
-
37
- const Root = React.forwardRef<ViewRef, SlottableViewProps & PopoverRootProps>(
38
- ({ asChild, open: openProp, defaultOpen, onOpenChange: onOpenChangeProp, ...viewProps }, ref) => {
39
- const [open = false, onOpenChange] = useControllableState({
40
- prop: openProp,
41
- defaultProp: defaultOpen,
42
- onChange: onOpenChangeProp,
43
- });
44
- const nativeID = React.useId();
45
- const [triggerPosition, setTriggerPosition] = React.useState<LayoutPosition | null>(null);
46
- const [contentLayout, setContentLayout] = React.useState<LayoutRectangle | null>(null);
47
-
48
- const Component = asChild ? Slot.View : View;
49
- return (
50
- <RootContext.Provider
51
- value={{
52
- open,
53
- onOpenChange,
54
- contentLayout,
55
- nativeID,
56
- setContentLayout,
57
- setTriggerPosition,
58
- triggerPosition,
59
- }}
60
- >
61
- <Component ref={ref} {...viewProps} />
62
- </RootContext.Provider>
63
- );
64
- }
65
- );
66
-
67
- Root.displayName = 'RootNativePopover';
68
-
69
- function usePopoverContext() {
70
- const context = React.useContext(RootContext);
71
- if (!context) {
72
- throw new Error('Popover compound components cannot be rendered outside the Popover component');
73
- }
74
- return context;
75
- }
76
-
77
- const Trigger = React.forwardRef<PressableRef, SlottablePressableProps>(
78
- ({ asChild, onPress: onPressProp, disabled = false, ...props }, ref) => {
79
- const triggerRef = React.useRef<View>(null);
80
- const { open, onOpenChange, setTriggerPosition } = usePopoverContext();
81
-
82
- React.useImperativeHandle(
83
- ref,
84
- () => {
85
- if (!triggerRef.current) {
86
- return new View({});
87
- }
88
- return triggerRef.current;
89
- },
90
- [triggerRef.current]
91
- );
92
-
93
- function onPress(ev: GestureResponderEvent) {
94
- if (disabled) return;
95
- triggerRef.current?.measure((_x, _y, width, height, pageX, pageY) => {
96
- setTriggerPosition({ width, pageX, pageY: pageY, height });
97
- });
98
- const newValue = !open;
99
- onOpenChange(newValue);
100
- onPressProp?.(ev);
101
- }
102
-
103
- const Component = asChild ? Slot.Pressable : Pressable;
104
- return (
105
- <Component
106
- ref={triggerRef}
107
- aria-disabled={disabled ?? undefined}
108
- role='button'
109
- onPress={onPress}
110
- disabled={disabled ?? undefined}
111
- {...props}
112
- />
113
- );
114
- }
115
- );
116
-
117
- Trigger.displayName = 'TriggerNativePopover';
118
-
119
- /**
120
- * @warning when using a custom `<PortalHost />`, you might have to adjust the Content's sideOffset to account for nav elements like headers.
121
- */
122
- function Portal({ forceMount, hostName, children }: PopoverPortalProps) {
123
- const value = usePopoverContext();
124
-
125
- if (!value.triggerPosition) {
126
- return null;
127
- }
128
-
129
- if (!forceMount) {
130
- if (!value.open) {
131
- return null;
132
- }
133
- }
134
-
135
- return (
136
- <RNPPortal hostName={hostName} name={`${value.nativeID}_portal`}>
137
- <RootContext.Provider value={value}>{children}</RootContext.Provider>
138
- </RNPPortal>
139
- );
140
- }
141
-
142
- const Overlay = React.forwardRef<PressableRef, SlottablePressableProps & PopoverOverlayProps>(
143
- ({ asChild, forceMount, onPress: OnPressProp, closeOnPress = true, ...props }, ref) => {
144
- const { open, onOpenChange, setTriggerPosition, setContentLayout } = usePopoverContext();
145
-
146
- function onPress(ev: GestureResponderEvent) {
147
- if (closeOnPress) {
148
- setTriggerPosition(null);
149
- setContentLayout(null);
150
- onOpenChange(false);
151
- }
152
- OnPressProp?.(ev);
153
- }
154
-
155
- if (!forceMount) {
156
- if (!open) {
157
- return null;
158
- }
159
- }
160
-
161
- const Component = asChild ? Slot.Pressable : Pressable;
162
- return <Component ref={ref} onPress={onPress} {...props} />;
163
- }
164
- );
165
-
166
- Overlay.displayName = 'OverlayNativePopover';
167
-
168
- /**
169
- * @info `position`, `top`, `left`, and `maxWidth` style properties are controlled internally. Opt out of this behavior by setting `disablePositioningStyle` to `true`.
170
- */
171
- const Content = React.forwardRef<ViewRef, SlottableViewProps & PositionedContentProps>(
172
- (
173
- {
174
- asChild = false,
175
- forceMount,
176
- align = 'start',
177
- side = 'bottom',
178
- sideOffset = 0,
179
- alignOffset = 0,
180
- avoidCollisions = true,
181
- onLayout: onLayoutProp,
182
- insets,
183
- style,
184
- disablePositioningStyle,
185
- ...props
186
- },
187
- ref
188
- ) => {
189
- const {
190
- open,
191
- onOpenChange,
192
- contentLayout,
193
- nativeID,
194
- setContentLayout,
195
- setTriggerPosition,
196
- triggerPosition,
197
- } = usePopoverContext();
198
-
199
- React.useEffect(() => {
200
- const backHandler = BackHandler.addEventListener('hardwareBackPress', () => {
201
- setTriggerPosition(null);
202
- setContentLayout(null);
203
- onOpenChange(false);
204
- return true;
205
- });
206
-
207
- return () => {
208
- setContentLayout(null);
209
- backHandler.remove();
210
- };
211
- }, []);
212
-
213
- const positionStyle = useRelativePosition({
214
- align,
215
- avoidCollisions,
216
- triggerPosition,
217
- contentLayout,
218
- alignOffset,
219
- insets,
220
- sideOffset,
221
- side,
222
- disablePositioningStyle,
223
- });
224
-
225
- function onLayout(event: LayoutChangeEvent) {
226
- setContentLayout(event.nativeEvent.layout);
227
- onLayoutProp?.(event);
228
- }
229
-
230
- if (!forceMount) {
231
- if (!open) {
232
- return null;
233
- }
234
- }
235
-
236
- const Component = asChild ? Slot.View : View;
237
- return (
238
- <Component
239
- ref={ref}
240
- role='dialog'
241
- nativeID={nativeID}
242
- aria-modal={true}
243
- style={[positionStyle, style]}
244
- onLayout={onLayout}
245
- onStartShouldSetResponder={onStartShouldSetResponder}
246
- {...props}
247
- />
248
- );
249
- }
250
- );
251
-
252
- Content.displayName = 'ContentNativePopover';
253
-
254
- const Close = React.forwardRef<PressableRef, SlottablePressableProps>(
255
- ({ asChild, onPress: onPressProp, disabled = false, ...props }, ref) => {
256
- const { onOpenChange, setContentLayout, setTriggerPosition } = usePopoverContext();
257
-
258
- function onPress(ev: GestureResponderEvent) {
259
- if (disabled) return;
260
- setTriggerPosition(null);
261
- setContentLayout(null);
262
- onOpenChange(false);
263
- onPressProp?.(ev);
264
- }
265
-
266
- const Component = asChild ? Slot.Pressable : Pressable;
267
- return (
268
- <Component
269
- ref={ref}
270
- aria-disabled={disabled ?? undefined}
271
- role='button'
272
- onPress={onPress}
273
- disabled={disabled ?? undefined}
274
- {...props}
275
- />
276
- );
277
- }
278
- );
279
-
280
- Close.displayName = 'CloseNativePopover';
281
-
282
- export { Close, Content, Overlay, Portal, Root, Trigger, usePopoverContext };
283
-
284
- function onStartShouldSetResponder() {
285
- return true;
286
- }
@@ -1,179 +0,0 @@
1
- import * as Popover from '@radix-ui/react-popover';
2
- import { useAugmentedRef, useControllableState } from '@rnr/hooks';
3
- import * as Slot from '@rnr/slot';
4
- import type {
5
- PositionedContentProps,
6
- PressableRef,
7
- SlottablePressableProps,
8
- SlottableViewProps,
9
- ViewRef,
10
- } from '@rnr/types';
11
- import * as React from 'react';
12
- import { Pressable, View, type GestureResponderEvent } from 'react-native';
13
- import type {
14
- PopoverOverlayProps,
15
- PopoverPortalProps,
16
- PopoverRootProps,
17
- RootContext,
18
- } from './types';
19
-
20
- const RootContext = React.createContext<RootContext | null>(null);
21
-
22
- const Root = React.forwardRef<ViewRef, SlottableViewProps & PopoverRootProps>(
23
- ({ asChild, open: openProp, defaultOpen, onOpenChange: onOpenChangeProp, ...viewProps }, ref) => {
24
- const [open = false, onOpenChange] = useControllableState({
25
- prop: openProp,
26
- defaultProp: defaultOpen,
27
- onChange: onOpenChangeProp,
28
- });
29
- const Component = asChild ? Slot.View : View;
30
- return (
31
- <RootContext.Provider value={{ open, onOpenChange }}>
32
- <Popover.Root open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>
33
- <Component ref={ref} {...viewProps} />
34
- </Popover.Root>
35
- </RootContext.Provider>
36
- );
37
- }
38
- );
39
-
40
- Root.displayName = 'RootWebPopover';
41
-
42
- function usePopoverContext() {
43
- const context = React.useContext(RootContext);
44
- if (!context) {
45
- throw new Error('Popover compound components cannot be rendered outside the Popover component');
46
- }
47
- return context;
48
- }
49
-
50
- const Trigger = React.forwardRef<PressableRef, SlottablePressableProps>(
51
- ({ asChild, onPress: onPressProp, role: _role, disabled, ...props }, ref) => {
52
- const augmentedRef = useAugmentedRef({ ref });
53
- const { onOpenChange, open } = usePopoverContext();
54
- function onPress(ev: GestureResponderEvent) {
55
- if (onPressProp) {
56
- onPressProp(ev);
57
- }
58
- onOpenChange(!open);
59
- }
60
-
61
- React.useLayoutEffect(() => {
62
- if (augmentedRef.current) {
63
- const augRef = augmentedRef.current as unknown as HTMLButtonElement;
64
- augRef.dataset.state = open ? 'open' : 'closed';
65
- augRef.type = 'button';
66
- }
67
- }, [open]);
68
-
69
- const Component = asChild ? Slot.Pressable : Pressable;
70
- return (
71
- <Popover.Trigger disabled={disabled ?? undefined} asChild>
72
- <Component
73
- ref={augmentedRef}
74
- onPress={onPress}
75
- role='button'
76
- disabled={disabled}
77
- {...props}
78
- />
79
- </Popover.Trigger>
80
- );
81
- }
82
- );
83
-
84
- Trigger.displayName = 'TriggerWebPopover';
85
-
86
- function Portal({ forceMount, container, children }: PopoverPortalProps) {
87
- return <Popover.Portal forceMount={forceMount} children={children} container={container} />;
88
- }
89
-
90
- const Overlay = React.forwardRef<PressableRef, SlottablePressableProps & PopoverOverlayProps>(
91
- ({ asChild, forceMount, ...props }, ref) => {
92
- const Component = asChild ? Slot.Pressable : Pressable;
93
- return <Component ref={ref} {...props} />;
94
- }
95
- );
96
-
97
- Overlay.displayName = 'OverlayWebPopover';
98
-
99
- const Content = React.forwardRef<ViewRef, SlottableViewProps & PositionedContentProps>(
100
- (
101
- {
102
- asChild = false,
103
- forceMount,
104
- align = 'start',
105
- side = 'bottom',
106
- sideOffset = 0,
107
- alignOffset = 0,
108
- avoidCollisions = true,
109
- insets: _insets,
110
- disablePositioningStyle: _disablePositioningStyle,
111
- onCloseAutoFocus,
112
- onEscapeKeyDown,
113
- onInteractOutside,
114
- onPointerDownOutside,
115
- ...props
116
- },
117
- ref
118
- ) => {
119
- const Component = asChild ? Slot.View : View;
120
- return (
121
- <Popover.Content
122
- onCloseAutoFocus={onCloseAutoFocus}
123
- onEscapeKeyDown={onEscapeKeyDown}
124
- onInteractOutside={onInteractOutside}
125
- onPointerDownOutside={onPointerDownOutside}
126
- forceMount={forceMount}
127
- align={align}
128
- side={side}
129
- sideOffset={sideOffset}
130
- alignOffset={alignOffset}
131
- avoidCollisions={avoidCollisions}
132
- >
133
- <Component ref={ref} {...props} />
134
- </Popover.Content>
135
- );
136
- }
137
- );
138
-
139
- Content.displayName = 'ContentWebPopover';
140
-
141
- const Close = React.forwardRef<PressableRef, SlottablePressableProps>(
142
- ({ asChild, onPress: onPressProp, disabled, ...props }, ref) => {
143
- const augmentedRef = useAugmentedRef({ ref });
144
- const { onOpenChange, open } = usePopoverContext();
145
-
146
- function onPress(ev: GestureResponderEvent) {
147
- if (onPressProp) {
148
- onPressProp(ev);
149
- }
150
- onOpenChange(!open);
151
- }
152
-
153
- React.useLayoutEffect(() => {
154
- if (augmentedRef.current) {
155
- const augRef = augmentedRef.current as unknown as HTMLButtonElement;
156
- augRef.type = 'button';
157
- }
158
- }, []);
159
-
160
- const Component = asChild ? Slot.Pressable : Pressable;
161
- return (
162
- <>
163
- <Popover.Close disabled={disabled ?? undefined} asChild>
164
- <Component
165
- ref={augmentedRef}
166
- onPress={onPress}
167
- role='button'
168
- disabled={disabled}
169
- {...props}
170
- />
171
- </Popover.Close>
172
- </>
173
- );
174
- }
175
- );
176
-
177
- Close.displayName = 'CloseWebPopover';
178
-
179
- export { Close, Content, Overlay, Portal, Root, Trigger, usePopoverContext };
@@ -1,30 +0,0 @@
1
- import type { ForceMountable } from '@rnr/types';
2
-
3
- interface RootContext {
4
- open: boolean;
5
- onOpenChange: (value: boolean) => void;
6
- }
7
-
8
- interface PopoverRootProps {
9
- open?: boolean;
10
- defaultOpen?: boolean;
11
- onOpenChange?: (value: boolean) => void;
12
- }
13
-
14
- interface PopoverPortalProps extends ForceMountable {
15
- children: React.ReactNode;
16
- /**
17
- * Platform: NATIVE ONLY
18
- */
19
- hostName?: string;
20
- /**
21
- * Platform: WEB ONLY
22
- */
23
- container?: HTMLElement | null | undefined;
24
- }
25
-
26
- interface PopoverOverlayProps extends ForceMountable {
27
- closeOnPress?: boolean;
28
- }
29
-
30
- export type { PopoverRootProps, PopoverPortalProps, PopoverOverlayProps, RootContext };
@@ -1,82 +0,0 @@
1
- import * as React from 'react';
2
- import { Platform, type View, type ViewStyle } from 'react-native';
3
- import { create } from 'zustand';
4
-
5
- const DEFAULT_PORTAL_HOST = 'INTERNAL_PRIMITIVE_DEFAULT_HOST_NAME';
6
-
7
- type PortalMap = Map<string, React.ReactNode>;
8
- type PortalHostMap = Map<string, PortalMap>;
9
-
10
- const usePortal = create<{ map: PortalHostMap }>(() => ({
11
- map: new Map<string, PortalMap>().set(DEFAULT_PORTAL_HOST, new Map<string, React.ReactNode>()),
12
- }));
13
-
14
- const updatePortal = (hostName: string, name: string, children: React.ReactNode) => {
15
- usePortal.setState((prev) => {
16
- const next = new Map(prev.map);
17
- const portal = next.get(hostName) ?? new Map<string, React.ReactNode>();
18
- portal.set(name, children);
19
- next.set(hostName, portal);
20
- return { map: next };
21
- });
22
- };
23
- const removePortal = (hostName: string, name: string) => {
24
- usePortal.setState((prev) => {
25
- const next = new Map(prev.map);
26
- const portal = next.get(hostName) ?? new Map<string, React.ReactNode>();
27
- portal.delete(name);
28
- next.set(hostName, portal);
29
- return { map: next };
30
- });
31
- };
32
-
33
- export function PortalHost({ name = DEFAULT_PORTAL_HOST }: { name?: string }) {
34
- const portalMap = usePortal((state) => state.map).get(name) ?? new Map<string, React.ReactNode>();
35
- if (portalMap.size === 0) return null;
36
- return <>{Array.from(portalMap.values())}</>;
37
- }
38
-
39
- export function Portal({
40
- name,
41
- hostName = DEFAULT_PORTAL_HOST,
42
- children,
43
- }: {
44
- name: string;
45
- hostName?: string;
46
- children: React.ReactNode;
47
- }) {
48
- React.useEffect(() => {
49
- updatePortal(hostName, name, children);
50
- }, [hostName, name, children]);
51
-
52
- React.useEffect(() => {
53
- return () => {
54
- removePortal(hostName, name);
55
- };
56
- }, [hostName, name]);
57
-
58
- return null;
59
- }
60
-
61
- const ROOT: ViewStyle = {
62
- flex: 1,
63
- };
64
-
65
- export function useModalPortalRoot() {
66
- const ref = React.useRef<View>(null);
67
- const [sideOffset, setSideOffSet] = React.useState(0);
68
-
69
- const onLayout = React.useCallback(() => {
70
- if (Platform.OS === 'web') return;
71
- ref.current?.measure((_x, _y, _width, _height, _pageX, pageY) => {
72
- setSideOffSet(-pageY);
73
- });
74
- }, []);
75
-
76
- return {
77
- ref,
78
- sideOffset,
79
- onLayout,
80
- style: ROOT,
81
- };
82
- }
@@ -1 +0,0 @@
1
- export * from './progress';
@@ -1,59 +0,0 @@
1
- import * as React from 'react';
2
- import { View } from 'react-native';
3
- import * as Slot from '@rnr/slot';
4
- import type { SlottableViewProps, ViewRef } from '@rnr/types';
5
- import type { ProgressRootProps } from './types';
6
-
7
- // This project uses code from WorkOS/Radix Primitives.
8
- // The code is licensed under the MIT License.
9
- // https://github.com/radix-ui/primitives/tree/main
10
-
11
- const DEFAULT_MAX = 100;
12
-
13
- const Root = React.forwardRef<ViewRef, SlottableViewProps & ProgressRootProps>(
14
- (
15
- { asChild, value: valueProp, max: maxProp, getValueLabel = defaultGetValueLabel, ...props },
16
- ref
17
- ) => {
18
- const max = maxProp ?? DEFAULT_MAX;
19
- const value = isValidValueNumber(valueProp, max) ? valueProp : 0;
20
-
21
- const Component = asChild ? Slot.View : View;
22
- return (
23
- <Component
24
- role='progressbar'
25
- ref={ref}
26
- aria-valuemax={max}
27
- aria-valuemin={0}
28
- aria-valuenow={value}
29
- aria-valuetext={getValueLabel(value, max)}
30
- accessibilityValue={{
31
- min: 0,
32
- max,
33
- now: value,
34
- text: getValueLabel(value, max),
35
- }}
36
- {...props}
37
- />
38
- );
39
- }
40
- );
41
-
42
- Root.displayName = 'RootProgress';
43
-
44
- const Indicator = React.forwardRef<ViewRef, SlottableViewProps>(({ asChild, ...props }, ref) => {
45
- const Component = asChild ? Slot.View : View;
46
- return <Component ref={ref} role='presentation' {...props} />;
47
- });
48
-
49
- Indicator.displayName = 'IndicatorProgress';
50
-
51
- export { Indicator, Root };
52
-
53
- function defaultGetValueLabel(value: number, max: number) {
54
- return `${Math.round((value / max) * 100)}%`;
55
- }
56
-
57
- function isValidValueNumber(value: any, max: number): value is number {
58
- return typeof value === 'number' && !isNaN(value) && value <= max && value >= 0;
59
- }
@@ -1,36 +0,0 @@
1
- import * as Progress from '@radix-ui/react-progress';
2
- import * as React from 'react';
3
- import { View } from 'react-native';
4
- import * as Slot from '@rnr/slot';
5
- import type { SlottableViewProps, ViewRef } from '@rnr/types';
6
- import type { ProgressRootProps } from './types';
7
-
8
- const ProgressContext = React.createContext<ProgressRootProps | null>(null);
9
-
10
- const Root = React.forwardRef<ViewRef, SlottableViewProps & ProgressRootProps>(
11
- ({ asChild, value, max, getValueLabel, ...props }, ref) => {
12
- const Component = asChild ? Slot.View : View;
13
- return (
14
- <ProgressContext.Provider value={{ value, max }}>
15
- <Progress.Root value={value} max={max} getValueLabel={getValueLabel} asChild>
16
- <Component ref={ref} {...props} />
17
- </Progress.Root>
18
- </ProgressContext.Provider>
19
- );
20
- }
21
- );
22
-
23
- Root.displayName = 'RootProgress';
24
-
25
- const Indicator = React.forwardRef<ViewRef, SlottableViewProps>(({ asChild, ...props }, ref) => {
26
- const Component = asChild ? Slot.View : View;
27
- return (
28
- <Progress.Indicator asChild>
29
- <Component ref={ref} {...props} />
30
- </Progress.Indicator>
31
- );
32
- });
33
-
34
- Indicator.displayName = 'IndicatorProgress';
35
-
36
- export { Indicator, Root };
@@ -1,7 +0,0 @@
1
- interface ProgressRootProps {
2
- value?: number | null | undefined;
3
- max?: number;
4
- getValueLabel?(value: number, max: number): string;
5
- }
6
-
7
- export type { ProgressRootProps };
@@ -1 +0,0 @@
1
- export * from './radio-group';