@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.
Files changed (123) hide show
  1. package/docs/dropdown-menu.mdx +27 -4
  2. package/lib/commonjs/context-menu/ContextMenu.js +2 -0
  3. package/lib/commonjs/context-menu/ContextMenu.js.map +1 -1
  4. package/lib/commonjs/context-menu/ContextMenu.web.js +2 -0
  5. package/lib/commonjs/context-menu/ContextMenu.web.js.map +1 -1
  6. package/lib/commonjs/dialog/SheetShell.js +6 -1
  7. package/lib/commonjs/dialog/SheetShell.js.map +1 -1
  8. package/lib/commonjs/dropdown-menu/DropdownMenu.js +7 -1
  9. package/lib/commonjs/dropdown-menu/DropdownMenu.js.map +1 -1
  10. package/lib/commonjs/dropdown-menu/DropdownMenu.web.js +2 -0
  11. package/lib/commonjs/dropdown-menu/DropdownMenu.web.js.map +1 -1
  12. package/lib/commonjs/floating/TriggerSlot.js +3 -1
  13. package/lib/commonjs/floating/TriggerSlot.js.map +1 -1
  14. package/lib/commonjs/floating/constants.js +4 -1
  15. package/lib/commonjs/floating/constants.js.map +1 -1
  16. package/lib/commonjs/floating/menu-rows.js +28 -22
  17. package/lib/commonjs/floating/menu-rows.js.map +1 -1
  18. package/lib/commonjs/floating/menu-sub-flyout.js +58 -28
  19. package/lib/commonjs/floating/menu-sub-flyout.js.map +1 -1
  20. package/lib/commonjs/floating/menu-sub-inline.js +5 -1
  21. package/lib/commonjs/floating/menu-sub-inline.js.map +1 -1
  22. package/lib/commonjs/floating/shared.js +2 -2
  23. package/lib/commonjs/floating/shared.js.map +1 -1
  24. package/lib/commonjs/popover/Popover.js +2 -0
  25. package/lib/commonjs/popover/Popover.js.map +1 -1
  26. package/lib/commonjs/popover/Popover.web.js +2 -0
  27. package/lib/commonjs/popover/Popover.web.js.map +1 -1
  28. package/lib/module/context-menu/ContextMenu.js +2 -0
  29. package/lib/module/context-menu/ContextMenu.js.map +1 -1
  30. package/lib/module/context-menu/ContextMenu.web.js +2 -0
  31. package/lib/module/context-menu/ContextMenu.web.js.map +1 -1
  32. package/lib/module/dialog/SheetShell.js +6 -1
  33. package/lib/module/dialog/SheetShell.js.map +1 -1
  34. package/lib/module/dropdown-menu/DropdownMenu.js +7 -1
  35. package/lib/module/dropdown-menu/DropdownMenu.js.map +1 -1
  36. package/lib/module/dropdown-menu/DropdownMenu.web.js +2 -0
  37. package/lib/module/dropdown-menu/DropdownMenu.web.js.map +1 -1
  38. package/lib/module/floating/TriggerSlot.js +5 -3
  39. package/lib/module/floating/TriggerSlot.js.map +1 -1
  40. package/lib/module/floating/constants.js +3 -0
  41. package/lib/module/floating/constants.js.map +1 -1
  42. package/lib/module/floating/menu-rows.js +29 -23
  43. package/lib/module/floating/menu-rows.js.map +1 -1
  44. package/lib/module/floating/menu-sub-flyout.js +58 -28
  45. package/lib/module/floating/menu-sub-flyout.js.map +1 -1
  46. package/lib/module/floating/menu-sub-inline.js +5 -1
  47. package/lib/module/floating/menu-sub-inline.js.map +1 -1
  48. package/lib/module/floating/shared.js +3 -3
  49. package/lib/module/floating/shared.js.map +1 -1
  50. package/lib/module/popover/Popover.js +2 -0
  51. package/lib/module/popover/Popover.js.map +1 -1
  52. package/lib/module/popover/Popover.web.js +2 -0
  53. package/lib/module/popover/Popover.web.js.map +1 -1
  54. package/lib/typescript/commonjs/context-menu/ContextMenu.d.ts +1 -1
  55. package/lib/typescript/commonjs/context-menu/ContextMenu.d.ts.map +1 -1
  56. package/lib/typescript/commonjs/context-menu/ContextMenu.web.d.ts +1 -1
  57. package/lib/typescript/commonjs/context-menu/ContextMenu.web.d.ts.map +1 -1
  58. package/lib/typescript/commonjs/context-menu/types.d.ts +2 -0
  59. package/lib/typescript/commonjs/context-menu/types.d.ts.map +1 -1
  60. package/lib/typescript/commonjs/dialog/SheetShell.d.ts +4 -1
  61. package/lib/typescript/commonjs/dialog/SheetShell.d.ts.map +1 -1
  62. package/lib/typescript/commonjs/dropdown-menu/DropdownMenu.d.ts +2 -2
  63. package/lib/typescript/commonjs/dropdown-menu/DropdownMenu.d.ts.map +1 -1
  64. package/lib/typescript/commonjs/dropdown-menu/DropdownMenu.web.d.ts +1 -1
  65. package/lib/typescript/commonjs/dropdown-menu/DropdownMenu.web.d.ts.map +1 -1
  66. package/lib/typescript/commonjs/floating/TriggerSlot.d.ts +3 -1
  67. package/lib/typescript/commonjs/floating/TriggerSlot.d.ts.map +1 -1
  68. package/lib/typescript/commonjs/floating/constants.d.ts +2 -0
  69. package/lib/typescript/commonjs/floating/constants.d.ts.map +1 -1
  70. package/lib/typescript/commonjs/floating/menu-rows.d.ts.map +1 -1
  71. package/lib/typescript/commonjs/floating/menu-sub-flyout.d.ts.map +1 -1
  72. package/lib/typescript/commonjs/floating/menu-sub-inline.d.ts.map +1 -1
  73. package/lib/typescript/commonjs/floating/shared.d.ts +2 -2
  74. package/lib/typescript/commonjs/floating/shared.d.ts.map +1 -1
  75. package/lib/typescript/commonjs/floating/types.d.ts +29 -3
  76. package/lib/typescript/commonjs/floating/types.d.ts.map +1 -1
  77. package/lib/typescript/commonjs/popover/Popover.d.ts +1 -1
  78. package/lib/typescript/commonjs/popover/Popover.d.ts.map +1 -1
  79. package/lib/typescript/commonjs/popover/Popover.web.d.ts +1 -1
  80. package/lib/typescript/commonjs/popover/Popover.web.d.ts.map +1 -1
  81. package/lib/typescript/module/context-menu/ContextMenu.d.ts +1 -1
  82. package/lib/typescript/module/context-menu/ContextMenu.d.ts.map +1 -1
  83. package/lib/typescript/module/context-menu/ContextMenu.web.d.ts +1 -1
  84. package/lib/typescript/module/context-menu/ContextMenu.web.d.ts.map +1 -1
  85. package/lib/typescript/module/context-menu/types.d.ts +2 -0
  86. package/lib/typescript/module/context-menu/types.d.ts.map +1 -1
  87. package/lib/typescript/module/dialog/SheetShell.d.ts +4 -1
  88. package/lib/typescript/module/dialog/SheetShell.d.ts.map +1 -1
  89. package/lib/typescript/module/dropdown-menu/DropdownMenu.d.ts +2 -2
  90. package/lib/typescript/module/dropdown-menu/DropdownMenu.d.ts.map +1 -1
  91. package/lib/typescript/module/dropdown-menu/DropdownMenu.web.d.ts +1 -1
  92. package/lib/typescript/module/dropdown-menu/DropdownMenu.web.d.ts.map +1 -1
  93. package/lib/typescript/module/floating/TriggerSlot.d.ts +3 -1
  94. package/lib/typescript/module/floating/TriggerSlot.d.ts.map +1 -1
  95. package/lib/typescript/module/floating/constants.d.ts +2 -0
  96. package/lib/typescript/module/floating/constants.d.ts.map +1 -1
  97. package/lib/typescript/module/floating/menu-rows.d.ts.map +1 -1
  98. package/lib/typescript/module/floating/menu-sub-flyout.d.ts.map +1 -1
  99. package/lib/typescript/module/floating/menu-sub-inline.d.ts.map +1 -1
  100. package/lib/typescript/module/floating/shared.d.ts +2 -2
  101. package/lib/typescript/module/floating/shared.d.ts.map +1 -1
  102. package/lib/typescript/module/floating/types.d.ts +29 -3
  103. package/lib/typescript/module/floating/types.d.ts.map +1 -1
  104. package/lib/typescript/module/popover/Popover.d.ts +1 -1
  105. package/lib/typescript/module/popover/Popover.d.ts.map +1 -1
  106. package/lib/typescript/module/popover/Popover.web.d.ts +1 -1
  107. package/lib/typescript/module/popover/Popover.web.d.ts.map +1 -1
  108. package/package.json +1 -1
  109. package/src/context-menu/ContextMenu.tsx +2 -0
  110. package/src/context-menu/ContextMenu.web.tsx +2 -0
  111. package/src/context-menu/types.ts +2 -0
  112. package/src/dialog/SheetShell.tsx +10 -2
  113. package/src/dropdown-menu/DropdownMenu.tsx +11 -1
  114. package/src/dropdown-menu/DropdownMenu.web.tsx +2 -0
  115. package/src/floating/TriggerSlot.tsx +7 -3
  116. package/src/floating/constants.ts +3 -1
  117. package/src/floating/menu-rows.tsx +36 -25
  118. package/src/floating/menu-sub-flyout.tsx +62 -28
  119. package/src/floating/menu-sub-inline.tsx +12 -2
  120. package/src/floating/shared.tsx +11 -4
  121. package/src/floating/types.ts +29 -3
  122. package/src/popover/Popover.tsx +2 -0
  123. 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.** Opening on hover is easy; staying open while the pointer
