@jobber/components 7.11.2 → 7.11.3

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.
@@ -1,5 +1,5 @@
1
1
  import React__default, { useState, useRef, useEffect, useCallback, useMemo, forwardRef } from 'react';
2
- import { u as useFloating, k as useClick, g as useListNavigation, c as useDismiss, d as useInteractions, F as FloatingPortal, i as FloatingFocusManager, l as useTransitionStyles } from '../floating-ui.react-es.js';
2
+ import { u as useFloating, k as useClick, j as useListNavigation, c as useDismiss, d as useInteractions, F as FloatingPortal, h as FloatingFocusManager, l as useTransitionStyles } from '../floating-ui.react-es.js';
3
3
  import classnames from 'classnames';
4
4
  import { tokens } from '@jobber/design';
5
5
  import { useCallbackRef, useDebounce, useSafeLayoutEffect, useIsMounted, useOnKeyDown } from '@jobber/hooks';
@@ -6,10 +6,7 @@ export declare function resolveComposableBaseProps(props: {
6
6
  readonly style?: React.CSSProperties;
7
7
  readonly UNSAFE_className?: string;
8
8
  readonly UNSAFE_style?: React.CSSProperties;
9
- }): {
10
- className: string | undefined;
11
- style: React.CSSProperties | undefined;
12
- };
9
+ }): Pick<import("../utils/mergeUnsafeProps").UnsafeProps, "className" | "style">;
13
10
  export declare function hasMenuSlot(children: React.ReactNode, slot: MenuSlotName): boolean;
