@react-native-reusables/cli 0.0.18 → 0.1.1

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