20
- * travels diagonally from the row to the panel is the part that needs a
21
- * delay. Leaving either surface SCHEDULES a close, entering either CANCELS
22
- * it, and the delay is long enough (`CLOSE_DELAY_MS`) to cross the gap.
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
- setOpen(true);
276
- }, [cancelTimer, setOpen]);
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
- // Hover and keyboard through DOM listeners on the wrapper rather than RN
326
- // props: `Item` renders its own `Pressable` and publishes neither
327
- // `onHoverIn` nor `onKeyDown`, and widening its prop surface for one
328
- // web-only caller is the wrong trade. `mouseenter`/`mouseleave` do not
329
- // bubble, so they describe THIS row and not the rows under the panel.
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 onEnter = () => sub.keepOpen();
335
- const onLeave = () => sub.closeSoon();
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('mouseenter', onEnter);
344
- element.addEventListener('mouseleave', onLeave);
356
+ element.addEventListener('pointermove', onMove);
357
+ element.addEventListener('pointerleave', onLeave);
345
358
  element.addEventListener('keydown', onKeyDown);
346
359
  return () => {
347
- element.removeEventListener('mouseenter', onEnter);
348
- element.removeEventListener('mouseleave', onLeave);
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({ children, className, style }: MenuSubContentProps) {
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 onEnter = () => sub.keepOpen();
401
- const onLeave = () => sub.closeSoon();
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('mouseenter', onEnter);
410
- element.addEventListener('mouseleave', onLeave);
438
+ element.addEventListener('pointermove', onMove);
439
+ element.addEventListener('pointerleave', onLeave);
411
440
  element.addEventListener('keydown', onKeyDown);
412
441
  return () => {
413
- element.removeEventListener('mouseenter', onEnter);
414
- element.removeEventListener('mouseleave', onLeave);
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
- side="right"
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="start"
480
+ align={align}
451
481
  // Measured from the PARENT PANEL's edge, not the trigger row's — see
452
482
  // `useFlyoutAnchor`.
453
- sideOffset={MENU_SUB_SIDE_OFFSET}
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({ children, className, style }: MenuSubContentProps) {
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 className={cx('pl-space-16', className)} style={style}>
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
  );
@@ -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, so it takes the full gutter. */
120
- gutter?: boolean;
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 = false,
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 ? ROW_GUTTER_CLASS : inset ? ROW_INSET_CLASS : false,
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
  );
@@ -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
- * Appended to whatever chrome the trigger draws of its own. A trigger that
193
- * draws none (a dropdown's, a popover's) simply has nothing to append to, so
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
  /**
@@ -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={{