@react-native-reusables/cli 0.0.9 → 0.0.10

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/dist/generated/components/primitives/accordion/accordion.tsx +216 -0
  2. package/dist/generated/components/primitives/accordion/accordion.web.tsx +295 -0
  3. package/dist/generated/components/primitives/accordion/index.ts +1 -0
  4. package/dist/generated/components/primitives/accordion/types.ts +45 -0
  5. package/dist/generated/components/primitives/alert-dialog/alert-dialog.tsx +237 -0
  6. package/dist/generated/components/primitives/alert-dialog/alert-dialog.web.tsx +256 -0
  7. package/dist/generated/components/primitives/alert-dialog/index.ts +1 -0
  8. package/dist/generated/components/primitives/alert-dialog/types.ts +48 -0
  9. package/dist/generated/components/primitives/aspect-ratio.tsx +23 -0
  10. package/dist/generated/components/primitives/avatar/ types.ts +10 -0
  11. package/dist/generated/components/primitives/avatar/index.tsx +95 -0
  12. package/dist/generated/components/primitives/checkbox/checkbox.tsx +101 -0
  13. package/dist/generated/components/primitives/checkbox/checkbox.web.tsx +114 -0
  14. package/dist/generated/components/primitives/checkbox/index.ts +1 -0
  15. package/dist/generated/components/primitives/checkbox/types.ts +11 -0
  16. package/dist/generated/components/primitives/collapsible/collapsible.tsx +119 -0
  17. package/dist/generated/components/primitives/collapsible/collapsible.web.tsx +157 -0
  18. package/dist/generated/components/primitives/collapsible/index.ts +1 -0
  19. package/dist/generated/components/primitives/collapsible/types.ts +18 -0
  20. package/dist/generated/components/primitives/context-menu/context-menu.tsx +626 -0
  21. package/dist/generated/components/primitives/context-menu/context-menu.web.tsx +504 -0
  22. package/dist/generated/components/primitives/context-menu/index.ts +1 -0
  23. package/dist/generated/components/primitives/context-menu/types.ts +82 -0
  24. package/dist/generated/components/primitives/dialog/dialog.tsx +211 -0
  25. package/dist/generated/components/primitives/dialog/dialog.web.tsx +197 -0
  26. package/dist/generated/components/primitives/dialog/index.ts +1 -0
  27. package/dist/generated/components/primitives/dialog/types.ts +60 -0
  28. package/dist/generated/components/primitives/dropdown-menu/dropdown-menu.tsx +584 -0
  29. package/dist/generated/components/primitives/dropdown-menu/dropdown-menu.web.tsx +521 -0
  30. package/dist/generated/components/primitives/dropdown-menu/index.ts +1 -0
  31. package/dist/generated/components/primitives/dropdown-menu/types.ts +71 -0
  32. package/dist/generated/components/primitives/hooks/index.ts +3 -0
  33. package/dist/generated/components/primitives/hooks/useAugmentedRef.tsx +29 -0
  34. package/dist/generated/components/primitives/hooks/useControllableState.tsx +75 -0
  35. package/dist/generated/components/primitives/hooks/useRelativePosition.tsx +227 -0
  36. package/dist/generated/components/primitives/hover-card/hover-card.tsx +271 -0
  37. package/dist/generated/components/primitives/hover-card/hover-card.web.tsx +145 -0
  38. package/dist/generated/components/primitives/hover-card/index.ts +1 -0
  39. package/dist/generated/components/primitives/hover-card/types.ts +42 -0
  40. package/dist/generated/components/primitives/label/index.ts +1 -0
  41. package/dist/generated/components/primitives/label/label.tsx +31 -0
  42. package/dist/generated/components/primitives/label/label.web.tsx +36 -0
  43. package/dist/generated/components/primitives/label/types.ts +15 -0
  44. package/dist/generated/components/primitives/menubar/index.ts +1 -0
  45. package/dist/generated/components/primitives/menubar/menubar.tsx +624 -0
  46. package/dist/generated/components/primitives/menubar/menubar.web.tsx +543 -0
  47. package/dist/generated/components/primitives/menubar/types.ts +76 -0
  48. package/dist/generated/components/primitives/navigation-menu/index.ts +1 -0
  49. package/dist/generated/components/primitives/navigation-menu/navigation-menu.tsx +315 -0
  50. package/dist/generated/components/primitives/navigation-menu/navigation-menu.web.tsx +264 -0
  51. package/dist/generated/components/primitives/navigation-menu/types.ts +49 -0
  52. package/dist/generated/components/primitives/popover/index.ts +1 -0
  53. package/dist/generated/components/primitives/popover/popover.tsx +286 -0
  54. package/dist/generated/components/primitives/popover/popover.web.tsx +179 -0
  55. package/dist/generated/components/primitives/popover/types.ts +30 -0
  56. package/dist/generated/components/primitives/portal.tsx +67 -0
  57. package/dist/generated/components/primitives/progress/index.ts +1 -0
  58. package/dist/generated/components/primitives/progress/progress.tsx +59 -0
  59. package/dist/generated/components/primitives/progress/progress.web.tsx +36 -0
  60. package/dist/generated/components/primitives/progress/types.ts +7 -0
  61. package/dist/generated/components/primitives/radio-group/index.ts +1 -0
  62. package/dist/generated/components/primitives/radio-group/radio-group.tsx +116 -0
  63. package/dist/generated/components/primitives/radio-group/radio-group.web.tsx +78 -0
  64. package/dist/generated/components/primitives/radio-group/types.ts +15 -0
  65. package/dist/generated/components/primitives/select/index.ts +1 -0
  66. package/dist/generated/components/primitives/select/select.tsx +455 -0
  67. package/dist/generated/components/primitives/select/select.web.tsx +319 -0
  68. package/dist/generated/components/primitives/select/types.ts +87 -0
  69. package/dist/generated/components/primitives/separator/ types.ts +6 -0
  70. package/dist/generated/components/primitives/separator/index.tsx +23 -0
  71. package/dist/generated/components/primitives/slider/index.ts +1 -0
  72. package/dist/generated/components/primitives/slider/slider.tsx +89 -0
  73. package/dist/generated/components/primitives/slider/slider.web.tsx +67 -0
  74. package/dist/generated/components/primitives/slider/types.ts +24 -0
  75. package/dist/generated/components/primitives/slot.tsx +187 -0
  76. package/dist/generated/components/primitives/switch/index.ts +1 -0
  77. package/dist/generated/components/primitives/switch/switch.tsx +65 -0
  78. package/dist/generated/components/primitives/switch/switch.web.tsx +67 -0
  79. package/dist/generated/components/primitives/switch/types.ts +11 -0
  80. package/dist/generated/components/primitives/table.tsx +55 -0
  81. package/dist/generated/components/primitives/tabs/index.ts +1 -0
  82. package/dist/generated/components/primitives/tabs/tabs.tsx +133 -0
  83. package/dist/generated/components/primitives/tabs/tabs.web.tsx +97 -0
  84. package/dist/generated/components/primitives/tabs/types.ts +24 -0
  85. package/dist/generated/components/primitives/toast/ types.ts +7 -0
  86. package/dist/generated/components/primitives/toast/index.tsx +128 -0
  87. package/dist/generated/components/primitives/toggle/index.ts +1 -0
  88. package/dist/generated/components/primitives/toggle/toggle.tsx +37 -0
  89. package/dist/generated/components/primitives/toggle/toggle.web.tsx +26 -0
  90. package/dist/generated/components/primitives/toggle/types.ts +7 -0
  91. package/dist/generated/components/primitives/toggle-group/index.ts +1 -0
  92. package/dist/generated/components/primitives/toggle-group/toggle-group.tsx +125 -0
  93. package/dist/generated/components/primitives/toggle-group/toggle-group.web.tsx +124 -0
  94. package/dist/generated/components/primitives/toggle-group/types.ts +37 -0
  95. package/dist/generated/components/primitives/toolbar/index.ts +1 -0
  96. package/dist/generated/components/primitives/toolbar/toolbar.tsx +125 -0
  97. package/dist/generated/components/primitives/toolbar/toolbar.web.tsx +129 -0
  98. package/dist/generated/components/primitives/toolbar/types.ts +39 -0
  99. package/dist/generated/components/primitives/tooltip/index.ts +1 -0
  100. package/dist/generated/components/primitives/tooltip/tooltip.tsx +271 -0
  101. package/dist/generated/components/primitives/tooltip/tooltip.web.tsx +167 -0
  102. package/dist/generated/components/primitives/tooltip/types.ts +44 -0
  103. package/dist/generated/components/primitives/types.ts +105 -0
  104. package/dist/generated/components/primitives/utils.ts +61 -0
  105. package/dist/generated/components/ui/accordion.tsx +127 -0
  106. package/dist/generated/components/ui/alert-dialog.tsx +167 -0
  107. package/dist/generated/components/ui/aspect-ratio.tsx +5 -0
  108. package/dist/generated/components/ui/avatar.tsx +44 -0
  109. package/dist/generated/components/ui/badge.tsx +51 -0
  110. package/dist/generated/components/ui/button.tsx +88 -0
  111. package/dist/generated/components/ui/card.tsx +67 -0
  112. package/dist/generated/components/ui/checkbox.tsx +34 -0
  113. package/dist/generated/components/ui/collapsible.tsx +9 -0
  114. package/dist/generated/components/ui/context-menu.tsx +244 -0
  115. package/dist/generated/components/ui/dialog.tsx +150 -0
  116. package/dist/generated/components/ui/dropdown-menu.tsx +244 -0
  117. package/dist/generated/components/ui/hover-card.tsx +45 -0
  118. package/dist/generated/components/ui/input.tsx +26 -0
  119. package/dist/generated/components/ui/label.tsx +28 -0
  120. package/dist/generated/components/ui/menubar.tsx +260 -0
  121. package/dist/generated/components/ui/navigation-menu.tsx +177 -0
  122. package/dist/generated/components/ui/popover.tsx +39 -0
  123. package/dist/generated/components/ui/radio-group.tsx +38 -0
  124. package/dist/generated/components/ui/select.tsx +181 -0
  125. package/dist/generated/components/ui/separator.tsx +23 -0
  126. package/dist/generated/components/ui/skeleton.tsx +39 -0
  127. package/dist/generated/components/ui/switch.tsx +97 -0
  128. package/dist/generated/components/ui/table.tsx +99 -0
  129. package/dist/generated/components/ui/tabs.tsx +65 -0
  130. package/dist/generated/components/ui/text.tsx +24 -0
  131. package/dist/generated/components/ui/textarea.tsx +28 -0
  132. package/dist/generated/components/ui/toggle-group.tsx +86 -0
  133. package/dist/generated/components/ui/toggle.tsx +85 -0
  134. package/dist/generated/components/ui/tooltip.tsx +36 -0
  135. package/dist/generated/components/ui/typography.tsx +204 -0
  136. package/package.json +8 -8
