@lattice-ui/radio-group 0.4.3 → 0.5.0-next.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.
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "radio-group",
3
+ "tree": {
4
+ "$path": "out",
5
+ "out": {
6
+ "$path": "out"
7
+ }
8
+ }
9
+ }
@@ -1,3 +1,3 @@
1
1
  import { React } from "@lattice-ui/core";
2
2
  import type { RadioGroupIndicatorProps } from "./types";
3
- export declare function RadioGroupIndicator(props: RadioGroupIndicatorProps): React.JSX.Element | undefined;
3
+ export declare function RadioGroupIndicator(props: RadioGroupIndicatorProps): React.JSX.Element;
@@ -3,29 +3,58 @@ local TS = _G[script]
3
3
  local _core = TS.import(script, TS.getModule(script, "@lattice-ui", "core").out)
4
4
  local React = _core.React
5
5
  local Slot = _core.Slot
6
+ local Presence = TS.import(script, TS.getModule(script, "@lattice-ui", "layer").out).Presence
7
+ local _motion = TS.import(script, TS.getModule(script, "@lattice-ui", "motion").out)
8
+ local createIndicatorRevealRecipe = _motion.createIndicatorRevealRecipe
9
+ local usePresenceMotion = _motion.usePresenceMotion
6
10
  local useRadioGroupItemContext = TS.import(script, script.Parent, "context").useRadioGroupItemContext
7
- local function RadioGroupIndicator(props)
8
- local radioGroupItemContext = useRadioGroupItemContext()
9
- local visible = radioGroupItemContext.checked
10
- local forceMount = props.forceMount == true
11
- if not visible and not forceMount then
12
- return nil
13
- end
14
- local child = props.children
11
+ local function RadioGroupIndicatorImpl(props)
12
+ local motionRef = usePresenceMotion(props.motionPresent, props.transition or createIndicatorRevealRecipe(UDim2.fromOffset(10, 10)), props.onExitComplete)
15
13
  if props.asChild then
14
+ local child = props.children
16
15
  if not React.isValidElement(child) then
17
16
  error("[RadioGroupIndicator] `asChild` requires a child element.")
18
17
  end
19
18
  return React.createElement(Slot, {
20
- Visible = visible,
19
+ Visible = props.visible,
20
+ ref = motionRef,
21
21
  }, child)
22
22
  end
23
23
  return React.createElement("frame", {
24
24
  BackgroundColor3 = Color3.fromRGB(240, 244, 252),
25
25
  BorderSizePixel = 0,
26
26
  Size = UDim2.fromOffset(10, 10),
27
- Visible = visible,
28
- }, child)
27
+ Visible = props.visible,
28
+ ref = motionRef,
29
+ }, props.children)
30
+ end
31
+ local function RadioGroupIndicator(props)
32
+ local radioGroupItemContext = useRadioGroupItemContext()
33
+ local visible = radioGroupItemContext.checked
34
+ local forceMount = props.forceMount == true
35
+ local transition = React.useMemo(function()
36
+ return props.transition or createIndicatorRevealRecipe(UDim2.fromOffset(10, 10))
37
+ end, { props.transition })
38
+ if forceMount then
39
+ return React.createElement(RadioGroupIndicatorImpl, {
40
+ asChild = props.asChild,
41
+ motionPresent = visible,
42
+ transition = transition,
43
+ visible = visible,
44
+ }, props.children)
45
+ end
46
+ return React.createElement(Presence, {
47
+ present = visible,
48
+ render = function(state)
49
+ return React.createElement(RadioGroupIndicatorImpl, {
50
+ asChild = props.asChild,
51
+ motionPresent = state.isPresent,
52
+ onExitComplete = state.onExitComplete,
53
+ transition = transition,
54
+ visible = true,
55
+ }, props.children)
56
+ end,
57
+ })
29
58
  end
