@react-native-reusables/cli 0.0.18 → 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 -648
  53. package/__generated/components/primitives/context-menu/context-menu.web.tsx +0 -533
  54. package/__generated/components/primitives/context-menu/index.ts +0 -1
  55. package/__generated/components/primitives/context-menu/types.ts +0 -90
  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 -608
  61. package/__generated/components/primitives/dropdown-menu/dropdown-menu.web.tsx +0 -550
  62. package/__generated/components/primitives/dropdown-menu/index.ts +0 -1
  63. package/__generated/components/primitives/dropdown-menu/types.ts +0 -72
  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 -279
  69. package/__generated/components/primitives/hover-card/hover-card.web.tsx +0 -150
  70. package/__generated/components/primitives/hover-card/index.ts +0 -1
  71. package/__generated/components/primitives/hover-card/types.ts +0 -51
  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 -622
  78. package/__generated/components/primitives/menubar/menubar.web.tsx +0 -548
  79. package/__generated/components/primitives/menubar/types.ts +0 -77
  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 -290
  86. package/__generated/components/primitives/popover/popover.web.tsx +0 -191
  87. package/__generated/components/primitives/popover/types.ts +0 -24
  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 -466
  99. package/__generated/components/primitives/select/select.web.tsx +0 -332
  100. package/__generated/components/primitives/select/types.ts +0 -89
  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 -277
  133. package/__generated/components/primitives/tooltip/tooltip.web.tsx +0 -181
  134. package/__generated/components/primitives/tooltip/types.ts +0 -42
  135. package/__generated/components/primitives/types.ts +0 -105
  136. package/__generated/components/primitives/utils.ts +0 -61
