reshaped 3.2.4 → 3.2.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.
@@ -5,7 +5,7 @@ import { classNames } from "../../utilities/helpers.js";
5
5
  import * as keys from "../../constants/keys.js";
6
6
  import s from "./Actionable.module.css";
7
7
  const Actionable = forwardRef((props, ref) => {
8
- const { children, href, onClick, type, disabled, insetFocus, disableFocusRing, borderRadius, as, fullWidth, className, attributes, } = props;
8
+ const { children, href, onClick, type, disabled, insetFocus, disableFocusRing, borderRadius, as, stopPropagation, fullWidth, className, attributes, } = props;
9
9
  const rootClassNames = classNames(s.root, className, disabled && s["--disabled"], borderRadius && s[`--radius-${borderRadius}`], insetFocus && s["--inset"], disableFocusRing && s["--disabled-focus-ring"], fullWidth && s["--full-width"]);
10
10
  const rootAttributes = { ...attributes };
11
11
  const hasClickHandler = onClick || attributes?.onClick;
@@ -38,6 +38,8 @@ const Actionable = forwardRef((props, ref) => {
38
38
  const handlePress = (event) => {
39
39
  if (disabled)
40
40
  return;
41
+ if (stopPropagation)
42
+ event.stopPropagation();
41
43
  onClick?.(event);
42
44
  attributes?.onClick?.(event);
43
45
  };
@@ -48,6 +50,8 @@ const Actionable = forwardRef((props, ref) => {
48
50
  return;
49
51
  if (rootAttributes.role !== "button")
50
52
  return;
53
+ if (stopPropagation)
54
+ event.stopPropagation();
51
55
  event.preventDefault();
52
56
  handlePress(event);
53
57
  };
@@ -10,6 +10,7 @@ export type Props = {
10
10
  insetFocus?: boolean;
11
11
  disableFocusRing?: boolean;
12
12
  borderRadius?: "inherit";
13
+ stopPropagation?: boolean;
13
14
  as?: keyof JSX.IntrinsicElements;
14
15
  className?: G.ClassName;
15
16
  attributes?: G.Attributes<"button"> & Omit<JSX.IntrinsicElements["a"], keyof G.Attributes<"button">> & {
@@ -8,7 +8,7 @@ import ButtonGroup from "./ButtonGroup.js";
8
8
  import ButtonAligner from "./ButtonAligner.js";
9
9
  import s from "./Button.module.css";
10
10
  const Button = forwardRef((props, ref) => {
11
- const { variant = "solid", color = "neutral", elevated, highlighted, fullWidth, loading, disabled, type, href, size = "medium", children, rounded, onClick, icon, endIcon, as, className, attributes, } = props;
11
+ const { variant = "solid", color = "neutral", elevated, highlighted, fullWidth, loading, disabled, type, href, size = "medium", children, rounded, onClick, icon, endIcon, stopPropagation, as, className, attributes, } = props;
12
12
  const iconOnly = (icon || endIcon) && !children;
13
13
  const rootClassName = classNames(s.root, className, color && s[`--color-${color}`], variant && s[`--variant-${variant}`], responsiveClassNames(s, "--size", size), responsiveClassNames(s, "--full-width", fullWidth), elevated && variant !== "ghost" && s["--elevated"], rounded && s["--rounded"], disabled && s["--disabled"], loading && s["--loading"], highlighted && s["--highlighted"], iconOnly && s["--icon-only"]);
14
14
  const renderIcon = (position) => {
@@ -27,7 +27,7 @@ const Button = forwardRef((props, ref) => {
27
27
  });
28
28
  return (_jsx(Icon, { className: iconClassName, svg: (position === "start" ? icon : endIcon), size: iconSize, autoWidth: true }));
29
29
  };
30
- return (_jsxs(Actionable, { disabled: disabled || loading, className: rootClassName, attributes: { ...attributes, "data-rs-aligner-target": true }, type: type, onClick: onClick, href: href, ref: ref, as: as, children: [loading && (_jsx("div", { className: s.loader, children: _jsx(Loader, { color: "inherit" }) })), renderIcon("start"), children && _jsx("span", { className: s.text, children: children }), renderIcon("end")] }));
30
+ return (_jsxs(Actionable, { disabled: disabled || loading, className: rootClassName, attributes: { ...attributes, "data-rs-aligner-target": true }, type: type, onClick: onClick, href: href, ref: ref, as: as, stopPropagation: stopPropagation, children: [loading && (_jsx("div", { className: s.loader, children: _jsx(Loader, { color: "inherit" }) })), renderIcon("start"), children && _jsx("span", { className: s.text, children: children }), renderIcon("end")] }));
31
31
  });
32
32
  Button.Group = ButtonGroup;
33
33
  Button.Aligner = ButtonAligner;
@@ -4,7 +4,7 @@ import type { ActionableProps } from "../Actionable";
4
4
  import type { AlignerProps as BaseAlignerProps } from "../_private/Aligner";
5
5
  import type * as G from "../../types/global";
6
6
  export type Size = "xlarge" | "large" | "medium" | "small";
7
- export type Props = Pick<ActionableProps, "attributes" | "className" | "disabled" | "children" | "href" | "onClick" | "type" | "as"> & {
7
+ export type Props = Pick<ActionableProps, "attributes" | "className" | "disabled" | "children" | "href" | "onClick" | "type" | "as" | "stopPropagation"> & {
8
8
  color?: "primary" | "critical" | "positive" | "neutral" | "media" | "inherit";
9
9
  variant?: "solid" | "outline" | "ghost" | "faded";
10
10
  icon?: IconProps["svg"];
@@ -27,6 +27,7 @@ const DropdownMenuContent = (props) => {
27
27
  },
28
28
  }, [subMenuInstance?.current], {
29
29
  disabled: flyout.status === "idle",
30
+ ref: attributes?.ref,
30
31
  });
31
32
  const contentClassName = classNames(s.menu, className);
32
33
  return (_jsx(Popover.Content, { className: contentClassName, attributes: { ...attributes, ref }, children: children }));
@@ -2,7 +2,7 @@ import type React from "react";
2
2
  import type { PopoverProps, PopoverInstance } from "../Popover";
3
3
  import type { FlyoutContentProps } from "../_private/Flyout";
4
4
  export type Instance = PopoverInstance;
5
- export type Props = Pick<PopoverProps, "children" | "position" | "forcePosition" | "fallbackPositions" | "triggerType" | "contentGap" | "onOpen" | "onClose" | "active" | "defaultActive" | "width" | "disableHideAnimation" | "disableCloseOnOutsideClick" | "instanceRef" | "containerRef"> & {
5
+ export type Props = Pick<PopoverProps, "children" | "position" | "forcePosition" | "fallbackPositions" | "triggerType" | "contentGap" | "contentShift" | "onOpen" | "onClose" | "active" | "defaultActive" | "width" | "disableHideAnimation" | "disableCloseOnOutsideClick" | "instanceRef" | "containerRef"> & {
6
6
  trapFocusMode?: Extract<PopoverProps["trapFocusMode"], "action-menu" | "selection-menu">;
7
7
  };
8
8
  export type ContentProps = Pick<FlyoutContentProps, "attributes" | "children" | "className">;
@@ -1,4 +1,4 @@
1
- declare const Link: import("react").ForwardRefExoticComponent<Pick<import("../Actionable").ActionableProps, "disabled" | "className" | "attributes" | "children" | "type" | "onClick" | "href"> & {
1
+ declare const Link: import("react").ForwardRefExoticComponent<Pick<import("../Actionable").ActionableProps, "disabled" | "className" | "attributes" | "children" | "type" | "onClick" | "href" | "stopPropagation"> & {
2
2
  icon?: import("../Icon").IconProps["svg"];
3
3
  color?: "inherit" | "critical" | "primary" | "positive" | "warning";
4
4
  variant?: "plain" | "underline";
@@ -5,8 +5,8 @@ import Actionable from "../Actionable/index.js";
5
5
  import Icon from "../Icon/index.js";
6
6
  import s from "./Link.module.css";
7
7
  const Link = forwardRef((props, ref) => {
8
- const { icon, disabled, href, color = "primary", variant = "underline", className, children, attributes, type, onClick, } = props;
8
+ const { icon, disabled, href, color = "primary", variant = "underline", className, children, attributes, type, onClick, stopPropagation, } = props;
9
9
  const rootClassNames = classNames(s.root, className, disabled && s["--disabled"], variant && s[`--variant-${variant}`], color && s[`--color-${color}`], icon && s["--with-icon"]);
10
- return (_jsxs(Actionable, { href: href, disabled: disabled, className: rootClassNames, attributes: attributes, type: type, onClick: onClick, ref: ref, children: [icon && _jsx(Icon, { svg: icon }), children] }));
10
+ return (_jsxs(Actionable, { href: href, disabled: disabled, className: rootClassNames, attributes: attributes, type: type, onClick: onClick, ref: ref, stopPropagation: stopPropagation, children: [icon && _jsx(Icon, { svg: icon }), children] }));
11
11
  });
12
12
  export default Link;
@@ -1,6 +1,6 @@
1
1
  import type { ActionableProps } from "../Actionable";
2
2
  import type { IconProps } from "../Icon";
3
- export type Props = Pick<ActionableProps, "attributes" | "className" | "disabled" | "children" | "href" | "onClick" | "type"> & {
3
+ export type Props = Pick<ActionableProps, "attributes" | "className" | "disabled" | "children" | "href" | "onClick" | "type" | "stopPropagation"> & {
4
4
  icon?: IconProps["svg"];
5
5
  color?: "inherit" | "critical" | "primary" | "positive" | "warning";
6
6
  variant?: "plain" | "underline";
@@ -1,6 +1,6 @@
1
1
  declare const _default: {
2
2
  title: string;
3
- component: import("react").ForwardRefExoticComponent<Pick<import("../../Actionable").ActionableProps, "children" | "disabled" | "className" | "attributes" | "type" | "onClick" | "href"> & {
3
+ component: import("react").ForwardRefExoticComponent<Pick<import("../../Actionable").ActionableProps, "children" | "disabled" | "className" | "attributes" | "type" | "onClick" | "href" | "stopPropagation"> & {
4
4
  icon?: import("../../Icon").IconProps["svg"];
5
5
  color?: "inherit" | "critical" | "primary" | "positive" | "warning";
6
6
  variant?: "plain" | "underline";
@@ -7,11 +7,11 @@ import View from "../View/index.js";
7
7
  import MenuItemAligner from "./MenuItemAligner.js";
8
8
  import s from "./MenuItem.module.css";
9
9
  const MenuItem = forwardRef((props, ref) => {
10
- const { icon, startSlot, endSlot, children, color = "primary", selected, disabled, onClick, href, size = "medium", roundedCorners, as, className, attributes, } = props;
10
+ const { icon, startSlot, endSlot, children, color = "primary", selected, disabled, onClick, href, size = "medium", roundedCorners, stopPropagation, as, className, attributes, } = props;
11
11
  const rootClassNames = classNames(s.root, className, responsiveClassNames(s, "--size", size), responsiveClassNames(s, "--rounded-corners", roundedCorners), color && s[`--color-${color}`], selected && s["--selected"], disabled && s["--disabled"]);
12
12
  const gapSize = responsivePropDependency(size, (size) => (size === "large" ? 3 : 2));
13
13
  const iconSize = responsivePropDependency(size, (size) => (size === "large" ? 5 : 4));
14
- return (_jsx(Actionable, { disabled: disabled, className: rootClassNames, attributes: { ...attributes, "data-rs-aligner-target": true }, onClick: onClick, href: href, ref: ref, as: as, children: _jsxs(View, { direction: "row", gap: gapSize, align: "center", children: [icon && _jsx(Icon, { svg: icon, className: s.icon, size: iconSize }), !icon && startSlot, children && (_jsx(View.Item, { grow: true, className: s.content, children: children })), endSlot] }) }));
14
+ return (_jsx(Actionable, { disabled: disabled, className: rootClassNames, attributes: { ...attributes, "data-rs-aligner-target": true }, onClick: onClick, href: href, ref: ref, as: as, stopPropagation: stopPropagation, children: _jsxs(View, { direction: "row", gap: gapSize, align: "center", children: [icon && _jsx(Icon, { svg: icon, className: s.icon, size: iconSize }), !icon && startSlot, children && (_jsx(View.Item, { grow: true, className: s.content, children: children })), endSlot] }) }));
15
15
  });
16
16
  MenuItem.Aligner = MenuItemAligner;
17
17
  export default MenuItem;
@@ -3,7 +3,7 @@ import type { IconProps } from "../Icon";
3
3
  import type { ActionableProps } from "../Actionable";
4
4
  import type * as G from "../../types/global";
5
5
  export type Size = "small" | "medium" | "large";
6
- export type Props = Pick<ActionableProps, "attributes" | "className" | "disabled" | "children" | "href" | "onClick" | "as"> & {
6
+ export type Props = Pick<ActionableProps, "attributes" | "className" | "disabled" | "children" | "href" | "onClick" | "as" | "stopPropagation"> & {
7
7
  color?: "neutral" | "critical" | "primary";
8
8
  icon?: IconProps["svg"];
9
9
  startSlot?: React.ReactNode;
@@ -1 +1 @@
1
- .root{background:var(--rs-color-background-elevation-overlay);box-shadow:var(--rs-shadow-overlay);color:var(--rs-color-foreground-neutral);transition:var(--rs-easing-accelerate) var(--rs-duration-medium);transition-property:transform,opacity;will-change:transform}[data-rs-keyboard] .root:focus{box-shadow:var(--rs-focus-shadow);outline:none}.root{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);--rs-modal-size-m:var(--rs-modal-size-s);--rs-modal-size-l:var(--rs-modal-size-m);--rs-modal-size-xl:var(--rs-modal-size-l);--rs-modal-size:var(--rs-modal-size-s)}.--position-center{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(100% - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center.--active,[dir=rtl] .--position-center.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(100% - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:fixed;transform:translateY(100%);width:100%}.--position-bottom.--contained{position:absolute}.--position-bottom.--active,[dir=rtl] .--position-bottom.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(100% - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(-100%);width:var(--rs-modal-size)}.--position-start.--contained{position:absolute}[dir=rtl] .--position-start{transform:translate(100%)}.--position-start.--active,[dir=rtl] .--position-start.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(100% - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(100%);width:var(--rs-modal-size)}.--position-end.--contained{position:absolute}[dir=rtl] .--position-end{transform:translate(-100%)}.--position-end.--active,[dir=rtl] .--position-end.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:100%;opacity:0;overflow:auto;position:fixed;transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen.--contained{position:absolute}.--position-full-screen.--active,[dir=rtl] .--position-full-screen.--active{opacity:1;transform:translate(0)!important}.--active,[dir=rtl] .--active{transition-timing-function:var(--rs-easing-decelerate)}.--dragging{transition:none}.--overflow-visible{overflow:visible}@media (--rs-viewport-m ){.root{--rs-modal-size:var(--rs-modal-size-m)}.--position-center--m{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(100% - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center--m.--active,[dir=rtl] .--position-center--m.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom--m{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(100% - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:fixed;transform:translateY(100%);width:100%}.--position-bottom--m.--contained{position:absolute}.--position-bottom--m.--active,[dir=rtl] .--position-bottom--m.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start--m{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(100% - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(-100%);width:var(--rs-modal-size)}.--position-start--m.--contained{position:absolute}[dir=rtl] .--position-start--m{transform:translate(100%)}.--position-start--m.--active,[dir=rtl] .--position-start--m.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end--m{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(100% - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(100%);width:var(--rs-modal-size)}.--position-end--m.--contained{position:absolute}[dir=rtl] .--position-end--m{transform:translate(-100%)}.--position-end--m.--active,[dir=rtl] .--position-end--m.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen--m{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:100%;opacity:0;overflow:auto;position:fixed;transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen--m.--contained{position:absolute}.--position-full-screen--m.--active,[dir=rtl] .--position-full-screen--m.--active{opacity:1;transform:translate(0)!important}}@media (--rs-viewport-l ){.root{--rs-modal-size:var(--rs-modal-size-l)}.--position-center--l{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(100% - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center--l.--active,[dir=rtl] .--position-center--l.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom--l{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(100% - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:fixed;transform:translateY(100%);width:100%}.--position-bottom--l.--contained{position:absolute}.--position-bottom--l.--active,[dir=rtl] .--position-bottom--l.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start--l{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(100% - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(-100%);width:var(--rs-modal-size)}.--position-start--l.--contained{position:absolute}[dir=rtl] .--position-start--l{transform:translate(100%)}.--position-start--l.--active,[dir=rtl] .--position-start--l.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end--l{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(100% - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(100%);width:var(--rs-modal-size)}.--position-end--l.--contained{position:absolute}[dir=rtl] .--position-end--l{transform:translate(-100%)}.--position-end--l.--active,[dir=rtl] .--position-end--l.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen--l{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:100%;opacity:0;overflow:auto;position:fixed;transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen--l.--contained{position:absolute}.--position-full-screen--l.--active,[dir=rtl] .--position-full-screen--l.--active{opacity:1;transform:translate(0)!important}}@media (--rs-viewport-xl ){.root{--rs-modal-size:var(--rs-modal-size-xl)}.--position-center--xl{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(100% - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center--xl.--active,[dir=rtl] .--position-center--xl.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom--xl{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(100% - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:fixed;transform:translateY(100%);width:100%}.--position-bottom--xl.--contained{position:absolute}.--position-bottom--xl.--active,[dir=rtl] .--position-bottom--xl.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start--xl{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(100% - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(-100%);width:var(--rs-modal-size)}.--position-start--xl.--contained{position:absolute}[dir=rtl] .--position-start--xl{transform:translate(100%)}.--position-start--xl.--active,[dir=rtl] .--position-start--xl.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end--xl{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(100% - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(100%);width:var(--rs-modal-size)}.--position-end--xl.--contained{position:absolute}[dir=rtl] .--position-end--xl{transform:translate(-100%)}.--position-end--xl.--active,[dir=rtl] .--position-end--xl.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen--xl{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:100%;opacity:0;overflow:auto;position:fixed;transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen--xl.--contained{position:absolute}.--position-full-screen--xl.--active,[dir=rtl] .--position-full-screen--xl.--active{opacity:1;transform:translate(0)!important}}
1
+ .root{--rs-modal-container-width:100vw;--rs-modal-position:fixed;background:var(--rs-color-background-elevation-overlay);box-shadow:var(--rs-shadow-overlay);color:var(--rs-color-foreground-neutral);transition:var(--rs-easing-accelerate) var(--rs-duration-medium);transition-property:transform,opacity;will-change:transform}[data-rs-keyboard] .root:focus{box-shadow:var(--rs-focus-shadow);outline:none}.root.--contained{--rs-modal-position:absolute;--rs-modal-container-width:100%}.root{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);--rs-modal-size-m:var(--rs-modal-size-s);--rs-modal-size-l:var(--rs-modal-size-m);--rs-modal-size-xl:var(--rs-modal-size-l);--rs-modal-size:var(--rs-modal-size-s)}.--position-center{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(var(--rs-modal-container-width) - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center.--active,[dir=rtl] .--position-center.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(var(--rs-modal-container-width) - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:var(--rs-modal-position);transform:translateY(100%);width:100%}.--position-bottom.--active,[dir=rtl] .--position-bottom.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(var(--rs-modal-container-width) - var(--rs-unit-x4));opacity:1;overflow:auto;position:var(--rs-modal-position);transform:translate(-100%);width:var(--rs-modal-size)}[dir=rtl] .--position-start{transform:translate(100%)}.--position-start.--active,[dir=rtl] .--position-start.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(var(--rs-modal-container-width) - var(--rs-unit-x4));opacity:1;overflow:auto;position:var(--rs-modal-position);transform:translate(100%);width:var(--rs-modal-size)}[dir=rtl] .--position-end{transform:translate(-100%)}.--position-end.--active,[dir=rtl] .--position-end.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:var(--rs-modal-container-width);opacity:0;overflow:auto;position:var(--rs-modal-position);transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen.--active,[dir=rtl] .--position-full-screen.--active{opacity:1;transform:translate(0)!important}.--active,[dir=rtl] .--active{transition-timing-function:var(--rs-easing-decelerate)}.--dragging{transition:none}.--overflow-visible{overflow:visible}@media (--rs-viewport-m ){.root{--rs-modal-size:var(--rs-modal-size-m)}.--position-center--m{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(var(--rs-modal-container-width) - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center--m.--active,[dir=rtl] .--position-center--m.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom--m{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(var(--rs-modal-container-width) - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:var(--rs-modal-position);transform:translateY(100%);width:100%}.--position-bottom--m.--active,[dir=rtl] .--position-bottom--m.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start--m{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(var(--rs-modal-container-width) - var(--rs-unit-x4));opacity:1;overflow:auto;position:var(--rs-modal-position);transform:translate(-100%);width:var(--rs-modal-size)}[dir=rtl] .--position-start--m{transform:translate(100%)}.--position-start--m.--active,[dir=rtl] .--position-start--m.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end--m{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(var(--rs-modal-container-width) - var(--rs-unit-x4));opacity:1;overflow:auto;position:var(--rs-modal-position);transform:translate(100%);width:var(--rs-modal-size)}[dir=rtl] .--position-end--m{transform:translate(-100%)}.--position-end--m.--active,[dir=rtl] .--position-end--m.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen--m{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:var(--rs-modal-container-width);opacity:0;overflow:auto;position:var(--rs-modal-position);transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen--m.--active,[dir=rtl] .--position-full-screen--m.--active{opacity:1;transform:translate(0)!important}}@media (--rs-viewport-l ){.root{--rs-modal-size:var(--rs-modal-size-l)}.--position-center--l{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(var(--rs-modal-container-width) - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center--l.--active,[dir=rtl] .--position-center--l.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom--l{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(var(--rs-modal-container-width) - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:var(--rs-modal-position);transform:translateY(100%);width:100%}.--position-bottom--l.--active,[dir=rtl] .--position-bottom--l.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start--l{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(var(--rs-modal-container-width) - var(--rs-unit-x4));opacity:1;overflow:auto;position:var(--rs-modal-position);transform:translate(-100%);width:var(--rs-modal-size)}[dir=rtl] .--position-start--l{transform:translate(100%)}.--position-start--l.--active,[dir=rtl] .--position-start--l.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end--l{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(var(--rs-modal-container-width) - var(--rs-unit-x4));opacity:1;overflow:auto;position:var(--rs-modal-position);transform:translate(100%);width:var(--rs-modal-size)}[dir=rtl] .--position-end--l{transform:translate(-100%)}.--position-end--l.--active,[dir=rtl] .--position-end--l.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen--l{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:var(--rs-modal-container-width);opacity:0;overflow:auto;position:var(--rs-modal-position);transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen--l.--active,[dir=rtl] .--position-full-screen--l.--active{opacity:1;transform:translate(0)!important}}@media (--rs-viewport-xl ){.root{--rs-modal-size:var(--rs-modal-size-xl)}.--position-center--xl{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(var(--rs-modal-container-width) - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center--xl.--active,[dir=rtl] .--position-center--xl.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom--xl{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(var(--rs-modal-container-width) - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:var(--rs-modal-position);transform:translateY(100%);width:100%}.--position-bottom--xl.--active,[dir=rtl] .--position-bottom--xl.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start--xl{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(var(--rs-modal-container-width) - var(--rs-unit-x4));opacity:1;overflow:auto;position:var(--rs-modal-position);transform:translate(-100%);width:var(--rs-modal-size)}[dir=rtl] .--position-start--xl{transform:translate(100%)}.--position-start--xl.--active,[dir=rtl] .--position-start--xl.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end--xl{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(var(--rs-modal-container-width) - var(--rs-unit-x4));opacity:1;overflow:auto;position:var(--rs-modal-position);transform:translate(100%);width:var(--rs-modal-size)}[dir=rtl] .--position-end--xl{transform:translate(-100%)}.--position-end--xl.--active,[dir=rtl] .--position-end--xl.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen--xl{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:var(--rs-modal-container-width);opacity:0;overflow:auto;position:var(--rs-modal-position);transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen--xl.--active,[dir=rtl] .--position-full-screen--xl.--active{opacity:1;transform:translate(0)!important}}
@@ -1,7 +1,7 @@
1
1
  import type React from "react";
2
2
  import type { FlyoutProps, FlyoutInstance } from "../_private/Flyout";
3
3
  export type Instance = FlyoutInstance;
4
- export type Props = Pick<FlyoutProps, "id" | "position" | "forcePosition" | "fallbackPositions" | "onOpen" | "onClose" | "width" | "trapFocusMode" | "active" | "defaultActive" | "contentGap" | "instanceRef" | "triggerType" | "disableHideAnimation" | "disableContentHover" | "disableCloseOnOutsideClick" | "containerRef" | "initialFocusRef"> & {
4
+ export type Props = Pick<FlyoutProps, "id" | "position" | "forcePosition" | "fallbackPositions" | "onOpen" | "onClose" | "width" | "trapFocusMode" | "active" | "defaultActive" | "contentGap" | "contentShift" | "instanceRef" | "triggerType" | "disableHideAnimation" | "disableContentHover" | "disableCloseOnOutsideClick" | "containerRef" | "initialFocusRef"> & {
5
5
  children?: React.ReactNode;
6
6
  padding?: number;
7
7
  variant?: "elevated" | "headless";
@@ -5,9 +5,9 @@ import Text from "../Text/index.js";
5
5
  import Flyout from "../_private/Flyout/index.js";
6
6
  import s from "./Tooltip.module.css";
7
7
  const Tooltip = (props) => {
8
- const { id, text, children, onOpen, onClose, position = "bottom", containerRef, active, disabled, disableContentHover, } = props;
8
+ const { id, text, children, onOpen, onClose, position = "bottom", containerRef, contentGap, contentShift, active, disabled, disableContentHover, } = props;
9
9
  if (!text)
10
10
  return _jsx(_Fragment, { children: children({}) });
11
- return (_jsxs(Flyout, { id: id, active: active, position: position, disabled: disabled, onOpen: onOpen, onClose: onClose, disableContentHover: disableContentHover, containerRef: containerRef, triggerType: "hover", groupTimeouts: true, children: [_jsx(Flyout.Trigger, { children: children }), _jsx(Flyout.Content, { children: _jsx(Theme, { colorMode: "inverted", children: _jsx(Text, { variant: "caption-1", className: s.root, children: text }) }) })] }));
11
+ return (_jsxs(Flyout, { id: id, active: active, position: position, disabled: disabled, contentGap: contentGap, contentShift: contentShift, onOpen: onOpen, onClose: onClose, disableContentHover: disableContentHover, containerRef: containerRef, triggerType: "hover", groupTimeouts: true, children: [_jsx(Flyout.Trigger, { children: children }), _jsx(Flyout.Content, { children: _jsx(Theme, { colorMode: "inverted", children: _jsx(Text, { variant: "caption-1", className: s.root, children: text }) }) })] }));
12
12
  };
13
13
  export default Tooltip;
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  import type { FlyoutProps, FlyoutTriggerProps } from "../_private/Flyout";
3
- export type Props = Pick<FlyoutProps, "id" | "position" | "onOpen" | "onClose" | "active" | "disabled" | "disableContentHover" | "containerRef"> & {
3
+ export type Props = Pick<FlyoutProps, "id" | "position" | "onOpen" | "onClose" | "active" | "disabled" | "disableContentHover" | "containerRef" | "contentGap" | "contentShift"> & {
4
4
  children: (attributes: Parameters<FlyoutTriggerProps["children"]>[0] | {}) => React.ReactNode;
5
5
  text?: React.ReactNode;
6
6
  };
@@ -18,6 +18,7 @@ export type Options = {
18
18
  lastUsedFallback: Position;
19
19
  onFallback: (position: Position) => void;
20
20
  contentGap?: number;
21
+ contentShift?: number;
21
22
  };
22
23
  export type Styles = React.CSSProperties;
23
24
  export type State = {
@@ -87,6 +88,7 @@ type BaseProps = {
87
88
  onClose?: () => void;
88
89
  width?: Width;
89
90
  contentGap?: number;
91
+ contentShift?: number;
90
92
  contentClassName?: string;
91
93
  contentAttributes?: G.Attributes<"div">;
92
94
  instanceRef?: React.Ref<Instance>;
@@ -130,6 +132,6 @@ export type ContextProps = {
130
132
  handleContentMouseDown: () => void;
131
133
  handleContentMouseUp: () => void;
132
134
  isSubmenu: boolean;
133
- } & Pick<Props, "triggerType" | "contentClassName" | "contentAttributes" | "trapFocusMode" | "contentGap" | "containerRef" | "disableContentHover">;
135
+ } & Pick<Props, "triggerType" | "contentClassName" | "contentAttributes" | "trapFocusMode" | "contentGap" | "contentShift" | "containerRef" | "disableContentHover">;
134
136
  export type TriggerContextProps = Pick<ContextProps, "triggerElRef">;
135
137
  export {};
@@ -15,7 +15,7 @@ import cooldown from "./utilities/cooldown.js";
15
15
  import { Provider, useFlyoutTriggerContext, useFlyoutContext, useFlyoutContentContext, } from "./Flyout.context.js";
16
16
  import useHandlerRef from "../../../hooks/useHandlerRef.js";
17
17
  const FlyoutRoot = (props) => {
18
- const { triggerType = "click", groupTimeouts, onOpen, onClose, children, disabled, forcePosition, trapFocusMode, width, disableHideAnimation, disableContentHover, disableCloseOnOutsideClick, contentGap = 2, contentClassName, contentAttributes, position: passedPosition, active: passedActive, id: passedId, instanceRef, containerRef, initialFocusRef, } = props;
18
+ const { triggerType = "click", groupTimeouts, onOpen, onClose, children, disabled, forcePosition, trapFocusMode, width, disableHideAnimation, disableContentHover, disableCloseOnOutsideClick, contentGap = 2, contentShift, contentClassName, contentAttributes, position: passedPosition, active: passedActive, id: passedId, instanceRef, containerRef, initialFocusRef, } = props;
19
19
  const fallbackPositions = props.fallbackPositions === false || forcePosition ? [] : props.fallbackPositions;
20
20
  const onOpenRef = useHandlerRef(onOpen);
21
21
  const onCloseRef = useHandlerRef(onClose);
@@ -59,6 +59,7 @@ const FlyoutRoot = (props) => {
59
59
  container: containerRef?.current,
60
60
  fallbackPositions,
61
61
  contentGap,
62
+ contentShift,
62
63
  });
63
64
  const { status, updatePosition, render, hide, remove, show } = flyout;
64
65
  const isRendered = status !== "idle";
@@ -3,15 +3,15 @@ declare const _default: {
3
3
  title: string;
4
4
  };
5
5
  export default _default;
6
- export declare const positions: () => React.JSX.Element;
6
+ export declare const position: () => React.JSX.Element;
7
7
  export declare const dynamicPosition: () => React.JSX.Element;
8
8
  export declare const modes: () => React.JSX.Element;
9
- export declare const widthTrigger: () => React.JSX.Element;
9
+ export declare const width: () => React.JSX.Element;
10
+ export declare const offset: () => React.JSX.Element;
10
11
  export declare const disableFlags: () => React.JSX.Element;
11
12
  export declare const initialFocus: () => React.JSX.Element;
12
13
  export declare const customPortalTarget: () => React.JSX.Element;
13
- export declare const testWidthOverflowOnMobile: () => React.JSX.Element;
14
14
  export declare const testInsideFixed: () => React.JSX.Element;
15
15
  export declare const testDynamicBounds: () => React.JSX.Element;
16
16
  export declare const testDisableOutsideClick: () => React.JSX.Element;
17
- export declare const scopedTheming: () => React.JSX.Element;
17
+ export declare const testScopedTheming: () => React.JSX.Element;
@@ -7,7 +7,6 @@ import Theme from "../../../Theme/index.js";
7
7
  import Button from "../../../Button/index.js";
8
8
  import Flyout from "../index.js";
9
9
  import TextField from "../../../TextField/index.js";
10
- import useToggle from "../../../../hooks/useToggle.js";
11
10
  export default { title: "Utilities/Internal/Flyout" };
12
11
  const Demo = (props) => {
13
12
  const { position = "bottom-start", children, ...rest } = props;
@@ -20,7 +19,7 @@ const Demo = (props) => {
20
19
  background: "var(--rs-color-background-elevation-overlay)",
21
20
  padding: "var(--rs-unit-x4)",
22
21
  height: 150,
23
- width: 160,
22
+ minWidth: 160,
24
23
  borderRadius: "var(--rs-radius-medium)",
25
24
  border: "1px solid var(--rs-color-border-neutral-faded)",
26
25
  boxSizing: "border-box",
@@ -30,7 +29,7 @@ const Demo = (props) => {
30
29
  </Flyout.Content>
31
30
  </Flyout>);
32
31
  };
33
- export const positions = () => (<div style={{ paddingTop: 200 }}>
32
+ export const position = () => (<div style={{ paddingTop: 200 }}>
34
33
  <View gap={3} direction="row">
35
34
  <Demo position="bottom-start"/>
36
35
  <Demo position="bottom-end"/>
@@ -107,20 +106,35 @@ export const modes = () => (<Example>
107
106
  </Demo>
108
107
  </Example.Item>
109
108
  </Example>);
110
- export const widthTrigger = () => (<Flyout triggerType="click" width="trigger" position="bottom">
111
- <Flyout.Trigger>
112
- {(attributes) => <button {...attributes}>Trigger with long text</button>}
113
- </Flyout.Trigger>
114
- <Flyout.Content>
115
- <div style={{
109
+ export const width = () => (<Example>
110
+ <Example.Item title="width: 300px">
111
+ <Demo width="300px" position="bottom"/>
112
+ </Example.Item>
113
+ <Example.Item title="width: trigger">
114
+ <Flyout triggerType="click" width="trigger" position="bottom">
115
+ <Flyout.Trigger>
116
+ {(attributes) => <Button attributes={attributes}>Trigger with long text</Button>}
117
+ </Flyout.Trigger>
118
+ <Flyout.Content>
119
+ <div style={{
116
120
  background: "var(--rs-color-background-elevation-overlay)",
117
121
  padding: "var(--rs-unit-x4)",
118
122
  borderRadius: "var(--rs-radius-medium)",
119
123
  border: "1px solid var(--rs-color-border-neutral-faded)",
120
124
  boxSizing: "border-box",
121
125
  }}></div>
122
- </Flyout.Content>
123
- </Flyout>);
126
+ </Flyout.Content>
127
+ </Flyout>
128
+ </Example.Item>
129
+ </Example>);
130
+ export const offset = () => (<Example>
131
+ <Example.Item title="contentGap: x10">
132
+ <Demo contentGap={10}/>
133
+ </Example.Item>
134
+ <Example.Item title="contentShift: x10">
135
+ <Demo contentShift={10}/>
136
+ </Example.Item>
137
+ </Example>);
124
138
  export const disableFlags = () => (<Example>
125
139
  <Example.Item title="disableContentHover">
126
140
  <Demo triggerType="hover" disableContentHover>
@@ -198,12 +212,6 @@ export const customPortalTarget = () => {
198
212
  </Example.Item>
199
213
  </Example>);
200
214
  };
201
- export const testWidthOverflowOnMobile = () => (<Demo position="bottom-start" width={600}>
202
- Should work on mobile
203
- <button type="button">Item 1</button>
204
- <button type="button">Item 2</button>
205
- <button type="button">Close</button>
206
- </Demo>);
207
215
  export const testInsideFixed = () => (<Example>
208
216
  <Example.Item title="should move the content on page scroll">
209
217
  <View position="fixed" insetTop={20} insetStart={0} insetEnd={0} backgroundColor="neutral-faded" padding={4}>
@@ -277,7 +285,6 @@ export const testDynamicBounds = () => {
277
285
  </View>);
278
286
  };
279
287
  export const testDisableOutsideClick = () => {
280
- const toggle = useToggle();
281
288
  return (<Example>
282
289
  <Example.Item title="opening second flyout shouldn't block the first one from closing">
283
290
  <View direction="row" gap={4}>
@@ -287,7 +294,7 @@ export const testDisableOutsideClick = () => {
287
294
  </Example.Item>
288
295
  </Example>);
289
296
  };
290
- export const scopedTheming = () => (<View gap={3} align="start">
297
+ export const testScopedTheming = () => (<View gap={3} align="start">
291
298
  <Button color="primary">Reshaped button</Button>
292
299
  <Theme name="twitter">
293
300
  <Flyout triggerType="click" active position="bottom-start">
@@ -16,6 +16,7 @@ type UseFlyout = (args: PassedFlyoutOptions & {
16
16
  flyoutElRef: ElementRef;
17
17
  triggerBoundsRef: React.RefObject<DOMRect | undefined>;
18
18
  contentGap?: number;
19
+ contentShift?: number;
19
20
  }) => Pick<T.State, "styles" | "position" | "status"> & {
20
21
  updatePosition: (options?: {
21
22
  sync?: boolean;
@@ -43,12 +43,12 @@ const resetStyles = {
43
43
  * Set position of the target element to fit on the screen
44
44
  */
45
45
  const flyout = (args) => {
46
- const { triggerEl, flyoutEl, triggerBounds: passedTriggerBounds, contentGap = 0, ...options } = args;
46
+ const { triggerEl, flyoutEl, triggerBounds: passedTriggerBounds, contentShift = 0, contentGap = 0, ...options } = args;
47
47
  const { position, fallbackPositions, width, container, lastUsedFallback, onFallback } = options;
48
48
  const targetClone = flyoutEl.cloneNode(true);
49
49
  const triggerBounds = passedTriggerBounds || triggerEl.getBoundingClientRect();
50
50
  const baseUnit = getComputedStyle(flyoutEl).getPropertyValue("--rs-unit-x1");
51
- const contentGapModifier = baseUnit ? parseInt(baseUnit) : 0;
51
+ const unitModifier = baseUnit ? parseInt(baseUnit) : 0;
52
52
  // Reset all styles applied on the previous hook execution
53
53
  targetClone.style.cssText = "";
54
54
  Object.keys(resetStyles).forEach((key) => {
@@ -83,7 +83,8 @@ const flyout = (args) => {
83
83
  flyoutBounds,
84
84
  scopeOffset,
85
85
  position: currentPosition,
86
- contentGap: contentGap * contentGapModifier,
86
+ contentGap: contentGap * unitModifier,
87
+ contentShift: contentShift * unitModifier,
87
88
  });
88
89
  const visible = fullyVisible(tested);
89
90
  const validPosition = visible || fallbackPositions?.length === 0;
@@ -135,7 +136,7 @@ const flyoutReducer = (state, action) => {
135
136
  }
136
137
  };
137
138
  const useFlyout = (args) => {
138
- const { triggerElRef, flyoutElRef, triggerBoundsRef, contentGap, ...options } = args;
139
+ const { triggerElRef, flyoutElRef, triggerBoundsRef, contentGap, contentShift, ...options } = args;
139
140
  const { position: defaultPosition = "bottom", fallbackPositions, width, container } = options;
140
141
  const lastUsedFallbackRef = React.useRef(defaultPosition);
141
142
  // Memo the array internally to avoid new arrays triggering useCallback
@@ -178,6 +179,7 @@ const useFlyout = (args) => {
178
179
  rtl: isRTL,
179
180
  container,
180
181
  contentGap,
182
+ contentShift,
181
183
  });
182
184
  if (nextFlyoutData)
183
185
  dispatch({ type: "position", payload: { ...nextFlyoutData, sync: options?.sync } });
@@ -191,6 +193,7 @@ const useFlyout = (args) => {
191
193
  triggerBoundsRef,
192
194
  width,
193
195
  contentGap,
196
+ contentShift,
194
197
  handleFallback,
195
198
  ]);
196
199
  React.useEffect(() => {
@@ -16,7 +16,7 @@ const centerBySize = (originSize, targetSize) => {
16
16
  * Calculate styles for the current position
17
17
  */
18
18
  const calculatePosition = (args) => {
19
- const { triggerBounds, flyoutBounds, scopeOffset, position: passedPosition, rtl, width, contentGap = 0, } = args;
19
+ const { triggerBounds, flyoutBounds, scopeOffset, position: passedPosition, rtl, width, contentGap = 0, contentShift = 0, } = args;
20
20
  const isFullWidth = width === "full" || width === "100%";
21
21
  let left = 0;
22
22
  let top = 0;
@@ -33,7 +33,7 @@ const calculatePosition = (args) => {
33
33
  switch (position) {
34
34
  case "bottom":
35
35
  case "top":
36
- left = centerBySize(triggerBounds.width, flyoutWidth) + triggerBounds.left;
36
+ left = centerBySize(triggerBounds.width, flyoutWidth) + triggerBounds.left + contentShift;
37
37
  break;
38
38
  case "start":
39
39
  case "start-top":
@@ -47,11 +47,11 @@ const calculatePosition = (args) => {
47
47
  break;
48
48
  case "top-start":
49
49
  case "bottom-start":
50
- left = triggerBounds.left;
50
+ left = triggerBounds.left + contentShift + contentShift;
51
51
  break;
52
52
  case "top-end":
53
53
  case "bottom-end":
54
- left = triggerBounds.right - flyoutWidth;
54
+ left = triggerBounds.right - flyoutWidth + contentShift;
55
55
  break;
56
56
  default:
57
57
  break;
@@ -69,15 +69,15 @@ const calculatePosition = (args) => {
69
69
  break;
70
70
  case "start":
71
71
  case "end":
72
- top = centerBySize(triggerBounds.height, flyoutHeight) + triggerBounds.top;
72
+ top = centerBySize(triggerBounds.height, flyoutHeight) + triggerBounds.top + contentShift;
73
73
  break;
74
74
  case "start-top":
75
75
  case "end-top":
76
- top = triggerBounds.top;
76
+ top = triggerBounds.top + contentShift;
77
77
  break;
78
78
  case "start-bottom":
79
79
  case "end-bottom":
80
- top = triggerBounds.bottom - flyoutHeight;
80
+ top = triggerBounds.bottom - flyoutHeight + contentShift;
81
81
  break;
82
82
  default:
83
83
  break;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "reshaped",
3
3
  "description": "Professionally crafted design system in React & Figma for building products of any scale and complexity",
4
- "version": "3.2.4",
4
+ "version": "3.2.5",
5
5
  "license": "MIT",
6
6
  "email": "hello@reshaped.so",
7
7
  "homepage": "https://reshaped.so",