@lattice-ui/menu 0.1.1 → 0.3.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.
- package/out/index.d.ts +19 -8
- package/out/init.luau +29 -10
- package/package.json +11 -7
- package/src/Menu/MenuContent.tsx +0 -146
- package/src/Menu/MenuGroup.tsx +0 -24
- package/src/Menu/MenuItem.tsx +0 -72
- package/src/Menu/MenuLabel.tsx +0 -27
- package/src/Menu/MenuPortal.tsx +0 -28
- package/src/Menu/MenuRoot.tsx +0 -35
- package/src/Menu/MenuSeparator.tsx +0 -15
- package/src/Menu/MenuTrigger.tsx +0 -61
- package/src/Menu/context.ts +0 -6
- package/src/Menu/types.ts +0 -73
- package/src/index.ts +0 -19
- package/tsconfig.json +0 -16
- package/tsconfig.typecheck.json +0 -25
package/out/index.d.ts
CHANGED
|
@@ -1,9 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { MenuContent } from "./Menu/MenuContent";
|
|
2
|
+
import { MenuGroup } from "./Menu/MenuGroup";
|
|
3
|
+
import { MenuItem } from "./Menu/MenuItem";
|
|
4
|
+
import { MenuLabel } from "./Menu/MenuLabel";
|
|
5
|
+
import { MenuPortal } from "./Menu/MenuPortal";
|
|
6
|
+
import { Menu as MenuRoot } from "./Menu/MenuRoot";
|
|
7
|
+
import { MenuSeparator } from "./Menu/MenuSeparator";
|
|
8
|
+
import { MenuTrigger } from "./Menu/MenuTrigger";
|
|
9
|
+
export declare const Menu: {
|
|
10
|
+
readonly Root: typeof MenuRoot;
|
|
11
|
+
readonly Trigger: typeof MenuTrigger;
|
|
12
|
+
readonly Portal: typeof MenuPortal;
|
|
13
|
+
readonly Content: typeof MenuContent;
|
|
14
|
+
readonly Item: typeof MenuItem;
|
|
15
|
+
readonly Group: typeof MenuGroup;
|
|
16
|
+
readonly Label: typeof MenuLabel;
|
|
17
|
+
readonly Separator: typeof MenuSeparator;
|
|
18
|
+
};
|
|
19
|
+
export { MenuContent, MenuGroup, MenuItem, MenuLabel, MenuPortal, MenuRoot, MenuSeparator, MenuTrigger };
|
|
9
20
|
export type { MenuContentProps, MenuGroupProps, MenuItemProps, MenuLabelProps, MenuPortalProps, MenuProps, MenuSelectEvent, MenuSeparatorProps, MenuTriggerProps, } from "./Menu/types";
|
package/out/init.luau
CHANGED
|
@@ -1,12 +1,31 @@
|
|
|
1
1
|
-- Compiled with roblox-ts v3.0.0
|
|
2
2
|
local TS = _G[script]
|
|
3
|
-
local
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
3
|
+
local MenuContent = TS.import(script, script, "Menu", "MenuContent").MenuContent
|
|
4
|
+
local MenuGroup = TS.import(script, script, "Menu", "MenuGroup").MenuGroup
|
|
5
|
+
local MenuItem = TS.import(script, script, "Menu", "MenuItem").MenuItem
|
|
6
|
+
local MenuLabel = TS.import(script, script, "Menu", "MenuLabel").MenuLabel
|
|
7
|
+
local MenuPortal = TS.import(script, script, "Menu", "MenuPortal").MenuPortal
|
|
8
|
+
local MenuRoot = TS.import(script, script, "Menu", "MenuRoot").Menu
|
|
9
|
+
local MenuSeparator = TS.import(script, script, "Menu", "MenuSeparator").MenuSeparator
|
|
10
|
+
local MenuTrigger = TS.import(script, script, "Menu", "MenuTrigger").MenuTrigger
|
|
11
|
+
local Menu = {
|
|
12
|
+
Root = MenuRoot,
|
|
13
|
+
Trigger = MenuTrigger,
|
|
14
|
+
Portal = MenuPortal,
|
|
15
|
+
Content = MenuContent,
|
|
16
|
+
Item = MenuItem,
|
|
17
|
+
Group = MenuGroup,
|
|
18
|
+
Label = MenuLabel,
|
|
19
|
+
Separator = MenuSeparator,
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
Menu = Menu,
|
|
23
|
+
MenuContent = MenuContent,
|
|
24
|
+
MenuGroup = MenuGroup,
|
|
25
|
+
MenuItem = MenuItem,
|
|
26
|
+
MenuLabel = MenuLabel,
|
|
27
|
+
MenuPortal = MenuPortal,
|
|
28
|
+
MenuRoot = MenuRoot,
|
|
29
|
+
MenuSeparator = MenuSeparator,
|
|
30
|
+
MenuTrigger = MenuTrigger,
|
|
31
|
+
}
|
package/package.json
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lattice-ui/menu",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"main": "out/init.luau",
|
|
6
6
|
"types": "out/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"out",
|
|
9
|
+
"README.md"
|
|
10
|
+
],
|
|
7
11
|
"dependencies": {
|
|
8
|
-
"@lattice-ui/core": "0.
|
|
9
|
-
"@lattice-ui/focus": "0.
|
|
10
|
-
"@lattice-ui/layer": "0.
|
|
11
|
-
"@lattice-ui/popper": "0.
|
|
12
|
+
"@lattice-ui/core": "0.3.0",
|
|
13
|
+
"@lattice-ui/focus": "0.3.0",
|
|
14
|
+
"@lattice-ui/layer": "0.3.0",
|
|
15
|
+
"@lattice-ui/popper": "0.3.0"
|
|
12
16
|
},
|
|
13
17
|
"devDependencies": {
|
|
14
18
|
"@rbxts/react": "17.3.7-ts.1",
|
|
@@ -20,7 +24,7 @@
|
|
|
20
24
|
},
|
|
21
25
|
"scripts": {
|
|
22
26
|
"build": "rbxtsc -p tsconfig.json",
|
|
23
|
-
"
|
|
24
|
-
"
|
|
27
|
+
"typecheck": "tsc -p tsconfig.typecheck.json",
|
|
28
|
+
"watch": "rbxtsc -p tsconfig.json -w"
|
|
25
29
|
}
|
|
26
30
|
}
|
package/src/Menu/MenuContent.tsx
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { React, Slot } from "@lattice-ui/core";
|
|
2
|
-
import { RovingFocusGroup } from "@lattice-ui/focus";
|
|
3
|
-
import { DismissableLayer, Presence } from "@lattice-ui/layer";
|
|
4
|
-
import { usePopper } from "@lattice-ui/popper";
|
|
5
|
-
import { useMenuContext } from "./context";
|
|
6
|
-
import type { MenuContentProps } from "./types";
|
|
7
|
-
|
|
8
|
-
type MenuContentImplProps = {
|
|
9
|
-
enabled: boolean;
|
|
10
|
-
visible: boolean;
|
|
11
|
-
onDismiss: () => void;
|
|
12
|
-
loop: boolean;
|
|
13
|
-
asChild?: boolean;
|
|
14
|
-
placement?: MenuContentProps["placement"];
|
|
15
|
-
offset?: MenuContentProps["offset"];
|
|
16
|
-
padding?: MenuContentProps["padding"];
|
|
17
|
-
} & Pick<MenuContentProps, "children" | "onEscapeKeyDown" | "onInteractOutside" | "onPointerDownOutside">;
|
|
18
|
-
|
|
19
|
-
function toGuiObject(instance: Instance | undefined) {
|
|
20
|
-
if (!instance || !instance.IsA("GuiObject")) {
|
|
21
|
-
return undefined;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return instance;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function MenuContentImpl(props: MenuContentImplProps) {
|
|
28
|
-
const menuContext = useMenuContext();
|
|
29
|
-
|
|
30
|
-
const popper = usePopper({
|
|
31
|
-
anchorRef: menuContext.triggerRef,
|
|
32
|
-
contentRef: menuContext.contentRef,
|
|
33
|
-
placement: props.placement,
|
|
34
|
-
offset: props.offset,
|
|
35
|
-
padding: props.padding,
|
|
36
|
-
enabled: props.enabled,
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
const setContentRef = React.useCallback(
|
|
40
|
-
(instance: Instance | undefined) => {
|
|
41
|
-
menuContext.contentRef.current = toGuiObject(instance);
|
|
42
|
-
},
|
|
43
|
-
[menuContext.contentRef],
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
const contentNode = props.asChild ? (
|
|
47
|
-
(() => {
|
|
48
|
-
const child = props.children;
|
|
49
|
-
if (!React.isValidElement(child)) {
|
|
50
|
-
error("[MenuContent] `asChild` requires a child element.");
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return (
|
|
54
|
-
<Slot AnchorPoint={popper.anchorPoint} Position={popper.position} Visible={props.visible} ref={setContentRef}>
|
|
55
|
-
{child}
|
|
56
|
-
</Slot>
|
|
57
|
-
);
|
|
58
|
-
})()
|
|
59
|
-
) : (
|
|
60
|
-
<frame
|
|
61
|
-
AnchorPoint={popper.anchorPoint}
|
|
62
|
-
BackgroundTransparency={1}
|
|
63
|
-
BorderSizePixel={0}
|
|
64
|
-
Position={popper.position}
|
|
65
|
-
Size={UDim2.fromOffset(0, 0)}
|
|
66
|
-
Visible={props.visible}
|
|
67
|
-
ref={setContentRef}
|
|
68
|
-
>
|
|
69
|
-
{props.children}
|
|
70
|
-
</frame>
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
return (
|
|
74
|
-
<DismissableLayer
|
|
75
|
-
enabled={props.enabled}
|
|
76
|
-
modal={menuContext.modal}
|
|
77
|
-
onDismiss={props.onDismiss}
|
|
78
|
-
onEscapeKeyDown={props.onEscapeKeyDown}
|
|
79
|
-
onInteractOutside={props.onInteractOutside}
|
|
80
|
-
onPointerDownOutside={props.onPointerDownOutside}
|
|
81
|
-
>
|
|
82
|
-
<RovingFocusGroup active={props.enabled} autoFocus="first" loop={props.loop} orientation="vertical">
|
|
83
|
-
{contentNode}
|
|
84
|
-
</RovingFocusGroup>
|
|
85
|
-
</DismissableLayer>
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export function MenuContent(props: MenuContentProps) {
|
|
90
|
-
const menuContext = useMenuContext();
|
|
91
|
-
const open = menuContext.open;
|
|
92
|
-
const forceMount = props.forceMount === true;
|
|
93
|
-
const loop = props.loop ?? true;
|
|
94
|
-
|
|
95
|
-
const handleDismiss = React.useCallback(() => {
|
|
96
|
-
menuContext.setOpen(false);
|
|
97
|
-
}, [menuContext.setOpen]);
|
|
98
|
-
|
|
99
|
-
if (!open && !forceMount) {
|
|
100
|
-
return undefined;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (forceMount) {
|
|
104
|
-
return (
|
|
105
|
-
<MenuContentImpl
|
|
106
|
-
asChild={props.asChild}
|
|
107
|
-
enabled={open}
|
|
108
|
-
loop={loop}
|
|
109
|
-
offset={props.offset}
|
|
110
|
-
onDismiss={handleDismiss}
|
|
111
|
-
onEscapeKeyDown={props.onEscapeKeyDown}
|
|
112
|
-
onInteractOutside={props.onInteractOutside}
|
|
113
|
-
onPointerDownOutside={props.onPointerDownOutside}
|
|
114
|
-
padding={props.padding}
|
|
115
|
-
placement={props.placement}
|
|
116
|
-
visible={open}
|
|
117
|
-
>
|
|
118
|
-
{props.children}
|
|
119
|
-
</MenuContentImpl>
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return (
|
|
124
|
-
<Presence
|
|
125
|
-
exitFallbackMs={0}
|
|
126
|
-
present={open}
|
|
127
|
-
render={(state) => (
|
|
128
|
-
<MenuContentImpl
|
|
129
|
-
asChild={props.asChild}
|
|
130
|
-
enabled={state.isPresent}
|
|
131
|
-
loop={loop}
|
|
132
|
-
offset={props.offset}
|
|
133
|
-
onDismiss={handleDismiss}
|
|
134
|
-
onEscapeKeyDown={props.onEscapeKeyDown}
|
|
135
|
-
onInteractOutside={props.onInteractOutside}
|
|
136
|
-
onPointerDownOutside={props.onPointerDownOutside}
|
|
137
|
-
padding={props.padding}
|
|
138
|
-
placement={props.placement}
|
|
139
|
-
visible={state.isPresent}
|
|
140
|
-
>
|
|
141
|
-
{props.children}
|
|
142
|
-
</MenuContentImpl>
|
|
143
|
-
)}
|
|
144
|
-
/>
|
|
145
|
-
);
|
|
146
|
-
}
|
package/src/Menu/MenuGroup.tsx
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { React, Slot } from "@lattice-ui/core";
|
|
2
|
-
import type { MenuGroupProps } from "./types";
|
|
3
|
-
|
|
4
|
-
export function MenuGroup(props: MenuGroupProps) {
|
|
5
|
-
if (props.asChild) {
|
|
6
|
-
const child = props.children;
|
|
7
|
-
if (!child) {
|
|
8
|
-
error("[MenuGroup] `asChild` requires a child element.");
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
return <Slot>{child}</Slot>;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
return (
|
|
15
|
-
<frame BackgroundTransparency={1} Size={UDim2.fromOffset(220, 0)}>
|
|
16
|
-
<uilistlayout
|
|
17
|
-
FillDirection={Enum.FillDirection.Vertical}
|
|
18
|
-
Padding={new UDim(0, 4)}
|
|
19
|
-
SortOrder={Enum.SortOrder.LayoutOrder}
|
|
20
|
-
/>
|
|
21
|
-
{props.children}
|
|
22
|
-
</frame>
|
|
23
|
-
);
|
|
24
|
-
}
|
package/src/Menu/MenuItem.tsx
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { React, Slot } from "@lattice-ui/core";
|
|
2
|
-
import { RovingFocusItem } from "@lattice-ui/focus";
|
|
3
|
-
import { useMenuContext } from "./context";
|
|
4
|
-
import type { MenuItemProps, MenuSelectEvent } from "./types";
|
|
5
|
-
|
|
6
|
-
function createMenuSelectEvent(): MenuSelectEvent {
|
|
7
|
-
const event: MenuSelectEvent = {
|
|
8
|
-
defaultPrevented: false,
|
|
9
|
-
preventDefault: () => {
|
|
10
|
-
event.defaultPrevented = true;
|
|
11
|
-
},
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
return event;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function MenuItem(props: MenuItemProps) {
|
|
18
|
-
const menuContext = useMenuContext();
|
|
19
|
-
|
|
20
|
-
const handleActivated = React.useCallback(() => {
|
|
21
|
-
if (props.disabled) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const event = createMenuSelectEvent();
|
|
26
|
-
props.onSelect?.(event);
|
|
27
|
-
|
|
28
|
-
if (!event.defaultPrevented) {
|
|
29
|
-
menuContext.setOpen(false);
|
|
30
|
-
}
|
|
31
|
-
}, [menuContext, props.disabled, props.onSelect]);
|
|
32
|
-
|
|
33
|
-
if (props.asChild) {
|
|
34
|
-
const child = props.children;
|
|
35
|
-
if (!child) {
|
|
36
|
-
error("[MenuItem] `asChild` requires a child element.");
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return (
|
|
40
|
-
<RovingFocusItem asChild disabled={props.disabled}>
|
|
41
|
-
<Slot
|
|
42
|
-
Active={props.disabled !== true}
|
|
43
|
-
Event={{ Activated: handleActivated }}
|
|
44
|
-
Selectable={props.disabled !== true}
|
|
45
|
-
>
|
|
46
|
-
{child}
|
|
47
|
-
</Slot>
|
|
48
|
-
</RovingFocusItem>
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return (
|
|
53
|
-
<RovingFocusItem asChild disabled={props.disabled}>
|
|
54
|
-
<textbutton
|
|
55
|
-
Active={props.disabled !== true}
|
|
56
|
-
AutoButtonColor={false}
|
|
57
|
-
BackgroundColor3={Color3.fromRGB(47, 53, 68)}
|
|
58
|
-
BorderSizePixel={0}
|
|
59
|
-
Event={{ Activated: handleActivated }}
|
|
60
|
-
Selectable={props.disabled !== true}
|
|
61
|
-
Size={UDim2.fromOffset(220, 34)}
|
|
62
|
-
Text="Menu Item"
|
|
63
|
-
TextColor3={props.disabled ? Color3.fromRGB(135, 142, 156) : Color3.fromRGB(234, 239, 247)}
|
|
64
|
-
TextSize={15}
|
|
65
|
-
TextXAlignment={Enum.TextXAlignment.Left}
|
|
66
|
-
>
|
|
67
|
-
<uipadding PaddingLeft={new UDim(0, 10)} PaddingRight={new UDim(0, 10)} />
|
|
68
|
-
{props.children}
|
|
69
|
-
</textbutton>
|
|
70
|
-
</RovingFocusItem>
|
|
71
|
-
);
|
|
72
|
-
}
|
package/src/Menu/MenuLabel.tsx
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { React, Slot } from "@lattice-ui/core";
|
|
2
|
-
import type { MenuLabelProps } from "./types";
|
|
3
|
-
|
|
4
|
-
export function MenuLabel(props: MenuLabelProps) {
|
|
5
|
-
if (props.asChild) {
|
|
6
|
-
const child = props.children;
|
|
7
|
-
if (!child) {
|
|
8
|
-
error("[MenuLabel] `asChild` requires a child element.");
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
return <Slot>{child}</Slot>;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
return (
|
|
15
|
-
<textlabel
|
|
16
|
-
BackgroundTransparency={1}
|
|
17
|
-
Size={UDim2.fromOffset(220, 24)}
|
|
18
|
-
Text="Label"
|
|
19
|
-
TextColor3={Color3.fromRGB(162, 173, 191)}
|
|
20
|
-
TextSize={14}
|
|
21
|
-
TextXAlignment={Enum.TextXAlignment.Left}
|
|
22
|
-
>
|
|
23
|
-
<uipadding PaddingLeft={new UDim(0, 10)} />
|
|
24
|
-
{props.children}
|
|
25
|
-
</textlabel>
|
|
26
|
-
);
|
|
27
|
-
}
|
package/src/Menu/MenuPortal.tsx
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { React } from "@lattice-ui/core";
|
|
2
|
-
import { Portal, PortalProvider, usePortalContext } from "@lattice-ui/layer";
|
|
3
|
-
import type { MenuPortalProps } from "./types";
|
|
4
|
-
|
|
5
|
-
function MenuPortalWithOverrides(props: MenuPortalProps) {
|
|
6
|
-
const portalContext = usePortalContext();
|
|
7
|
-
const container = props.container ?? portalContext.container;
|
|
8
|
-
const displayOrderBase = props.displayOrderBase ?? portalContext.displayOrderBase;
|
|
9
|
-
|
|
10
|
-
return (
|
|
11
|
-
<PortalProvider container={container} displayOrderBase={displayOrderBase}>
|
|
12
|
-
<Portal>{props.children}</Portal>
|
|
13
|
-
</PortalProvider>
|
|
14
|
-
);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function MenuPortal(props: MenuPortalProps) {
|
|
18
|
-
const hasOverrides = props.container !== undefined || props.displayOrderBase !== undefined;
|
|
19
|
-
if (hasOverrides) {
|
|
20
|
-
return (
|
|
21
|
-
<MenuPortalWithOverrides container={props.container} displayOrderBase={props.displayOrderBase}>
|
|
22
|
-
{props.children}
|
|
23
|
-
</MenuPortalWithOverrides>
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return <Portal>{props.children}</Portal>;
|
|
28
|
-
}
|
package/src/Menu/MenuRoot.tsx
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { React, useControllableState } from "@lattice-ui/core";
|
|
2
|
-
import { MenuContextProvider } from "./context";
|
|
3
|
-
import type { MenuProps } from "./types";
|
|
4
|
-
|
|
5
|
-
export function Menu(props: MenuProps) {
|
|
6
|
-
const [open, setOpenState] = useControllableState<boolean>({
|
|
7
|
-
value: props.open,
|
|
8
|
-
defaultValue: props.defaultOpen ?? false,
|
|
9
|
-
onChange: props.onOpenChange,
|
|
10
|
-
});
|
|
11
|
-
const modal = props.modal ?? true;
|
|
12
|
-
|
|
13
|
-
const triggerRef = React.useRef<GuiObject>();
|
|
14
|
-
const contentRef = React.useRef<GuiObject>();
|
|
15
|
-
|
|
16
|
-
const setOpen = React.useCallback(
|
|
17
|
-
(nextOpen: boolean) => {
|
|
18
|
-
setOpenState(nextOpen);
|
|
19
|
-
},
|
|
20
|
-
[setOpenState],
|
|
21
|
-
);
|
|
22
|
-
|
|
23
|
-
const contextValue = React.useMemo(
|
|
24
|
-
() => ({
|
|
25
|
-
open,
|
|
26
|
-
setOpen,
|
|
27
|
-
modal,
|
|
28
|
-
triggerRef,
|
|
29
|
-
contentRef,
|
|
30
|
-
}),
|
|
31
|
-
[modal, open, setOpen],
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
return <MenuContextProvider value={contextValue}>{props.children}</MenuContextProvider>;
|
|
35
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { React, Slot } from "@lattice-ui/core";
|
|
2
|
-
import type { MenuSeparatorProps } from "./types";
|
|
3
|
-
|
|
4
|
-
export function MenuSeparator(props: MenuSeparatorProps) {
|
|
5
|
-
if (props.asChild) {
|
|
6
|
-
const child = props.children;
|
|
7
|
-
if (!child) {
|
|
8
|
-
error("[MenuSeparator] `asChild` requires a child element.");
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
return <Slot>{child}</Slot>;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
return <frame BackgroundColor3={Color3.fromRGB(72, 79, 97)} BorderSizePixel={0} Size={UDim2.fromOffset(220, 1)} />;
|
|
15
|
-
}
|
package/src/Menu/MenuTrigger.tsx
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { React, Slot } from "@lattice-ui/core";
|
|
2
|
-
import { useMenuContext } from "./context";
|
|
3
|
-
import type { MenuTriggerProps } from "./types";
|
|
4
|
-
|
|
5
|
-
function toGuiObject(instance: Instance | undefined) {
|
|
6
|
-
if (!instance || !instance.IsA("GuiObject")) {
|
|
7
|
-
return undefined;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
return instance;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function MenuTrigger(props: MenuTriggerProps) {
|
|
14
|
-
const menuContext = useMenuContext();
|
|
15
|
-
|
|
16
|
-
const setTriggerRef = React.useCallback(
|
|
17
|
-
(instance: Instance | undefined) => {
|
|
18
|
-
menuContext.triggerRef.current = toGuiObject(instance);
|
|
19
|
-
},
|
|
20
|
-
[menuContext.triggerRef],
|
|
21
|
-
);
|
|
22
|
-
|
|
23
|
-
const handleActivated = React.useCallback(() => {
|
|
24
|
-
if (props.disabled) {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
menuContext.setOpen(!menuContext.open);
|
|
29
|
-
}, [menuContext.open, menuContext.setOpen, props.disabled]);
|
|
30
|
-
|
|
31
|
-
if (props.asChild) {
|
|
32
|
-
const child = props.children;
|
|
33
|
-
if (!child) {
|
|
34
|
-
error("[MenuTrigger] `asChild` requires a child element.");
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return (
|
|
38
|
-
<Slot Event={{ Activated: handleActivated }} ref={setTriggerRef}>
|
|
39
|
-
{child}
|
|
40
|
-
</Slot>
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return (
|
|
45
|
-
<textbutton
|
|
46
|
-
Active={props.disabled !== true}
|
|
47
|
-
AutoButtonColor={false}
|
|
48
|
-
BackgroundTransparency={1}
|
|
49
|
-
BorderSizePixel={0}
|
|
50
|
-
Event={{ Activated: handleActivated }}
|
|
51
|
-
Selectable={props.disabled !== true}
|
|
52
|
-
Size={UDim2.fromOffset(140, 38)}
|
|
53
|
-
Text="Toggle Menu"
|
|
54
|
-
TextColor3={Color3.fromRGB(240, 244, 250)}
|
|
55
|
-
TextSize={16}
|
|
56
|
-
ref={setTriggerRef}
|
|
57
|
-
>
|
|
58
|
-
{props.children}
|
|
59
|
-
</textbutton>
|
|
60
|
-
);
|
|
61
|
-
}
|
package/src/Menu/context.ts
DELETED
package/src/Menu/types.ts
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import type { LayerInteractEvent } from "@lattice-ui/layer";
|
|
2
|
-
import type { PopperPlacement } from "@lattice-ui/popper";
|
|
3
|
-
import type React from "@rbxts/react";
|
|
4
|
-
|
|
5
|
-
export type MenuSetOpen = (open: boolean) => void;
|
|
6
|
-
|
|
7
|
-
export type MenuContextValue = {
|
|
8
|
-
open: boolean;
|
|
9
|
-
setOpen: MenuSetOpen;
|
|
10
|
-
modal: boolean;
|
|
11
|
-
triggerRef: React.MutableRefObject<GuiObject | undefined>;
|
|
12
|
-
contentRef: React.MutableRefObject<GuiObject | undefined>;
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export type MenuProps = {
|
|
16
|
-
open?: boolean;
|
|
17
|
-
defaultOpen?: boolean;
|
|
18
|
-
onOpenChange?: (open: boolean) => void;
|
|
19
|
-
modal?: boolean;
|
|
20
|
-
children?: React.ReactNode;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export type MenuTriggerProps = {
|
|
24
|
-
asChild?: boolean;
|
|
25
|
-
disabled?: boolean;
|
|
26
|
-
children?: React.ReactElement;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export type MenuPortalProps = {
|
|
30
|
-
container?: BasePlayerGui;
|
|
31
|
-
displayOrderBase?: number;
|
|
32
|
-
children?: React.ReactNode;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
export type MenuContentProps = {
|
|
36
|
-
asChild?: boolean;
|
|
37
|
-
forceMount?: boolean;
|
|
38
|
-
placement?: PopperPlacement;
|
|
39
|
-
offset?: Vector2;
|
|
40
|
-
padding?: number;
|
|
41
|
-
loop?: boolean;
|
|
42
|
-
onEscapeKeyDown?: (event: LayerInteractEvent) => void;
|
|
43
|
-
onPointerDownOutside?: (event: LayerInteractEvent) => void;
|
|
44
|
-
onInteractOutside?: (event: LayerInteractEvent) => void;
|
|
45
|
-
children?: React.ReactNode;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
export type MenuSelectEvent = {
|
|
49
|
-
defaultPrevented: boolean;
|
|
50
|
-
preventDefault: () => void;
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
export type MenuItemProps = {
|
|
54
|
-
asChild?: boolean;
|
|
55
|
-
disabled?: boolean;
|
|
56
|
-
onSelect?: (event: MenuSelectEvent) => void;
|
|
57
|
-
children?: React.ReactElement;
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
export type MenuSeparatorProps = {
|
|
61
|
-
asChild?: boolean;
|
|
62
|
-
children?: React.ReactElement;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
export type MenuGroupProps = {
|
|
66
|
-
asChild?: boolean;
|
|
67
|
-
children?: React.ReactElement;
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
export type MenuLabelProps = {
|
|
71
|
-
asChild?: boolean;
|
|
72
|
-
children?: React.ReactElement;
|
|
73
|
-
};
|
package/src/index.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export { MenuContent } from "./Menu/MenuContent";
|
|
2
|
-
export { MenuGroup } from "./Menu/MenuGroup";
|
|
3
|
-
export { MenuItem } from "./Menu/MenuItem";
|
|
4
|
-
export { MenuLabel } from "./Menu/MenuLabel";
|
|
5
|
-
export { MenuPortal } from "./Menu/MenuPortal";
|
|
6
|
-
export { Menu } from "./Menu/MenuRoot";
|
|
7
|
-
export { MenuSeparator } from "./Menu/MenuSeparator";
|
|
8
|
-
export { MenuTrigger } from "./Menu/MenuTrigger";
|
|
9
|
-
export type {
|
|
10
|
-
MenuContentProps,
|
|
11
|
-
MenuGroupProps,
|
|
12
|
-
MenuItemProps,
|
|
13
|
-
MenuLabelProps,
|
|
14
|
-
MenuPortalProps,
|
|
15
|
-
MenuProps,
|
|
16
|
-
MenuSelectEvent,
|
|
17
|
-
MenuSeparatorProps,
|
|
18
|
-
MenuTriggerProps,
|
|
19
|
-
} from "./Menu/types";
|
package/tsconfig.json
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "../../tsconfig.base.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"rootDir": "src",
|
|
5
|
-
"outDir": "out",
|
|
6
|
-
"declaration": true,
|
|
7
|
-
"typeRoots": [
|
|
8
|
-
"./node_modules/@rbxts",
|
|
9
|
-
"../../node_modules/@rbxts",
|
|
10
|
-
"./node_modules/@lattice-ui",
|
|
11
|
-
"../../node_modules/@lattice-ui"
|
|
12
|
-
],
|
|
13
|
-
"types": ["types", "compiler-types"]
|
|
14
|
-
},
|
|
15
|
-
"include": ["src"]
|
|
16
|
-
}
|
package/tsconfig.typecheck.json
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "./tsconfig.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"noEmit": true,
|
|
5
|
-
"baseUrl": "..",
|
|
6
|
-
"rootDir": "..",
|
|
7
|
-
"paths": {
|
|
8
|
-
"@lattice-ui/checkbox": ["checkbox/src/index.ts"],
|
|
9
|
-
"@lattice-ui/core": ["core/src/index.ts"],
|
|
10
|
-
"@lattice-ui/dialog": ["dialog/src/index.ts"],
|
|
11
|
-
"@lattice-ui/focus": ["focus/src/index.ts"],
|
|
12
|
-
"@lattice-ui/layer": ["layer/src/index.ts"],
|
|
13
|
-
"@lattice-ui/menu": ["menu/src/index.ts"],
|
|
14
|
-
"@lattice-ui/popover": ["popover/src/index.ts"],
|
|
15
|
-
"@lattice-ui/popper": ["popper/src/index.ts"],
|
|
16
|
-
"@lattice-ui/radio-group": ["radio-group/src/index.ts"],
|
|
17
|
-
"@lattice-ui/style": ["style/src/index.ts"],
|
|
18
|
-
"@lattice-ui/switch": ["switch/src/index.ts"],
|
|
19
|
-
"@lattice-ui/system": ["system/src/index.ts"],
|
|
20
|
-
"@lattice-ui/tabs": ["tabs/src/index.ts"],
|
|
21
|
-
"@lattice-ui/toggle-group": ["toggle-group/src/index.ts"],
|
|
22
|
-
"@lattice-ui/tooltip": ["tooltip/src/index.ts"]
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|