@oxyhq/bloom 1.0.3 → 1.0.5
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/docs/dropdown-menu.mdx +27 -4
- package/lib/commonjs/context-menu/ContextMenu.js +2 -0
- package/lib/commonjs/context-menu/ContextMenu.js.map +1 -1
- package/lib/commonjs/context-menu/ContextMenu.web.js +2 -0
- package/lib/commonjs/context-menu/ContextMenu.web.js.map +1 -1
- package/lib/commonjs/dialog/SheetShell.js +6 -1
- package/lib/commonjs/dialog/SheetShell.js.map +1 -1
- package/lib/commonjs/dropdown-menu/DropdownMenu.js +7 -1
- package/lib/commonjs/dropdown-menu/DropdownMenu.js.map +1 -1
- package/lib/commonjs/dropdown-menu/DropdownMenu.web.js +2 -0
- package/lib/commonjs/dropdown-menu/DropdownMenu.web.js.map +1 -1
- package/lib/commonjs/floating/TriggerSlot.js +3 -1
- package/lib/commonjs/floating/TriggerSlot.js.map +1 -1
- package/lib/commonjs/floating/constants.js +4 -1
- package/lib/commonjs/floating/constants.js.map +1 -1
- package/lib/commonjs/floating/menu-rows.js +28 -22
- package/lib/commonjs/floating/menu-rows.js.map +1 -1
- package/lib/commonjs/floating/menu-sub-flyout.js +58 -28
- package/lib/commonjs/floating/menu-sub-flyout.js.map +1 -1
- package/lib/commonjs/floating/menu-sub-inline.js +5 -1
- package/lib/commonjs/floating/menu-sub-inline.js.map +1 -1
- package/lib/commonjs/floating/shared.js +2 -2
- package/lib/commonjs/floating/shared.js.map +1 -1
- package/lib/commonjs/popover/Popover.js +2 -0
- package/lib/commonjs/popover/Popover.js.map +1 -1
- package/lib/commonjs/popover/Popover.web.js +2 -0
- package/lib/commonjs/popover/Popover.web.js.map +1 -1
- package/lib/module/context-menu/ContextMenu.js +2 -0
- package/lib/module/context-menu/ContextMenu.js.map +1 -1
- package/lib/module/context-menu/ContextMenu.web.js +2 -0
- package/lib/module/context-menu/ContextMenu.web.js.map +1 -1
- package/lib/module/dialog/SheetShell.js +6 -1
- package/lib/module/dialog/SheetShell.js.map +1 -1
- package/lib/module/dropdown-menu/DropdownMenu.js +7 -1
- package/lib/module/dropdown-menu/DropdownMenu.js.map +1 -1
- package/lib/module/dropdown-menu/DropdownMenu.web.js +2 -0
- package/lib/module/dropdown-menu/DropdownMenu.web.js.map +1 -1
- package/lib/module/floating/TriggerSlot.js +5 -3
- package/lib/module/floating/TriggerSlot.js.map +1 -1
- package/lib/module/floating/constants.js +3 -0
- package/lib/module/floating/constants.js.map +1 -1
- package/lib/module/floating/menu-rows.js +29 -23
- package/lib/module/floating/menu-rows.js.map +1 -1
- package/lib/module/floating/menu-sub-flyout.js +58 -28
- package/lib/module/floating/menu-sub-flyout.js.map +1 -1
- package/lib/module/floating/menu-sub-inline.js +5 -1
- package/lib/module/floating/menu-sub-inline.js.map +1 -1
- package/lib/module/floating/shared.js +3 -3
- package/lib/module/floating/shared.js.map +1 -1
- package/lib/module/popover/Popover.js +2 -0
- package/lib/module/popover/Popover.js.map +1 -1
- package/lib/module/popover/Popover.web.js +2 -0
- package/lib/module/popover/Popover.web.js.map +1 -1
- package/lib/typescript/commonjs/context-menu/ContextMenu.d.ts +1 -1
- package/lib/typescript/commonjs/context-menu/ContextMenu.d.ts.map +1 -1
- package/lib/typescript/commonjs/context-menu/ContextMenu.web.d.ts +1 -1
- package/lib/typescript/commonjs/context-menu/ContextMenu.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/context-menu/types.d.ts +2 -0
- package/lib/typescript/commonjs/context-menu/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/dialog/SheetShell.d.ts +4 -1
- package/lib/typescript/commonjs/dialog/SheetShell.d.ts.map +1 -1
- package/lib/typescript/commonjs/dropdown-menu/DropdownMenu.d.ts +2 -2
- package/lib/typescript/commonjs/dropdown-menu/DropdownMenu.d.ts.map +1 -1
- package/lib/typescript/commonjs/dropdown-menu/DropdownMenu.web.d.ts +1 -1
- package/lib/typescript/commonjs/dropdown-menu/DropdownMenu.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/floating/TriggerSlot.d.ts +3 -1
- package/lib/typescript/commonjs/floating/TriggerSlot.d.ts.map +1 -1
- package/lib/typescript/commonjs/floating/constants.d.ts +2 -0
- package/lib/typescript/commonjs/floating/constants.d.ts.map +1 -1
- package/lib/typescript/commonjs/floating/menu-rows.d.ts.map +1 -1
- package/lib/typescript/commonjs/floating/menu-sub-flyout.d.ts.map +1 -1
- package/lib/typescript/commonjs/floating/menu-sub-inline.d.ts.map +1 -1
- package/lib/typescript/commonjs/floating/shared.d.ts +2 -2
- package/lib/typescript/commonjs/floating/shared.d.ts.map +1 -1
- package/lib/typescript/commonjs/floating/types.d.ts +29 -3
- package/lib/typescript/commonjs/floating/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/popover/Popover.d.ts +1 -1
- package/lib/typescript/commonjs/popover/Popover.d.ts.map +1 -1
- package/lib/typescript/commonjs/popover/Popover.web.d.ts +1 -1
- package/lib/typescript/commonjs/popover/Popover.web.d.ts.map +1 -1
- package/lib/typescript/module/context-menu/ContextMenu.d.ts +1 -1
- package/lib/typescript/module/context-menu/ContextMenu.d.ts.map +1 -1
- package/lib/typescript/module/context-menu/ContextMenu.web.d.ts +1 -1
- package/lib/typescript/module/context-menu/ContextMenu.web.d.ts.map +1 -1
- package/lib/typescript/module/context-menu/types.d.ts +2 -0
- package/lib/typescript/module/context-menu/types.d.ts.map +1 -1
- package/lib/typescript/module/dialog/SheetShell.d.ts +4 -1
- package/lib/typescript/module/dialog/SheetShell.d.ts.map +1 -1
- package/lib/typescript/module/dropdown-menu/DropdownMenu.d.ts +2 -2
- package/lib/typescript/module/dropdown-menu/DropdownMenu.d.ts.map +1 -1
- package/lib/typescript/module/dropdown-menu/DropdownMenu.web.d.ts +1 -1
- package/lib/typescript/module/dropdown-menu/DropdownMenu.web.d.ts.map +1 -1
- package/lib/typescript/module/floating/TriggerSlot.d.ts +3 -1
- package/lib/typescript/module/floating/TriggerSlot.d.ts.map +1 -1
- package/lib/typescript/module/floating/constants.d.ts +2 -0
- package/lib/typescript/module/floating/constants.d.ts.map +1 -1
- package/lib/typescript/module/floating/menu-rows.d.ts.map +1 -1
- package/lib/typescript/module/floating/menu-sub-flyout.d.ts.map +1 -1
- package/lib/typescript/module/floating/menu-sub-inline.d.ts.map +1 -1
- package/lib/typescript/module/floating/shared.d.ts +2 -2
- package/lib/typescript/module/floating/shared.d.ts.map +1 -1
- package/lib/typescript/module/floating/types.d.ts +29 -3
- package/lib/typescript/module/floating/types.d.ts.map +1 -1
- package/lib/typescript/module/popover/Popover.d.ts +1 -1
- package/lib/typescript/module/popover/Popover.d.ts.map +1 -1
- package/lib/typescript/module/popover/Popover.web.d.ts +1 -1
- package/lib/typescript/module/popover/Popover.web.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/context-menu/ContextMenu.tsx +2 -0
- package/src/context-menu/ContextMenu.web.tsx +2 -0
- package/src/context-menu/types.ts +2 -0
- package/src/dialog/SheetShell.tsx +10 -2
- package/src/dropdown-menu/DropdownMenu.tsx +11 -1
- package/src/dropdown-menu/DropdownMenu.web.tsx +2 -0
- package/src/floating/TriggerSlot.tsx +7 -3
- package/src/floating/constants.ts +3 -1
- package/src/floating/menu-rows.tsx +36 -25
- package/src/floating/menu-sub-flyout.tsx +62 -28
- package/src/floating/menu-sub-inline.tsx +12 -2
- package/src/floating/shared.tsx +11 -4
- package/src/floating/types.ts +29 -3
- package/src/popover/Popover.tsx +2 -0
- package/src/popover/Popover.web.tsx +2 -0
|
@@ -16,10 +16,10 @@
|
|
|
16
16
|
* - **Stack rank.** Taken by the `OverlayRoot` inside `FloatingPanel`, on
|
|
17
17
|
* mount, like every other surface. The sub-panel mounts AFTER the root panel,
|
|
18
18
|
* so it paints above it by construction and carries no `zIndex`.
|
|
19
|
-
* - **Hover intent.**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
19
|
+
* - **Hover intent.** A real mouse/pen move over the row opens it; a layout
|
|
20
|
+
* transition placing the row under a parked pointer does not. Leaving either
|
|
21
|
+
* surface SCHEDULES a close, moving over either CANCELS it, and the delay is
|
|
22
|
+
* long enough (`CLOSE_DELAY_MS`) to cross the gap.
|
|
23
23
|
* - **Keyboard.** Right opens and moves into the panel, Left and Escape leave
|
|
24
24
|
* it. Escape is handled here in the CAPTURE phase with
|
|
25
25
|
* `stopImmediatePropagation`, which is the only way the INNERMOST surface
|
|
@@ -111,6 +111,12 @@ function domNode(node: View | null): DomNode | null {
|
|
|
111
111
|
return element as DomNode;
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
+
/** Touch movement is scrolling/dragging, not hover intent. */
|
|
115
|
+
function isHoverPointer(event: Event): boolean {
|
|
116
|
+
const pointerType = (event as PointerEvent).pointerType;
|
|
117
|
+
return pointerType === 'mouse' || pointerType === 'pen';
|
|
118
|
+
}
|
|
119
|
+
|
|
114
120
|
/** The first focusable descendant, so Right lands ON the panel's first row. */
|
|
115
121
|
function focusFirstItem(node: DomNode | null): void {
|
|
116
122
|
const first = node?.querySelector<HTMLElement>('[role="menuitem"], [role="menuitemcheckbox"], [role="checkbox"], [role="radio"]');
|
|
@@ -272,8 +278,10 @@ export function createFlyoutMenuSub(prefix: string): MenuSubParts {
|
|
|
272
278
|
|
|
273
279
|
const keepOpen = useCallback(() => {
|
|
274
280
|
cancelTimer();
|
|
275
|
-
|
|
276
|
-
|
|
281
|
+
// `pointermove` is intentionally continuous. Once open, cancel the close
|
|
282
|
+
// timer without re-notifying a controlled consumer on every coordinate.
|
|
283
|
+
if (!isOpen) setOpen(true);
|
|
284
|
+
}, [cancelTimer, isOpen, setOpen]);
|
|
277
285
|
|
|
278
286
|
const closeSoon = useCallback(() => {
|
|
279
287
|
cancelTimer();
|
|
@@ -322,17 +330,22 @@ export function createFlyoutMenuSub(prefix: string): MenuSubParts {
|
|
|
322
330
|
[sub.triggerRef],
|
|
323
331
|
);
|
|
324
332
|
|
|
325
|
-
//
|
|
326
|
-
// props: `Item` renders its own `Pressable` and publishes neither
|
|
327
|
-
//
|
|
328
|
-
// web-only caller is the wrong trade. `
|
|
329
|
-
//
|
|
333
|
+
// Pointer intent and keyboard through DOM listeners on the wrapper rather
|
|
334
|
+
// than RN props: `Item` renders its own `Pressable` and publishes neither
|
|
335
|
+
// pointer movement nor `onKeyDown`, and widening its prop surface for one
|
|
336
|
+
// web-only caller is the wrong trade. Crucially, `pointermove` needs actual
|
|
337
|
+
// coordinates to change: unlike enter, layout motion cannot synthesize it
|
|
338
|
+
// when a transition puts this row under a parked pointer.
|
|
330
339
|
useEffect(() => {
|
|
331
340
|
const element = domNode(node);
|
|
332
341
|
if (!element || disabled) return;
|
|
333
342
|
|
|
334
|
-
const
|
|
335
|
-
|
|
343
|
+
const onMove = (event: Event) => {
|
|
344
|
+
if (isHoverPointer(event)) sub.keepOpen();
|
|
345
|
+
};
|
|
346
|
+
const onLeave = (event: Event) => {
|
|
347
|
+
if (isHoverPointer(event)) sub.closeSoon();
|
|
348
|
+
};
|
|
336
349
|
const onKeyDown = (event: Event) => {
|
|
337
350
|
const key = (event as KeyboardEvent).key;
|
|
338
351
|
if (key !== 'ArrowRight' && key !== 'Enter' && key !== ' ') return;
|
|
@@ -340,12 +353,12 @@ export function createFlyoutMenuSub(prefix: string): MenuSubParts {
|
|
|
340
353
|
sub.keepOpen();
|
|
341
354
|
};
|
|
342
355
|
|
|
343
|
-
element.addEventListener('
|
|
344
|
-
element.addEventListener('
|
|
356
|
+
element.addEventListener('pointermove', onMove);
|
|
357
|
+
element.addEventListener('pointerleave', onLeave);
|
|
345
358
|
element.addEventListener('keydown', onKeyDown);
|
|
346
359
|
return () => {
|
|
347
|
-
element.removeEventListener('
|
|
348
|
-
element.removeEventListener('
|
|
360
|
+
element.removeEventListener('pointermove', onMove);
|
|
361
|
+
element.removeEventListener('pointerleave', onLeave);
|
|
349
362
|
element.removeEventListener('keydown', onKeyDown);
|
|
350
363
|
};
|
|
351
364
|
}, [node, disabled, sub]);
|
|
@@ -388,7 +401,19 @@ export function createFlyoutMenuSub(prefix: string): MenuSubParts {
|
|
|
388
401
|
}
|
|
389
402
|
MenuSubTrigger.displayName = `${prefix}SubTrigger`;
|
|
390
403
|
|
|
391
|
-
function MenuSubContent({
|
|
404
|
+
function MenuSubContent({
|
|
405
|
+
children,
|
|
406
|
+
label = 'Submenu',
|
|
407
|
+
side = 'right',
|
|
408
|
+
align = 'start',
|
|
409
|
+
sideOffset = MENU_SUB_SIDE_OFFSET,
|
|
410
|
+
alignOffset,
|
|
411
|
+
minWidth,
|
|
412
|
+
maxWidth,
|
|
413
|
+
className,
|
|
414
|
+
style,
|
|
415
|
+
testID,
|
|
416
|
+
}: MenuSubContentProps) {
|
|
392
417
|
const sub = useSubFlyout();
|
|
393
418
|
const anchor = useFlyoutAnchor(sub.triggerRef, sub.open);
|
|
394
419
|
const [node, setNode] = useState<View | null>(null);
|
|
@@ -397,8 +422,12 @@ export function createFlyoutMenuSub(prefix: string): MenuSubParts {
|
|
|
397
422
|
const element = domNode(node);
|
|
398
423
|
if (!element || !sub.open) return;
|
|
399
424
|
|
|
400
|
-
const
|
|
401
|
-
|
|
425
|
+
const onMove = (event: Event) => {
|
|
426
|
+
if (isHoverPointer(event)) sub.keepOpen();
|
|
427
|
+
};
|
|
428
|
+
const onLeave = (event: Event) => {
|
|
429
|
+
if (isHoverPointer(event)) sub.closeSoon();
|
|
430
|
+
};
|
|
402
431
|
const onKeyDown = (event: Event) => {
|
|
403
432
|
const key = (event as KeyboardEvent).key;
|
|
404
433
|
if (key !== 'ArrowLeft') return;
|
|
@@ -406,12 +435,12 @@ export function createFlyoutMenuSub(prefix: string): MenuSubParts {
|
|
|
406
435
|
sub.closeAndRefocus();
|
|
407
436
|
};
|
|
408
437
|
|
|
409
|
-
element.addEventListener('
|
|
410
|
-
element.addEventListener('
|
|
438
|
+
element.addEventListener('pointermove', onMove);
|
|
439
|
+
element.addEventListener('pointerleave', onLeave);
|
|
411
440
|
element.addEventListener('keydown', onKeyDown);
|
|
412
441
|
return () => {
|
|
413
|
-
element.removeEventListener('
|
|
414
|
-
element.removeEventListener('
|
|
442
|
+
element.removeEventListener('pointermove', onMove);
|
|
443
|
+
element.removeEventListener('pointerleave', onLeave);
|
|
415
444
|
element.removeEventListener('keydown', onKeyDown);
|
|
416
445
|
};
|
|
417
446
|
}, [node, sub]);
|
|
@@ -445,19 +474,24 @@ export function createFlyoutMenuSub(prefix: string): MenuSubParts {
|
|
|
445
474
|
open={sub.open}
|
|
446
475
|
anchor={anchor}
|
|
447
476
|
role="menu"
|
|
448
|
-
|
|
477
|
+
label={label}
|
|
478
|
+
side={side}
|
|
449
479
|
// The panel's first row lines up with the trigger row it flew out of.
|
|
450
|
-
align=
|
|
480
|
+
align={align}
|
|
451
481
|
// Measured from the PARENT PANEL's edge, not the trigger row's — see
|
|
452
482
|
// `useFlyoutAnchor`.
|
|
453
|
-
sideOffset={
|
|
483
|
+
sideOffset={sideOffset}
|
|
484
|
+
alignOffset={alignOffset}
|
|
454
485
|
dismissible={false}
|
|
455
486
|
modal={false}
|
|
456
487
|
onDismiss={sub.closeAndRefocus}
|
|
488
|
+
minWidth={minWidth}
|
|
489
|
+
maxWidth={maxWidth}
|
|
457
490
|
// `w-64` — a sub panel is a FIXED 256px, so a column of flyouts does not
|
|
458
491
|
// step in and out as their labels change length.
|
|
459
492
|
className={cx(MENU_SUB_PANEL_CLASS, className)}
|
|
460
|
-
style={style}
|
|
493
|
+
style={style}
|
|
494
|
+
testID={testID}>
|
|
461
495
|
{/* `-mx-1 px-1 max-h-96 overflow-y-auto`: the negative inset bleeds the
|
|
462
496
|
scroller to the panel edge and pads the content back, so the
|
|
463
497
|
scrollbar is not inset by the panel's own `p-1`. It doubles as the
|
|
@@ -93,13 +93,23 @@ export function createInlineMenuSub(prefix: string): MenuSubParts {
|
|
|
93
93
|
}
|
|
94
94
|
MenuSubTrigger.displayName = `${prefix}SubTrigger`;
|
|
95
95
|
|
|
96
|
-
function MenuSubContent({
|
|
96
|
+
function MenuSubContent({
|
|
97
|
+
children,
|
|
98
|
+
label,
|
|
99
|
+
className,
|
|
100
|
+
style,
|
|
101
|
+
testID,
|
|
102
|
+
}: MenuSubContentProps) {
|
|
97
103
|
const sub = useMenuSub();
|
|
98
104
|
if (!sub.open) return null;
|
|
99
105
|
// Indented under its trigger, which is the whole visual statement an inline
|
|
100
106
|
// disclosure makes.
|
|
101
107
|
return (
|
|
102
|
-
<StyledView
|
|
108
|
+
<StyledView
|
|
109
|
+
accessibilityLabel={label}
|
|
110
|
+
className={cx('pl-space-16', className)}
|
|
111
|
+
style={style}
|
|
112
|
+
testID={testID}>
|
|
103
113
|
{children}
|
|
104
114
|
</StyledView>
|
|
105
115
|
);
|
package/src/floating/shared.tsx
CHANGED
|
@@ -47,6 +47,7 @@ import {
|
|
|
47
47
|
ROW_DISABLED_CLASS,
|
|
48
48
|
ROW_ENABLED_CLASS,
|
|
49
49
|
ROW_GUTTER_CLASS,
|
|
50
|
+
ROW_GUTTER_END_CLASS,
|
|
50
51
|
ROW_HIGHLIGHT_CLASS,
|
|
51
52
|
ROW_INSET_CLASS,
|
|
52
53
|
ROW_LEADING_CLASS,
|
|
@@ -116,8 +117,8 @@ export interface MenuRowShellProps {
|
|
|
116
117
|
destructive?: boolean;
|
|
117
118
|
/** Indent to line up with the rows that carry an indicator. */
|
|
118
119
|
inset?: boolean;
|
|
119
|
-
/** This row carries an out-of-flow indicator
|
|
120
|
-
gutter?:
|
|
120
|
+
/** This row carries an out-of-flow indicator at the named edge. */
|
|
121
|
+
gutter?: 'leading' | 'trailing';
|
|
121
122
|
leading?: React.ReactNode;
|
|
122
123
|
trailing?: React.ReactNode;
|
|
123
124
|
/** A plain-string child, rendered as the row's own label. */
|
|
@@ -146,7 +147,7 @@ export function MenuRowShell({
|
|
|
146
147
|
disabled,
|
|
147
148
|
destructive = false,
|
|
148
149
|
inset = false,
|
|
149
|
-
gutter
|
|
150
|
+
gutter,
|
|
150
151
|
leading,
|
|
151
152
|
trailing,
|
|
152
153
|
title,
|
|
@@ -164,7 +165,13 @@ export function MenuRowShell({
|
|
|
164
165
|
const rowClass = cx(
|
|
165
166
|
ROW_CLASS,
|
|
166
167
|
disabled ? ROW_DISABLED_CLASS : ROW_ENABLED_CLASS,
|
|
167
|
-
gutter
|
|
168
|
+
gutter === 'leading'
|
|
169
|
+
? ROW_GUTTER_CLASS
|
|
170
|
+
: gutter === 'trailing'
|
|
171
|
+
? ROW_GUTTER_END_CLASS
|
|
172
|
+
: inset
|
|
173
|
+
? ROW_INSET_CLASS
|
|
174
|
+
: false,
|
|
168
175
|
highlighted && ROW_HIGHLIGHT_CLASS,
|
|
169
176
|
className,
|
|
170
177
|
);
|
package/src/floating/types.ts
CHANGED
|
@@ -189,9 +189,8 @@ export interface OverlayTriggerProps {
|
|
|
189
189
|
/** Accessible name. Ignored when the `asChild` child carries its own. */
|
|
190
190
|
label?: string;
|
|
191
191
|
/**
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
* the class lands alone.
|
|
192
|
+
* Bare triggers apply this to the measured anchor wrapper; families whose
|
|
193
|
+
* trigger owns chrome append it to that chrome instead.
|
|
195
194
|
*/
|
|
196
195
|
className?: string;
|
|
197
196
|
style?: StyleProp<ViewStyle>;
|
|
@@ -274,6 +273,13 @@ export interface MenuCheckboxRowProps
|
|
|
274
273
|
extends Omit<MenuRowProps, 'onPress' | 'variant' | 'leading' | 'inset'> {
|
|
275
274
|
checked: boolean;
|
|
276
275
|
onCheckedChange: (checked: boolean) => void;
|
|
276
|
+
/**
|
|
277
|
+
* Mark rendered while checked. Omit for Bloom's default check; pass `null`
|
|
278
|
+
* to suppress it or a glyph to match a product-specific menu.
|
|
279
|
+
*/
|
|
280
|
+
indicator?: React.ReactNode;
|
|
281
|
+
/** Where the mark sits. Defaults to the established leading gutter. */
|
|
282
|
+
indicatorPosition?: 'leading' | 'trailing';
|
|
277
283
|
}
|
|
278
284
|
|
|
279
285
|
export interface MenuRadioGroupProps {
|
|
@@ -285,6 +291,13 @@ export interface MenuRadioGroupProps {
|
|
|
285
291
|
export interface MenuRadioRowProps
|
|
286
292
|
extends Omit<MenuRowProps, 'onPress' | 'variant' | 'leading' | 'inset'> {
|
|
287
293
|
value: string;
|
|
294
|
+
/**
|
|
295
|
+
* Mark rendered while this value is selected. Omit for Bloom's default dot;
|
|
296
|
+
* pass `null` to suppress it or a glyph to match a product-specific menu.
|
|
297
|
+
*/
|
|
298
|
+
indicator?: React.ReactNode;
|
|
299
|
+
/** Where the mark sits. Defaults to the established leading gutter. */
|
|
300
|
+
indicatorPosition?: 'leading' | 'trailing';
|
|
288
301
|
}
|
|
289
302
|
|
|
290
303
|
export interface MenuLabelProps {
|
|
@@ -325,9 +338,22 @@ export interface MenuSubTriggerProps {
|
|
|
325
338
|
|
|
326
339
|
export interface MenuSubContentProps {
|
|
327
340
|
children?: React.ReactNode;
|
|
341
|
+
/** Accessible name of the flyout panel on web. */
|
|
342
|
+
label?: string;
|
|
343
|
+
/** Preferred lateral side on web. Defaults to `'right'` and may flip to fit. */
|
|
344
|
+
side?: Extract<FloatingSide, 'left' | 'right'>;
|
|
345
|
+
/** Vertical alignment against the sub trigger on web. Defaults to `'start'`. */
|
|
346
|
+
align?: FloatingAlign;
|
|
347
|
+
/** Gap from the parent panel edge on web. Defaults to Bloom's submenu seam. */
|
|
348
|
+
sideOffset?: number;
|
|
349
|
+
/** Vertical shift applied before viewport clamping on web. */
|
|
350
|
+
alignOffset?: number;
|
|
351
|
+
minWidth?: number;
|
|
352
|
+
maxWidth?: number;
|
|
328
353
|
/** Appended to the sub panel's own classes — see {@link MenuRowProps.className}. */
|
|
329
354
|
className?: string;
|
|
330
355
|
style?: StyleProp<ViewStyle>;
|
|
356
|
+
testID?: string;
|
|
331
357
|
}
|
|
332
358
|
|
|
333
359
|
/**
|
package/src/popover/Popover.tsx
CHANGED
|
@@ -36,6 +36,7 @@ export function PopoverTrigger({
|
|
|
36
36
|
asChild,
|
|
37
37
|
disabled,
|
|
38
38
|
label,
|
|
39
|
+
className,
|
|
39
40
|
style,
|
|
40
41
|
testID,
|
|
41
42
|
}: PopoverTriggerProps) {
|
|
@@ -45,6 +46,7 @@ export function PopoverTrigger({
|
|
|
45
46
|
<TriggerSlot
|
|
46
47
|
asChild={asChild}
|
|
47
48
|
anchorRef={popover.anchorRef}
|
|
49
|
+
className={className}
|
|
48
50
|
style={style}
|
|
49
51
|
testID={testID}
|
|
50
52
|
handle={{
|
|
@@ -36,6 +36,7 @@ export function PopoverTrigger({
|
|
|
36
36
|
asChild,
|
|
37
37
|
disabled,
|
|
38
38
|
label,
|
|
39
|
+
className,
|
|
39
40
|
style,
|
|
40
41
|
testID,
|
|
41
42
|
}: PopoverTriggerProps) {
|
|
@@ -45,6 +46,7 @@ export function PopoverTrigger({
|
|
|
45
46
|
<TriggerSlot
|
|
46
47
|
asChild={asChild}
|
|
47
48
|
anchorRef={popover.anchorRef}
|
|
49
|
+
className={className}
|
|
48
50
|
style={style}
|
|
49
51
|
testID={testID}
|
|
50
52
|
handle={{
|