@@ -1,648 +0,0 @@
1
- import {
2
- useAugmentedRef,
3
- useControllableState,
4
- useRelativePosition,
5
- type LayoutPosition,
6
- } from '@rnr/hooks';
7
- import { Portal as RNPPortal } from '@rnr/portal';
8
- import * as Slot from '@rnr/slot';
9
- import type {
10
- ForceMountable,
11
- PositionedContentProps,
12
- PressableRef,
13
- SlottablePressableProps,
14
- SlottableTextProps,
15
- SlottableViewProps,
16
- TextRef,
17
- ViewRef,
18
- } from '@rnr/types';
19
- import * as React from 'react';
20
- import {
21
- BackHandler,
22
- Pressable,
23
- Text,
24
- View,
25
- type AccessibilityActionEvent,
26
- type GestureResponderEvent,
27
- type LayoutChangeEvent,
28
- type LayoutRectangle,
29
- } from 'react-native';
30
- import type {
31
- ContextMenuCheckboxItemProps,
32
- ContextMenuItemProps,
33
- ContextMenuOverlayProps,
34
- ContextMenuPortalProps,
35
- ContextMenuRadioGroupProps,
36
- ContextMenuRadioItemProps,
37
- ContextMenuRootProps,
38
- ContextMenuSeparatorProps,
39
- ContextMenuSubProps,
40
- ContextMenuSubTriggerProps,
41
- ContextMenuTriggerRef,
42
- } from './types';
43
-
44
- interface IRootContext extends ContextMenuRootProps {
45
- open: boolean;
46
- onOpenChange: (open: boolean) => void;
47
- pressPosition: LayoutPosition | null;
48
- setPressPosition: (pressPosition: LayoutPosition | null) => void;
49
- contentLayout: LayoutRectangle | null;
50
- setContentLayout: (contentLayout: LayoutRectangle | null) => void;
51
- nativeID: string;
52
- }
53
-
54
- const RootContext = React.createContext<IRootContext | null>(null);
55
-
56
- const Root = React.forwardRef<ViewRef, SlottableViewProps & ContextMenuRootProps>(
57
- ({ asChild, relativeTo = 'longPress', onOpenChange: onOpenChangeProp, ...viewProps }, ref) => {
58
- const nativeID = React.useId();
59
- const [pressPosition, setPressPosition] = React.useState<LayoutPosition | null>(null);
60
- const [contentLayout, setContentLayout] = React.useState<LayoutRectangle | null>(null);
61
- const [open, setOpen] = React.useState(false);
62
-
63
- function onOpenChange(value: boolean) {
64
- setOpen(value);
65
- onOpenChangeProp?.(value);
66
- }
67
-
68
- const Component = asChild ? Slot.View : View;
69
- return (
70
- <RootContext.Provider
71
- value={{
72
- open,
73
- onOpenChange,
74
- relativeTo,
75
- contentLayout,
76
- nativeID,
77
- pressPosition,
78
- setContentLayout,
79
- setPressPosition,
80
- }}
81
- >
82
- <Component ref={ref} {...viewProps} />
83
- </RootContext.Provider>
84
- );
85
- }
86
- );
87
-
88
- Root.displayName = 'RootNativeContextMenu';
89
-
90
- function useRootContext() {
91
- const context = React.useContext(RootContext);
92
- if (!context) {
93
- throw new Error(
94
- 'ContextMenu compound components cannot be rendered outside the ContextMenu component'
95
- );
96
- }
97
- return context;
98
- }
99
-
100
- const accessibilityActions = [{ name: 'longpress' }];
101
-
102
- const Trigger = React.forwardRef<ContextMenuTriggerRef, SlottablePressableProps>(
103
- (
104
- {
105
- asChild,
106
- onLongPress: onLongPressProp,
107
- disabled = false,
108
- onAccessibilityAction: onAccessibilityActionProp,
109
- ...props
110
- },
111
- ref
112
- ) => {
113
- const { open, onOpenChange, relativeTo, setPressPosition } = useRootContext();
114
- const augmentedRef = useAugmentedRef({
115
- ref,
116
- methods: {
117
- open: () => {
118
- onOpenChange(true);
119
- augmentedRef.current?.measure((_x, _y, width, height, pageX, pageY) => {
120
- setPressPosition({ width, pageX, pageY: pageY, height });
121
- });
122
- },
123
- close: () => {
124
- setPressPosition(null);
125
- onOpenChange(false);
126
- },
127
- },
128
- });
129
-
130
- function onLongPress(ev: GestureResponderEvent) {
131
- if (disabled) return;
132
- if (relativeTo === 'longPress') {
133
- setPressPosition({
134
- width: 0,
135
- pageX: ev.nativeEvent.pageX,
136
- pageY: ev.nativeEvent.pageY,
137
- height: 0,
138
- });
139
- }
140
- if (relativeTo === 'trigger') {
141
- augmentedRef.current?.measure((_x, _y, width, height, pageX, pageY) => {
142
- setPressPosition({ width, pageX, pageY: pageY, height });
143
- });
144
- }
145
- onOpenChange(!open);
146
- onLongPressProp?.(ev);
147
- }
148
-
149
- function onAccessibilityAction(event: AccessibilityActionEvent) {
150
- if (disabled) return;
151
- if (event.nativeEvent.actionName === 'longpress') {
152
- setPressPosition({
153
- width: 0,
154
- pageX: 0,
155
- pageY: 0,
156
- height: 0,
157
- });
158
- const newValue = !open;
159
- onOpenChange(newValue);
160
- }
161
- onAccessibilityActionProp?.(event);
162
- }
163
-
164
- const Component = asChild ? Slot.Pressable : Pressable;
165
- return (
166
- <Component
167
- ref={augmentedRef}
168
- aria-disabled={disabled ?? undefined}
169
- role='button'
170
- onLongPress={onLongPress}
171
- disabled={disabled ?? undefined}
172
- aria-expanded={open}
173
- accessibilityActions={accessibilityActions}
174
- onAccessibilityAction={onAccessibilityAction}
175
- {...props}
176
- />
177
- );
178
- }
179
- );
180
-
181
- Trigger.displayName = 'TriggerNativeContextMenu';
182
-
183
- /**
184
- * @warning when using a custom `<PortalHost />`, you will have to adjust the Content's sideOffset to account for nav elements like headers.
185
- */
186
- function Portal({ forceMount, hostName, children }: ContextMenuPortalProps) {
187
- const value = useRootContext();
188
-
189
- if (!value.pressPosition) {
190
- return null;
191
- }
192
-
193
- if (!forceMount) {
194
- if (!value.open) {
195
- return null;
196
- }
197
- }
198
-
199
- return (
200
- <RNPPortal hostName={hostName} name={`${value.nativeID}_portal`}>
201
- <RootContext.Provider value={value}>{children}</RootContext.Provider>
202
- </RNPPortal>
203
- );
204
- }
205
-
206
- const Overlay = React.forwardRef<PressableRef, SlottablePressableProps & ContextMenuOverlayProps>(
207
- ({ asChild, forceMount, onPress: OnPressProp, closeOnPress = true, ...props }, ref) => {
208
- const { open, onOpenChange, setContentLayout, setPressPosition } = useRootContext();
209
-
210
- function onPress(ev: GestureResponderEvent) {
211
- if (closeOnPress) {
212
- setPressPosition(null);
213
- setContentLayout(null);
214
- onOpenChange(false);
215
- }
216
- OnPressProp?.(ev);
217
- }
218
-
219
- if (!forceMount) {
220
- if (!open) {
221
- return null;
222
- }
223
- }
224
-
225
- const Component = asChild ? Slot.Pressable : Pressable;
226
- return <Component ref={ref} onPress={onPress} {...props} />;
227
- }
228
- );
229
-
230
- Overlay.displayName = 'OverlayNativeContextMenu';
231
-
232
- const Content = React.forwardRef<ViewRef, SlottableViewProps & PositionedContentProps>(
233
- (
234
- {
235
- asChild = false,
236
- forceMount,
237
- align = 'start',
238
- side = 'bottom',
239
- sideOffset = 0,
240
- alignOffset = 0,
241
- avoidCollisions = true,
242
- onLayout: onLayoutProp,
243
- insets,
244
- style,
245
- disablePositioningStyle,
246
- ...props
247
- },
248
- ref
249
- ) => {
250
- const {
251
- open,
252
- onOpenChange,
253
- contentLayout,
254
- nativeID,
255
- pressPosition,
256
- setContentLayout,
257
- setPressPosition,
258
- } = useRootContext();
259
-
260
- React.useEffect(() => {
261
- const backHandler = BackHandler.addEventListener('hardwareBackPress', () => {
262
- setPressPosition(null);
263
- setContentLayout(null);
264
- onOpenChange(false);
265
- return true;
266
- });
267
-
268
- return () => {
269
- setContentLayout(null);
270
- backHandler.remove();
271
- };
272
- }, []);
273
-
274
- const positionStyle = useRelativePosition({
275
- align,
276
- avoidCollisions,
277
- triggerPosition: pressPosition,
278
- contentLayout,
279
- alignOffset,
280
- insets,
281
- sideOffset,
282
- side,
283
- disablePositioningStyle,
284
- });
285
-
286
- function onLayout(event: LayoutChangeEvent) {
287
- setContentLayout(event.nativeEvent.layout);
288
- onLayoutProp?.(event);
289
- }
290
-
291
- if (!forceMount) {
292
- if (!open) {
293
- return null;
294
- }
295
- }
296
-
297
- const Component = asChild ? Slot.View : View;
298
- return (
299
- <Component
300
- ref={ref}
301
- role='menu'
302
- nativeID={nativeID}
303
- aria-modal={true}
304
- style={[positionStyle, style]}
305
- onLayout={onLayout}
306
- onStartShouldSetResponder={onStartShouldSetResponder}
307
- {...props}
308
- />
309
- );
310
- }
311
- );
312
-
313
- Content.displayName = 'ContentNativeContextMenu';
314
-
315
- const Item = React.forwardRef<PressableRef, SlottablePressableProps & ContextMenuItemProps>(
316
- (
317
- { asChild, textValue, onPress: onPressProp, disabled = false, closeOnPress = true, ...props },
318
- ref
319
- ) => {
320
- const { onOpenChange, setContentLayout, setPressPosition } = useRootContext();
321
-
322
- function onPress(ev: GestureResponderEvent) {
323
- if (closeOnPress) {
324
- setPressPosition(null);
325
- setContentLayout(null);
326
- onOpenChange(false);
327
- }
328
- onPressProp?.(ev);
329
- }
330
-
331
- const Component = asChild ? Slot.Pressable : Pressable;
332
- return (
333
- <Component
334
- ref={ref}
335
- role='menuitem'
336
- onPress={onPress}
337
- disabled={disabled}
338
- aria-valuetext={textValue}
339
- aria-disabled={!!disabled}
340
- accessibilityState={{ disabled: !!disabled }}
341
- {...props}
342
- />
343
- );
344
- }
345
- );
346
-
347
- Item.displayName = 'ItemNativeContextMenu';
348
-
349
- const Group = React.forwardRef<ViewRef, SlottableViewProps>(({ asChild, ...props }, ref) => {
350
- const Component = asChild ? Slot.View : View;
351
- return <Component ref={ref} role='group' {...props} />;
352
- });
353
-
354
- Group.displayName = 'GroupNativeContextMenu';
355
-
356
- const Label = React.forwardRef<TextRef, SlottableTextProps>(({ asChild, ...props }, ref) => {
357
- const Component = asChild ? Slot.Text : Text;
358
- return <Component ref={ref} {...props} />;
359
- });
360
-
361
- Label.displayName = 'LabelNativeContextMenu';
362
-
363
- type FormItemContext =
364
- | { checked: boolean }
365
- | {
366
- value: string | undefined;
367
- onValueChange: (value: string) => void;
368
- };
369
-
370
- const FormItemContext = React.createContext<FormItemContext | null>(null);
371
-
372
- const CheckboxItem = React.forwardRef<
373
- PressableRef,
374
- SlottablePressableProps & ContextMenuCheckboxItemProps
375
- >(
376
- (
377
- {
378
- asChild,
379
- checked,
380
- onCheckedChange,
381
- textValue,
382
- onPress: onPressProp,
383
- closeOnPress = true,
384
- disabled = false,
385
- ...props
386
- },
387
- ref
388
- ) => {
389
- const { onOpenChange, setContentLayout, setPressPosition, nativeID } = useRootContext();
390
-
391
- function onPress(ev: GestureResponderEvent) {
392
- onCheckedChange(!checked);
393
- if (closeOnPress) {
394
- setPressPosition(null);
395
- setContentLayout(null);
396
- onOpenChange(false);
397
- }
398
- onPressProp?.(ev);
399
- }
400
-
401
- const Component = asChild ? Slot.Pressable : Pressable;
402
- return (
403
- <FormItemContext.Provider value={{ checked }}>
404
- <Component
405
- ref={ref}
406
- role='checkbox'
407
- aria-checked={checked}
408
- onPress={onPress}
409
- disabled={disabled}
410
- aria-disabled={!!disabled}
411
- aria-valuetext={textValue}
412
- accessibilityState={{ disabled: !!disabled }}
413
- {...props}
414
- />
415
- </FormItemContext.Provider>
416
- );
417
- }
418
- );
419
-
420
- CheckboxItem.displayName = 'CheckboxItemNativeContextMenu';
421
-
422
- function useFormItemContext() {
423
- const context = React.useContext(FormItemContext);
424
- if (!context) {
425
- throw new Error(
426
- 'CheckboxItem or RadioItem compound components cannot be rendered outside of a CheckboxItem or RadioItem component'
427
- );
428
- }
429
- return context;
430
- }
431
-
432
- const RadioGroup = React.forwardRef<ViewRef, SlottableViewProps & ContextMenuRadioGroupProps>(
433
- ({ asChild, value, onValueChange, ...props }, ref) => {
434
- const Component = asChild ? Slot.View : View;
435
- return (
436
- <FormItemContext.Provider value={{ value, onValueChange }}>
437
- <Component ref={ref} role='radiogroup' {...props} />
438
- </FormItemContext.Provider>
439
- );
440
- }
441
- );
442
-
443
- RadioGroup.displayName = 'RadioGroupNativeContextMenu';
444
-
445
- type BothFormItemContext = Exclude<FormItemContext, { checked: boolean }> & {
446
- checked: boolean;
447
- };
448
-
449
- const RadioItemContext = React.createContext({} as { itemValue: string });
450
-
451
- const RadioItem = React.forwardRef<
452
- PressableRef,
453
- SlottablePressableProps & ContextMenuRadioItemProps
454
- >(
455
- (
456
- {
457
- asChild,
458
- value: itemValue,
459
- textValue,
460
- onPress: onPressProp,
461
- disabled = false,
462
- closeOnPress = true,
463
- ...props
464
- },
465
- ref
466
- ) => {
467
- const { onOpenChange, setContentLayout, setPressPosition } = useRootContext();
468
-
469
- const { value, onValueChange } = useFormItemContext() as BothFormItemContext;
470
- function onPress(ev: GestureResponderEvent) {
471
- onValueChange(itemValue);
472
- if (closeOnPress) {
473
- setPressPosition(null);
474
- setContentLayout(null);
475
- onOpenChange(false);
476
- }
477
- onPressProp?.(ev);
478
- }
479
-
480
- const Component = asChild ? Slot.Pressable : Pressable;
481
- return (
482
- <RadioItemContext.Provider value={{ itemValue }}>
483
- <Component
484
- ref={ref}
485
- onPress={onPress}
486
- role='radio'
487
- aria-checked={value === itemValue}
488
- disabled={disabled ?? false}
489
- accessibilityState={{
490
- disabled: disabled ?? false,
491
- checked: value === itemValue,
492
- }}
493
- aria-valuetext={textValue}
494
- {...props}
495
- />
496
- </RadioItemContext.Provider>
497
- );
498
- }
499
- );
500
-
501
- RadioItem.displayName = 'RadioItemNativeContextMenu';
502
-
503
- function useItemIndicatorContext() {
504
- return React.useContext(RadioItemContext);
505
- }
506
-
507
- const ItemIndicator = React.forwardRef<ViewRef, SlottableViewProps & ForceMountable>(
508
- ({ asChild, forceMount, ...props }, ref) => {
509
- const { itemValue } = useItemIndicatorContext();
510
- const { checked, value } = useFormItemContext() as BothFormItemContext;
511
-
512
- if (!forceMount) {
513
- if (itemValue == null && !checked) {
514
- return null;
515
- }
516
- if (value !== itemValue) {
517
- return null;
518
- }
519
- }
520
- const Component = asChild ? Slot.View : View;
521
- return <Component ref={ref} role='presentation' {...props} />;
522
- }
523
- );
524
-
525
- ItemIndicator.displayName = 'ItemIndicatorNativeContextMenu';
526
-
527
- const Separator = React.forwardRef<ViewRef, SlottableViewProps & ContextMenuSeparatorProps>(
528
- ({ asChild, decorative, ...props }, ref) => {
529
- const Component = asChild ? Slot.View : View;
530
- return <Component role={decorative ? 'presentation' : 'separator'} ref={ref} {...props} />;
531
- }
532
- );
533
-
534
- Separator.displayName = 'SeparatorNativeContextMenu';
535
-
536
- const SubContext = React.createContext<{
537
- nativeID: string;
538
- open: boolean;
539
- onOpenChange: (value: boolean) => void;
540
- } | null>(null);
541
-
542
- const Sub = React.forwardRef<ViewRef, SlottableViewProps & ContextMenuSubProps>(
543
- ({ asChild, defaultOpen, open: openProp, onOpenChange: onOpenChangeProp, ...props }, ref) => {
544
- const nativeID = React.useId();
545
- const [open = false, onOpenChange] = useControllableState({
546
- prop: openProp,
547
- defaultProp: defaultOpen,
548
- onChange: onOpenChangeProp,
549
- });
550
-
551
- const Component = asChild ? Slot.View : View;
552
- return (
553
- <SubContext.Provider
554
- value={{
555
- nativeID,
556
- open,
557
- onOpenChange,
558
- }}
559
- >
560
- <Component ref={ref} {...props} />
561
- </SubContext.Provider>
562
- );
563
- }
564
- );
565
-
566
- Sub.displayName = 'SubNativeContextMenu';
567
-
568
- function useSubContext() {
569
- const context = React.useContext(SubContext);
570
- if (!context) {
571
- throw new Error('Sub compound components cannot be rendered outside of a Sub component');
572
- }
573
- return context;
574
- }
575
-
576
- const SubTrigger = React.forwardRef<
577
- PressableRef,
578
- SlottablePressableProps & ContextMenuSubTriggerProps
579
- >(({ asChild, textValue, onPress: onPressProp, disabled = false, ...props }, ref) => {
580
- const { nativeID, open, onOpenChange } = useSubContext();
581
-
582
- function onPress(ev: GestureResponderEvent) {
583
- onOpenChange(!open);
584
- onPressProp?.(ev);
585
- }
586
-
587
- const Component = asChild ? Slot.Pressable : Pressable;
588
- return (
589
- <Component
590
- ref={ref}
591
- aria-valuetext={textValue}
592
- role='menuitem'
593
- aria-expanded={open}
594
- accessibilityState={{ expanded: open, disabled: !!disabled }}
595
- nativeID={nativeID}
596
- onPress={onPress}
597
- disabled={disabled}
598
- aria-disabled={!!disabled}
599
- {...props}
600
- />
601
- );
602
- });
603
-
604
- SubTrigger.displayName = 'SubTriggerNativeContextMenu';
605
-
606
- const SubContent = React.forwardRef<PressableRef, SlottablePressableProps & ForceMountable>(
607
- ({ asChild = false, forceMount, ...props }, ref) => {
608
- const { open, nativeID } = useSubContext();
609
-
610
- if (!forceMount) {
611
- if (!open) {
612
- return null;
613
- }
614
- }
615
-
616
- const Component = asChild ? Slot.Pressable : Pressable;
617
- return <Component ref={ref} role='group' aria-labelledby={nativeID} {...props} />;
618
- }
619
- );
620
-
621
- Content.displayName = 'ContentNativeContextMenu';
622
-
623
- export {
624
- CheckboxItem,
625
- Content,
626
- Group,
627
- Item,
628
- ItemIndicator,
629
- Label,
630
- Overlay,
631
- Portal,
632
- RadioGroup,
633
- RadioItem,
634
- Root,
635
- Separator,
636
- Sub,
637
- SubContent,
638
- SubTrigger,
639
- Trigger,
640
- useRootContext,
641
- useSubContext,
642
- };
643
-
644
- export type { ContextMenuTriggerRef };
645
-
646
- function onStartShouldSetResponder() {
647
- return true;
648
- }