@nori-ui/core 1.2.0 → 1.4.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/dist/chunk-2PESUXE3.js +3 -0
- package/dist/chunk-2PESUXE3.js.map +1 -0
- package/dist/{chunk-WDNDTSNX.js → chunk-4I37QSEM.js} +3 -3
- package/dist/{chunk-WDNDTSNX.js.map → chunk-4I37QSEM.js.map} +1 -1
- package/dist/chunk-BNDUQNG7.js +443 -0
- package/dist/chunk-BNDUQNG7.js.map +1 -0
- package/dist/chunk-H7MFAFV4.js +303 -0
- package/dist/chunk-H7MFAFV4.js.map +1 -0
- package/dist/chunk-KCLWPSV5.js +134 -0
- package/dist/chunk-KCLWPSV5.js.map +1 -0
- package/dist/{chunk-7D2BHQ6M.js → chunk-L5X4SYJ4.js} +3 -3
- package/dist/chunk-L5X4SYJ4.js.map +1 -0
- package/dist/{chunk-XBNVKPJN.js → chunk-XXBN6CIK.js} +3 -3
- package/dist/{chunk-XBNVKPJN.js.map → chunk-XXBN6CIK.js.map} +1 -1
- package/dist/chunk-ZPUYNM37.js +3 -0
- package/dist/chunk-ZPUYNM37.js.map +1 -0
- package/dist/client.cjs +879 -21
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +4 -1
- package/dist/client.d.ts +4 -1
- package/dist/client.js +18 -13
- package/dist/client.js.map +1 -1
- package/dist/components/Breadcrumb/index.cjs.map +1 -1
- package/dist/components/Breadcrumb/index.js +3 -2
- package/dist/components/ContextMenu/index.cjs +1150 -0
- package/dist/components/ContextMenu/index.cjs.map +1 -0
- package/dist/components/ContextMenu/index.d.cts +38 -0
- package/dist/components/ContextMenu/index.d.ts +38 -0
- package/dist/components/ContextMenu/index.js +10 -0
- package/dist/components/ContextMenu/index.js.map +1 -0
- package/dist/components/DatePicker/index.cjs.map +1 -1
- package/dist/components/DatePicker/index.js +3 -2
- package/dist/components/DropdownMenu/index.cjs +1032 -0
- package/dist/components/DropdownMenu/index.cjs.map +1 -0
- package/dist/components/DropdownMenu/index.d.cts +97 -0
- package/dist/components/DropdownMenu/index.d.ts +97 -0
- package/dist/components/DropdownMenu/index.js +10 -0
- package/dist/components/DropdownMenu/index.js.map +1 -0
- package/dist/components/Popover/index.cjs +1 -0
- package/dist/components/Popover/index.cjs.map +1 -1
- package/dist/components/Popover/index.d.cts +22 -1
- package/dist/components/Popover/index.d.ts +22 -1
- package/dist/components/Popover/index.js +2 -1
- package/dist/components/Sheet/index.cjs +855 -0
- package/dist/components/Sheet/index.cjs.map +1 -0
- package/dist/components/Sheet/index.d.cts +104 -0
- package/dist/components/Sheet/index.d.ts +104 -0
- package/dist/components/Sheet/index.js +8 -0
- package/dist/components/Sheet/index.js.map +1 -0
- package/dist/index.cjs +879 -21
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +18 -13
- package/package.json +1 -1
- package/dist/chunk-7D2BHQ6M.js.map +0 -1
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { Popover, usePopoverContext } from './chunk-L5X4SYJ4.js';
|
|
2
|
+
import { Slot } from './chunk-ZIBNLXIV.js';
|
|
3
|
+
import { cn } from './chunk-CHXHRJNZ.js';
|
|
4
|
+
import { px } from './chunk-5A2QOOVN.js';
|
|
5
|
+
import { useThemeColors } from './chunk-R5JMDDCB.js';
|
|
6
|
+
import { __name } from './chunk-WCQVDF3K.js';
|
|
7
|
+
import { createContext, useContext, useRef, useEffect, useCallback, useState, isValidElement } from 'react';
|
|
8
|
+
import { Platform, View, Pressable, Text } from 'react-native';
|
|
9
|
+
import { jsx, jsxs } from 'nativewind/jsx-runtime';
|
|
10
|
+
|
|
11
|
+
var MenuContext = createContext(null);
|
|
12
|
+
var MenuContextProvider = /* @__PURE__ */ __name(({
|
|
13
|
+
open,
|
|
14
|
+
toggle,
|
|
15
|
+
close,
|
|
16
|
+
children
|
|
17
|
+
}) => /* @__PURE__ */ jsx(MenuContext.Provider, { value: { open, toggle: toggle ?? close, close }, children }), "MenuContextProvider");
|
|
18
|
+
function useMenuContext(caller) {
|
|
19
|
+
const ctx = useContext(MenuContext);
|
|
20
|
+
if (!ctx) {
|
|
21
|
+
throw new Error(`<${caller}> must be rendered inside a <DropdownMenu> or <ContextMenu>.`);
|
|
22
|
+
}
|
|
23
|
+
return ctx;
|
|
24
|
+
}
|
|
25
|
+
__name(useMenuContext, "useMenuContext");
|
|
26
|
+
var MenuContent = /* @__PURE__ */ __name(({
|
|
27
|
+
children,
|
|
28
|
+
className,
|
|
29
|
+
testID,
|
|
30
|
+
side = "bottom",
|
|
31
|
+
align = "start",
|
|
32
|
+
"aria-label": ariaLabel
|
|
33
|
+
}) => {
|
|
34
|
+
const colors = useThemeColors();
|
|
35
|
+
const containerRef = useRef(null);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
if (Platform.OS !== "web") {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (typeof document === "undefined") {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const container = containerRef.current;
|
|
44
|
+
if (!container) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const getItems = /* @__PURE__ */ __name(() => Array.from(container.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])')), "getItems");
|
|
48
|
+
const onKeyDown = /* @__PURE__ */ __name((e) => {
|
|
49
|
+
const items = getItems();
|
|
50
|
+
if (items.length === 0) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const focused = document.activeElement;
|
|
54
|
+
const idx = focused ? items.indexOf(focused) : -1;
|
|
55
|
+
switch (e.key) {
|
|
56
|
+
case "ArrowDown":
|
|
57
|
+
e.preventDefault();
|
|
58
|
+
items[idx < items.length - 1 ? idx + 1 : 0]?.focus();
|
|
59
|
+
break;
|
|
60
|
+
case "ArrowUp":
|
|
61
|
+
e.preventDefault();
|
|
62
|
+
items[idx > 0 ? idx - 1 : items.length - 1]?.focus();
|
|
63
|
+
break;
|
|
64
|
+
case "Home":
|
|
65
|
+
e.preventDefault();
|
|
66
|
+
items[0]?.focus();
|
|
67
|
+
break;
|
|
68
|
+
case "End":
|
|
69
|
+
e.preventDefault();
|
|
70
|
+
items[items.length - 1]?.focus();
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}, "onKeyDown");
|
|
74
|
+
container.addEventListener("keydown", onKeyDown);
|
|
75
|
+
return () => container.removeEventListener("keydown", onKeyDown);
|
|
76
|
+
});
|
|
77
|
+
return /* @__PURE__ */ jsx(
|
|
78
|
+
Popover.Content,
|
|
79
|
+
{
|
|
80
|
+
side,
|
|
81
|
+
align,
|
|
82
|
+
...testID !== void 0 ? { testID } : {},
|
|
83
|
+
...ariaLabel !== void 0 ? { "aria-label": ariaLabel } : {},
|
|
84
|
+
...className !== void 0 ? { className } : {},
|
|
85
|
+
children: /* @__PURE__ */ jsx(
|
|
86
|
+
View,
|
|
87
|
+
{
|
|
88
|
+
ref: containerRef,
|
|
89
|
+
...{
|
|
90
|
+
role: "menu",
|
|
91
|
+
...ariaLabel !== void 0 ? { "aria-label": ariaLabel } : {}
|
|
92
|
+
},
|
|
93
|
+
style: {
|
|
94
|
+
minWidth: 160,
|
|
95
|
+
paddingVertical: px(colors.spacing["1"]),
|
|
96
|
+
margin: -px(colors.spacing["4"]),
|
|
97
|
+
borderRadius: px(colors.radius.lg),
|
|
98
|
+
overflow: "hidden"
|
|
99
|
+
},
|
|
100
|
+
children
|
|
101
|
+
}
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
}, "MenuContent");
|
|
106
|
+
MenuContent.displayName = "MenuContent";
|
|
107
|
+
var MenuItem = /* @__PURE__ */ __name(({
|
|
108
|
+
onSelect,
|
|
109
|
+
disabled = false,
|
|
110
|
+
destructive = false,
|
|
111
|
+
icon,
|
|
112
|
+
shortcut,
|
|
113
|
+
children,
|
|
114
|
+
className,
|
|
115
|
+
testID
|
|
116
|
+
}) => {
|
|
117
|
+
const colors = useThemeColors();
|
|
118
|
+
const menu = useMenuContext("MenuItem");
|
|
119
|
+
const handlePress = useCallback(() => {
|
|
120
|
+
if (disabled) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
onSelect?.();
|
|
124
|
+
menu.close();
|
|
125
|
+
}, [disabled, onSelect, menu]);
|
|
126
|
+
const textColor = destructive ? colors.color.danger : disabled ? colors.semantic.text.muted : colors.semantic.text.default;
|
|
127
|
+
return /* @__PURE__ */ jsxs(
|
|
128
|
+
Pressable,
|
|
129
|
+
{
|
|
130
|
+
onPress: handlePress,
|
|
131
|
+
disabled,
|
|
132
|
+
...{
|
|
133
|
+
role: "menuitem",
|
|
134
|
+
"aria-disabled": disabled ? "true" : void 0,
|
|
135
|
+
tabIndex: disabled ? -1 : 0,
|
|
136
|
+
onKeyDown: /* @__PURE__ */ __name((e) => {
|
|
137
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
138
|
+
e.preventDefault();
|
|
139
|
+
handlePress();
|
|
140
|
+
}
|
|
141
|
+
}, "onKeyDown")
|
|
142
|
+
},
|
|
143
|
+
...testID !== void 0 ? { testID } : {},
|
|
144
|
+
className: cn("flex-row items-center gap-2 px-3 py-2", className),
|
|
145
|
+
style: { opacity: disabled ? 0.4 : 1 },
|
|
146
|
+
accessibilityRole: "menuitem",
|
|
147
|
+
accessibilityState: { disabled },
|
|
148
|
+
children: [
|
|
149
|
+
icon !== void 0 && /* @__PURE__ */ jsx(View, { style: { width: 16, height: 16, alignItems: "center", justifyContent: "center" }, children: icon }),
|
|
150
|
+
/* @__PURE__ */ jsx(
|
|
151
|
+
Text,
|
|
152
|
+
{
|
|
153
|
+
style: {
|
|
154
|
+
flex: 1,
|
|
155
|
+
fontFamily: colors.fontFamily.body,
|
|
156
|
+
fontSize: px(colors.fontSize.sm),
|
|
157
|
+
color: textColor
|
|
158
|
+
},
|
|
159
|
+
children
|
|
160
|
+
}
|
|
161
|
+
),
|
|
162
|
+
shortcut !== void 0 && Platform.OS === "web" && /* @__PURE__ */ jsx(
|
|
163
|
+
Text,
|
|
164
|
+
{
|
|
165
|
+
...{ "aria-hidden": "true" },
|
|
166
|
+
style: {
|
|
167
|
+
fontFamily: colors.fontFamily.body,
|
|
168
|
+
fontSize: px(colors.fontSize.xs),
|
|
169
|
+
color: colors.semantic.text.muted
|
|
170
|
+
},
|
|
171
|
+
children: shortcut
|
|
172
|
+
}
|
|
173
|
+
)
|
|
174
|
+
]
|
|
175
|
+
}
|
|
176
|
+
);
|
|
177
|
+
}, "MenuItem");
|
|
178
|
+
MenuItem.displayName = "MenuItem";
|
|
179
|
+
var MenuSeparator = /* @__PURE__ */ __name(({ className, testID }) => {
|
|
180
|
+
const colors = useThemeColors();
|
|
181
|
+
return /* @__PURE__ */ jsx(
|
|
182
|
+
View,
|
|
183
|
+
{
|
|
184
|
+
...{ role: "separator" },
|
|
185
|
+
accessibilityRole: "none",
|
|
186
|
+
...testID !== void 0 ? { testID } : {},
|
|
187
|
+
className: cn("mx-1 my-1", className),
|
|
188
|
+
style: {
|
|
189
|
+
height: 1,
|
|
190
|
+
marginVertical: 4,
|
|
191
|
+
marginHorizontal: 4,
|
|
192
|
+
backgroundColor: colors.semantic.border.default
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
);
|
|
196
|
+
}, "MenuSeparator");
|
|
197
|
+
MenuSeparator.displayName = "MenuSeparator";
|
|
198
|
+
var MenuLabel = /* @__PURE__ */ __name(({ children, className, testID }) => {
|
|
199
|
+
const colors = useThemeColors();
|
|
200
|
+
return /* @__PURE__ */ jsx(
|
|
201
|
+
View,
|
|
202
|
+
{
|
|
203
|
+
...{ role: "presentation" },
|
|
204
|
+
...testID !== void 0 ? { testID } : {},
|
|
205
|
+
className: cn("px-3 pt-2 pb-1", className),
|
|
206
|
+
children: /* @__PURE__ */ jsx(
|
|
207
|
+
Text,
|
|
208
|
+
{
|
|
209
|
+
style: {
|
|
210
|
+
fontFamily: colors.fontFamily.body,
|
|
211
|
+
fontSize: px(colors.fontSize.xs),
|
|
212
|
+
color: colors.semantic.text.muted,
|
|
213
|
+
textTransform: "uppercase",
|
|
214
|
+
letterSpacing: 0.6,
|
|
215
|
+
fontWeight: "600"
|
|
216
|
+
},
|
|
217
|
+
children
|
|
218
|
+
}
|
|
219
|
+
)
|
|
220
|
+
}
|
|
221
|
+
);
|
|
222
|
+
}, "MenuLabel");
|
|
223
|
+
MenuLabel.displayName = "MenuLabel";
|
|
224
|
+
var DropdownMenuRoot = /* @__PURE__ */ __name(({ open, defaultOpen = false, onOpenChange, children }) => {
|
|
225
|
+
const [inner, setInner] = useState(defaultOpen);
|
|
226
|
+
const isControlled = open !== void 0;
|
|
227
|
+
const current = isControlled ? open : inner;
|
|
228
|
+
const setOpen = useCallback(
|
|
229
|
+
(next) => {
|
|
230
|
+
if (!isControlled) {
|
|
231
|
+
setInner(next);
|
|
232
|
+
}
|
|
233
|
+
onOpenChange?.(next);
|
|
234
|
+
},
|
|
235
|
+
[isControlled, onOpenChange]
|
|
236
|
+
);
|
|
237
|
+
const toggle = useCallback(() => setOpen(!current), [setOpen, current]);
|
|
238
|
+
const close = useCallback(() => setOpen(false), [setOpen]);
|
|
239
|
+
return /* @__PURE__ */ jsx(MenuContextProvider, { open: current, toggle, close, children: /* @__PURE__ */ jsx(Popover, { open: current, onOpenChange: setOpen, children }) });
|
|
240
|
+
}, "DropdownMenuRoot");
|
|
241
|
+
var DropdownMenuTrigger = /* @__PURE__ */ __name(({ children, className, testID }) => {
|
|
242
|
+
const menu = useMenuContext("DropdownMenu.Trigger");
|
|
243
|
+
const popover = usePopoverContext("DropdownMenu.Trigger");
|
|
244
|
+
const onPress = useCallback(() => {
|
|
245
|
+
popover.measureTrigger();
|
|
246
|
+
popover.setOpen(!popover.open);
|
|
247
|
+
}, [popover]);
|
|
248
|
+
if (isValidElement(children)) {
|
|
249
|
+
const child = children;
|
|
250
|
+
const fire = /* @__PURE__ */ __name((existing) => (event) => {
|
|
251
|
+
existing?.(event);
|
|
252
|
+
popover.measureTrigger();
|
|
253
|
+
popover.setOpen(!popover.open);
|
|
254
|
+
}, "fire");
|
|
255
|
+
return /* @__PURE__ */ jsx(
|
|
256
|
+
Slot,
|
|
257
|
+
{
|
|
258
|
+
ref: (node) => {
|
|
259
|
+
popover.triggerRef.current = node;
|
|
260
|
+
},
|
|
261
|
+
onClick: fire(child.props.onClick),
|
|
262
|
+
onPress: fire(child.props.onPress),
|
|
263
|
+
...{
|
|
264
|
+
"aria-haspopup": "menu",
|
|
265
|
+
"aria-expanded": menu.open,
|
|
266
|
+
"aria-controls": popover.contentId
|
|
267
|
+
},
|
|
268
|
+
...testID !== void 0 ? { "data-testid": testID } : {},
|
|
269
|
+
...className !== void 0 ? { className } : {},
|
|
270
|
+
children: child
|
|
271
|
+
}
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
return /* @__PURE__ */ jsx(
|
|
275
|
+
Pressable,
|
|
276
|
+
{
|
|
277
|
+
ref: (node) => {
|
|
278
|
+
popover.triggerRef.current = node;
|
|
279
|
+
},
|
|
280
|
+
onPress,
|
|
281
|
+
...{
|
|
282
|
+
"aria-haspopup": "menu",
|
|
283
|
+
"aria-expanded": menu.open,
|
|
284
|
+
"aria-controls": popover.contentId
|
|
285
|
+
},
|
|
286
|
+
...testID !== void 0 ? { testID } : {},
|
|
287
|
+
...className !== void 0 ? { className } : {},
|
|
288
|
+
children: typeof children === "string" || typeof children === "number" ? /* @__PURE__ */ jsx(Text, { children }) : children
|
|
289
|
+
}
|
|
290
|
+
);
|
|
291
|
+
}, "DropdownMenuTrigger");
|
|
292
|
+
var DropdownMenuContent = /* @__PURE__ */ __name((props) => /* @__PURE__ */ jsx(MenuContent, { ...props }), "DropdownMenuContent");
|
|
293
|
+
var DropdownMenu = Object.assign(DropdownMenuRoot, {
|
|
294
|
+
Trigger: DropdownMenuTrigger,
|
|
295
|
+
Content: DropdownMenuContent,
|
|
296
|
+
Item: MenuItem,
|
|
297
|
+
Separator: MenuSeparator,
|
|
298
|
+
Label: MenuLabel
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
export { DropdownMenu, MenuContent, MenuContextProvider, MenuItem, MenuLabel, MenuSeparator };
|
|
302
|
+
//# sourceMappingURL=chunk-H7MFAFV4.js.map
|
|
303
|
+
//# sourceMappingURL=chunk-H7MFAFV4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/DropdownMenu/DropdownMenu.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-H7MFAFV4.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { Platform, Pressable, Text as RNText, View } from 'react-native';\nimport { Slot } from '../../slot';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\nimport { Popover, usePopoverContext } from '../Popover/Popover';\n\n// ---------------------------------------------------------------------------\n// Internal menu context — carries open state + toggle/close for sub-components\n// ---------------------------------------------------------------------------\n\ntype MenuContextValue = {\n open: boolean;\n toggle: () => void;\n close: () => void;\n};\n\nconst MenuContext = createContext<MenuContextValue | null>(null);\n\n/**\n * @internal — provides MenuContext; exported so ContextMenu can reuse it\n * without re-implementing the provider.\n */\nexport const MenuContextProvider = ({\n open,\n toggle,\n close,\n children,\n}: {\n open: boolean;\n /** Optional — DropdownMenu passes it; ContextMenu items only need close. */\n toggle?: () => void;\n close: () => void;\n children: ReactNode;\n}) => <MenuContext.Provider value={{ open, toggle: toggle ?? close, close }}>{children}</MenuContext.Provider>;\n\n/** @internal */\nexport function useMenuContext(caller: string): MenuContextValue {\n const ctx = useContext(MenuContext);\n if (!ctx) {\n throw new Error(`<${caller}> must be rendered inside a <DropdownMenu> or <ContextMenu>.`);\n }\n return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// Shared menu surface sub-components\n// ---------------------------------------------------------------------------\n\nexport type MenuContentProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n side?: 'top' | 'right' | 'bottom' | 'left';\n align?: 'start' | 'center' | 'end';\n 'aria-label'?: string;\n};\n\n/**\n * The floating menu surface. Wraps `Popover.Content` and applies\n * `role=\"menu\"` so assistive tech announces the list of items.\n *\n * Web keyboard navigation:\n * - ArrowDown / ArrowUp — cycle focus between enabled items.\n * - Home / End — jump to first / last enabled item.\n * - Escape — closes the menu (handled by Popover.Content already).\n * - Enter / Space — activates the focused item.\n */\nexport const MenuContent = ({\n children,\n className,\n testID,\n side = 'bottom',\n align = 'start',\n 'aria-label': ariaLabel,\n}: MenuContentProps) => {\n const colors = useThemeColors();\n const containerRef = useRef<View | null>(null);\n\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n if (typeof document === 'undefined') {\n return;\n }\n\n const container = containerRef.current as unknown as HTMLElement | null;\n if (!container) {\n return;\n }\n\n const getItems = (): HTMLElement[] =>\n Array.from(container.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled=\"true\"])'));\n\n const onKeyDown = (e: KeyboardEvent) => {\n const items = getItems();\n if (items.length === 0) {\n return;\n }\n const focused = document.activeElement as HTMLElement | null;\n const idx = focused ? items.indexOf(focused) : -1;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n items[idx < items.length - 1 ? idx + 1 : 0]?.focus();\n break;\n case 'ArrowUp':\n e.preventDefault();\n items[idx > 0 ? idx - 1 : items.length - 1]?.focus();\n break;\n case 'Home':\n e.preventDefault();\n items[0]?.focus();\n break;\n case 'End':\n e.preventDefault();\n items[items.length - 1]?.focus();\n break;\n default:\n break;\n }\n };\n\n container.addEventListener('keydown', onKeyDown);\n return () => container.removeEventListener('keydown', onKeyDown);\n });\n\n return (\n <Popover.Content\n side={side}\n align={align}\n {...(testID !== undefined ? { testID } : {})}\n {...(ariaLabel !== undefined ? { 'aria-label': ariaLabel } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n <View\n ref={containerRef}\n {...({\n role: 'menu',\n ...(ariaLabel !== undefined ? { 'aria-label': ariaLabel } : {}),\n } as Record<string, unknown>)}\n style={{\n minWidth: 160,\n paddingVertical: px(colors.spacing['1']),\n margin: -px(colors.spacing['4']),\n borderRadius: px(colors.radius.lg),\n overflow: 'hidden',\n }}\n >\n {children}\n </View>\n </Popover.Content>\n );\n};\nMenuContent.displayName = 'MenuContent';\n\n// ---- MenuItem --------------------------------------------------------------\n\nexport type MenuItemProps = {\n /** Fired when the item is selected. Also closes the menu. */\n onSelect?: () => void;\n /** Prevents interaction and dims the item visually. */\n disabled?: boolean;\n /** Renders the item in a danger/destructive tone. */\n destructive?: boolean;\n /** Leading icon node. */\n icon?: ReactNode;\n /**\n * Keyboard shortcut hint shown on the trailing edge.\n * Purely presentational — web only, no function key binding.\n */\n shortcut?: string;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nexport const MenuItem = ({\n onSelect,\n disabled = false,\n destructive = false,\n icon,\n shortcut,\n children,\n className,\n testID,\n}: MenuItemProps) => {\n const colors = useThemeColors();\n const menu = useMenuContext('MenuItem');\n\n const handlePress = useCallback(() => {\n if (disabled) {\n return;\n }\n onSelect?.();\n menu.close();\n }, [disabled, onSelect, menu]);\n\n const textColor = destructive\n ? colors.color.danger\n : disabled\n ? colors.semantic.text.muted\n : colors.semantic.text.default;\n\n return (\n <Pressable\n onPress={handlePress}\n disabled={disabled}\n {...({\n role: 'menuitem',\n 'aria-disabled': disabled ? 'true' : undefined,\n tabIndex: disabled ? -1 : 0,\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handlePress();\n }\n },\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex-row items-center gap-2 px-3 py-2', className)}\n style={{ opacity: disabled ? 0.4 : 1 }}\n accessibilityRole=\"menuitem\"\n accessibilityState={{ disabled }}\n >\n {icon !== undefined && (\n <View style={{ width: 16, height: 16, alignItems: 'center', justifyContent: 'center' }}>{icon}</View>\n )}\n <RNText\n style={{\n flex: 1,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: textColor,\n }}\n >\n {children}\n </RNText>\n {shortcut !== undefined && Platform.OS === 'web' && (\n <RNText\n {...({ 'aria-hidden': 'true' } as Record<string, unknown>)}\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.xs),\n color: colors.semantic.text.muted,\n }}\n >\n {shortcut}\n </RNText>\n )}\n </Pressable>\n );\n};\nMenuItem.displayName = 'MenuItem';\n\n// ---- MenuSeparator ---------------------------------------------------------\n\nexport type MenuSeparatorProps = {\n className?: string;\n testID?: string;\n};\n\nexport const MenuSeparator = ({ className, testID }: MenuSeparatorProps) => {\n const colors = useThemeColors();\n return (\n <View\n {...({ role: 'separator' } as Record<string, unknown>)}\n accessibilityRole=\"none\"\n {...(testID !== undefined ? { testID } : {})}\n className={cn('mx-1 my-1', className)}\n style={{\n height: 1,\n marginVertical: 4,\n marginHorizontal: 4,\n backgroundColor: colors.semantic.border.default,\n }}\n />\n );\n};\nMenuSeparator.displayName = 'MenuSeparator';\n\n// ---- MenuLabel -------------------------------------------------------------\n\nexport type MenuLabelProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nexport const MenuLabel = ({ children, className, testID }: MenuLabelProps) => {\n const colors = useThemeColors();\n return (\n <View\n {...({ role: 'presentation' } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n className={cn('px-3 pt-2 pb-1', className)}\n >\n <RNText\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.xs),\n color: colors.semantic.text.muted,\n textTransform: 'uppercase',\n letterSpacing: 0.6,\n fontWeight: '600',\n }}\n >\n {children}\n </RNText>\n </View>\n );\n};\nMenuLabel.displayName = 'MenuLabel';\n\n// ---------------------------------------------------------------------------\n// DropdownMenu root\n// ---------------------------------------------------------------------------\n\nexport type DropdownMenuProps = {\n /** Controlled open state. */\n open?: boolean;\n /** Initial open state (uncontrolled). @defaultValue false */\n defaultOpen?: boolean;\n /** Fires with the new open state. */\n onOpenChange?: (open: boolean) => void;\n children?: ReactNode;\n};\n\n/**\n * Click-triggered dropdown menu.\n *\n * Compound parts:\n * - `DropdownMenu.Trigger` — wraps any element; click opens the menu.\n * - `DropdownMenu.Content` — the floating menu surface.\n * - `DropdownMenu.Item` — interactive menu item.\n * - `DropdownMenu.Separator` — visual divider.\n * - `DropdownMenu.Label` — non-interactive section heading.\n *\n * ```tsx\n * <DropdownMenu>\n * <DropdownMenu.Trigger>\n * <Button>Options</Button>\n * </DropdownMenu.Trigger>\n * <DropdownMenu.Content>\n * <DropdownMenu.Item onSelect={() => console.log('edit')}>Edit</DropdownMenu.Item>\n * <DropdownMenu.Separator />\n * <DropdownMenu.Item destructive onSelect={() => console.log('delete')}>Delete</DropdownMenu.Item>\n * </DropdownMenu.Content>\n * </DropdownMenu>\n * ```\n */\nconst DropdownMenuRoot = ({ open, defaultOpen = false, onOpenChange, children }: DropdownMenuProps) => {\n const [inner, setInner] = useState<boolean>(defaultOpen);\n const isControlled = open !== undefined;\n const current = isControlled ? open : inner;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInner(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const toggle = useCallback(() => setOpen(!current), [setOpen, current]);\n const close = useCallback(() => setOpen(false), [setOpen]);\n\n return (\n <MenuContextProvider open={current} toggle={toggle} close={close}>\n <Popover open={current} onOpenChange={setOpen}>\n {children}\n </Popover>\n </MenuContextProvider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Trigger\n// ---------------------------------------------------------------------------\n\nexport type DropdownMenuTriggerProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Element that toggles the dropdown menu on click/press. Uses asChild by\n * default — the wrapped child becomes the trigger. Gets `aria-haspopup=\"menu\"`\n * and `aria-expanded`.\n *\n * Internally uses the Popover context to measure the trigger rect (needed for\n * positioning) and set the triggerRef — same as PopoverTrigger, but with\n * `aria-haspopup=\"menu\"` instead of `\"dialog\"`.\n */\nconst DropdownMenuTrigger = ({ children, className, testID }: DropdownMenuTriggerProps) => {\n const menu = useMenuContext('DropdownMenu.Trigger');\n const popover = usePopoverContext('DropdownMenu.Trigger');\n\n const onPress = useCallback(() => {\n popover.measureTrigger();\n popover.setOpen(!popover.open);\n }, [popover]);\n\n if (isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n const fire = (existing: ((e: unknown) => void) | undefined) => (event: unknown) => {\n existing?.(event);\n popover.measureTrigger();\n popover.setOpen(!popover.open);\n };\n\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n popover.triggerRef.current = node;\n }}\n onClick={fire(child.props.onClick as ((e: unknown) => void) | undefined)}\n onPress={fire(child.props.onPress as ((e: unknown) => void) | undefined)}\n {...({\n 'aria-haspopup': 'menu',\n 'aria-expanded': menu.open,\n 'aria-controls': popover.contentId,\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { 'data-testid': testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {child}\n </Slot>\n );\n }\n\n return (\n <Pressable\n ref={(node) => {\n popover.triggerRef.current = node as unknown as HTMLElement | null;\n }}\n onPress={onPress}\n {...({\n 'aria-haspopup': 'menu',\n 'aria-expanded': menu.open,\n 'aria-controls': popover.contentId,\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {typeof children === 'string' || typeof children === 'number' ? <RNText>{children}</RNText> : children}\n </Pressable>\n );\n};\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Content\n// ---------------------------------------------------------------------------\n\nexport type DropdownMenuContentProps = MenuContentProps;\n\nconst DropdownMenuContent = (props: DropdownMenuContentProps) => <MenuContent {...props} />;\n\n// ---------------------------------------------------------------------------\n// Public compound export\n// ---------------------------------------------------------------------------\n\nexport const DropdownMenu = Object.assign(DropdownMenuRoot, {\n Trigger: DropdownMenuTrigger,\n Content: DropdownMenuContent,\n Item: MenuItem,\n Separator: MenuSeparator,\n Label: MenuLabel,\n});\n"]}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { MenuLabel, MenuSeparator, MenuItem, MenuContextProvider, MenuContent } from './chunk-H7MFAFV4.js';
|
|
2
|
+
import { Popover, usePopoverContext } from './chunk-L5X4SYJ4.js';
|
|
3
|
+
import { Slot } from './chunk-ZIBNLXIV.js';
|
|
4
|
+
import { __name } from './chunk-WCQVDF3K.js';
|
|
5
|
+
import { createContext, useState, useCallback, isValidElement, useContext } from 'react';
|
|
6
|
+
import { Platform, Pressable, Text } from 'react-native';
|
|
7
|
+
import { jsx } from 'nativewind/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
var ContextMenuCtx = createContext(null);
|
|
10
|
+
var useContextMenuCtx = /* @__PURE__ */ __name(() => {
|
|
11
|
+
const ctx = useContext(ContextMenuCtx);
|
|
12
|
+
if (!ctx) {
|
|
13
|
+
throw new Error("ContextMenu compound parts must be rendered inside a <ContextMenu>.");
|
|
14
|
+
}
|
|
15
|
+
return ctx;
|
|
16
|
+
}, "useContextMenuCtx");
|
|
17
|
+
var ContextMenuRoot = /* @__PURE__ */ __name(({ open, defaultOpen = false, onOpenChange, children }) => {
|
|
18
|
+
const [inner, setInner] = useState(defaultOpen);
|
|
19
|
+
const isControlled = open !== void 0;
|
|
20
|
+
const current = isControlled ? open : inner;
|
|
21
|
+
const setOpen = useCallback(
|
|
22
|
+
(next) => {
|
|
23
|
+
if (!isControlled) {
|
|
24
|
+
setInner(next);
|
|
25
|
+
}
|
|
26
|
+
onOpenChange?.(next);
|
|
27
|
+
},
|
|
28
|
+
[isControlled, onOpenChange]
|
|
29
|
+
);
|
|
30
|
+
return /* @__PURE__ */ jsx(ContextMenuCtx.Provider, { value: { open: current, setOpen }, children: /* @__PURE__ */ jsx(Popover, { open: current, onOpenChange: setOpen, children }) });
|
|
31
|
+
}, "ContextMenuRoot");
|
|
32
|
+
var ContextMenuTrigger = /* @__PURE__ */ __name(({ children, className, testID }) => {
|
|
33
|
+
const ctx = useContextMenuCtx();
|
|
34
|
+
const popover = usePopoverContext("ContextMenu.Trigger");
|
|
35
|
+
const openMenu = useCallback(() => {
|
|
36
|
+
popover.measureTrigger();
|
|
37
|
+
ctx.setOpen(true);
|
|
38
|
+
}, [ctx, popover]);
|
|
39
|
+
if (Platform.OS === "web") {
|
|
40
|
+
if (isValidElement(children)) {
|
|
41
|
+
const child = children;
|
|
42
|
+
const existing = child.props.onContextMenu;
|
|
43
|
+
return /* @__PURE__ */ jsx(
|
|
44
|
+
Slot,
|
|
45
|
+
{
|
|
46
|
+
ref: (node) => {
|
|
47
|
+
popover.triggerRef.current = node;
|
|
48
|
+
},
|
|
49
|
+
onContextMenu: (e) => {
|
|
50
|
+
e.preventDefault();
|
|
51
|
+
existing?.(e);
|
|
52
|
+
openMenu();
|
|
53
|
+
},
|
|
54
|
+
...{
|
|
55
|
+
"aria-haspopup": "menu",
|
|
56
|
+
"aria-expanded": ctx.open,
|
|
57
|
+
"aria-controls": popover.contentId
|
|
58
|
+
},
|
|
59
|
+
...testID !== void 0 ? { "data-testid": testID } : {},
|
|
60
|
+
...className !== void 0 ? { className } : {},
|
|
61
|
+
children: child
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
return /* @__PURE__ */ jsx(
|
|
66
|
+
Pressable,
|
|
67
|
+
{
|
|
68
|
+
ref: (node) => {
|
|
69
|
+
popover.triggerRef.current = node;
|
|
70
|
+
},
|
|
71
|
+
...{
|
|
72
|
+
onContextMenu: /* @__PURE__ */ __name((e) => {
|
|
73
|
+
e.preventDefault();
|
|
74
|
+
openMenu();
|
|
75
|
+
}, "onContextMenu"),
|
|
76
|
+
"aria-haspopup": "menu",
|
|
77
|
+
"aria-expanded": ctx.open,
|
|
78
|
+
"aria-controls": popover.contentId
|
|
79
|
+
},
|
|
80
|
+
...testID !== void 0 ? { testID } : {},
|
|
81
|
+
...className !== void 0 ? { className } : {},
|
|
82
|
+
children: typeof children === "string" || typeof children === "number" ? /* @__PURE__ */ jsx(Text, { children }) : children
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
if (isValidElement(children)) {
|
|
87
|
+
const child = children;
|
|
88
|
+
const existing = child.props.onLongPress;
|
|
89
|
+
return /* @__PURE__ */ jsx(
|
|
90
|
+
Slot,
|
|
91
|
+
{
|
|
92
|
+
ref: (node) => {
|
|
93
|
+
popover.triggerRef.current = node;
|
|
94
|
+
},
|
|
95
|
+
onLongPress: (e) => {
|
|
96
|
+
existing?.(e);
|
|
97
|
+
openMenu();
|
|
98
|
+
},
|
|
99
|
+
accessibilityRole: "button",
|
|
100
|
+
...testID !== void 0 ? { testID } : {},
|
|
101
|
+
...className !== void 0 ? { className } : {},
|
|
102
|
+
children: child
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
return /* @__PURE__ */ jsx(
|
|
107
|
+
Pressable,
|
|
108
|
+
{
|
|
109
|
+
ref: (node) => {
|
|
110
|
+
popover.triggerRef.current = node;
|
|
111
|
+
},
|
|
112
|
+
onLongPress: openMenu,
|
|
113
|
+
...testID !== void 0 ? { testID } : {},
|
|
114
|
+
...className !== void 0 ? { className } : {},
|
|
115
|
+
children: typeof children === "string" || typeof children === "number" ? /* @__PURE__ */ jsx(Text, { children }) : children
|
|
116
|
+
}
|
|
117
|
+
);
|
|
118
|
+
}, "ContextMenuTrigger");
|
|
119
|
+
var ContextMenuContent = /* @__PURE__ */ __name((props) => {
|
|
120
|
+
const ctx = useContextMenuCtx();
|
|
121
|
+
const close = useCallback(() => ctx.setOpen(false), [ctx]);
|
|
122
|
+
return /* @__PURE__ */ jsx(MenuContextProvider, { open: ctx.open, close, children: /* @__PURE__ */ jsx(MenuContent, { ...props }) });
|
|
123
|
+
}, "ContextMenuContent");
|
|
124
|
+
var ContextMenu = Object.assign(ContextMenuRoot, {
|
|
125
|
+
Trigger: ContextMenuTrigger,
|
|
126
|
+
Content: ContextMenuContent,
|
|
127
|
+
Item: MenuItem,
|
|
128
|
+
Separator: MenuSeparator,
|
|
129
|
+
Label: MenuLabel
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
export { ContextMenu };
|
|
133
|
+
//# sourceMappingURL=chunk-KCLWPSV5.js.map
|
|
134
|
+
//# sourceMappingURL=chunk-KCLWPSV5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ContextMenu/ContextMenu.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-KCLWPSV5.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useState,\n} from 'react';\nimport { Platform, Pressable, Text as RNText } from 'react-native';\nimport { Slot } from '../../slot';\nimport {\n MenuContent,\n type MenuContentProps,\n MenuContextProvider,\n MenuItem,\n type MenuItemProps,\n MenuLabel,\n type MenuLabelProps,\n MenuSeparator,\n type MenuSeparatorProps,\n} from '../DropdownMenu/DropdownMenu';\nimport { Popover, usePopoverContext } from '../Popover/Popover';\n\n// ---------------------------------------------------------------------------\n// ContextMenu internal context (separate from DropdownMenu's context)\n// ---------------------------------------------------------------------------\n\ntype ContextMenuCtxValue = {\n open: boolean;\n setOpen: (next: boolean) => void;\n};\n\nconst ContextMenuCtx = createContext<ContextMenuCtxValue | null>(null);\n\nconst useContextMenuCtx = () => {\n const ctx = useContext(ContextMenuCtx);\n if (!ctx) {\n throw new Error('ContextMenu compound parts must be rendered inside a <ContextMenu>.');\n }\n return ctx;\n};\n\n// ---------------------------------------------------------------------------\n// ContextMenu root\n// ---------------------------------------------------------------------------\n\nexport type ContextMenuProps = {\n /** Controlled open state. */\n open?: boolean;\n /** Initial open state (uncontrolled). @defaultValue false */\n defaultOpen?: boolean;\n /** Fires with the new open state. */\n onOpenChange?: (open: boolean) => void;\n children?: ReactNode;\n};\n\n/**\n * Long-press (native) or right-click (web) triggered menu. Shares the same\n * compound surface as `DropdownMenu` but with a different trigger gesture.\n *\n * - **Web**: right-click (`contextmenu` event) opens the menu. The browser's\n * native context menu is suppressed via `preventDefault`.\n * - **Native**: long-press (`onLongPress`) opens the menu.\n *\n * The menu is anchored to the trigger element's bounding box (cursor-coordinate\n * anchoring is deferred to v2).\n *\n * ```tsx\n * <ContextMenu>\n * <ContextMenu.Trigger>\n * <View style={{ padding: 16 }}>\n * <Text>Right-click or long-press me</Text>\n * </View>\n * </ContextMenu.Trigger>\n * <ContextMenu.Content>\n * <ContextMenu.Item onSelect={() => console.log('copy')}>Copy</ContextMenu.Item>\n * <ContextMenu.Item onSelect={() => console.log('paste')}>Paste</ContextMenu.Item>\n * </ContextMenu.Content>\n * </ContextMenu>\n * ```\n */\nconst ContextMenuRoot = ({ open, defaultOpen = false, onOpenChange, children }: ContextMenuProps) => {\n const [inner, setInner] = useState<boolean>(defaultOpen);\n const isControlled = open !== undefined;\n const current = isControlled ? open : inner;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInner(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n return (\n <ContextMenuCtx.Provider value={{ open: current, setOpen }}>\n <Popover open={current} onOpenChange={setOpen}>\n {children}\n </Popover>\n </ContextMenuCtx.Provider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// ContextMenu.Trigger\n// ---------------------------------------------------------------------------\n\nexport type ContextMenuTriggerProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Trigger element for ContextMenu.\n *\n * - Web: fires on `contextmenu` (right-click). Calls `preventDefault` so the\n * browser's native context menu is suppressed.\n * - Native: fires on `onLongPress`.\n */\nconst ContextMenuTrigger = ({ children, className, testID }: ContextMenuTriggerProps) => {\n const ctx = useContextMenuCtx();\n const popover = usePopoverContext('ContextMenu.Trigger');\n\n const openMenu = useCallback(() => {\n popover.measureTrigger();\n ctx.setOpen(true);\n }, [ctx, popover]);\n\n if (Platform.OS === 'web') {\n if (isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n const existing = child.props.onContextMenu as ((e: MouseEvent) => void) | undefined;\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n popover.triggerRef.current = node;\n }}\n onContextMenu={(e: MouseEvent) => {\n e.preventDefault();\n existing?.(e);\n openMenu();\n }}\n {...({\n 'aria-haspopup': 'menu',\n 'aria-expanded': ctx.open,\n 'aria-controls': popover.contentId,\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { 'data-testid': testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {child}\n </Slot>\n );\n }\n\n return (\n <Pressable\n ref={(node) => {\n popover.triggerRef.current = node as unknown as HTMLElement | null;\n }}\n {...({\n onContextMenu: (e: MouseEvent) => {\n e.preventDefault();\n openMenu();\n },\n 'aria-haspopup': 'menu',\n 'aria-expanded': ctx.open,\n 'aria-controls': popover.contentId,\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {typeof children === 'string' || typeof children === 'number' ? <RNText>{children}</RNText> : children}\n </Pressable>\n );\n }\n\n // Native — long press\n if (isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n const existing = child.props.onLongPress as ((e: unknown) => void) | undefined;\n return (\n <Slot\n ref={(node: unknown) => {\n popover.triggerRef.current = node as HTMLElement | null;\n }}\n onLongPress={(e: unknown) => {\n existing?.(e);\n openMenu();\n }}\n accessibilityRole=\"button\"\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {child}\n </Slot>\n );\n }\n\n return (\n <Pressable\n ref={(node) => {\n popover.triggerRef.current = node as unknown as HTMLElement | null;\n }}\n onLongPress={openMenu}\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {typeof children === 'string' || typeof children === 'number' ? <RNText>{children}</RNText> : children}\n </Pressable>\n );\n};\n\n// ---------------------------------------------------------------------------\n// ContextMenu.Content\n// ---------------------------------------------------------------------------\n\nexport type ContextMenuContentProps = MenuContentProps;\n\n/**\n * The floating menu surface for ContextMenu. Wraps the shared MenuContent and\n * provides the MenuContext so `ContextMenu.Item` can close the menu on select.\n */\nconst ContextMenuContent = (props: ContextMenuContentProps) => {\n const ctx = useContextMenuCtx();\n const close = useCallback(() => ctx.setOpen(false), [ctx]);\n return (\n <MenuContextProvider open={ctx.open} close={close}>\n <MenuContent {...props} />\n </MenuContextProvider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public compound export\n// ---------------------------------------------------------------------------\n\nexport { MenuItem, type MenuItemProps, MenuLabel, type MenuLabelProps, MenuSeparator, type MenuSeparatorProps };\n\nexport const ContextMenu = Object.assign(ContextMenuRoot, {\n Trigger: ContextMenuTrigger,\n Content: ContextMenuContent,\n Item: MenuItem,\n Separator: MenuSeparator,\n Label: MenuLabel,\n});\n"]}
|
|
@@ -331,6 +331,6 @@ var Popover = Object.assign(PopoverRoot, {
|
|
|
331
331
|
Content: PopoverContent
|
|
332
332
|
});
|
|
333
333
|
|
|
334
|
-
export { Popover };
|
|
335
|
-
//# sourceMappingURL=chunk-
|
|
336
|
-
//# sourceMappingURL=chunk-
|
|
334
|
+
export { Popover, usePopoverContext };
|
|
335
|
+
//# sourceMappingURL=chunk-L5X4SYJ4.js.map
|
|
336
|
+
//# sourceMappingURL=chunk-L5X4SYJ4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Popover/Popover.tsx"],"names":["RNText","content"],"mappings":"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","file":"chunk-L5X4SYJ4.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Dimensions, Modal, Platform, Pressable, Text as RNText, View } from 'react-native';\nimport { Slot } from '../../slot';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type PopoverSide = 'top' | 'right' | 'bottom' | 'left';\nexport type PopoverAlign = 'start' | 'center' | 'end';\n\ntype TriggerRect = { top: number; left: number; width: number; height: number };\n\ntype PopoverContextValue = {\n open: boolean;\n setOpen: (next: boolean) => void;\n contentId: string;\n triggerRef: { current: HTMLElement | null };\n contentRef: { current: HTMLDivElement | null };\n triggerRect: TriggerRect | null;\n measureTrigger: () => void;\n};\n\nconst PopoverContext = createContext<PopoverContextValue | null>(null);\n\nconst usePopoverContext = (label: string): PopoverContextValue => {\n const ctx = useContext(PopoverContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside a <Popover>.`);\n }\n return ctx;\n};\n\n/**\n * @internal — exposes the Popover context so higher-level overlay components\n * (DropdownMenu, ContextMenu) can interact with trigger measurement and open\n * state without going through PopoverTrigger.\n */\nexport { usePopoverContext };\n\nexport type PopoverProps = {\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. @defaultValue false */\n defaultOpen?: boolean;\n /** Fires with the new open state. */\n onOpenChange?: (open: boolean) => void;\n children?: ReactNode;\n};\n\n/**\n * Non-modal floating panel anchored to a trigger element. Use for help\n * tooltips with rich content, color pickers, or profile previews.\n *\n * Composition: `Popover` (root, owns open state), `PopoverTrigger`\n * (forwards events to its child via Slot when `asChild`), `PopoverContent`\n * (the floating surface).\n *\n * Differences from `Dialog`: non-modal — does NOT trap focus or lock\n * scroll. Tab moves outside as normal. Differences from `Tooltip`: can\n * contain interactive content (buttons, inputs, links) and dismisses on\n * outside-click + Escape rather than mouse-leave.\n *\n * Behavior:\n * - Trigger click toggles open/close.\n * - Click outside the content (and outside the trigger) closes.\n * - Escape closes.\n *\n * Cross-platform: uses RN `<Modal>` as the visibility/portal primitive on\n * native (transparent backdrop, tap-outside-to-close). On web, the content\n * uses `position: fixed` + a measured trigger rect so it escapes any\n * ancestor `overflow: hidden`.\n */\nconst PopoverRoot = ({ open, defaultOpen = false, onOpenChange, children }: PopoverProps) => {\n const [inner, setInner] = useState<boolean>(defaultOpen);\n const isControlled = open !== undefined;\n const current = isControlled ? open : inner;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInner(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const baseId = useId();\n const triggerRef = useRef<HTMLElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n\n // Measure the trigger so the content can render with `position: fixed` +\n // computed coords. position:fixed escapes any ancestor's overflow:hidden\n // (e.g. fumadocs Tabs panes, our Preview frame), which is the single\n // biggest source of \"the popup got cut off\" bugs.\n const [triggerRect, setTriggerRect] = useState<TriggerRect | null>(null);\n const measureTrigger = useCallback(() => {\n const node = triggerRef.current;\n if (!node || typeof node.getBoundingClientRect !== 'function') {\n return;\n }\n const rect = node.getBoundingClientRect();\n setTriggerRect({ top: rect.top, left: rect.left, width: rect.width, height: rect.height });\n }, []);\n\n const ctxValue: PopoverContextValue = {\n open: current,\n setOpen,\n contentId: `${baseId}-content`,\n triggerRef,\n contentRef,\n triggerRect,\n measureTrigger,\n };\n\n return <PopoverContext.Provider value={ctxValue}>{children}</PopoverContext.Provider>;\n};\n\nexport type PopoverTriggerProps = {\n /** Render the child as the trigger (Slot pattern). Default true — pass `false` for an inline pressable. */\n asChild?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Element that toggles the popover. Uses `asChild` by default so any\n * element (Button, Link, custom Pressable) becomes the trigger.\n *\n * The trigger element gets `aria-haspopup=\"dialog\"` and `aria-expanded`\n * so assistive tech announces the relationship.\n */\nexport const PopoverTrigger = ({ asChild = true, children, className, testID }: PopoverTriggerProps) => {\n const ctx = usePopoverContext('PopoverTrigger');\n const onPress = useCallback(() => {\n ctx.measureTrigger();\n ctx.setOpen(!ctx.open);\n }, [ctx]);\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n // Pass both onClick (web HTML buttons) AND onPress (RN Pressable /\n // our own Button) so the trigger fires regardless of which event\n // model the wrapped child speaks. The child's existing handler\n // runs first, then we toggle.\n const fire = (existing: ((e: unknown) => void) | undefined) => (event: unknown) => {\n existing?.(event);\n ctx.measureTrigger();\n ctx.setOpen(!ctx.open);\n };\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n ctx.triggerRef.current = node;\n }}\n onClick={fire(child.props.onClick as ((e: unknown) => void) | undefined)}\n onPress={fire(child.props.onPress as ((e: unknown) => void) | undefined)}\n aria-haspopup=\"dialog\"\n aria-expanded={ctx.open}\n aria-controls={ctx.contentId}\n {...(testID !== undefined ? { 'data-testid': testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {child}\n </Slot>\n );\n }\n\n return (\n <Pressable\n ref={(node) => {\n ctx.triggerRef.current = node as unknown as HTMLElement | null;\n }}\n onPress={onPress}\n {...({\n 'aria-haspopup': 'dialog',\n 'aria-expanded': ctx.open,\n 'aria-controls': ctx.contentId,\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {wrapStringChildren(children)}\n </Pressable>\n );\n};\n\n// On native, raw strings rendered as children of a non-Text component\n// throw \"Text strings must be rendered within a <Text> component\". On\n// web, react-native-web silently tolerates it. Wrap any string/number\n// children in an RNText so the same JSX renders cleanly on both\n// platforms. Non-string children are passed through unchanged.\nfunction wrapStringChildren(children: ReactNode): ReactNode {\n if (typeof children === 'string' || typeof children === 'number') {\n return <RNText>{children}</RNText>;\n }\n return children;\n}\n\nconst GAP = 4; // visual gap between trigger and content\nconst MIN_WIDTH = 200;\n// Margin reserved on each side so the popover never butts against the\n// viewport edge. Matches the 8px safe-area we use for native modal pads.\nconst VIEWPORT_MARGIN = 8;\n\nfunction computePosition(\n rect: TriggerRect,\n side: PopoverSide,\n align: PopoverAlign,\n contentSize: { width: number; height: number } | null\n): { top: number; left: number } {\n const cw = contentSize?.width ?? MIN_WIDTH;\n const ch = contentSize?.height ?? 0;\n\n let top = 0;\n let left = 0;\n\n switch (side) {\n case 'top':\n top = rect.top - GAP - ch;\n break;\n case 'bottom':\n top = rect.top + rect.height + GAP;\n break;\n case 'left':\n left = rect.left - GAP - cw;\n break;\n case 'right':\n left = rect.left + rect.width + GAP;\n break;\n }\n\n if (side === 'top' || side === 'bottom') {\n switch (align) {\n case 'start':\n left = rect.left;\n break;\n case 'center':\n left = rect.left + rect.width / 2 - cw / 2;\n break;\n case 'end':\n left = rect.left + rect.width - cw;\n break;\n }\n } else {\n switch (align) {\n case 'start':\n top = rect.top;\n break;\n case 'center':\n top = rect.top + rect.height / 2 - ch / 2;\n break;\n case 'end':\n top = rect.top + rect.height - ch;\n break;\n }\n }\n\n return { top, left };\n}\n\nexport type PopoverContentProps = {\n /** Side of the trigger to anchor on. @defaultValue 'bottom' */\n side?: PopoverSide;\n /** Alignment along the trigger edge. @defaultValue 'center' */\n align?: PopoverAlign;\n children?: ReactNode;\n className?: string;\n testID?: string;\n /** Accessible label when no visible heading is present. */\n 'aria-label'?: string;\n};\n\n/**\n * The floating popover surface. Renders only while open. On web uses\n * `position: fixed` with a measured trigger rect so it escapes any\n * ancestor `overflow: hidden`. Non-modal: focus is NOT trapped inside —\n * the user can tab back out as normal.\n *\n * ARIA: `role=\"dialog\"` (without `aria-modal`) so assistive tech\n * announces it as a grouping but doesn't suppress the rest of the page.\n */\nexport const PopoverContent = ({\n side = 'bottom',\n align = 'center',\n children,\n className,\n testID,\n ...rest\n}: PopoverContentProps) => {\n const ctx = usePopoverContext('PopoverContent');\n const colors = useThemeColors();\n const ariaLabel = rest['aria-label'];\n\n // Measure content size after first paint so we can anchor `top`-style\n // popups (which need to know content height to render above the trigger).\n const [contentSize, setContentSize] = useState<{ width: number; height: number } | null>(null);\n\n // Web-only side effects: outside-click close, Escape close, re-measure\n // on resize. RN Modal handles its own dismissal on native (tap-outside\n // is the transparent overlay's onPress).\n useEffect(() => {\n if (!ctx.open) {\n return;\n }\n if (Platform.OS !== 'web') {\n return;\n }\n if (typeof document === 'undefined') {\n return;\n }\n\n ctx.measureTrigger();\n\n const onDocMouseDown = (event: MouseEvent) => {\n const target = event.target as Node;\n const trigger = ctx.triggerRef.current;\n const content = ctx.contentRef.current;\n if (trigger?.contains(target)) {\n return;\n }\n if (content?.contains(target)) {\n return;\n }\n ctx.setOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n ctx.setOpen(false);\n }\n };\n const onResize = () => ctx.measureTrigger();\n const onScroll = () => ctx.measureTrigger();\n\n document.addEventListener('mousedown', onDocMouseDown);\n document.addEventListener('keydown', onKeyDown);\n window.addEventListener('resize', onResize);\n window.addEventListener('scroll', onScroll, true);\n return () => {\n document.removeEventListener('mousedown', onDocMouseDown);\n document.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('resize', onResize);\n window.removeEventListener('scroll', onScroll, true);\n };\n // ctx is the provider's stable identity; we only care about open transitions.\n }, [ctx.open, ctx.measureTrigger, ctx.setOpen, ctx.triggerRef, ctx.contentRef]);\n\n // Reset measured size when popover closes so reopening re-measures fresh.\n useEffect(() => {\n if (!ctx.open) {\n setContentSize(null);\n }\n }, [ctx.open]);\n\n if (!ctx.open) {\n return null;\n }\n\n const position = ctx.triggerRect ? computePosition(ctx.triggerRect, side, align, contentSize) : null;\n\n // Viewport-aware max width. Web uses Dimensions.get('window') which\n // react-native-web maps to window.innerWidth; native uses the same API\n // for the device window. Subtract margin on both sides so content\n // doesn't kiss the screen edge.\n const viewportWidth = Dimensions.get('window').width;\n const maxContentWidth = Math.max(MIN_WIDTH, viewportWidth - VIEWPORT_MARGIN * 2);\n\n const contentBaseStyle: ViewStyle = {\n minWidth: MIN_WIDTH,\n maxWidth: maxContentWidth,\n borderRadius: px(colors.radius.lg),\n borderWidth: 1,\n borderColor: colors.semantic.border.default,\n backgroundColor: colors.semantic.background.elevated,\n padding: px(colors.spacing['4']),\n ...(Platform.OS === 'web'\n ? ({\n boxShadow: '0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1)',\n // Subtle scale-in. Skipped on native (do nothing fancy there).\n transition: 'opacity 120ms ease-out, transform 120ms ease-out',\n transform: 'scale(1)',\n opacity: 1,\n } as ViewStyle)\n : { elevation: 8 }),\n };\n\n // Clamp `left` so the popover stays within the viewport even when the\n // trigger sits near the right edge. First-paint fallback uses\n // `maxContentWidth` (the cap we apply via maxWidth above) — content\n // is allowed to grow up to that size, so assuming worst-case avoids\n // a one-frame overflow before measurement settles.\n const measuredWidth = contentSize?.width ?? maxContentWidth;\n const clampedLeft = position\n ? Math.min(\n Math.max(VIEWPORT_MARGIN, position.left),\n Math.max(VIEWPORT_MARGIN, viewportWidth - measuredWidth - VIEWPORT_MARGIN)\n )\n : 0;\n\n const positionedStyle: ViewStyle =\n Platform.OS === 'web'\n ? position\n ? ({\n position: 'fixed' as unknown as 'absolute',\n top: position.top,\n left: clampedLeft,\n zIndex: 50,\n } as ViewStyle)\n : ({\n // Trigger not yet measured — render off-screen for a\n // frame to avoid a flash at (0,0).\n position: 'fixed' as unknown as 'absolute',\n top: -9999,\n left: -9999,\n zIndex: 50,\n } as ViewStyle)\n : {};\n\n const content = (\n <View\n ref={(node) => {\n ctx.contentRef.current = node as unknown as HTMLDivElement | null;\n if (Platform.OS !== 'web') {\n return;\n }\n if (!node) {\n return;\n }\n if (typeof (node as unknown as HTMLDivElement).getBoundingClientRect !== 'function') {\n return;\n }\n const rect = (node as unknown as HTMLDivElement).getBoundingClientRect();\n if (!contentSize || contentSize.width !== rect.width || contentSize.height !== rect.height) {\n setContentSize({ width: rect.width, height: rect.height });\n }\n }}\n {...({\n role: 'dialog',\n id: ctx.contentId,\n ...(ariaLabel !== undefined ? { 'aria-label': ariaLabel, accessibilityLabel: ariaLabel } : {}),\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n className={cn(\n 'rounded-lg border border-semantic-border-default bg-semantic-background-elevated',\n className\n )}\n style={[contentBaseStyle, positionedStyle]}\n >\n {children}\n </View>\n );\n\n if (Platform.OS === 'web') {\n return content;\n }\n\n // Native: use Modal as the floating layer with a transparent backdrop.\n // Tap on the backdrop closes the popover.\n return (\n <Modal visible={ctx.open} transparent animationType=\"fade\" onRequestClose={() => ctx.setOpen(false)}>\n <Pressable\n accessibilityRole=\"none\"\n aria-hidden={true}\n onPress={() => ctx.setOpen(false)}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'transparent',\n }}\n >\n <Pressable\n onPress={(event) => event.stopPropagation?.()}\n style={{\n position: 'absolute',\n top: ctx.triggerRect\n ? side === 'top'\n ? Math.max(VIEWPORT_MARGIN, ctx.triggerRect.top - GAP - 80)\n : ctx.triggerRect.top + ctx.triggerRect.height + GAP\n : 80,\n // Clamp horizontally so a wide popover near the\n // right edge can still grow leftward without\n // overflowing the screen.\n left: ctx.triggerRect\n ? Math.min(\n Math.max(VIEWPORT_MARGIN, ctx.triggerRect.left),\n Math.max(VIEWPORT_MARGIN, viewportWidth - measuredWidth - VIEWPORT_MARGIN)\n )\n : VIEWPORT_MARGIN * 2,\n }}\n >\n {content}\n </Pressable>\n </Pressable>\n </Modal>\n );\n};\n\n/**\n * Public `Popover` value — the root function plus its `.Trigger` and `.Content`\n * static members. `Object.assign` produces a value whose inferred type carries\n * the static properties, so `.d.ts` consumers can write `<Popover.Trigger>`\n * without a separate import.\n */\nexport const Popover = Object.assign(PopoverRoot, {\n Trigger: PopoverTrigger,\n Content: PopoverContent,\n});\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Popover } from './chunk-7D2BHQ6M.js';
|
|
2
1
|
import { useLocale, Calendar } from './chunk-HZKXPN6B.js';
|
|
2
|
+
import { Popover } from './chunk-L5X4SYJ4.js';
|
|
3
3
|
import { cn } from './chunk-CHXHRJNZ.js';
|
|
4
4
|
import { px } from './chunk-5A2QOOVN.js';
|
|
5
5
|
import { useThemeColors } from './chunk-R5JMDDCB.js';
|
|
@@ -339,5 +339,5 @@ var DatePicker = Object.assign(DatePickerRoot, {
|
|
|
339
339
|
});
|
|
340
340
|
|
|
341
341
|
export { DatePicker };
|
|
342
|
-
//# sourceMappingURL=chunk-
|
|
343
|
-
//# sourceMappingURL=chunk-
|
|
342
|
+
//# sourceMappingURL=chunk-XXBN6CIK.js.map
|
|
343
|
+
//# sourceMappingURL=chunk-XXBN6CIK.js.map
|