@@ -0,0 +1,101 @@
1
+ import * as React from 'react';
2
+ import { GestureResponderEvent, Pressable, View } from 'react-native';
3
+ import * as Slot from '@rnr/slot';
4
+ import type { ComponentPropsWithAsChild, PressableRef, SlottablePressableProps } from '@rnr/types';
5
+ import type { CheckboxIndicator, CheckboxRootProps } from './types';
6
+
7
+ interface RootContext extends CheckboxRootProps {
8
+ nativeID?: string;
9
+ }
10
+
11
+ const CheckboxContext = React.createContext<RootContext | null>(null);
12
+
13
+ const Root = React.forwardRef<PressableRef, SlottablePressableProps & CheckboxRootProps>(
14
+ ({ asChild, disabled = false, checked, onCheckedChange, nativeID, ...props }, ref) => {
15
+ return (
16
+ <CheckboxContext.Provider
17
+ value={{
18
+ disabled,
19
+ checked,
20
+ onCheckedChange,
21
+ nativeID,
22
+ }}
23
+ >
24
+ <Trigger ref={ref} {...props} />
25
+ </CheckboxContext.Provider>
26
+ );
27
+ }
28
+ );
29
+
30
+ Root.displayName = 'RootNativeCheckbox';
31
+
32
+ function useCheckboxContext() {
33
+ const context = React.useContext(CheckboxContext);
34
+ if (!context) {
35
+ throw new Error(
36
+ 'Checkbox compound components cannot be rendered outside the Checkbox component'
37
+ );
38
+ }
39
+ return context;
40
+ }
41
+
42
+ const Trigger = React.forwardRef<PressableRef, SlottablePressableProps>(
43
+ ({ asChild, onPress: onPressProp, ...props }, ref) => {
44
+ const { disabled, checked, onCheckedChange, nativeID } = useCheckboxContext();
45
+
46
+ function onPress(ev: GestureResponderEvent) {
47
+ if (disabled) return;
48
+ const newValue = !checked;
49
+ onCheckedChange(newValue);
50
+ onPressProp?.(ev);
51
+ }
52
+
53
+ const Component = asChild ? Slot.Pressable : Pressable;
54
+ return (
55
+ <Component
56
+ ref={ref}
57
+ nativeID={nativeID}
58
+ aria-disabled={disabled}
59
+ role='checkbox'
60
+ aria-checked={checked}
61
+ onPress={onPress}
62
+ accessibilityState={{
63
+ checked,
64
+ disabled,
65
+ }}
66
+ disabled={disabled}
67
+ {...props}
68
+ />
69
+ );
70
+ }
71
+ );
72
+
73
+ Trigger.displayName = 'TriggerNativeCheckbox';
74
+
75
+ const Indicator = React.forwardRef<
76
+ React.ElementRef<typeof View>,
77
+ ComponentPropsWithAsChild<typeof View> & CheckboxIndicator
78
+ >(({ asChild, forceMount, ...props }, ref) => {
79
+ const { checked, disabled } = useCheckboxContext();
80
+
81
+ if (!forceMount) {
82
+ if (!checked) {
83
+ return null;
84
+ }
85
+ }
86
+
87
+ const Component = asChild ? Slot.View : View;
88
+ return (
89
+ <Component
90
+ ref={ref}
91
+ aria-disabled={disabled}
92
+ aria-hidden={!(forceMount || checked)}
93
+ role={'presentation'}
94
+ {...props}
95
+ />
96
+ );
97
+ });
98
+
99
+ Indicator.displayName = 'IndicatorNativeCheckbox';
100
+
101
+ export { Indicator, Root };
@@ -0,0 +1,114 @@
1
+ import * as Checkbox from '@radix-ui/react-checkbox';
2
+ import * as React from 'react';
3
+ import { GestureResponderEvent, Pressable, View } from 'react-native';
4
+ import { useAugmentedRef } from '@rnr/hooks';
5
+ import * as Slot from '@rnr/slot';
6
+ import type { ComponentPropsWithAsChild, PressableRef, SlottablePressableProps } from '@rnr/types';
7
+ import type { CheckboxIndicator, CheckboxRootProps } from './types';
8
+
9
+ const CheckboxContext = React.createContext<CheckboxRootProps | null>(null);
10
+
11
+ const Root = React.forwardRef<PressableRef, SlottablePressableProps & CheckboxRootProps>(
12
+ (
13
+ { asChild, disabled, checked, onCheckedChange, onPress: onPressProp, role: _role, ...props },
14
+ ref
15
+ ) => {
16
+ const augmentedRef = useAugmentedRef({ ref });
17
+
18
+ function onPress(ev: GestureResponderEvent) {
19
+ onPressProp?.(ev);
20
+ onCheckedChange(!checked);
21
+ }
22
+
23
+ React.useLayoutEffect(() => {
24
+ if (augmentedRef.current) {
25
+ const augRef = augmentedRef.current as unknown as HTMLButtonElement;
26
+ augRef.dataset.state = checked ? 'checked' : 'unchecked';
27
+ augRef.value = checked ? 'on' : 'off';
28
+ }
29
+ }, [checked]);
30
+
31
+ React.useLayoutEffect(() => {
32
+ if (augmentedRef.current) {
33
+ const augRef = augmentedRef.current as unknown as HTMLButtonElement;
34
+ augRef.type = 'button';
35
+ augRef.role = 'checkbox';
36
+
37
+ if (disabled) {
38
+ augRef.dataset.disabled = 'true';
39
+ } else {
40
+ augRef.dataset.disabled = undefined;
41
+ }
42
+ }
43
+ }, [disabled]);
44
+
45
+ const Component = asChild ? Slot.Pressable : Pressable;
46
+ return (
47
+ <CheckboxContext.Provider value={{ checked, disabled, onCheckedChange }}>
48
+ <Checkbox.Root
49
+ checked={checked}
50
+ onCheckedChange={onCheckedChange}
51
+ disabled={disabled}
52
+ asChild
53
+ >
54
+ <Component
55
+ ref={augmentedRef}
56
+ role='button'
57
+ onPress={onPress}
58
+ disabled={disabled}
59
+ {...props}
60
+ />
61
+ </Checkbox.Root>
62
+ </CheckboxContext.Provider>
63
+ );
64
+ }
65
+ );
66
+
67
+ Root.displayName = 'RootWebCheckbox';
68
+
69
+ function useCheckboxContext() {
70
+ const context = React.useContext(CheckboxContext);
71
+ if (context === null) {
72
+ throw new Error(
73
+ 'Checkbox compound components cannot be rendered outside the Checkbox component'
74
+ );
75
+ }
76
+ return context;
77
+ }
78
+
79
+ const Indicator = React.forwardRef<
80
+ React.ElementRef<typeof View>,
81
+ ComponentPropsWithAsChild<typeof View> & CheckboxIndicator
82
+ >(({ asChild, forceMount, ...props }, ref) => {
83
+ const { checked, disabled } = useCheckboxContext();
84
+ const augmentedRef = useAugmentedRef({ ref });
85
+
86
+ React.useLayoutEffect(() => {
87
+ if (augmentedRef.current) {
88
+ const augRef = augmentedRef.current as unknown as HTMLDivElement;
89
+ augRef.dataset.state = checked ? 'checked' : 'unchecked';
90
+ }
91
+ }, [checked]);
92
+
93
+ React.useLayoutEffect(() => {
94
+ if (augmentedRef.current) {
95
+ const augRef = augmentedRef.current as unknown as HTMLDivElement;
96
+ if (disabled) {
97
+ augRef.dataset.disabled = 'true';
98
+ } else {
99
+ augRef.dataset.disabled = undefined;
100
+ }
101
+ }
102
+ }, [disabled]);
103
+
104
+ const Component = asChild ? Slot.View : View;
105
+ return (
106
+ <Checkbox.Indicator forceMount={forceMount} asChild>
107
+ <Component ref={ref} {...props} />
108
+ </Checkbox.Indicator>
109
+ );
110
+ });
111
+
112
+ Indicator.displayName = 'IndicatorWebCheckbox';
113
+
114
+ export { Indicator, Root };
@@ -0,0 +1 @@
1
+ export * from './checkbox';
@@ -0,0 +1,11 @@
1
+ import type { ForceMountable } from '@rnr/types';
2
+
3
+ interface CheckboxRootProps {
4
+ checked: boolean;
5
+ onCheckedChange: (checked: boolean) => void;
6
+ disabled?: boolean;
7
+ }
8
+
9
+ type CheckboxIndicator = ForceMountable;
10
+
11
+ export type { CheckboxRootProps, CheckboxIndicator };
@@ -0,0 +1,119 @@
1
+ import { useControllableState } from '@rnr/hooks';
2
+ import * as Slot from '@rnr/slot';
3
+ import type {
4
+ PressableRef,
5
+ SlottablePressableProps,
6
+ SlottableViewProps,
7
+ ViewRef,
8
+ } from '@rnr/types';
9
+ import * as React from 'react';
10
+ import { Pressable, View, type GestureResponderEvent } from 'react-native';
11
+ import type { CollapsibleContentProps, CollapsibleRootProps, RootContext } from './types';
12
+
13
+ const CollapsibleContext = React.createContext<(RootContext & { nativeID: string }) | null>(null);
14
+
15
+ const Root = React.forwardRef<ViewRef, SlottableViewProps & CollapsibleRootProps>(
16
+ (
17
+ {
18
+ asChild,
19
+ disabled = false,
20
+ open: openProp,
21
+ defaultOpen,
22
+ onOpenChange: onOpenChangeProp,
23
+ ...viewProps
24
+ },
25
+ ref
26
+ ) => {
27
+ const nativeID = React.useId();
28
+ const [open = false, onOpenChange] = useControllableState({
29
+ prop: openProp,
30
+ defaultProp: defaultOpen,
31
+ onChange: onOpenChangeProp,
32
+ });
33
+
34
+ const Component = asChild ? Slot.View : View;
35
+ return (
36
+ <CollapsibleContext.Provider
37
+ value={{
38
+ disabled,
39
+ open,
40
+ onOpenChange,
41
+ nativeID,
42
+ }}
43
+ >
44
+ <Component ref={ref} {...viewProps} />
45
+ </CollapsibleContext.Provider>
46
+ );
47
+ }
48
+ );
49
+
50
+ Root.displayName = 'RootNativeCollapsible';
51
+
52
+ function useCollapsibleContext() {
53
+ const context = React.useContext(CollapsibleContext);
54
+ if (!context) {
55
+ throw new Error(
56
+ 'Collapsible compound components cannot be rendered outside the Collapsible component'
57
+ );
58
+ }
59
+ return context;
60
+ }
61
+
62
+ const Trigger = React.forwardRef<PressableRef, SlottablePressableProps>(
63
+ ({ asChild, onPress: onPressProp, disabled: disabledProp = false, ...props }, ref) => {
64
+ const { disabled, open, onOpenChange, nativeID } = useCollapsibleContext();
65
+
66
+ function onPress(ev: GestureResponderEvent) {
67
+ if (disabled || disabledProp) return;
68
+ onOpenChange(!open);
69
+ onPressProp?.(ev);
70
+ }
71
+
72
+ const Component = asChild ? Slot.Pressable : Pressable;
73
+ return (
74
+ <Component
75
+ key={`trigger-${nativeID}-${open}`}
76
+ ref={ref}
77
+ nativeID={nativeID}
78
+ aria-disabled={(disabled || disabledProp) ?? undefined}
79
+ role='button'
80
+ onPress={onPress}
81
+ accessibilityState={{
82
+ expanded: open,
83
+ disabled: (disabled || disabledProp) ?? undefined,
84
+ }}
85
+ disabled={disabled || disabledProp}
86
+ {...props}
87
+ />
88
+ );
89
+ }
90
+ );
91
+
92
+ Trigger.displayName = 'TriggerNativeCollapsible';
93
+
94
+ const Content = React.forwardRef<ViewRef, SlottableViewProps & CollapsibleContentProps>(
95
+ ({ asChild, forceMount, ...props }, ref) => {
96
+ const { nativeID, open } = useCollapsibleContext();
97
+
98
+ if (!forceMount) {
99
+ if (!open) {
100
+ return null;
101
+ }
102
+ }
103
+
104
+ const Component = asChild ? Slot.View : View;
105
+ return (
106
+ <Component
107
+ ref={ref}
108
+ aria-hidden={!(forceMount || open)}
109
+ aria-labelledby={nativeID}
110
+ role={'region'}
111
+ {...props}
112
+ />
113
+ );
114
+ }
115
+ );
116
+
117
+ Content.displayName = 'ContentNativeCollapsible';
118
+
119
+ export { Content, Root, Trigger };
@@ -0,0 +1,157 @@
1
+ import * as Collapsible from '@radix-ui/react-collapsible';
2
+ import { useAugmentedRef, useControllableState } from '@rnr/hooks';
3
+ import * as Slot from '@rnr/slot';
4
+ import type {
5
+ PressableRef,
6
+ SlottablePressableProps,
7
+ SlottableViewProps,
8
+ ViewRef,
9
+ } from '@rnr/types';
10
+ import * as React from 'react';
11
+ import { Pressable, View, type GestureResponderEvent } from 'react-native';
12
+ import type { CollapsibleContentProps, CollapsibleRootProps, RootContext } from './types';
13
+
14
+ const CollapsibleContext = React.createContext<RootContext | null>(null);
15
+
16
+ const Root = React.forwardRef<ViewRef, SlottableViewProps & CollapsibleRootProps>(
17
+ (
18
+ {
19
+ asChild,
20
+ disabled = false,
21
+ open: openProp,
22
+ defaultOpen,
23
+ onOpenChange: onOpenChangeProp,
24
+ ...viewProps
25
+ },
26
+ ref
27
+ ) => {
28
+ const [open = false, onOpenChange] = useControllableState({
29
+ prop: openProp,
30
+ defaultProp: defaultOpen,
31
+ onChange: onOpenChangeProp,
32
+ });
33
+ const augmentedRef = useAugmentedRef({ ref });
34
+
35
+ React.useLayoutEffect(() => {
36
+ if (augmentedRef.current) {
37
+ const augRef = augmentedRef.current as unknown as HTMLDivElement;
38
+ augRef.dataset.state = open ? 'open' : 'closed';
39
+ }
40
+ }, [open]);
41
+
42
+ React.useLayoutEffect(() => {
43
+ if (augmentedRef.current) {
44
+ const augRef = augmentedRef.current as unknown as HTMLDivElement;
45
+ if (disabled) {
46
+ augRef.dataset.disabled = 'true';
47
+ } else {
48
+ augRef.dataset.disabled = undefined;
49
+ }
50
+ }
51
+ }, [disabled]);
52
+
53
+ const Component = asChild ? Slot.View : View;
54
+ return (
55
+ <CollapsibleContext.Provider
56
+ value={{
57
+ disabled,
58
+ open,
59
+ onOpenChange,
60
+ }}
61
+ >
62
+ <Collapsible.Root
63
+ open={open}
64
+ defaultOpen={defaultOpen}
65
+ onOpenChange={onOpenChange}
66
+ disabled={disabled}
67
+ >
68
+ <Component ref={ref} {...viewProps} />
69
+ </Collapsible.Root>
70
+ </CollapsibleContext.Provider>
71
+ );
72
+ }
73
+ );
74
+
75
+ Root.displayName = 'RootWebCollapsible';
76
+
77
+ function useCollapsibleContext() {
78
+ const context = React.useContext(CollapsibleContext);
79
+ if (!context) {
80
+ throw new Error(
81
+ 'Collapsible compound components cannot be rendered outside the Collapsible component'
82
+ );
83
+ }
84
+ return context;
85
+ }
86
+
87
+ const Trigger = React.forwardRef<PressableRef, SlottablePressableProps>(
88
+ ({ asChild, onPress: onPressProp, disabled: disabledProp = false, ...props }, ref) => {
89
+ const { disabled, open, onOpenChange } = useCollapsibleContext();
90
+ const augmentedRef = useAugmentedRef({ ref });
91
+
92
+ React.useLayoutEffect(() => {
93
+ if (augmentedRef.current) {
94
+ const augRef = augmentedRef.current as unknown as HTMLButtonElement;
95
+ augRef.dataset.state = open ? 'open' : 'closed';
96
+ }
97
+ }, [open]);
98
+
99
+ React.useLayoutEffect(() => {
100
+ if (augmentedRef.current) {
101
+ const augRef = augmentedRef.current as unknown as HTMLButtonElement;
102
+ augRef.type = 'button';
103
+
104
+ if (disabled) {
105
+ augRef.dataset.disabled = 'true';
106
+ } else {
107
+ augRef.dataset.disabled = undefined;
108
+ }
109
+ }
110
+ }, [disabled]);
111
+
112
+ function onPress(ev: GestureResponderEvent) {
113
+ onPressProp?.(ev);
114
+ onOpenChange(!open);
115
+ }
116
+
117
+ const Component = asChild ? Slot.Pressable : Pressable;
118
+ return (
119
+ <Collapsible.Trigger disabled={disabled} asChild>
120
+ <Component
121
+ ref={augmentedRef}
122
+ role='button'
123
+ onPress={onPress}
124
+ disabled={disabled}
125
+ {...props}
126
+ />
127
+ </Collapsible.Trigger>
128
+ );
129
+ }
130
+ );
131
+
132
+ Trigger.displayName = 'TriggerWebCollapsible';
133
+
134
+ const Content = React.forwardRef<ViewRef, SlottableViewProps & CollapsibleContentProps>(
135
+ ({ asChild, forceMount, ...props }, ref) => {
136
+ const augmentedRef = useAugmentedRef({ ref });
137
+ const { open } = useCollapsibleContext();
138
+
139
+ React.useLayoutEffect(() => {
140
+ if (augmentedRef.current) {
141
+ const augRef = augmentedRef.current as unknown as HTMLDivElement;
142
+ augRef.dataset.state = open ? 'open' : 'closed';
143
+ }
144
+ }, [open]);
145
+
146
+ const Component = asChild ? Slot.View : View;
147
+ return (
148
+ <Collapsible.Content forceMount={forceMount} asChild>
149
+ <Component ref={augmentedRef} {...props} />
150
+ </Collapsible.Content>
151
+ );
152
+ }
153
+ );
154
+
155
+ Content.displayName = 'ContentWebCollapsible';
156
+
157
+ export { Content, Root, Trigger };
@@ -0,0 +1 @@
1
+ export * from './collapsible';
@@ -0,0 +1,18 @@
1
+ import type { ForceMountable } from '@rnr/types';
2
+
3
+ interface RootContext {
4
+ open: boolean;
5
+ onOpenChange: (open: boolean) => void;
6
+ disabled: boolean;
7
+ }
8
+
9
+ interface CollapsibleRootProps {
10
+ open?: boolean;
11
+ defaultOpen?: boolean;
12
+ onOpenChange?: (open: boolean) => void;
13
+ disabled?: boolean;
14
+ }
15
+
16
+ type CollapsibleContentProps = ForceMountable;
17
+
18
+ export type { CollapsibleContentProps, CollapsibleRootProps, RootContext };