30
59
  return {
31
60
  RadioGroupIndicator = RadioGroupIndicator,
@@ -3,7 +3,10 @@ local TS = _G[script]
3
3
  local _core = TS.import(script, TS.getModule(script, "@lattice-ui", "core").out)
4
4
  local React = _core.React
5
5
  local Slot = _core.Slot
6
- local useFocusNode = _core.useFocusNode
6
+ local useFocusNode = TS.import(script, TS.getModule(script, "@lattice-ui", "focus").out).useFocusNode
7
+ local _motion = TS.import(script, TS.getModule(script, "@lattice-ui", "motion").out)
8
+ local createSelectionResponseRecipe = _motion.createSelectionResponseRecipe
9
+ local useResponseMotion = _motion.useResponseMotion
7
10
  local _context = TS.import(script, script.Parent, "context")
8
11
  local RadioGroupItemContextProvider = _context.RadioGroupItemContextProvider
9
12
  local useRadioGroupContext = _context.useRadioGroupContext
@@ -45,13 +48,19 @@ local function RadioGroupItem(props)
45
48
  return disabledRef.current
46
49
  end,
47
50
  })
51
+ local motionRef = useResponseMotion(checked, {
52
+ active = {
53
+ BackgroundColor3 = Color3.fromRGB(88, 142, 255),
54
+ },
55
+ inactive = {
56
+ BackgroundColor3 = Color3.fromRGB(47, 53, 68),
57
+ },
58
+ }, props.transition or createSelectionResponseRecipe())
48
59
  local setItemRef = React.useCallback(function(instance)
49
- if not instance or not instance:IsA("GuiObject") then
50
- itemRef.current = nil
51
- return nil
52
- end
53
- itemRef.current = instance
54
- end, {})
60
+ local nextItem = if not instance or not instance:IsA("GuiObject") then nil else instance
61
+ itemRef.current = nextItem
62
+ motionRef.current = nextItem
63
+ end, { motionRef })
55
64
  local handleSelect = React.useCallback(function()
56
65
  if disabled then
57
66
  return nil
@@ -1,11 +1,12 @@
1
1
  -- Compiled with roblox-ts v3.0.0
2
2
  local TS = _G[script]
3
3
  local _core = TS.import(script, TS.getModule(script, "@lattice-ui", "core").out)
4
- local findOrderedSelectionEntry = _core.findOrderedSelectionEntry
5
- local focusOrderedSelectionEntry = _core.focusOrderedSelectionEntry
6
- local getRelativeOrderedSelectionEntry = _core.getRelativeOrderedSelectionEntry
7
4
  local React = _core.React
8
5
  local useControllableState = _core.useControllableState
6
+ local _focus = TS.import(script, TS.getModule(script, "@lattice-ui", "focus").out)
7
+ local findOrderedSelectionEntry = _focus.findOrderedSelectionEntry
8
+ local focusOrderedSelectionEntry = _focus.focusOrderedSelectionEntry
9
+ local getRelativeOrderedSelectionEntry = _focus.getRelativeOrderedSelectionEntry
9
10
  local RadioGroupContextProvider = TS.import(script, script.Parent, "context").RadioGroupContextProvider
10
11
  local function RadioGroupRoot(props)
11
12
  local orientation = props.orientation or "vertical"
@@ -1,3 +1,4 @@
1
+ import type { PresenceMotionConfig, ResponseMotionConfig } from "@lattice-ui/motion";
1
2
  import type React from "@rbxts/react";
2
3
  export type RadioGroupSetValue = (value: string) => void;
3
4
  export type RadioGroupOrientation = "horizontal" | "vertical";
@@ -31,12 +32,14 @@ export type RadioGroupProps = {
31
32
  children?: React.ReactNode;
32
33
  };
33
34
  export type RadioGroupItemProps = {
35
+ transition?: ResponseMotionConfig;
34
36
  value: string;
35
37
  disabled?: boolean;
36
38
  asChild?: boolean;
37
39
  children?: React.ReactElement;
38
40
  };
39
41
  export type RadioGroupIndicatorProps = {
42
+ transition?: PresenceMotionConfig;
40
43
  forceMount?: boolean;
41
44
  asChild?: boolean;
42
45
  children?: React.ReactNode;
package/package.json CHANGED
@@ -1,15 +1,25 @@
1
1
  {
2
2
  "name": "@lattice-ui/radio-group",
3
- "version": "0.4.3",
3
+ "version": "0.5.0-next.1",
4
4
  "private": false,
5
5
  "main": "out/init.luau",
6
6
  "types": "out/index.d.ts",
7
+ "source": "src/index.ts",
7
8
  "files": [
9
+ "default.project.json",
8
10
  "out",
11
+ "src",
9
12
  "README.md"
10
13
  ],
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/astra-void/lattice-ui.git"
17
+ },
11
18
  "dependencies": {
12
- "@lattice-ui/core": "0.4.3"
19
+ "@lattice-ui/core": "0.5.0-next.1",
20
+ "@lattice-ui/motion": "0.5.0-next.1",
21
+ "@lattice-ui/layer": "0.5.0-next.1",
22
+ "@lattice-ui/focus": "0.5.0-next.1"
13
23
  },
14
24
  "devDependencies": {
15
25
  "@rbxts/react": "17.3.7-ts.1",
@@ -21,6 +31,8 @@
21
31
  },
22
32
  "scripts": {
23
33
  "build": "rbxtsc -p tsconfig.json",
34
+ "lint": "eslint .",
35
+ "lint:fix": "eslint . --fix",
24
36
  "typecheck": "tsc -p tsconfig.typecheck.json",
25
37
  "watch": "rbxtsc -p tsconfig.json -w"
26
38
  }
@@ -0,0 +1,86 @@
1
+ import { React, Slot } from "@lattice-ui/core";
2
+ import { Presence } from "@lattice-ui/layer";
3
+ import { createIndicatorRevealRecipe, type PresenceMotionConfig, usePresenceMotion } from "@lattice-ui/motion";
4
+ import { useRadioGroupItemContext } from "./context";
5
+ import type { RadioGroupIndicatorProps } from "./types";
6
+
7
+ function RadioGroupIndicatorImpl(props: {
8
+ motionPresent: boolean;
9
+ visible: boolean;
10
+ transition?: PresenceMotionConfig;
11
+ onExitComplete?: () => void;
12
+ asChild?: boolean;
13
+ children?: React.ReactNode;
14
+ }) {
15
+ const motionRef = usePresenceMotion<Frame>(
16
+ props.motionPresent,
17
+ props.transition ?? createIndicatorRevealRecipe(UDim2.fromOffset(10, 10)),
18
+ props.onExitComplete,
19
+ );
20
+
21
+ if (props.asChild) {
22
+ const child = props.children;
23
+ if (!React.isValidElement(child)) {
24
+ error("[RadioGroupIndicator] `asChild` requires a child element.");
25
+ }
26
+
27
+ return (
28
+ <Slot Visible={props.visible} ref={motionRef}>
29
+ {child}
30
+ </Slot>
31
+ );
32
+ }
33
+
34
+ return (
35
+ <frame
36
+ BackgroundColor3={Color3.fromRGB(240, 244, 252)}
37
+ BorderSizePixel={0}
38
+ Size={UDim2.fromOffset(10, 10)}
39
+ Visible={props.visible}
40
+ ref={motionRef}
41
+ >
42
+ {props.children}
43
+ </frame>
44
+ );
45
+ }
46
+
47
+ export function RadioGroupIndicator(props: RadioGroupIndicatorProps) {
48
+ const radioGroupItemContext = useRadioGroupItemContext();
49
+ const visible = radioGroupItemContext.checked;
50
+ const forceMount = props.forceMount === true;
51
+
52
+ const transition = React.useMemo(
53
+ () => props.transition ?? createIndicatorRevealRecipe(UDim2.fromOffset(10, 10)),
54
+ [props.transition],
55
+ );
56
+
57
+ if (forceMount) {
58
+ return (
59
+ <RadioGroupIndicatorImpl
60
+ asChild={props.asChild}
61
+ motionPresent={visible}
62
+ transition={transition}
63
+ visible={visible}
64
+ >
65
+ {props.children}
66
+ </RadioGroupIndicatorImpl>
67
+ );
68
+ }
69
+
70
+ return (
71
+ <Presence
72
+ present={visible}
73
+ render={(state) => (
74
+ <RadioGroupIndicatorImpl
75
+ asChild={props.asChild}
76
+ motionPresent={state.isPresent}
77
+ onExitComplete={state.onExitComplete}
78
+ transition={transition}
79
+ visible={true}
80
+ >
81
+ {props.children}
82
+ </RadioGroupIndicatorImpl>
83
+ )}
84
+ />
85
+ );
86
+ }
@@ -0,0 +1,167 @@
1
+ import { React, Slot } from "@lattice-ui/core";
2
+ import { useFocusNode } from "@lattice-ui/focus";
3
+ import { createSelectionResponseRecipe, useResponseMotion } from "@lattice-ui/motion";
4
+ import { RadioGroupItemContextProvider, useRadioGroupContext } from "./context";
5
+ import type { RadioGroupItemProps } from "./types";
6
+
7
+ let nextItemId = 0;
8
+ let nextItemOrder = 0;
9
+
10
+ export function RadioGroupItem(props: RadioGroupItemProps) {
11
+ const radioGroupContext = useRadioGroupContext();
12
+ const disabled = radioGroupContext.disabled || props.disabled === true;
13
+ const checked = radioGroupContext.value === props.value;
14
+ const itemRef = React.useRef<GuiObject>();
15
+ const disabledRef = React.useRef(disabled);
16
+
17
+ React.useEffect(() => {
18
+ disabledRef.current = disabled;
19
+ }, [disabled]);
20
+
21
+ const itemIdRef = React.useRef(0);
22
+ if (itemIdRef.current === 0) {
23
+ nextItemId += 1;
24
+ itemIdRef.current = nextItemId;
25
+ }
26
+
27
+ const itemOrderRef = React.useRef(0);
28
+ if (itemOrderRef.current === 0) {
29
+ nextItemOrder += 1;
30
+ itemOrderRef.current = nextItemOrder;
31
+ }
32
+
33
+ React.useEffect(() => {
34
+ return radioGroupContext.registerItem({
35
+ id: itemIdRef.current,
36
+ value: props.value,
37
+ order: itemOrderRef.current,
38
+ ref: itemRef,
39
+ getDisabled: () => disabledRef.current,
40
+ });
41
+ }, [props.value, radioGroupContext]);
42
+
43
+ useFocusNode({
44
+ ref: itemRef,
45
+ getDisabled: () => disabledRef.current,
46
+ });
47
+
48
+ const motionRef = useResponseMotion<GuiObject>(
49
+ checked,
50
+ {
51
+ active: { BackgroundColor3: Color3.fromRGB(88, 142, 255) },
52
+ inactive: { BackgroundColor3: Color3.fromRGB(47, 53, 68) },
53
+ },
54
+ props.transition ?? createSelectionResponseRecipe(),
55
+ );
56
+
57
+ const setItemRef = React.useCallback(
58
+ (instance: Instance | undefined) => {
59
+ const nextItem = !instance || !instance.IsA("GuiObject") ? undefined : instance;
60
+ itemRef.current = nextItem;
61
+ motionRef.current = nextItem;
62
+ },
63
+ [motionRef],
64
+ );
65
+
66
+ const handleSelect = React.useCallback(() => {
67
+ if (disabled) {
68
+ return;
69
+ }
70
+
71
+ radioGroupContext.setValue(props.value);
72
+ }, [disabled, props.value, radioGroupContext]);
73
+
74
+ const handleSelectionGained = React.useCallback(() => {
75
+ if (disabled) {
76
+ return;
77
+ }
78
+
79
+ radioGroupContext.setValue(props.value);
80
+ }, [disabled, props.value, radioGroupContext]);
81
+
82
+ const handleInputBegan = React.useCallback(
83
+ (_rbx: GuiObject, inputObject: InputObject) => {
84
+ if (disabled) {
85
+ return;
86
+ }
87
+
88
+ const keyCode = inputObject.KeyCode;
89
+ const direction =
90
+ radioGroupContext.orientation === "horizontal"
91
+ ? keyCode === Enum.KeyCode.Left
92
+ ? -1
93
+ : keyCode === Enum.KeyCode.Right
94
+ ? 1
95
+ : undefined
96
+ : keyCode === Enum.KeyCode.Up
97
+ ? -1
98
+ : keyCode === Enum.KeyCode.Down
99
+ ? 1
100
+ : undefined;
101
+
102
+ if (direction !== undefined) {
103
+ radioGroupContext.moveSelection(props.value, direction);
104
+ return;
105
+ }
106
+
107
+ if (keyCode !== Enum.KeyCode.Return && keyCode !== Enum.KeyCode.Space) {
108
+ return;
109
+ }
110
+
111
+ radioGroupContext.setValue(props.value);
112
+ },
113
+ [disabled, props.value, radioGroupContext],
114
+ );
115
+
116
+ const eventHandlers = React.useMemo(
117
+ () => ({
118
+ Activated: handleSelect,
119
+ InputBegan: handleInputBegan,
120
+ SelectionGained: handleSelectionGained,
121
+ }),
122
+ [handleInputBegan, handleSelect, handleSelectionGained],
123
+ );
124
+
125
+ const itemContextValue = React.useMemo(
126
+ () => ({
127
+ checked,
128
+ disabled,
129
+ }),
130
+ [checked, disabled],
131
+ );
132
+
133
+ return (
134
+ <RadioGroupItemContextProvider value={itemContextValue}>
135
+ {props.asChild ? (
136
+ (() => {
137
+ const child = props.children;
138
+ if (!child) {
139
+ error("[RadioGroupItem] `asChild` requires a child element.");
140
+ }
141
+
142
+ return (
143
+ <Slot Active={!disabled} Event={eventHandlers} Selectable={!disabled} ref={setItemRef}>
144
+ {child}
145
+ </Slot>
146
+ );
147
+ })()
148
+ ) : (
149
+ <textbutton
150
+ Active={!disabled}
151
+ AutoButtonColor={false}
152
+ BackgroundColor3={checked ? Color3.fromRGB(88, 142, 255) : Color3.fromRGB(47, 53, 68)}
153
+ BorderSizePixel={0}
154
+ Event={eventHandlers}
155
+ Selectable={!disabled}
156
+ Size={UDim2.fromOffset(170, 34)}
157
+ Text={props.value}
158
+ TextColor3={disabled ? Color3.fromRGB(139, 146, 160) : Color3.fromRGB(236, 241, 249)}
159
+ TextSize={15}
160
+ ref={setItemRef}
161
+ >
162
+ {props.children}
163
+ </textbutton>
164
+ )}
165
+ </RadioGroupItemContextProvider>
166
+ );
167
+ }
@@ -0,0 +1,80 @@
1
+ import { React, useControllableState } from "@lattice-ui/core";
2
+ import {
3
+ findOrderedSelectionEntry,
4
+ focusOrderedSelectionEntry,
5
+ getRelativeOrderedSelectionEntry,
6
+ } from "@lattice-ui/focus";
7
+ import { RadioGroupContextProvider } from "./context";
8
+ import type { RadioGroupItemRegistration, RadioGroupProps } from "./types";
9
+
10
+ export function RadioGroupRoot(props: RadioGroupProps) {
11
+ const orientation = props.orientation ?? "vertical";
12
+ const [value, setValueState] = useControllableState<string | undefined>({
13
+ value: props.value,
14
+ defaultValue: props.defaultValue,
15
+ onChange: (nextValue) => {
16
+ if (nextValue !== undefined) {
17
+ props.onValueChange?.(nextValue);
18
+ }
19
+ },
20
+ });
21
+
22
+ const disabled = props.disabled === true;
23
+ const required = props.required === true;
24
+ const itemEntriesRef = React.useRef<Array<RadioGroupItemRegistration>>([]);
25
+ const [, setRegistryRevision] = React.useState(0);
26
+
27
+ const setValue = React.useCallback(
28
+ (nextValue: string) => {
29
+ if (disabled) {
30
+ return;
31
+ }
32
+
33
+ setValueState(nextValue);
34
+ },
35
+ [disabled, setValueState],
36
+ );
37
+
38
+ const registerItem = React.useCallback((item: RadioGroupItemRegistration) => {
39
+ itemEntriesRef.current.push(item);
40
+ setRegistryRevision((revision) => revision + 1);
41
+
42
+ return () => {
43
+ const index = itemEntriesRef.current.findIndex((entry) => entry.id === item.id);
44
+ if (index >= 0) {
45
+ itemEntriesRef.current.remove(index);
46
+ setRegistryRevision((revision) => revision + 1);
47
+ }
48
+ };
49
+ }, []);
50
+
51
+ const moveSelection = React.useCallback(
52
+ (fromValue: string, direction: -1 | 1) => {
53
+ const currentItem =
54
+ findOrderedSelectionEntry(itemEntriesRef.current, (item) => item.value === fromValue) ?? undefined;
55
+ const nextItem = getRelativeOrderedSelectionEntry(itemEntriesRef.current, currentItem?.id, direction);
56
+ if (!nextItem) {
57
+ return;
58
+ }
59
+
60
+ focusOrderedSelectionEntry(nextItem);
61
+ setValue(nextItem.value);
62
+ },
63
+ [setValue],
64
+ );
65
+
66
+ const contextValue = React.useMemo(
67
+ () => ({
68
+ value,
69
+ setValue,
70
+ disabled,
71
+ required,
72
+ orientation,
73
+ registerItem,
74
+ moveSelection,
75
+ }),
76
+ [disabled, moveSelection, orientation, registerItem, required, setValue, value],
77
+ );
78
+
79
+ return <RadioGroupContextProvider value={contextValue}>{props.children}</RadioGroupContextProvider>;
80
+ }
@@ -0,0 +1,8 @@
1
+ import { createStrictContext } from "@lattice-ui/core";
2
+ import type { RadioGroupContextValue, RadioGroupItemContextValue } from "./types";
3
+
4
+ const [RadioGroupContextProvider, useRadioGroupContext] = createStrictContext<RadioGroupContextValue>("RadioGroup");
5
+ const [RadioGroupItemContextProvider, useRadioGroupItemContext] =
6
+ createStrictContext<RadioGroupItemContextValue>("RadioGroupItem");
7
+
8
+ export { RadioGroupContextProvider, RadioGroupItemContextProvider, useRadioGroupContext, useRadioGroupItemContext };
@@ -0,0 +1,53 @@
1
+ import type { PresenceMotionConfig, ResponseMotionConfig } from "@lattice-ui/motion";
2
+ import type React from "@rbxts/react";
3
+
4
+ export type RadioGroupSetValue = (value: string) => void;
5
+ export type RadioGroupOrientation = "horizontal" | "vertical";
6
+
7
+ export type RadioGroupItemRegistration = {
8
+ id: number;
9
+ value: string;
10
+ order: number;
11
+ ref: React.MutableRefObject<GuiObject | undefined>;
12
+ getDisabled: () => boolean;
13
+ };
14
+
15
+ export type RadioGroupContextValue = {
16
+ value?: string;
17
+ setValue: RadioGroupSetValue;
18
+ disabled: boolean;
19
+ required: boolean;
20
+ orientation: RadioGroupOrientation;
21
+ registerItem: (item: RadioGroupItemRegistration) => () => void;
22
+ moveSelection: (fromValue: string, direction: -1 | 1) => void;
23
+ };
24
+
25
+ export type RadioGroupItemContextValue = {
26
+ checked: boolean;
27
+ disabled: boolean;
28
+ };
29
+
30
+ export type RadioGroupProps = {
31
+ value?: string;
32
+ defaultValue?: string;
33
+ onValueChange?: (value: string) => void;
34
+ disabled?: boolean;
35
+ required?: boolean;
36
+ orientation?: RadioGroupOrientation;
37
+ children?: React.ReactNode;
38
+ };
39
+
40
+ export type RadioGroupItemProps = {
41
+ transition?: ResponseMotionConfig;
42
+ value: string;
43
+ disabled?: boolean;
44
+ asChild?: boolean;
45
+ children?: React.ReactElement;
46
+ };
47
+
48
+ export type RadioGroupIndicatorProps = {
49
+ transition?: PresenceMotionConfig;
50
+ forceMount?: boolean;
51
+ asChild?: boolean;
52
+ children?: React.ReactNode;
53
+ };
package/src/index.ts ADDED
@@ -0,0 +1,25 @@
1
+ import { RadioGroupIndicator } from "./RadioGroup/RadioGroupIndicator";
2
+ import { RadioGroupItem } from "./RadioGroup/RadioGroupItem";
3
+ import { RadioGroupRoot } from "./RadioGroup/RadioGroupRoot";
4
+
5
+ export const RadioGroup = {
6
+ Root: RadioGroupRoot,
7
+ Item: RadioGroupItem,
8
+ Indicator: RadioGroupIndicator,
9
+ } as const satisfies {
10
+ Root: typeof RadioGroupRoot;
11
+ Item: typeof RadioGroupItem;
12
+ Indicator: typeof RadioGroupIndicator;
13
+ };
14
+
15
+ export type {
16
+ RadioGroupContextValue,
17
+ RadioGroupIndicatorProps,
18
+ RadioGroupItemContextValue,
19
+ RadioGroupItemProps,
20
+ RadioGroupItemRegistration,
21
+ RadioGroupOrientation,
22
+ RadioGroupProps,
23
+ RadioGroupSetValue,
24
+ } from "./RadioGroup/types";
25
+ export { RadioGroupIndicator, RadioGroupItem, RadioGroupRoot };