14
11
  export declare function resolveMenuTriggerRender({ children, render, }: {
15
12
  readonly children?: React.ReactNode;
package/dist/Menu-cjs.js CHANGED
@@ -11,8 +11,8 @@ var Icon = require('./Icon-cjs.js');
11
11
  var useFormFieldFocus = require('./useFormFieldFocus-cjs.js');
12
12
  var maxHeight = require('./maxHeight-cjs.js');
13
13
  var floatingUi_reactDom = require('./floating-ui.react-dom-cjs.js');
14
- var tslib_es6 = require('./tslib.es6-cjs.js');
15
14
  var useRenderElement = require('./useRenderElement-cjs.js');
15
+ var tslib_es6 = require('./tslib.es6-cjs.js');
16
16
  var BottomSheet = require('./BottomSheet-cjs.js');
17
17
  var OverlaySeparator = require('./OverlaySeparator-cjs.js');
18
18
  var MenuSubmenuTrigger$1 = require('./MenuSubmenuTrigger-cjs.js');
@@ -200,7 +200,17 @@ function MenuPortal({ children }) {
200
200
 
201
201
  var styles$1 = {"submenuHeader":"Vw9MFreevMU-","submenuTitle":"wpNMcBuNwwY-","spinning":"nOEBQCC4Cos-"};
202
202
 
203
- var styles = {"wrapper":"fpi0W91w2ag-","floatingContainer":"ba-Kj6mvQUw-","menu":"-DayvgvIcVo-","legacySection":"VsRRunpS6Yo-","separator":"jnggqK3YTIU-","triggerWrapper":"oRQQVVq-yxA-","ariaMenu":"QInUBKqkrl0-","bottomSheetMenuContent":"J3CW8IU48RM-","ariaItem":"bWR8m7-LKg4-","ariaItemNoLeadingSlot":"fzLvI88EH3s-","ariaSection":"PH5vvtLgvXI-","composableGroup":"Q0ssxff-Qo4-","ariaRadioGroup":"_2hYsKO-OHAI-","ariaSectionHeader":"iJjIifpa9bk-","composableGroupHeader":"BklkzNPbJ5Q-","composableGroupLabel":"_5-p9DbyRav4-","sectionHeader":"Bq7pLWj3jm4-","legacyAction":"P4Sdaq0-lZs-","action":"M1BgN-oCmKw-","destructive":"U9ihZZavz9w-","overlay":"_7we5hh6kYs8-","bottomSheetSubmenuPopup":"nf47GCAYI-c-","menuHidden":"cuw8ct7rX6s-","bottomSheetSubmenuBody":"a6uZEXgX8sg-","fullWidth":"_5OJ7B6mFcwk-","screenReaderOnly":"Bzvkz60bwWE-","spinning":"_0-VzuzHdi8o-"};
203
+ var styles = {"wrapper":"fpi0W91w2ag-","floatingContainer":"ba-Kj6mvQUw-","menu":"-DayvgvIcVo-","legacySection":"VsRRunpS6Yo-","separator":"jnggqK3YTIU-","triggerWrapper":"oRQQVVq-yxA-","composableMenu":"atokGnmWVls-","bottomSheetMenuContent":"J3CW8IU48RM-","composableItem":"zSMkwrZodBk-","composableItemNoLeadingSlot":"qbDWOwkPouM-","composableSection":"_353OIWGazfE-","composableGroup":"Q0ssxff-Qo4-","composableRadioGroup":"_2VyPM45lQBE-","composableSectionHeader":"efA-ozx9w0w-","composableGroupHeader":"BklkzNPbJ5Q-","composableGroupLabel":"_5-p9DbyRav4-","sectionHeader":"Bq7pLWj3jm4-","legacyAction":"P4Sdaq0-lZs-","action":"M1BgN-oCmKw-","destructive":"U9ihZZavz9w-","overlay":"_7we5hh6kYs8-","bottomSheetSubmenuPopup":"nf47GCAYI-c-","menuHidden":"cuw8ct7rX6s-","bottomSheetSubmenuBody":"a6uZEXgX8sg-","fullWidth":"_5OJ7B6mFcwk-","screenReaderOnly":"Bzvkz60bwWE-","spinning":"_0-VzuzHdi8o-"};
204
+
205
+ function mergeUnsafeProps(props) {
206
+ return useRenderElement.mergeProps({
207
+ className: props.UNSAFE_className,
208
+ style: props.UNSAFE_style,
209
+ }, {
210
+ className: props.className,
211
+ style: props.style,
212
+ });
213
+ }
204
214
 
205
215
  function assignRef(ref, instance) {
206
216
  if (!ref) {
@@ -248,14 +258,10 @@ function stripNativeTypeFromButtonRenderTarget(element) {
248
258
  }
249
259
 
250
260
  // New composable menu pieces prefer standard DOM props, but we still accept the
251
- // old UNSAFE_* names during the migration window. When both are provided, the
252
- // standard prop wins because it is the forward-looking API.
261
+ // old UNSAFE_* names during the migration window. Base UI's merge semantics let
262
+ // either API path continue to work while standard props still win on conflicts.
253
263
  function resolveComposableBaseProps(props) {
254
- var _a, _b;
255
- return {
256
- className: (_a = props.className) !== null && _a !== void 0 ? _a : props.UNSAFE_className,
257
- style: (_b = props.style) !== null && _b !== void 0 ? _b : props.UNSAFE_style,
258
- };
264
+ return mergeUnsafeProps(props);
259
265
  }
260
266
  // Detects whether a composed item already includes a specific slot so each
261
267
  // shell can adjust layout without needing to understand every child shape.
@@ -264,6 +270,9 @@ function hasMenuSlot(children, slot) {
264
270
  if (!React.isValidElement(child)) {
265
271
  return false;
266
272
  }
273
+ if (typeof child.type === "string" || !("menuSlot" in child.type)) {
274
+ return false;
275
+ }
267
276
  return child.type.menuSlot === slot;
268
277
  });
269
278
  }
@@ -302,12 +311,18 @@ function useMenuItemContext() {
302
311
  }
303
312
  function SharedMenuItemIcon(props) {
304
313
  const { variation } = useMenuItemContext();
305
- return (React.createElement("div", { "data-menu-slot": "icon" },
314
+ return (
315
+ // TODO: Remove this wrapper once Icon can accept the data attributes needed
316
+ // for Menu slot styling directly.
317
+ React.createElement("div", { "data-menu-slot": "icon" },
306
318
  React.createElement(Icon.Icon, Object.assign({}, props, { color: variation === "destructive" ? "destructive" : props.color }))));
307
319
  }
308
320
  function SharedMenuItemLabel(props) {
309
321
  const { variation } = useMenuItemContext();
310
- return (React.createElement("div", { "data-menu-slot": "label" },
322
+ return (
323
+ // TODO: Remove this wrapper once Typography can accept the data attributes
324
+ // needed for Menu slot styling directly.
325
+ React.createElement("div", { "data-menu-slot": "label" },
311
326
  React.createElement(Typography.Typography, { element: "span", size: "base", fontWeight: "semiBold", textColor: variation === "destructive" ? "destructive" : "text" }, props.children)));
312
327
  }
313
328
  function SharedMenuItemPrefix(props) {
@@ -480,7 +495,7 @@ function handleBottomSheetMenuContainerKeyDown(event) {
480
495
  }
481
496
  function BottomSheetMenuSurface({ children, className, menuRef, style, }) {
482
497
  const { focusModalityRef } = useBottomSheetContext();
483
- return (React.createElement("div", { ref: menuRef, className: classnames(styles.ariaMenu, className), role: "menu", tabIndex: -1, onKeyDown: event => {
498
+ return (React.createElement("div", { ref: menuRef, className: classnames(styles.composableMenu, className), role: "menu", tabIndex: -1, onKeyDown: event => {
484
499
  focusModalityRef.current = "keyboard";
485
500
  handleBottomSheetMenuContainerKeyDown(event);
486
501
  }, style: style }, children));
@@ -559,7 +574,7 @@ function BottomSheetRadioGroup({ children, value, defaultValue, onValueChange, c
559
574
  onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(nextValue);
560
575
  },
561
576
  } },
562
- React.createElement("div", { className: classnames(styles.ariaRadioGroup, resolvedBaseProps.className), style: resolvedBaseProps.style }, children)));
577
+ React.createElement("div", { className: classnames(styles.composableRadioGroup, resolvedBaseProps.className), style: resolvedBaseProps.style }, children)));
563
578
  }
564
579
  function BottomSheetGroup(props) {
565
580
  const { className, style } = resolveComposableBaseProps(props);
@@ -577,8 +592,8 @@ const BottomSheetItem = React.forwardRef(function BottomSheetItem(props, ref) {
577
592
  const { className: itemClassName, style } = resolveComposableBaseProps(props);
578
593
  const hasLeadingContent = hasMenuSlot(props.children, "icon") ||
579
594
  hasMenuSlot(props.children, "prefix");
580
- const className = classnames(styles.action, styles.ariaItem, {
581
- [styles.ariaItemNoLeadingSlot]: !hasLeadingContent,
595
+ const className = classnames(styles.action, styles.composableItem, {
596
+ [styles.composableItemNoLeadingSlot]: !hasLeadingContent,
582
597
  }, {
583
598
  [styles.destructive]: props.variation === "destructive",
584
599
  }, itemClassName);
@@ -614,8 +629,8 @@ const BottomSheetRadioItem = React.forwardRef(function BottomSheetRadioItem(prop
614
629
  const hasCustomSuffix = hasMenuSlot(props.children, "suffix");
615
630
  const hasLeadingContent = hasMenuSlot(props.children, "icon") ||
616
631
  hasMenuSlot(props.children, "prefix");
617
- return (React.createElement("button", Object.assign({ ref: ref, className: classnames(styles.action, styles.ariaItem, {
618
- [styles.ariaItemNoLeadingSlot]: !hasLeadingContent,
632
+ return (React.createElement("button", Object.assign({ ref: ref, className: classnames(styles.action, styles.composableItem, {
633
+ [styles.composableItemNoLeadingSlot]: !hasLeadingContent,
619
634
  }, className), "data-highlighted": isHighlighted ? "" : undefined, style: style, type: "button", role: "menuitemradio", "aria-checked": checked }, interactionProps, { onClick: () => {
620
635
  radioGroup === null || radioGroup === void 0 ? void 0 : radioGroup.setValue(props.value);
621
636
  if (props.closeOnClick) {
@@ -660,8 +675,8 @@ const BottomSheetSubmenuTrigger = React.forwardRef(function BottomSheetSubmenuTr
660
675
  // header can read it the moment it mounts. Prefer the explicit textValue
661
676
  // used for type-to-select, and fall back to the rendered text content.
662
677
  titleRef.current = textValue !== null && textValue !== void 0 ? textValue : getTextContent(children).trim();
663
- return (React.createElement(MenuSubmenuTrigger$1.DrawerTrigger, Object.assign({ ref: ref, role: "menuitem", "aria-haspopup": "menu", "data-highlighted": isHighlighted ? "" : undefined, className: classnames(styles.action, styles.ariaItem, {
664
- [styles.ariaItemNoLeadingSlot]: !hasLeadingContent,
678
+ return (React.createElement(MenuSubmenuTrigger$1.DrawerTrigger, Object.assign({ ref: ref, role: "menuitem", "aria-haspopup": "menu", "data-highlighted": isHighlighted ? "" : undefined, className: classnames(styles.action, styles.composableItem, {
679
+ [styles.composableItemNoLeadingSlot]: !hasLeadingContent,
665
680
  }, resolvedBaseProps.className), style: resolvedBaseProps.style, nativeButton: true }, interactionProps, { render: React.createElement("button", { type: "button" }) }),
666
681
  children,
667
682
  !hasCustomSuffix ? (React.createElement("div", { "data-menu-slot": "suffix" },
@@ -686,7 +701,7 @@ function BottomSheetSubmenuContent({ children, className, style, UNSAFE_style, U
686
701
  React.createElement(MenuSubmenuTrigger$1.DrawerClose, { "aria-label": title ? `Back to ${title}` : "Back", render: React.createElement(Button.Button, { ariaLabel: title ? `Back to ${title}` : "Back", icon: "arrowLeft", type: "tertiary", variation: "subtle" }) }),
687
702
  title ? (React.createElement("div", { className: styles$1.submenuTitle },
688
703
  React.createElement(Typography.Typography, { element: "span", size: "base", fontWeight: "semiBold", textColor: "text" }, title))) : null),
689
- React.createElement(BottomSheetMenuSurface, { menuRef: menuRef, className: classnames(styles.bottomSheetSubmenuBody, styles.ariaSection, resolvedBaseProps.className) }, children))));
704
+ React.createElement(BottomSheetMenuSurface, { menuRef: menuRef, className: classnames(styles.bottomSheetSubmenuBody, styles.composableSection, resolvedBaseProps.className) }, children))));
690
705
  }
691
706
  function BottomSheetGroupLabel(props) {
692
707
  const { className, style } = resolveComposableBaseProps(props);
@@ -773,7 +788,7 @@ function MenuDropdownContent({ children, style, className, preferredPlacement, U
773
788
  const popupStyle = getMenuPopupStyle(resolvedBaseProps.style);
774
789
  return (React.createElement(MenuSubmenuTrigger$1.MenuPortal, null,
775
790
  React.createElement(MenuSubmenuTrigger$1.MenuPositioner, { className: styles.floatingContainer, style: floatingLayerStyle, align: align, side: side, sideOffset: MENU_OFFSET },
776
- React.createElement(MenuSubmenuTrigger$1.MenuPopup, { className: classnames(styles.menu, styles.ariaMenu, resolvedBaseProps.className), style: popupStyle }, children))));
791
+ React.createElement(MenuSubmenuTrigger$1.MenuPopup, { className: classnames(styles.menu, styles.composableMenu, resolvedBaseProps.className), style: popupStyle }, children))));
777
792
  }
778
793
  function MenuDropdownRadioGroup({ children, value, defaultValue, onValueChange, className, style, UNSAFE_style, UNSAFE_className, }) {
779
794
  const resolvedBaseProps = resolveComposableBaseProps({
@@ -784,7 +799,7 @@ function MenuDropdownRadioGroup({ children, value, defaultValue, onValueChange,
784
799
  });
785
800
  return (React.createElement(MenuSubmenuTrigger$1.MenuRadioGroup, { value: value, defaultValue: defaultValue, onValueChange: nextValue => {
786
801
  onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(String(nextValue));
787
- }, className: classnames(styles.ariaRadioGroup, resolvedBaseProps.className), style: resolvedBaseProps.style }, children));
802
+ }, className: classnames(styles.composableRadioGroup, resolvedBaseProps.className), style: resolvedBaseProps.style }, children));
788
803
  }
789
804
  function MenuDropdownSeparator({ style, className, UNSAFE_style, UNSAFE_className, }) {
790
805
  const resolvedBaseProps = resolveComposableBaseProps({
@@ -805,8 +820,8 @@ const MenuDropdownItem = React.forwardRef(function MenuDropdownItem(props, ref)
805
820
  const { textValue } = props;
806
821
  const hasLeadingContent = hasMenuSlot(props.children, "icon") ||
807
822
  hasMenuSlot(props.children, "prefix");
808
- const className = classnames(styles.action, styles.ariaItem, {
809
- [styles.ariaItemNoLeadingSlot]: !hasLeadingContent,
823
+ const className = classnames(styles.action, styles.composableItem, {
824
+ [styles.composableItemNoLeadingSlot]: !hasLeadingContent,
810
825
  [styles.destructive]: props.variation === "destructive",
811
826
  }, itemClassName);
812
827
  if (props.href) {
@@ -831,8 +846,8 @@ const MenuDropdownRadioItem = React.forwardRef(function MenuDropdownRadioItem(pr
831
846
  const hasCustomSuffix = hasMenuSlot(props.children, "suffix");
832
847
  const hasLeadingContent = hasMenuSlot(props.children, "icon") ||
833
848
  hasMenuSlot(props.children, "prefix");
834
- return (React.createElement(MenuSubmenuTrigger$1.MenuRadioItem, { ref: ref, className: classnames(styles.action, styles.ariaItem, {
835
- [styles.ariaItemNoLeadingSlot]: !hasLeadingContent,
849
+ return (React.createElement(MenuSubmenuTrigger$1.MenuRadioItem, { ref: ref, className: classnames(styles.action, styles.composableItem, {
850
+ [styles.composableItemNoLeadingSlot]: !hasLeadingContent,
836
851
  }, className), style: style, value: props.value, label: props.textValue, closeOnClick: props.closeOnClick, nativeButton: true, render: React.createElement("button", { type: "button" }) },
837
852
  React.createElement(MenuItemProvider, null,
838
853
  props.children,
@@ -849,8 +864,8 @@ const MenuDropdownSubmenuTrigger = React.forwardRef(function MenuDropdownSubmenu
849
864
  const hasCustomSuffix = hasMenuSlot(props.children, "suffix");
850
865
  const hasLeadingContent = hasMenuSlot(props.children, "icon") ||
851
866
  hasMenuSlot(props.children, "prefix");
852
- return (React.createElement(MenuSubmenuTrigger$1.MenuSubmenuTrigger, { ref: ref, className: classnames(styles.action, styles.ariaItem, {
853
- [styles.ariaItemNoLeadingSlot]: !hasLeadingContent,
867
+ return (React.createElement(MenuSubmenuTrigger$1.MenuSubmenuTrigger, { ref: ref, className: classnames(styles.action, styles.composableItem, {
868
+ [styles.composableItemNoLeadingSlot]: !hasLeadingContent,
854
869
  }, resolvedBaseProps.className), style: resolvedBaseProps.style, label: props.textValue, nativeButton: true, render: React.createElement("button", { type: "button" }) },
855
870
  props.children,
856
871
  !hasCustomSuffix ? (React.createElement("div", { "data-menu-slot": "suffix" },
@@ -867,7 +882,7 @@ function MenuDropdownSubmenuContent({ children, className, style, UNSAFE_style,
867
882
  const popupStyle = getMenuPopupStyle(resolvedBaseProps.style);
868
883
  return (React.createElement(MenuSubmenuTrigger$1.MenuPortal, null,
869
884
  React.createElement(MenuSubmenuTrigger$1.MenuPositioner, { className: styles.floatingContainer, style: floatingLayerStyle, align: "start", side: "right", sideOffset: MENU_OFFSET },
870
- React.createElement(MenuSubmenuTrigger$1.MenuPopup, { className: classnames(styles.menu, styles.ariaMenu, resolvedBaseProps.className), style: popupStyle }, children))));
885
+ React.createElement(MenuSubmenuTrigger$1.MenuPopup, { className: classnames(styles.menu, styles.composableMenu, resolvedBaseProps.className), style: popupStyle }, children))));
871
886
  }
872
887
  function MenuDropdownGroupLabel(props) {
873
888
  const { className, style } = resolveComposableBaseProps(props);
package/dist/Menu-es.js CHANGED
@@ -2,15 +2,15 @@ import React__default, { useState, useRef, useId, useMemo } from 'react';
2
2
  import { useWindowDimensions, useRefocusOnActivator } from '@jobber/hooks';
3
3
  import classnames from 'classnames';
4
4
  import { AnimatePresence, motion } from 'framer-motion';
5
- import { u as useFloating, c as useDismiss, g as useListNavigation, d as useInteractions, F as FloatingPortal } from './floating-ui.react-es.js';
5
+ import { u as useFloating, c as useDismiss, j as useListNavigation, d as useInteractions, F as FloatingPortal } from './floating-ui.react-es.js';
6
6
  import { B as Button } from './Button-es.js';
7
7
  import { T as Typography } from './Typography-es.js';
8
8
  import { I as Icon } from './Icon-es.js';
9
9
  import { f as formFieldFocusAttribute } from './useFormFieldFocus-es.js';
10
10
  import { c as calculateMaxHeight } from './maxHeight-es.js';
11
11
  import { o as offset, f as flip, d as size, b as autoUpdate } from './floating-ui.react-dom-es.js';
12
- import { _ as __rest } from './tslib.es6-es.js';
13
12
  import { m as mergeProps } from './useRenderElement-es.js';
13
+ import { _ as __rest } from './tslib.es6-es.js';
14
14
  import { B as BottomSheet } from './BottomSheet-es.js';
15
15
  import { O as OverlaySeparator } from './OverlaySeparator-es.js';
16
16
  import { D as DrawerTrigger, a as DrawerTitle, b as DrawerClose, M as MenuTrigger$1, c as MenuLinkItem, d as MenuItem$1, e as MenuRadioItem$1, f as MenuRadioItemIndicator, g as MenuSubmenuTrigger$1, h as MenuRoot, i as MenuPortal$1, j as MenuPositioner, k as MenuPopup, l as MenuRadioGroup$1, m as MenuGroup$1, n as MenuSubmenuRoot, o as MenuGroupLabel$1 } from './MenuSubmenuTrigger-es.js';
@@ -198,7 +198,17 @@ function MenuPortal({ children }) {
198
198
 
199
199
  var styles$1 = {"submenuHeader":"Vw9MFreevMU-","submenuTitle":"wpNMcBuNwwY-","spinning":"nOEBQCC4Cos-"};
200
200
 
201
- var styles = {"wrapper":"fpi0W91w2ag-","floatingContainer":"ba-Kj6mvQUw-","menu":"-DayvgvIcVo-","legacySection":"VsRRunpS6Yo-","separator":"jnggqK3YTIU-","triggerWrapper":"oRQQVVq-yxA-","ariaMenu":"QInUBKqkrl0-","bottomSheetMenuContent":"J3CW8IU48RM-","ariaItem":"bWR8m7-LKg4-","ariaItemNoLeadingSlot":"fzLvI88EH3s-","ariaSection":"PH5vvtLgvXI-","composableGroup":"Q0ssxff-Qo4-","ariaRadioGroup":"_2hYsKO-OHAI-","ariaSectionHeader":"iJjIifpa9bk-","composableGroupHeader":"BklkzNPbJ5Q-","composableGroupLabel":"_5-p9DbyRav4-","sectionHeader":"Bq7pLWj3jm4-","legacyAction":"P4Sdaq0-lZs-","action":"M1BgN-oCmKw-","destructive":"U9ihZZavz9w-","overlay":"_7we5hh6kYs8-","bottomSheetSubmenuPopup":"nf47GCAYI-c-","menuHidden":"cuw8ct7rX6s-","bottomSheetSubmenuBody":"a6uZEXgX8sg-","fullWidth":"_5OJ7B6mFcwk-","screenReaderOnly":"Bzvkz60bwWE-","spinning":"_0-VzuzHdi8o-"};
201
+ var styles = {"wrapper":"fpi0W91w2ag-","floatingContainer":"ba-Kj6mvQUw-","menu":"-DayvgvIcVo-","legacySection":"VsRRunpS6Yo-","separator":"jnggqK3YTIU-","triggerWrapper":"oRQQVVq-yxA-","composableMenu":"atokGnmWVls-","bottomSheetMenuContent":"J3CW8IU48RM-","composableItem":"zSMkwrZodBk-","composableItemNoLeadingSlot":"qbDWOwkPouM-","composableSection":"_353OIWGazfE-","composableGroup":"Q0ssxff-Qo4-","composableRadioGroup":"_2VyPM45lQBE-","composableSectionHeader":"efA-ozx9w0w-","composableGroupHeader":"BklkzNPbJ5Q-","composableGroupLabel":"_5-p9DbyRav4-","sectionHeader":"Bq7pLWj3jm4-","legacyAction":"P4Sdaq0-lZs-","action":"M1BgN-oCmKw-","destructive":"U9ihZZavz9w-","overlay":"_7we5hh6kYs8-","bottomSheetSubmenuPopup":"nf47GCAYI-c-","menuHidden":"cuw8ct7rX6s-","bottomSheetSubmenuBody":"a6uZEXgX8sg-","fullWidth":"_5OJ7B6mFcwk-","screenReaderOnly":"Bzvkz60bwWE-","spinning":"_0-VzuzHdi8o-"};
202
+
203
+ function mergeUnsafeProps(props) {
204
+ return mergeProps({
205
+ className: props.UNSAFE_className,
206
+ style: props.UNSAFE_style,
207
+ }, {
208
+ className: props.className,
209
+ style: props.style,
210
+ });
211
+ }
202
212
 
203
213
  function assignRef(ref, instance) {
204
214
  if (!ref) {
@@ -246,14 +256,10 @@ function stripNativeTypeFromButtonRenderTarget(element) {
246
256
  }
247
257
 
248
258
  // New composable menu pieces prefer standard DOM props, but we still accept the
249
- // old UNSAFE_* names during the migration window. When both are provided, the
250
- // standard prop wins because it is the forward-looking API.
259
+ // old UNSAFE_* names during the migration window. Base UI's merge semantics let
260
+ // either API path continue to work while standard props still win on conflicts.
251
261
  function resolveComposableBaseProps(props) {
252
- var _a, _b;
253
- return {
254
- className: (_a = props.className) !== null && _a !== void 0 ? _a : props.UNSAFE_className,
255
- style: (_b = props.style) !== null && _b !== void 0 ? _b : props.UNSAFE_style,
256
- };
262
+ return mergeUnsafeProps(props);
257
263
  }
258
264
  // Detects whether a composed item already includes a specific slot so each
259
265
  // shell can adjust layout without needing to understand every child shape.
@@ -262,6 +268,9 @@ function hasMenuSlot(children, slot) {
262
268
  if (!React__default.isValidElement(child)) {
263
269
  return false;
264
270
  }
271
+ if (typeof child.type === "string" || !("menuSlot" in child.type)) {
272
+ return false;
273
+ }
265
274
  return child.type.menuSlot === slot;
266
275
  });
267
276
  }
@@ -300,12 +309,18 @@ function useMenuItemContext() {
300
309
  }
301
310
  function SharedMenuItemIcon(props) {
302
311
  const { variation } = useMenuItemContext();
303
- return (React__default.createElement("div", { "data-menu-slot": "icon" },
312
+ return (
313
+ // TODO: Remove this wrapper once Icon can accept the data attributes needed
314
+ // for Menu slot styling directly.
315
+ React__default.createElement("div", { "data-menu-slot": "icon" },
304
316
  React__default.createElement(Icon, Object.assign({}, props, { color: variation === "destructive" ? "destructive" : props.color }))));
305
317
  }
306
318
  function SharedMenuItemLabel(props) {
307
319
  const { variation } = useMenuItemContext();
308
- return (React__default.createElement("div", { "data-menu-slot": "label" },
320
+ return (
321
+ // TODO: Remove this wrapper once Typography can accept the data attributes
322
+ // needed for Menu slot styling directly.
323
+ React__default.createElement("div", { "data-menu-slot": "label" },
309
324
  React__default.createElement(Typography, { element: "span", size: "base", fontWeight: "semiBold", textColor: variation === "destructive" ? "destructive" : "text" }, props.children)));
310
325
  }
311
326
  function SharedMenuItemPrefix(props) {
@@ -478,7 +493,7 @@ function handleBottomSheetMenuContainerKeyDown(event) {
478
493
  }
479
494
  function BottomSheetMenuSurface({ children, className, menuRef, style, }) {
480
495
  const { focusModalityRef } = useBottomSheetContext();
481
- return (React__default.createElement("div", { ref: menuRef, className: classnames(styles.ariaMenu, className), role: "menu", tabIndex: -1, onKeyDown: event => {
496
+ return (React__default.createElement("div", { ref: menuRef, className: classnames(styles.composableMenu, className), role: "menu", tabIndex: -1, onKeyDown: event => {
482
497
  focusModalityRef.current = "keyboard";
483
498
  handleBottomSheetMenuContainerKeyDown(event);
484
499
  }, style: style }, children));
@@ -557,7 +572,7 @@ function BottomSheetRadioGroup({ children, value, defaultValue, onValueChange, c
557
572
  onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(nextValue);
558
573
  },
559
574
  } },
560
- React__default.createElement("div", { className: classnames(styles.ariaRadioGroup, resolvedBaseProps.className), style: resolvedBaseProps.style }, children)));
575
+ React__default.createElement("div", { className: classnames(styles.composableRadioGroup, resolvedBaseProps.className), style: resolvedBaseProps.style }, children)));
561
576
  }
562
577
  function BottomSheetGroup(props) {
563
578
  const { className, style } = resolveComposableBaseProps(props);
@@ -575,8 +590,8 @@ const BottomSheetItem = React__default.forwardRef(function BottomSheetItem(props
575
590
  const { className: itemClassName, style } = resolveComposableBaseProps(props);
576
591
  const hasLeadingContent = hasMenuSlot(props.children, "icon") ||
577
592
  hasMenuSlot(props.children, "prefix");
578
- const className = classnames(styles.action, styles.ariaItem, {
579
- [styles.ariaItemNoLeadingSlot]: !hasLeadingContent,
593
+ const className = classnames(styles.action, styles.composableItem, {
594
+ [styles.composableItemNoLeadingSlot]: !hasLeadingContent,
580
595
  }, {
581
596
  [styles.destructive]: props.variation === "destructive",
582
597
  }, itemClassName);
@@ -612,8 +627,8 @@ const BottomSheetRadioItem = React__default.forwardRef(function BottomSheetRadio
612
627
  const hasCustomSuffix = hasMenuSlot(props.children, "suffix");
613
628
  const hasLeadingContent = hasMenuSlot(props.children, "icon") ||
614
629
  hasMenuSlot(props.children, "prefix");
615
- return (React__default.createElement("button", Object.assign({ ref: ref, className: classnames(styles.action, styles.ariaItem, {
616
- [styles.ariaItemNoLeadingSlot]: !hasLeadingContent,
630
+ return (React__default.createElement("button", Object.assign({ ref: ref, className: classnames(styles.action, styles.composableItem, {
631
+ [styles.composableItemNoLeadingSlot]: !hasLeadingContent,
617
632
  }, className), "data-highlighted": isHighlighted ? "" : undefined, style: style, type: "button", role: "menuitemradio", "aria-checked": checked }, interactionProps, { onClick: () => {
618
633
  radioGroup === null || radioGroup === void 0 ? void 0 : radioGroup.setValue(props.value);
619
634
  if (props.closeOnClick) {
@@ -658,8 +673,8 @@ const BottomSheetSubmenuTrigger = React__default.forwardRef(function BottomSheet
658
673
  // header can read it the moment it mounts. Prefer the explicit textValue
659
674
  // used for type-to-select, and fall back to the rendered text content.
660
675
  titleRef.current = textValue !== null && textValue !== void 0 ? textValue : getTextContent(children).trim();
661
- return (React__default.createElement(DrawerTrigger, Object.assign({ ref: ref, role: "menuitem", "aria-haspopup": "menu", "data-highlighted": isHighlighted ? "" : undefined, className: classnames(styles.action, styles.ariaItem, {
662
- [styles.ariaItemNoLeadingSlot]: !hasLeadingContent,
676
+ return (React__default.createElement(DrawerTrigger, Object.assign({ ref: ref, role: "menuitem", "aria-haspopup": "menu", "data-highlighted": isHighlighted ? "" : undefined, className: classnames(styles.action, styles.composableItem, {
677
+ [styles.composableItemNoLeadingSlot]: !hasLeadingContent,
663
678
  }, resolvedBaseProps.className), style: resolvedBaseProps.style, nativeButton: true }, interactionProps, { render: React__default.createElement("button", { type: "button" }) }),
664
679
  children,
665
680
  !hasCustomSuffix ? (React__default.createElement("div", { "data-menu-slot": "suffix" },
@@ -684,7 +699,7 @@ function BottomSheetSubmenuContent({ children, className, style, UNSAFE_style, U
684
699
  React__default.createElement(DrawerClose, { "aria-label": title ? `Back to ${title}` : "Back", render: React__default.createElement(Button, { ariaLabel: title ? `Back to ${title}` : "Back", icon: "arrowLeft", type: "tertiary", variation: "subtle" }) }),
685
700
  title ? (React__default.createElement("div", { className: styles$1.submenuTitle },
686
701
  React__default.createElement(Typography, { element: "span", size: "base", fontWeight: "semiBold", textColor: "text" }, title))) : null),
687
- React__default.createElement(BottomSheetMenuSurface, { menuRef: menuRef, className: classnames(styles.bottomSheetSubmenuBody, styles.ariaSection, resolvedBaseProps.className) }, children))));
702
+ React__default.createElement(BottomSheetMenuSurface, { menuRef: menuRef, className: classnames(styles.bottomSheetSubmenuBody, styles.composableSection, resolvedBaseProps.className) }, children))));
688
703
  }
689
704
  function BottomSheetGroupLabel(props) {
690
705
  const { className, style } = resolveComposableBaseProps(props);
@@ -771,7 +786,7 @@ function MenuDropdownContent({ children, style, className, preferredPlacement, U
771
786
  const popupStyle = getMenuPopupStyle(resolvedBaseProps.style);
772
787
  return (React__default.createElement(MenuPortal$1, null,
773
788
  React__default.createElement(MenuPositioner, { className: styles.floatingContainer, style: floatingLayerStyle, align: align, side: side, sideOffset: MENU_OFFSET },
774
- React__default.createElement(MenuPopup, { className: classnames(styles.menu, styles.ariaMenu, resolvedBaseProps.className), style: popupStyle }, children))));
789
+ React__default.createElement(MenuPopup, { className: classnames(styles.menu, styles.composableMenu, resolvedBaseProps.className), style: popupStyle }, children))));
775
790
  }
776
791
  function MenuDropdownRadioGroup({ children, value, defaultValue, onValueChange, className, style, UNSAFE_style, UNSAFE_className, }) {
777
792
  const resolvedBaseProps = resolveComposableBaseProps({
@@ -782,7 +797,7 @@ function MenuDropdownRadioGroup({ children, value, defaultValue, onValueChange,
782
797
  });
783
798
  return (React__default.createElement(MenuRadioGroup$1, { value: value, defaultValue: defaultValue, onValueChange: nextValue => {
784
799
  onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(String(nextValue));
785
- }, className: classnames(styles.ariaRadioGroup, resolvedBaseProps.className), style: resolvedBaseProps.style }, children));
800
+ }, className: classnames(styles.composableRadioGroup, resolvedBaseProps.className), style: resolvedBaseProps.style }, children));
786
801
  }
787
802
  function MenuDropdownSeparator({ style, className, UNSAFE_style, UNSAFE_className, }) {
788
803
  const resolvedBaseProps = resolveComposableBaseProps({
@@ -803,8 +818,8 @@ const MenuDropdownItem = React__default.forwardRef(function MenuDropdownItem(pro
803
818
  const { textValue } = props;
804
819
  const hasLeadingContent = hasMenuSlot(props.children, "icon") ||
805
820
  hasMenuSlot(props.children, "prefix");
806
- const className = classnames(styles.action, styles.ariaItem, {
807
- [styles.ariaItemNoLeadingSlot]: !hasLeadingContent,
821
+ const className = classnames(styles.action, styles.composableItem, {
822
+ [styles.composableItemNoLeadingSlot]: !hasLeadingContent,
808
823
  [styles.destructive]: props.variation === "destructive",
809
824
  }, itemClassName);
810
825
  if (props.href) {
@@ -829,8 +844,8 @@ const MenuDropdownRadioItem = React__default.forwardRef(function MenuDropdownRad
829
844
  const hasCustomSuffix = hasMenuSlot(props.children, "suffix");
830
845
  const hasLeadingContent = hasMenuSlot(props.children, "icon") ||
831
846
  hasMenuSlot(props.children, "prefix");
832
- return (React__default.createElement(MenuRadioItem$1, { ref: ref, className: classnames(styles.action, styles.ariaItem, {
833
- [styles.ariaItemNoLeadingSlot]: !hasLeadingContent,
847
+ return (React__default.createElement(MenuRadioItem$1, { ref: ref, className: classnames(styles.action, styles.composableItem, {
848
+ [styles.composableItemNoLeadingSlot]: !hasLeadingContent,
834
849
  }, className), style: style, value: props.value, label: props.textValue, closeOnClick: props.closeOnClick, nativeButton: true, render: React__default.createElement("button", { type: "button" }) },
835
850
  React__default.createElement(MenuItemProvider, null,
836
851
  props.children,
@@ -847,8 +862,8 @@ const MenuDropdownSubmenuTrigger = React__default.forwardRef(function MenuDropdo
847
862
  const hasCustomSuffix = hasMenuSlot(props.children, "suffix");
848
863
  const hasLeadingContent = hasMenuSlot(props.children, "icon") ||
849
864
  hasMenuSlot(props.children, "prefix");
850
- return (React__default.createElement(MenuSubmenuTrigger$1, { ref: ref, className: classnames(styles.action, styles.ariaItem, {
851
- [styles.ariaItemNoLeadingSlot]: !hasLeadingContent,
865
+ return (React__default.createElement(MenuSubmenuTrigger$1, { ref: ref, className: classnames(styles.action, styles.composableItem, {
866
+ [styles.composableItemNoLeadingSlot]: !hasLeadingContent,
852
867
  }, resolvedBaseProps.className), style: resolvedBaseProps.style, label: props.textValue, nativeButton: true, render: React__default.createElement("button", { type: "button" }) },
853
868
  props.children,
854
869
  !hasCustomSuffix ? (React__default.createElement("div", { "data-menu-slot": "suffix" },
@@ -865,7 +880,7 @@ function MenuDropdownSubmenuContent({ children, className, style, UNSAFE_style,
865
880
  const popupStyle = getMenuPopupStyle(resolvedBaseProps.style);
866
881
  return (React__default.createElement(MenuPortal$1, null,
867
882
  React__default.createElement(MenuPositioner, { className: styles.floatingContainer, style: floatingLayerStyle, align: "start", side: "right", sideOffset: MENU_OFFSET },
868
- React__default.createElement(MenuPopup, { className: classnames(styles.menu, styles.ariaMenu, resolvedBaseProps.className), style: popupStyle }, children))));
883
+ React__default.createElement(MenuPopup, { className: classnames(styles.menu, styles.composableMenu, resolvedBaseProps.className), style: popupStyle }, children))));
869
884
  }
870
885
  function MenuDropdownGroupLabel(props) {
871
886
  const { className, style } = resolveComposableBaseProps(props);
@@ -7,7 +7,7 @@ import { H as Heading } from '../Heading-es.js';
7
7
  import { B as Button } from '../Button-es.js';
8
8
  import { B as ButtonDismiss } from '../ButtonDismiss-es.js';
9
9
  import { n as noop } from '../noop-es.js';
10
- import { b as useFloatingNodeId, u as useFloating, c as useDismiss, h as useRole, d as useInteractions, a as useFloatingParentNodeId, e as FloatingTree, f as FloatingNode, F as FloatingPortal, i as FloatingFocusManager, j as FloatingOverlay } from '../floating-ui.react-es.js';
10
+ import { b as useFloatingNodeId, u as useFloating, c as useDismiss, g as useRole, d as useInteractions, a as useFloatingParentNodeId, e as FloatingTree, f as FloatingNode, F as FloatingPortal, h as FloatingFocusManager, i as FloatingOverlay } from '../floating-ui.react-es.js';
11
11
  import { b as identity } from '../identity-es.js';
12
12
  import { A as AtlantisPortalContent } from '../AtlantisPortalContent-es.js';
13
13
  import '../Typography-es.js';
@@ -3233,4 +3233,4 @@ function useTransitionStyles(context, props) {
3233
3233
  };
3234
3234
  }
3235
3235
 
3236
- export { FloatingPortal as F, useFloatingParentNodeId as a, useFloatingNodeId as b, useDismiss as c, useInteractions as d, FloatingTree as e, FloatingNode as f, useListNavigation as g, useRole as h, FloatingFocusManager as i, FloatingOverlay as j, useClick as k, useTransitionStyles as l, FloatingArrow as m, useFloating as u };
3236
+ export { FloatingPortal as F, useFloatingParentNodeId as a, useFloatingNodeId as b, useDismiss as c, useInteractions as d, FloatingTree as e, FloatingNode as f, useRole as g, FloatingFocusManager as h, FloatingOverlay as i, useListNavigation as j, useClick as k, useTransitionStyles as l, FloatingArrow as m, useFloating as u };
package/dist/styles.css CHANGED
@@ -3501,7 +3501,7 @@ a._7BLGtYNuJOU-.zgRx3ehZ2z8-:hover {
3501
3501
  outline: none;
3502
3502
  }
3503
3503
 
3504
- .QInUBKqkrl0- {
3504
+ .atokGnmWVls- {
3505
3505
  display: grid;
3506
3506
  max-height: inherit;
3507
3507
  grid-template-columns: auto 1fr auto;
@@ -3521,7 +3521,7 @@ a._7BLGtYNuJOU-.zgRx3ehZ2z8-:hover {
3521
3521
  padding-bottom: var(--menu-space);
3522
3522
  }
3523
3523
 
3524
- .bWR8m7-LKg4- {
3524
+ .zSMkwrZodBk- {
3525
3525
  display: grid;
3526
3526
  grid-template-columns: subgrid;
3527
3527
  grid-column: 1 / -1;
@@ -3532,8 +3532,8 @@ a._7BLGtYNuJOU-.zgRx3ehZ2z8-:hover {
3532
3532
  gap: var(--menu-item-gap);
3533
3533
  }
3534
3534
 
3535
- .bWR8m7-LKg4- > [data-menu-slot="icon"],
3536
- .bWR8m7-LKg4- > [data-menu-slot="prefix"] {
3535
+ .zSMkwrZodBk- > [data-menu-slot="icon"],
3536
+ .zSMkwrZodBk- > [data-menu-slot="prefix"] {
3537
3537
  display: -ms-inline-flexbox;
3538
3538
  display: inline-flex;
3539
3539
  -ms-flex-align: center;
@@ -3543,18 +3543,18 @@ a._7BLGtYNuJOU-.zgRx3ehZ2z8-:hover {
3543
3543
  grid-row-start: 1;
3544
3544
  }
3545
3545
 
3546
- .bWR8m7-LKg4- > [data-menu-slot="label"] {
3546
+ .zSMkwrZodBk- > [data-menu-slot="label"] {
3547
3547
  grid-column-start: 2;
3548
3548
  width: 100%;
3549
3549
  min-width: 0;
3550
3550
  justify-self: start;
3551
3551
  }
3552
3552
 
3553
- .fzLvI88EH3s- > [data-menu-slot="label"] {
3553
+ .qbDWOwkPouM- > [data-menu-slot="label"] {
3554
3554
  grid-column: 1 / 3;
3555
3555
  }
3556
3556
 
3557
- .bWR8m7-LKg4- > [data-menu-slot="suffix"] {
3557
+ .zSMkwrZodBk- > [data-menu-slot="suffix"] {
3558
3558
  display: -ms-inline-flexbox;
3559
3559
  display: inline-flex;
3560
3560
  -ms-flex-align: center;
@@ -3568,11 +3568,11 @@ a._7BLGtYNuJOU-.zgRx3ehZ2z8-:hover {
3568
3568
  min-width: calc(var(--base-unit) * 1.5);
3569
3569
  }
3570
3570
 
3571
- .bWR8m7-LKg4- > [data-menu-slot="suffix"][data-unchecked] {
3571
+ .zSMkwrZodBk- > [data-menu-slot="suffix"][data-unchecked] {
3572
3572
  visibility: hidden;
3573
3573
  }
3574
3574
 
3575
- .PH5vvtLgvXI-,
3575
+ ._353OIWGazfE-,
3576
3576
  .Q0ssxff-Qo4- {
3577
3577
  display: grid;
3578
3578
  grid-template-columns: subgrid;
@@ -3580,25 +3580,25 @@ a._7BLGtYNuJOU-.zgRx3ehZ2z8-:hover {
3580
3580
  grid-column-start: 1;
3581
3581
  }
3582
3582
 
3583
- ._2hYsKO-OHAI- {
3583
+ ._2VyPM45lQBE- {
3584
3584
  display: grid;
3585
3585
  grid-template-columns: subgrid;
3586
3586
  grid-column: 1 / -1;
3587
3587
  grid-column-start: 1;
3588
3588
  }
3589
3589
 
3590
- .QInUBKqkrl0- .PH5vvtLgvXI-:not(:first-child),
3591
- .QInUBKqkrl0- .Q0ssxff-Qo4-:not(:first-child) {
3590
+ .atokGnmWVls- ._353OIWGazfE-:not(:first-child),
3591
+ .atokGnmWVls- .Q0ssxff-Qo4-:not(:first-child) {
3592
3592
  margin-top: 8px;
3593
3593
  margin-top: var(--space-small);
3594
3594
  }
3595
3595
 
3596
- .QInUBKqkrl0- .jnggqK3YTIU- + .PH5vvtLgvXI-,
3597
- .QInUBKqkrl0- .jnggqK3YTIU- + .Q0ssxff-Qo4- {
3596
+ .atokGnmWVls- .jnggqK3YTIU- + ._353OIWGazfE-,
3597
+ .atokGnmWVls- .jnggqK3YTIU- + .Q0ssxff-Qo4- {
3598
3598
  margin-top: 0;
3599
3599
  }
3600
3600
 
3601
- .iJjIifpa9bk-,
3601
+ .efA-ozx9w0w-,
3602
3602
  .BklkzNPbJ5Q- {
3603
3603
  grid-column: 1 / -1;
3604
3604
  grid-column-start: 1;
@@ -3668,7 +3668,7 @@ a._7BLGtYNuJOU-.zgRx3ehZ2z8-:hover {
3668
3668
  -webkit-tap-highlight-color: transparent;
3669
3669
  }
3670
3670
 
3671
- .fzLvI88EH3s- {
3671
+ .qbDWOwkPouM- {
3672
3672
  --menu-item-padding-right: var(--space-smaller);
3673
3673
  }
3674
3674
 
@@ -0,0 +1,8 @@
1
+ import type { CSSProperties } from "react";
2
+ export interface UnsafeProps {
3
+ readonly className?: string;
4
+ readonly style?: CSSProperties;
5
+ readonly UNSAFE_className?: string;
6
+ readonly UNSAFE_style?: CSSProperties;
7
+ }
8
+ export declare function mergeUnsafeProps(props: UnsafeProps): Pick<UnsafeProps, "className" | "style">;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jobber/components",
3
- "version": "7.11.2",
3
+ "version": "7.11.3",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -583,5 +583,5 @@
583
583
  "> 1%",
584
584
  "IE 10"
585
585
  ],
586
- "gitHead": "af4bf90a9ac5663ff26d0cfad49e3761457e4646"
586
+ "gitHead": "1adc75fc6e71cd2166f7c5b497dad8d0c095f35b"
587
587
  }