reshaped 3.2.0-canary.5 → 3.2.0-canary.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/CHANGELOG.md +26 -1
  2. package/dist/bundle.css +1 -1
  3. package/dist/bundle.d.ts +2 -0
  4. package/dist/bundle.js +16 -16
  5. package/dist/cjs/constants/breakpoints.d.ts +6 -0
  6. package/dist/cjs/constants/breakpoints.js +7 -0
  7. package/dist/cjs/themes/_generator/definitions/reshaped.js +8 -4
  8. package/dist/cjs/themes/_generator/tokens/viewport/viewport.transforms.js +10 -1
  9. package/dist/cjs/themes/figma/theme.css +1 -1
  10. package/dist/cjs/themes/reshaped/theme.css +1 -1
  11. package/dist/cjs/themes/slate/theme.css +1 -1
  12. package/dist/components/Actionable/Actionable.d.ts +1 -1
  13. package/dist/components/Actionable/Actionable.module.css +1 -1
  14. package/dist/components/Autocomplete/Autocomplete.js +2 -2
  15. package/dist/components/Button/Button.js +1 -1
  16. package/dist/components/Button/Button.module.css +1 -1
  17. package/dist/components/Card/Card.d.ts +1 -1
  18. package/dist/components/Card/Card.module.css +1 -1
  19. package/dist/components/Card/tests/Card.stories.d.ts +1 -1
  20. package/dist/components/Checkbox/Checkbox.module.css +1 -1
  21. package/dist/components/Divider/Divider.js +4 -3
  22. package/dist/components/Divider/Divider.module.css +1 -1
  23. package/dist/components/Divider/Divider.types.d.ts +3 -0
  24. package/dist/components/Divider/tests/Divider.stories.d.ts +1 -0
  25. package/dist/components/Divider/tests/Divider.stories.js +21 -0
  26. package/dist/components/DropdownMenu/DropdownMenu.types.d.ts +1 -1
  27. package/dist/components/FormControl/FormControl.context.d.ts +2 -1
  28. package/dist/components/Grid/Grid.d.ts +6 -0
  29. package/dist/components/Grid/Grid.js +46 -0
  30. package/dist/components/Grid/Grid.module.css +1 -0
  31. package/dist/components/Grid/Grid.types.d.ts +31 -0
  32. package/dist/components/Grid/Grid.types.js +1 -0
  33. package/dist/components/Grid/index.d.ts +2 -0
  34. package/dist/components/Grid/index.js +1 -0
  35. package/dist/components/Grid/tests/Grid.stories.d.ts +18 -0
  36. package/dist/components/Grid/tests/Grid.stories.js +170 -0
  37. package/dist/components/Icon/Icon.module.css +1 -1
  38. package/dist/components/Link/Link.d.ts +1 -1
  39. package/dist/components/Link/tests/Link.stories.d.ts +1 -1
  40. package/dist/components/Loader/Loader.module.css +1 -1
  41. package/dist/components/Loader/Loader.types.d.ts +1 -1
  42. package/dist/components/Loader/tests/Loader.stories.js +5 -3
  43. package/dist/components/Modal/Modal.js +7 -4
  44. package/dist/components/Modal/Modal.module.css +1 -1
  45. package/dist/components/Modal/Modal.types.d.ts +1 -1
  46. package/dist/components/Modal/tests/Modal.stories.d.ts +1 -0
  47. package/dist/components/Modal/tests/Modal.stories.js +28 -1
  48. package/dist/components/Overlay/Overlay.js +45 -27
  49. package/dist/components/Overlay/Overlay.module.css +1 -1
  50. package/dist/components/Overlay/Overlay.types.d.ts +1 -0
  51. package/dist/components/Overlay/tests/Overlay.stories.js +1 -1
  52. package/dist/components/Popover/Popover.js +2 -4
  53. package/dist/components/Popover/Popover.types.d.ts +1 -1
  54. package/dist/components/Radio/Radio.module.css +1 -1
  55. package/dist/components/Resizable/Resizable.module.css +1 -1
  56. package/dist/components/ScrollArea/ScrollArea.js +1 -1
  57. package/dist/components/Slider/Slider.module.css +1 -1
  58. package/dist/components/Slider/SliderControlled.js +2 -1
  59. package/dist/components/Switch/Switch.module.css +1 -1
  60. package/dist/components/Tabs/Tabs.d.ts +1 -1
  61. package/dist/components/Tabs/Tabs.module.css +1 -1
  62. package/dist/components/Tabs/TabsContext.d.ts +1 -1
  63. package/dist/components/Tabs/TabsItem.d.ts +1 -1
  64. package/dist/components/Tabs/TabsItem.js +2 -3
  65. package/dist/components/Tabs/TabsList.js +1 -1
  66. package/dist/components/Tabs/tests/Tabs.stories.d.ts +15 -13
  67. package/dist/components/Tabs/tests/Tabs.stories.js +71 -8
  68. package/dist/components/TextField/TextField.js +5 -1
  69. package/dist/components/TextField/TextField.module.css +1 -1
  70. package/dist/components/TextField/tests/TextField.stories.js +4 -0
  71. package/dist/components/Toast/ToastContainer.js +1 -2
  72. package/dist/components/Toast/ToastRegion.js +1 -1
  73. package/dist/components/Tooltip/Tooltip.js +1 -1
  74. package/dist/components/View/View.js +7 -3
  75. package/dist/components/View/View.module.css +1 -1
  76. package/dist/components/View/View.types.d.ts +2 -2
  77. package/dist/components/_private/Expandable/Expandable.js +9 -5
  78. package/dist/components/_private/Flyout/Flyout.module.css +1 -1
  79. package/dist/components/_private/Flyout/Flyout.types.d.ts +12 -3
  80. package/dist/components/_private/Flyout/FlyoutContent.js +1 -1
  81. package/dist/components/_private/Flyout/FlyoutControlled.js +34 -21
  82. package/dist/components/_private/Flyout/tests/Flyout.stories.d.ts +3 -1
  83. package/dist/components/_private/Flyout/tests/Flyout.stories.js +54 -32
  84. package/dist/components/_private/Flyout/useFlyout.d.ts +2 -1
  85. package/dist/components/_private/Flyout/useFlyout.js +45 -55
  86. package/dist/components/_private/Flyout/utilities/calculatePosition.js +16 -11
  87. package/dist/components/_private/Flyout/utilities/cooldown.d.ts +1 -1
  88. package/dist/components/_private/Flyout/utilities/cooldown.js +17 -5
  89. package/dist/components/_private/Flyout/utilities/getPositionFallbacks.d.ts +3 -0
  90. package/dist/components/_private/Flyout/utilities/getPositionFallbacks.js +39 -0
  91. package/dist/components/_private/Portal/Portal.js +3 -3
  92. package/dist/config/tailwind.d.ts +1 -1
  93. package/dist/constants/breakpoints.d.ts +6 -0
  94. package/dist/constants/breakpoints.js +5 -0
  95. package/dist/hooks/_private/useIsDismissible.js +7 -14
  96. package/dist/hooks/_private/useSingletonHotkeys.js +5 -3
  97. package/dist/hooks/_private/useSingletonKeyboardMode.js +1 -1
  98. package/dist/hooks/tests/useHotkeys.stories.js +3 -0
  99. package/dist/hooks/tests/useResponsiveClientValue.stories.d.ts +1 -2
  100. package/dist/hooks/tests/useResponsiveClientValue.stories.js +1 -2
  101. package/dist/hooks/useDrag.js +2 -1
  102. package/dist/hooks/useResponsiveClientValue.js +22 -11
  103. package/dist/hooks/useScrollLock.d.ts +4 -1
  104. package/dist/hooks/useScrollLock.js +14 -40
  105. package/dist/index.d.ts +2 -0
  106. package/dist/index.js +1 -0
  107. package/dist/styles/align/align.module.css +1 -0
  108. package/dist/styles/align/index.d.ts +3 -0
  109. package/dist/styles/align/index.js +10 -0
  110. package/dist/styles/justify/index.d.ts +3 -0
  111. package/dist/styles/justify/index.js +10 -0
  112. package/dist/styles/justify/justify.module.css +1 -0
  113. package/dist/styles/types.d.ts +2 -0
  114. package/dist/themes/_generator/definitions/reshaped.js +5 -4
  115. package/dist/themes/_generator/tokens/viewport/viewport.transforms.js +10 -1
  116. package/dist/themes/figma/theme.css +1 -1
  117. package/dist/themes/reshaped/theme.css +1 -1
  118. package/dist/themes/slate/theme.css +1 -1
  119. package/dist/utilities/a11y/TrapFocus.d.ts +1 -1
  120. package/dist/utilities/a11y/TrapFocus.js +1 -1
  121. package/dist/utilities/a11y/focus.js +1 -1
  122. package/dist/utilities/a11y/index.d.ts +4 -0
  123. package/dist/utilities/a11y/index.js +3 -0
  124. package/dist/utilities/css.d.ts +7 -0
  125. package/dist/utilities/css.js +18 -0
  126. package/dist/utilities/dom/flyout.d.ts +1 -0
  127. package/dist/utilities/{dom.js → dom/flyout.js} +1 -19
  128. package/dist/utilities/dom/index.d.ts +3 -0
  129. package/dist/utilities/dom/index.js +3 -0
  130. package/dist/utilities/dom/shadowDom.d.ts +1 -0
  131. package/dist/utilities/dom/shadowDom.js +4 -0
  132. package/dist/utilities/dom/userSelect.d.ts +2 -0
  133. package/dist/utilities/dom/userSelect.js +6 -0
  134. package/dist/utilities/platform.d.ts +1 -0
  135. package/dist/utilities/platform.js +15 -0
  136. package/dist/utilities/scroll/disable.d.ts +7 -0
  137. package/dist/utilities/scroll/disable.js +13 -0
  138. package/dist/utilities/scroll/helpers.d.ts +1 -0
  139. package/dist/utilities/scroll/helpers.js +17 -0
  140. package/dist/utilities/scroll/index.d.ts +2 -0
  141. package/dist/utilities/scroll/index.js +2 -0
  142. package/dist/utilities/scroll/lock.d.ts +5 -0
  143. package/dist/utilities/scroll/lock.js +24 -0
  144. package/dist/utilities/scroll/lockSafari.d.ts +2 -0
  145. package/dist/utilities/scroll/lockSafari.js +21 -0
  146. package/dist/utilities/scroll/lockStandard.d.ts +2 -0
  147. package/dist/utilities/scroll/lockStandard.js +17 -0
  148. package/dist/utilities/storybook/Placeholder.d.ts +1 -0
  149. package/dist/utilities/storybook/Placeholder.js +2 -2
  150. package/package.json +47 -50
  151. package/dist/utilities/dom.d.ts +0 -6
@@ -3,7 +3,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import React from "react";
4
4
  import { onNextFrame } from "../../utilities/animation.js";
5
5
  import { classNames } from "../../utilities/helpers.js";
6
- import TrapFocus from "../../utilities/a11y/TrapFocus.js";
6
+ import { TrapFocus } from "../../utilities/a11y/index.js";
7
7
  import useToggle from "../../hooks/useToggle.js";
8
8
  import useIsomorphicLayoutEffect from "../../hooks/useIsomorphicLayoutEffect.js";
9
9
  import useHotkeys from "../../hooks/useHotkeys.js";
@@ -13,21 +13,28 @@ import Portal from "../_private/Portal/index.js";
13
13
  import s from "./Overlay.module.css";
14
14
  import useHandlerRef from "../../hooks/useHandlerRef.js";
15
15
  const Overlay = (props) => {
16
- const { active, children, transparent, blurred, onClose, onOpen, disableCloseOnClick, className, attributes, } = props;
16
+ const { active, children, transparent, blurred, onClose, onOpen, disableCloseOnClick, containerRef, className, attributes, } = props;
17
+ // Selectors wrapped with refs to simplify working with useEffect dependency array
17
18
  const onCloseRef = useHandlerRef(onClose);
18
19
  const onOpenRef = useHandlerRef(onOpen);
19
- const clickThrough = transparent === true;
20
- const opacity = clickThrough ? 0 : (1 - (transparent || 0)) * 0.7;
20
+ const isTransparent = transparent === true;
21
+ const opacity = isTransparent ? 0 : (1 - (transparent || 0)) * 0.7;
21
22
  const [mounted, setMounted] = React.useState(false);
22
23
  const [animated, setAnimated] = React.useState(false);
24
+ const [offset, setOffset] = React.useState([0, 0]);
23
25
  const contentRef = React.useRef(null);
26
+ const { lockScroll, unlockScroll } = useScrollLock({ containerRef });
27
+ // Store overflow value in case we override it when rendering inside containerRef
28
+ const originalOverflowRef = React.useRef(null);
29
+ // Store mouseDown clicks that should close the overlay to then use it in mouseUp
24
30
  const isMouseDownValidRef = React.useRef(false);
25
- const { lockScroll, unlockScroll } = useScrollLock();
31
+ // Separating rendered and visible states to make sure animation is triggered only once overlay was added to the dom
26
32
  const { active: rendered, activate: render, deactivate: remove } = useToggle(active || false);
27
33
  const { active: visible, activate: show, deactivate: hide } = useToggle(active || false);
34
+ // Check that when close was triggered there were no other overlays / flyouts rendered above it
28
35
  const isDismissible = useIsDismissible(active, contentRef);
29
- const rootClassNames = classNames(s.root, visible && s["--visible"], clickThrough && s["--click-through"], blurred && s["--blurred"], animated && s["--animated"], className);
30
- const isInsideChild = (el) => {
36
+ const rootClassNames = classNames(s.root, visible && s["--visible"], isTransparent && s["--click-through"], blurred && s["--blurred"], animated && s["--animated"], containerRef && s["--contained"], className);
37
+ const isInsideContent = (el) => {
31
38
  if (!contentRef.current)
32
39
  return;
33
40
  const firstChild = contentRef.current.firstChild;
@@ -35,20 +42,24 @@ const Overlay = (props) => {
35
42
  return;
36
43
  return firstChild.contains(el);
37
44
  };
38
- const close = React.useCallback((reason) => {
45
+ const close = React.useCallback((args) => {
39
46
  if (!visible || !isDismissible())
40
47
  return;
41
- onCloseRef.current?.({ reason });
42
- }, [visible, isDismissible, onCloseRef]);
48
+ if (originalOverflowRef.current && containerRef?.current) {
49
+ containerRef.current.style.overflow = originalOverflowRef.current;
50
+ originalOverflowRef.current = null;
51
+ }
52
+ onCloseRef.current?.({ reason: args.reason });
53
+ }, [visible, isDismissible, onCloseRef, containerRef]);
43
54
  const handleMouseDown = (event) => {
44
- isMouseDownValidRef.current = !isInsideChild(event.target);
55
+ isMouseDownValidRef.current = !isInsideContent(event.target);
45
56
  };
46
57
  const handleMouseUp = (event) => {
47
- const isMouseUpValid = !isInsideChild(event.target);
48
- const shouldClose = isMouseDownValidRef.current && isMouseUpValid && !clickThrough;
58
+ const isMouseUpValid = !isInsideContent(event.target);
59
+ const shouldClose = isMouseDownValidRef.current && isMouseUpValid && !isTransparent;
49
60
  if (!shouldClose || disableCloseOnClick)
50
61
  return;
51
- close("overlay-click");
62
+ close({ reason: "overlay-click" });
52
63
  };
53
64
  const handleTransitionEnd = (e) => {
54
65
  if (e.propertyName !== "opacity" || e.target !== e.currentTarget)
@@ -56,11 +67,12 @@ const Overlay = (props) => {
56
67
  setAnimated(false);
57
68
  if (visible)
58
69
  return;
59
- if (!clickThrough)
60
- unlockScroll();
70
+ unlockScroll();
61
71
  remove();
62
72
  };
63
- useHotkeys({ Escape: () => close("escape-key") }, [close]);
73
+ useHotkeys({
74
+ Escape: () => close({ reason: "escape-key" }),
75
+ }, [close]);
64
76
  React.useEffect(() => {
65
77
  setAnimated(true);
66
78
  if (active && !rendered)
@@ -72,35 +84,41 @@ const Overlay = (props) => {
72
84
  React.useEffect(() => {
73
85
  if (!rendered)
74
86
  return;
75
- if (!clickThrough)
87
+ if (!isTransparent)
76
88
  lockScroll();
77
89
  onNextFrame(() => {
78
90
  show();
79
91
  });
80
- }, [rendered, show, lockScroll, clickThrough]);
92
+ }, [rendered, show, lockScroll, isTransparent]);
81
93
  React.useEffect(() => {
82
94
  if (!rendered || !contentRef.current)
83
95
  return;
84
96
  const trapFocus = new TrapFocus(contentRef.current);
97
+ const containerEl = containerRef?.current;
98
+ if (containerEl) {
99
+ originalOverflowRef.current = containerEl.style.overflow;
100
+ containerEl.style.overflow = "hidden";
101
+ setOffset([containerEl.scrollLeft, containerEl.scrollTop]);
102
+ }
85
103
  trapFocus.trap({
86
104
  initialFocusEl: contentRef.current.querySelector("[role=dialog][tabindex='-1']"),
87
105
  });
88
106
  onOpenRef.current?.();
89
107
  return () => trapFocus.release();
90
- // Ignoring onOpen since it might be not memoized when passed
91
- }, [rendered, onOpenRef]);
108
+ }, [rendered, onOpenRef, containerRef]);
92
109
  // Unlock scroll on unmount
93
110
  React.useEffect(() => {
94
- return () => {
95
- if (!clickThrough)
96
- unlockScroll();
97
- };
98
- }, [unlockScroll, clickThrough]);
111
+ return () => unlockScroll();
112
+ }, [unlockScroll]);
99
113
  useIsomorphicLayoutEffect(() => {
100
114
  setMounted(true);
101
115
  }, []);
102
116
  if (!rendered || !mounted)
103
117
  return null;
104
- return (_jsx(Portal, { children: _jsx(Portal.Scope, { children: (ref) => (_jsx("div", { ...attributes, ref: ref, style: { "--rs-overlay-opacity": opacity }, role: "button", tabIndex: -1, className: rootClassNames, onMouseDown: handleMouseDown, onMouseUp: handleMouseUp, onTransitionEnd: handleTransitionEnd, children: _jsx("div", { className: s.wrapper, children: _jsx("div", { className: s.inner, children: _jsx("div", { className: s.content, ref: contentRef, children: typeof children === "function" ? children({ active: visible }) : children }) }) }) })) }) }));
118
+ return (_jsx(Portal, { targetRef: containerRef, children: _jsx(Portal.Scope, { children: (ref) => (_jsx("div", { ...attributes, ref: ref, style: {
119
+ "--rs-overlay-opacity": opacity,
120
+ "--rs-overlay-offset-x": containerRef ? `${offset[0]}px` : undefined,
121
+ "--rs-overlay-offset-y": containerRef ? `${offset[1]}px` : undefined,
122
+ }, role: "button", tabIndex: -1, className: rootClassNames, onMouseDown: handleMouseDown, onMouseUp: handleMouseUp, onTransitionEnd: handleTransitionEnd, children: _jsx("div", { className: s.wrapper, children: _jsx("div", { className: s.inner, children: _jsx("div", { className: s.content, ref: contentRef, children: typeof children === "function" ? children({ active: visible }) : children }) }) }) })) }) }));
105
123
  };
106
124
  export default Overlay;
@@ -1 +1 @@
1
- .root{overflow:auto;-webkit-overflow-scrolling:touch;background-color:rgba(var(--rs-color-rgb-black),0);color:var(--rs-color-white);cursor:default!important;inset:-1px;opacity:0;outline:none;position:fixed;z-index:var(--rs-z-index-overlay)}.wrapper{display:table;height:100%;width:100%}.inner{display:table-cell;text-align:center}.content,.inner{vertical-align:middle}.content{display:inline-block;text-align:initial}.root.--visible{background-color:rgba(var(--rs-color-rgb-black),var(--rs-overlay-opacity));opacity:1}.root.--click-through{color:inherit;pointer-events:none}.root.--blurred{backdrop-filter:blur(3px)}.root.--click-through .content,.root.--click-through>:not(.wrapper){pointer-events:all}.root.--animated{transition:var(--rs-duration-medium) var(--rs-easing-accelerate);transition-property:background-color,opacity}.root.--animated.--visible{transition-timing-function:var(--rs-easing-decelerate)}
1
+ .root{--rs-overlay-offset-y:0px;--rs-overlay-offset-x:0px;overflow:auto;overflow-x:clip;position:fixed;-webkit-overflow-scrolling:touch;background-color:rgba(var(--rs-color-rgb-black),0);color:var(--rs-color-white);cursor:default!important;left:var(--rs-overlay-offset-x);opacity:0;outline:none;top:var(--rs-overlay-offset-y);z-index:var(--rs-z-index-overlay)}.root,.wrapper{height:100%;width:100%}.wrapper{display:table}.inner{display:table-cell;text-align:center}.content,.inner{vertical-align:middle}.content{display:inline-block;text-align:initial}.root.--visible{background-color:rgba(var(--rs-color-rgb-black),var(--rs-overlay-opacity));opacity:1}.root.--click-through{color:inherit;pointer-events:none}.root.--blurred{backdrop-filter:blur(3px);height:calc(100% + 2px);left:calc(var(--rs-overlay-offset-x) - 1px);top:calc(var(--rs-overlay-offset-y) - 1px);width:calc(100% + 2px)}.root.--click-through .content,.root.--click-through>:not(.wrapper){pointer-events:all}.root.--contained{position:absolute}.root.--animated{transition:var(--rs-duration-medium) var(--rs-easing-accelerate);transition-property:background-color,opacity}.root.--animated.--visible{transition-timing-function:var(--rs-easing-decelerate)}
@@ -13,6 +13,7 @@ export type Props = {
13
13
  }) => void;
14
14
  onOpen?: () => void;
15
15
  disableCloseOnClick?: boolean;
16
+ containerRef?: React.RefObject<HTMLElement>;
16
17
  className?: G.ClassName;
17
18
  attributes?: G.Attributes<"div">;
18
19
  };
@@ -9,7 +9,7 @@ export default {
9
9
  component: Overlay,
10
10
  parameters: {
11
11
  iframe: {
12
- url: "https://reshaped.so/docs/components/overlay",
12
+ url: "https://reshaped.so/docs/utilities/overlay",
13
13
  },
14
14
  },
15
15
  };
@@ -5,14 +5,12 @@ import Dismissible from "../Dismissible/index.js";
5
5
  import s from "./Popover.module.css";
6
6
  import getPaddingStyles from "../../styles/padding/index.js";
7
7
  const Popover = (props) => {
8
- const { id, forcePosition, onOpen, onClose, active, defaultActive, children, width, contentGap, variant = "elevated", triggerType = "click", position = "bottom", disableHideAnimation, disableContentHover, disableCloseOnOutsideClick, instanceRef, containerRef, } = props;
8
+ const { width, variant = "elevated", triggerType = "click", position = "bottom", ...flyoutProps } = props;
9
9
  const padding = props.padding ?? (variant === "headless" ? 0 : 4);
10
10
  const trapFocusMode = props.trapFocusMode || (triggerType === "hover" ? "content-menu" : undefined);
11
11
  const paddingStyles = getPaddingStyles(padding);
12
12
  const contentClassName = classNames(s.content, !!width && s["content--has-width"], variant && s[`content--variant-${variant}`], paddingStyles?.classNames);
13
- return (
14
- // @ts-ignore
15
- _jsx(Flyout, { id: id, instanceRef: instanceRef, position: position, forcePosition: forcePosition, onOpen: onOpen, onClose: onClose, trapFocusMode: trapFocusMode, triggerType: triggerType, active: active, defaultActive: defaultActive, width: width, disableHideAnimation: disableHideAnimation, disableContentHover: disableContentHover, disableCloseOnOutsideClick: disableCloseOnOutsideClick, contentGap: contentGap, containerRef: containerRef, contentClassName: contentClassName, contentAttributes: { style: { ...paddingStyles?.variables } }, children: children }));
13
+ return (_jsx(Flyout, { ...flyoutProps, position: position, trapFocusMode: trapFocusMode, triggerType: triggerType, width: width, contentClassName: contentClassName, contentAttributes: { style: { ...paddingStyles?.variables } } }));
16
14
  };
17
15
  const PopoverDismissible = (props) => {
18
16
  const { handleClose } = useFlyoutContext();
@@ -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" | "onOpen" | "onClose" | "width" | "trapFocusMode" | "active" | "defaultActive" | "contentGap" | "instanceRef" | "triggerType" | "disableHideAnimation" | "disableContentHover" | "disableCloseOnOutsideClick" | "containerRef"> & {
4
+ export type Props = Pick<FlyoutProps, "id" | "position" | "forcePosition" | "fallbackPositions" | "onOpen" | "onClose" | "width" | "trapFocusMode" | "active" | "defaultActive" | "contentGap" | "instanceRef" | "triggerType" | "disableHideAnimation" | "disableContentHover" | "disableCloseOnOutsideClick" | "containerRef" | "initialFocusRef"> & {
5
5
  children?: React.ReactNode;
6
6
  padding?: number;
7
7
  variant?: "elevated" | "headless";
@@ -1 +1 @@
1
- .root{align-items:center;cursor:pointer;display:inline-flex;user-select:none;vertical-align:top;-webkit-tap-highlight-color:transparent}.root:hover .input:not(:checked)+.decorator{background:var(--rs-color-background-neutral-faded)}.field{position:relative}.decorator{--rs-radio-decorator-size:var(--rs-line-height-body-3);background:var(--rs-color-background-elevation-base);border:1px solid var(--rs-color-border-neutral);border-radius:50%;height:var(--rs-radio-decorator-size);transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:background-color,border-color;width:var(--rs-radio-decorator-size)}.decorator:after{background:var(--rs-color-on-background-primary);border-radius:50%;content:"";height:calc(var(--rs-radio-decorator-size) * .4);left:50%;opacity:0;position:absolute;top:50%;transform:translate(-50%,-50%) scale(0);transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:opacity,transform;width:calc(var(--rs-radio-decorator-size) * .4)}.input:focus-visible+.decorator{box-shadow:var(--rs-focus-shadow)}.input:checked+.decorator,.root.--error .input:checked+.decorator,.root.--error:hover .input:checked+.decorator{background:var(--rs-color-background-primary);border-color:var(--rs-color-background-primary);border-width:2px}.input:checked+.decorator:after,.root.--error .input:checked+.decorator:after,.root.--error:hover .input:checked+.decorator:after{opacity:1;transform:translate(-50%,-50%) scale(1)}.text{margin-inline-start:var(--rs-unit-x2)}.root.--error .decorator,.root.--error:hover .input+.decorator{border-color:var(--rs-color-border-critical)}.root.--disabled{color:var(--rs-color-foreground-disabled);cursor:not-allowed}.root.--disabled .decorator,.root.--disabled .input:checked+.decorator,.root.--disabled:hover .input+.decorator{background:var(--rs-color-background-disabled-faded);border-color:var(--rs-color-border-disabled)}.root.--disabled .input:checked+.decorator{border-color:transparent}.root.--disabled .input:checked+.decorator:after{background:var(--rs-color-border-disabled)}
1
+ .root{align-items:center;cursor:pointer;display:inline-flex;user-select:none;vertical-align:top;-webkit-tap-highlight-color:transparent}.root:hover .input:not(:checked)+.decorator{background:var(--rs-color-background-neutral-faded)}.field{position:relative}.decorator{--rs-radio-decorator-size:var(--rs-line-height-body-3);background:var(--rs-color-background-elevation-base);border:1px solid var(--rs-color-border-neutral);border-radius:50%;height:var(--rs-radio-decorator-size);transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:background-color,border-color;width:var(--rs-radio-decorator-size)}.decorator:after{background:var(--rs-color-on-background-primary);border-radius:50%;content:"";height:calc(var(--rs-radio-decorator-size) * .4);left:50%;opacity:0;position:absolute;top:50%;transform:translate(-50%,-50%) scale(0);transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:opacity,transform;width:calc(var(--rs-radio-decorator-size) * .4)}[data-rs-keyboard] .input:focus+.decorator{box-shadow:var(--rs-focus-shadow)}.input:checked+.decorator,.root.--error .input:checked+.decorator,.root.--error:hover .input:checked+.decorator{background:var(--rs-color-background-primary);border-color:var(--rs-color-background-primary);border-width:2px}.input:checked+.decorator:after,.root.--error .input:checked+.decorator:after,.root.--error:hover .input:checked+.decorator:after{opacity:1;transform:translate(-50%,-50%) scale(1)}.text{margin-inline-start:var(--rs-unit-x2)}.root.--error .decorator,.root.--error:hover .input+.decorator{border-color:var(--rs-color-border-critical)}.root.--disabled{color:var(--rs-color-foreground-disabled);cursor:not-allowed}.root.--disabled .decorator,.root.--disabled .input:checked+.decorator,.root.--disabled:hover .input+.decorator{background:var(--rs-color-background-disabled-faded);border-color:var(--rs-color-border-disabled)}.root.--disabled .input:checked+.decorator{border-color:transparent}.root.--disabled .input:checked+.decorator:after{background:var(--rs-color-border-disabled)}
@@ -1 +1 @@
1
- .item{--rs-resizable-default-size:none;--rs-resizable-min-size:0;--rs-resizable-max-size:100%;flex-grow:100;max-width:var(--rs-resizable-default-size);min-width:var(--rs-resizable-default-size);overflow:hidden}.handle{flex-shrink:0;position:relative}.handle:after,.handle:before{border-radius:999px;content:"";position:absolute}.handle:after{background:var(--rs-color-border-neutral);opacity:0;transition:opacity var(--rs-duration-fast) var(--rs-easing-standard)}.handle--dragging:after,.handle:focus-visible:after,.handle:hover:after{opacity:.6}body:has(.handle--dragging) .handle:not(.handle--dragging){opacity:0}body:has(.--direction-row>.handle--dragging){cursor:ew-resize}body:has(.--direction-column>.handle--dragging){cursor:ns-resize}.--direction-row>.handle{cursor:ew-resize}.--direction-row>.handle:after,.--direction-row>.handle:before{inset-block:0;inset-inline-start:50%;transform:translateX(-50%)}.--direction-row>.handle:before{width:var(--rs-unit-x4)}.--direction-row>.handle:after{width:var(--rs-unit-x1)}.--direction-row>.item[data-rs-resizable-item-mounted]{max-width:var(--rs-resizable-max-size);min-width:var(--rs-resizable-min-size)}.--direction-column>.handle{cursor:ns-resize}.--direction-column>.handle:after,.--direction-column>.handle:before{inset-block-start:50%;inset-inline:0;transform:translateY(-50%)}.--direction-column>.handle:before{height:var(--rs-unit-x4)}.--direction-column>.handle:after{height:var(--rs-unit-x1)}.--direction-column>.item[data-rs-resizable-item-mounted]{max-height:var(--rs-resizable-max-size);min-height:var(--rs-resizable-min-size)}
1
+ .item{--rs-resizable-default-size:none;--rs-resizable-min-size:0;--rs-resizable-max-size:100%;flex-grow:100;max-width:var(--rs-resizable-default-size);min-width:var(--rs-resizable-default-size);overflow:hidden}.handle{flex-shrink:0;position:relative}.handle:after,.handle:before{border-radius:999px;content:"";position:absolute}.handle:after{background:var(--rs-color-border-neutral);opacity:0;transition:opacity var(--rs-duration-fast) var(--rs-easing-standard)}.handle--dragging:after,.handle:hover:after,[data-rs-keyboard] .handle:focus:after{opacity:.6}body:has(.handle--dragging) .handle:not(.handle--dragging){opacity:0}body:has(.--direction-row>.handle--dragging){cursor:ew-resize}body:has(.--direction-column>.handle--dragging){cursor:ns-resize}.--direction-row>.handle{cursor:ew-resize}.--direction-row>.handle:after,.--direction-row>.handle:before{inset-block:0;inset-inline-start:50%;transform:translateX(-50%)}.--direction-row>.handle:before{width:var(--rs-unit-x4)}.--direction-row>.handle:after{width:var(--rs-unit-x1)}.--direction-row>.item[data-rs-resizable-item-mounted]{max-width:var(--rs-resizable-max-size);min-width:var(--rs-resizable-min-size)}.--direction-column>.handle{cursor:ns-resize}.--direction-column>.handle:after,.--direction-column>.handle:before{inset-block-start:50%;inset-inline:0;transform:translateY(-50%)}.--direction-column>.handle:before{height:var(--rs-unit-x4)}.--direction-column>.handle:after{height:var(--rs-unit-x1)}.--direction-column>.item[data-rs-resizable-item-mounted]{max-height:var(--rs-resizable-max-size);min-height:var(--rs-resizable-min-size)}
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import React, { forwardRef } from "react";
4
4
  import { classNames } from "../../utilities/helpers.js";
5
- import { disableUserSelect, enableUserSelect } from "../../utilities/dom.js";
5
+ import { disableUserSelect, enableUserSelect } from "../../utilities/dom/index.js";
6
6
  import getHeightStyles from "../../styles/height/index.js";
7
7
  import getMaxHeightStyles from "../../styles/maxHeight/index.js";
8
8
  import useIsomorphicLayoutEffect from "../../hooks/useIsomorphicLayoutEffect.js";
@@ -1 +1 @@
1
- .root{--rs-slider-overflow-gap:var(--rs-unit-x1);--rs-slider-thumb-size:var(--rs-unit-x4);align-items:center;cursor:pointer;display:flex;position:relative;user-select:none;-webkit-tap-highlight-color:transparent}.root:has(.thumb:hover,.thumb--active,.input:focus-visible){overflow:visible}.bar{background:var(--rs-color-background-neutral);border-radius:var(--rs-radius-small);position:relative}.bar,.input{overflow:hidden}.input{height:1px;opacity:0;pointer-events:none;position:absolute;width:1px}.selection{background:var(--rs-color-background-primary);position:absolute}.tooltip{--rs-slider-tooltip-translate:calc(-50% + var(--rs-slider-tooltip-offset, 0px));background:var(--rs-color-background-elevation-overlay);border-radius:var(--rs-radius-small);box-shadow:var(--rs-shadow-overlay);box-sizing:initial;color:var(--rs-color-foreground-neutral);font-variant-numeric:tabular-nums;min-width:var(--rs-line-height-caption-1);opacity:0;padding:calc(var(--rs-unit-x1) / 2) var(--rs-unit-x1);pointer-events:none;text-align:center;transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:opacity,transform;user-select:none;white-space:nowrap;will-change:transform}.thumb,.thumbs,.tooltip{position:absolute}.thumb:before{background:var(--rs-color-background-primary);border-radius:999px;box-shadow:0 0 0 2px var(--rs-color-background-elevation-base);box-sizing:border-box;height:var(--rs-slider-thumb-size);transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:box-shadow;width:var(--rs-slider-thumb-size)}.thumb:after,.thumb:before{content:"";position:absolute}.thumb:after{cursor:grab;height:var(--rs-unit-x7);width:var(--rs-unit-x7)}.thumb:hover .tooltip{opacity:1}.input:focus-visible+.thumb:after,.thumb--active:after{cursor:grabbing}.input:focus-visible+.thumb:before,.thumb--active:before{box-shadow:0 0 0 1px var(--rs-color-background-elevation-base)}.input:focus-visible+.thumb .tooltip,.thumb--active .tooltip{opacity:1}.input:focus-visible+.thumb:before{box-shadow:var(--rs-focus-shadow)}.--orientation-horizontal{height:var(--rs-slider-thumb-size);margin-inline:calc(var(--rs-slider-overflow-gap) * -1);overflow-x:clip;padding-inline:var(--rs-slider-overflow-gap)}.--orientation-horizontal .bar{height:var(--rs-unit-x1);width:100%}.--orientation-horizontal .selection{height:100%;inset-inline-start:var(--rs-slider-selection-start);width:var(--rs-slider-selection-size)}.--orientation-horizontal .tooltip{bottom:100%;left:50%;transform:translate(var(--rs-slider-tooltip-translate))}.--orientation-horizontal .thumbs{height:100%;inset-inline:calc(var(--rs-slider-thumb-size) / 2 + var(--rs-slider-overflow-gap))}.--orientation-horizontal .thumb{height:100%;inset-inline-start:var(--ts-slider-thumb-position);width:0}.--orientation-horizontal .thumb:after,.--orientation-horizontal .thumb:before{left:0;top:50%;transform:translate(-50%,-50%)}.--orientation-horizontal .input:focus+.thumb .tooltip,.--orientation-horizontal .thumb--active .tooltip,.--orientation-horizontal .thumb:hover .tooltip{transform:translate(var(--rs-slider-tooltip-translate),calc(var(--rs-unit-x1) * -1.5))}.--orientation-vertical{flex-direction:column;height:100%;margin-block:calc(var(--rs-slider-overflow-gap) * -1);overflow-y:clip;padding-block:var(--rs-slider-overflow-gap);width:var(--rs-slider-thumb-size)}.--orientation-vertical .bar{height:100%;width:var(--rs-unit-x1)}.--orientation-vertical .selection{height:var(--rs-slider-selection-size);inset-block-end:var(--rs-slider-selection-start);inset-inline-start:auto;width:100%}.--orientation-vertical .tooltip{inset-inline-start:100%;top:50%;transform:translateY(var(--rs-slider-tooltip-translate))}.--orientation-vertical .thumbs{inset-block:calc(var(--rs-slider-thumb-size) / 2 + var(--rs-slider-overflow-gap));width:100%}.--orientation-vertical .thumb{height:0;inset-block-end:var(--ts-slider-thumb-position);width:100%}.--orientation-vertical .thumb:after,.--orientation-vertical .thumb:before{left:50%;top:0;transform:translate(-50%,-50%)}.--orientation-vertical .input:focus+.thumb .tooltip,.--orientation-vertical .thumb--active .tooltip,.--orientation-vertical .thumb:hover .tooltip{transform:translate(calc(var(--rs-unit-x1) * 1.5),-50%)}.--disabled{cursor:not-allowed}.--disabled .bar{background-color:var(--rs-color-background-disabled)}.--disabled .selection,.--disabled .thumb:before{background-color:var(--rs-color-foreground-disabled)}.--disabled .thumb:after{cursor:not-allowed}.--disabled .thumb:hover .tooltip{opacity:0}
1
+ .root{--rs-slider-overflow-gap:var(--rs-unit-x1);--rs-slider-thumb-size:var(--rs-unit-x4);align-items:center;cursor:pointer;display:flex;position:relative;user-select:none;-webkit-tap-highlight-color:transparent}.root:has(.thumb:hover,.thumb--active,.input:focus-visible){overflow:visible}.bar{background:var(--rs-color-background-neutral);border-radius:var(--rs-radius-small);position:relative}.bar,.input{overflow:hidden}.input{height:1px;opacity:0;pointer-events:none;position:absolute;width:1px}.selection{background:var(--rs-color-background-primary);position:absolute}.tooltip{--rs-slider-tooltip-translate:calc(-50% + var(--rs-slider-tooltip-offset, 0px));background:var(--rs-color-background-elevation-overlay);border-radius:var(--rs-radius-small);box-shadow:var(--rs-shadow-overlay);box-sizing:initial;color:var(--rs-color-foreground-neutral);font-variant-numeric:tabular-nums;min-width:var(--rs-line-height-caption-1);opacity:0;padding:calc(var(--rs-unit-x1) / 2) var(--rs-unit-x1);pointer-events:none;text-align:center;transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:opacity,transform;user-select:none;white-space:nowrap;will-change:transform}.thumb,.thumbs,.tooltip{position:absolute}.thumb:before{background:var(--rs-color-background-primary);border-radius:999px;box-shadow:0 0 0 2px var(--rs-color-background-elevation-base);box-sizing:border-box;height:var(--rs-slider-thumb-size);transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:box-shadow;width:var(--rs-slider-thumb-size)}.thumb:after,.thumb:before{content:"";position:absolute}.thumb:after{cursor:grab;height:var(--rs-unit-x7);width:var(--rs-unit-x7)}.thumb:hover .tooltip{opacity:1}.thumb--active:after,[data-rs-keyboard] .input:focus+.thumb:after{cursor:grabbing}.thumb--active:before,[data-rs-keyboard] .input:focus+.thumb:before{box-shadow:0 0 0 1px var(--rs-color-background-elevation-base)}.thumb--active .tooltip,[data-rs-keyboard] .input:focus+.thumb .tooltip{opacity:1}[data-rs-keyboard] .input:focus+.thumb:before{box-shadow:var(--rs-focus-shadow)}.--orientation-horizontal{height:var(--rs-slider-thumb-size);margin-inline:calc(var(--rs-slider-overflow-gap) * -1);overflow-x:clip;padding-inline:var(--rs-slider-overflow-gap)}.--orientation-horizontal .bar{height:var(--rs-unit-x1);width:100%}.--orientation-horizontal .selection{height:100%;inset-inline-start:var(--rs-slider-selection-start);width:var(--rs-slider-selection-size)}.--orientation-horizontal .tooltip{bottom:100%;left:50%;transform:translate(var(--rs-slider-tooltip-translate))}.--orientation-horizontal .thumbs{height:100%;inset-inline:calc(var(--rs-slider-thumb-size) / 2 + var(--rs-slider-overflow-gap))}.--orientation-horizontal .thumb{height:100%;inset-inline-start:var(--ts-slider-thumb-position);width:0}.--orientation-horizontal .thumb:after,.--orientation-horizontal .thumb:before{left:0;top:50%;transform:translate(-50%,-50%)}.--orientation-horizontal .input:focus+.thumb .tooltip,.--orientation-horizontal .thumb--active .tooltip,.--orientation-horizontal .thumb:hover .tooltip{transform:translate(var(--rs-slider-tooltip-translate),calc(var(--rs-unit-x1) * -1.5))}.--orientation-vertical{flex-direction:column;height:100%;margin-block:calc(var(--rs-slider-overflow-gap) * -1);overflow-y:clip;padding-block:var(--rs-slider-overflow-gap);width:var(--rs-slider-thumb-size)}.--orientation-vertical .bar{height:100%;width:var(--rs-unit-x1)}.--orientation-vertical .selection{height:var(--rs-slider-selection-size);inset-block-end:var(--rs-slider-selection-start);inset-inline-start:auto;width:100%}.--orientation-vertical .tooltip{inset-inline-start:100%;top:50%;transform:translateY(var(--rs-slider-tooltip-translate))}.--orientation-vertical .thumbs{inset-block:calc(var(--rs-slider-thumb-size) / 2 + var(--rs-slider-overflow-gap));width:100%}.--orientation-vertical .thumb{height:0;inset-block-end:var(--ts-slider-thumb-position);width:100%}.--orientation-vertical .thumb:after,.--orientation-vertical .thumb:before{left:50%;top:0;transform:translate(-50%,-50%)}.--orientation-vertical .input:focus+.thumb .tooltip,.--orientation-vertical .thumb--active .tooltip,.--orientation-vertical .thumb:hover .tooltip{transform:translate(calc(var(--rs-unit-x1) * 1.5),-50%)}.--disabled{cursor:not-allowed}.--disabled .bar{background-color:var(--rs-color-background-disabled)}.--disabled .selection,.--disabled .thumb:before{background-color:var(--rs-color-foreground-disabled)}.--disabled .thumb:after{cursor:not-allowed}.--disabled .thumb:hover .tooltip{opacity:0}
@@ -2,7 +2,8 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import React from "react";
4
4
  import { classNames } from "../../utilities/helpers.js";
5
- import { enableUserSelect, disableUserSelect, enableScroll, disableScroll } from "../../utilities/dom.js";
5
+ import { enableUserSelect, disableUserSelect } from "../../utilities/dom/index.js";
6
+ import { disableScroll, enableScroll } from "../../utilities/scroll/index.js";
6
7
  import useRTL from "../../hooks/useRTL.js";
7
8
  import useElementId from "../../hooks/useElementId.js";
8
9
  import { useFormControl } from "../FormControl/index.js";
@@ -1 +1 @@
1
- .root{align-items:center;display:inline-flex;gap:var(--rs-unit-x2);position:relative;vertical-align:top;-webkit-tap-highlight-color:transparent}.input{border:0;height:1px;left:0;opacity:0;outline:none;position:absolute;top:0;width:1px}.input:checked+.area{background:var(--rs-color-background-primary);border-color:transparent}.input:checked+.area .thumb{transform:translateX(var(--rs-unit-x3))}[dir=rtl] .input:checked+.area .thumb{transform:translateX(calc(var(--rs-unit-x3) * -1))}.input:focus-visible+.area{box-shadow:var(--rs-focus-shadow)}.input[disabled]+.area{background:var(--rs-color-background-disabled);cursor:not-allowed}.input[disabled]+.area .thumb{opacity:.8}.input[disabled]:checked+.area{background:var(--rs-color-background-primary);opacity:.4}.input[disabled]:checked+.area .thumb{opacity:1}.area{align-items:center;background:var(--rs-color-background-neutral);border:2px solid transparent;box-sizing:border-box;cursor:pointer;display:flex;height:calc(var(--rs-unit-x1) * 5);transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:background,border;width:calc(var(--rs-unit-x1) * 8)}.area,.thumb{border-radius:999px}.thumb{background:var(--rs-color-white);box-shadow:var(--rs-shadow-raised);height:var(--rs-unit-x4);transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:transform;width:var(--rs-unit-x4)}.root--size-small .area{height:calc(var(--rs-unit-x1) * 4);width:calc(var(--rs-unit-x1) * 6)}.root--size-small .thumb{height:var(--rs-unit-x3);width:var(--rs-unit-x3)}.root--size-small .input:checked+.area .thumb{transform:translateX(var(--rs-unit-x2))}[dir=rtl] .root--size-small .input:checked+.area .thumb{transform:translateX(calc(var(--rs-unit-x2) * -1))}.root--size-large .area{height:calc(var(--rs-unit-x1) * 6);width:calc(var(--rs-unit-x1) * 10)}.root--size-large .thumb{height:var(--rs-unit-x5);width:var(--rs-unit-x5)}.root--size-large .input:checked+.area .thumb{transform:translateX(var(--rs-unit-x4))}[dir=rtl] .root--size-large .input:checked+.area .thumb{transform:translateX(calc(var(--rs-unit-x4) * -1))}.root--reversed{flex-direction:row-reverse}
1
+ .root{align-items:center;display:inline-flex;gap:var(--rs-unit-x2);position:relative;vertical-align:top;-webkit-tap-highlight-color:transparent}.input{border:0;height:1px;left:0;opacity:0;outline:none;position:absolute;top:0;width:1px}.input:checked+.area{background:var(--rs-color-background-primary);border-color:transparent}.input:checked+.area .thumb{transform:translateX(var(--rs-unit-x3))}[dir=rtl] .input:checked+.area .thumb{transform:translateX(calc(var(--rs-unit-x3) * -1))}[data-rs-keyboard] .input:focus+.area{box-shadow:var(--rs-focus-shadow)}.input[disabled]+.area{background:var(--rs-color-background-disabled);cursor:not-allowed}.input[disabled]+.area .thumb{opacity:.8}.input[disabled]:checked+.area{background:var(--rs-color-background-primary);opacity:.4}.input[disabled]:checked+.area .thumb{opacity:1}.area{align-items:center;background:var(--rs-color-background-neutral);border:2px solid transparent;box-sizing:border-box;cursor:pointer;display:flex;height:calc(var(--rs-unit-x1) * 5);transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:background,border;width:calc(var(--rs-unit-x1) * 8)}.area,.thumb{border-radius:999px}.thumb{background:var(--rs-color-white);box-shadow:var(--rs-shadow-raised);height:var(--rs-unit-x4);transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:transform;width:var(--rs-unit-x4)}.root--size-small .area{height:calc(var(--rs-unit-x1) * 4);width:calc(var(--rs-unit-x1) * 6)}.root--size-small .thumb{height:var(--rs-unit-x3);width:var(--rs-unit-x3)}.root--size-small .input:checked+.area .thumb{transform:translateX(var(--rs-unit-x2))}[dir=rtl] .root--size-small .input:checked+.area .thumb{transform:translateX(calc(var(--rs-unit-x2) * -1))}.root--size-large .area{height:calc(var(--rs-unit-x1) * 6);width:calc(var(--rs-unit-x1) * 10)}.root--size-large .thumb{height:var(--rs-unit-x5);width:var(--rs-unit-x5)}.root--size-large .input:checked+.area .thumb{transform:translateX(var(--rs-unit-x4))}[dir=rtl] .root--size-large .input:checked+.area .thumb{transform:translateX(calc(var(--rs-unit-x4) * -1))}.root--reversed{flex-direction:row-reverse}
@@ -1,7 +1,7 @@
1
1
  import type * as T from "./Tabs.types";
2
2
  declare const Tabs: {
3
3
  (props: T.Props): import("react/jsx-runtime").JSX.Element;
4
- Item: import("react").ForwardRefExoticComponent<T.ItemProps & import("react").RefAttributes<HTMLAnchorElement | HTMLButtonElement>>;
4
+ Item: import("react").ForwardRefExoticComponent<T.ItemProps & import("react").RefAttributes<HTMLButtonElement | HTMLAnchorElement>>;
5
5
  List: (props: T.ListProps) => import("react/jsx-runtime").JSX.Element;
6
6
  Panel: (props: T.PanelProps) => import("react/jsx-runtime").JSX.Element;
7
7
  };
@@ -1 +1 @@
1
- @property --rs-tabs-stop-l{syntax:"<percentage>";initial-value:.01%;inherits:false}@property --rs-tabs-stop-r{syntax:"<percentage>";initial-value:100%;inherits:false}.root{box-sizing:initial;max-width:100%}.list,.root{position:relative}.inner{mask-image:linear-gradient(to right,transparent 0,#000 var(--rs-tabs-stop-l),#000 var(--rs-tabs-stop-r),transparent 100%);transition:var(--rs-duration-fast) var(--rs-easing-decelerate);transition-property:--rs-tabs-stop-l,--rs-tabs-stop-r}.inner:after{background-color:var(--rs-color-border-neutral-faded);content:"";position:absolute;z-index:2}.listItem{--rs-tabs-gap:var(--rs-unit-x4);flex-shrink:0;position:relative}.button{overflow:hidden;position:relative;z-index:1;-webkit-tap-highlight-color:transparent}.button,.buttonContent{border-radius:var(--rs-radius-medium);width:100%}.buttonContent{align-items:center;box-sizing:border-box;display:flex}.buttonContent:hover{color:var(--rs-color-foreground-neutral-faded)}.icon{color:inherit;transition:color var(--rs-duration-fast) var(--rs-easing-standard)}[data-rs-keyboard] .radio:focus+.buttonContent{box-shadow:var(--rs-focus-inset-shadow)}.icon:not(:last-child){margin-inline-end:var(--rs-unit-x2)}.--item-active:after{content:""}.--item-active:after,.selector{background:var(--rs-color-border-primary);border-radius:calc(var(--rs-radius-medium) - 1px);position:absolute;z-index:var(--rs-z-index-raised)}.selector{--rs-tab-selection-x:0;--rs-tab-selection-y:0;--rs-tab-selection-scale-x:0;--rs-tab-selection-scale-y:0;transform:translate(calc(var(--rs-tab-selection-x) * 1px),calc(var(--rs-tab-selection-y) * 1px)) translateZ(0);transform-origin:0 0}.--selector-hidden{visibility:hidden}.--selector-animated{transition:var(--rs-duration-medium) var(--rs-easing-decelerate);transition-property:transform,height,width;will-change:transform,height,width}.next,.prev{align-items:center;display:flex;inset-block:0;position:absolute;z-index:var(--rs-z-index-raised)}[dir=rtl] .next,[dir=rtl] .prev{transform:scaleX(-1)}.next{inset-inline-end:var(--rs-unit-x1)}.prev{inset-inline-start:var(--rs-unit-x1)}.panel{outline:none}[data-rs-keyboard] .panel:focus{box-shadow:var(--rs-focus-shadow)}.--panel-hidden{display:none}.--direction-row{margin:0 calc(var(--rs-unit-x2) * -1);overflow:hidden;padding:0 var(--rs-unit-x2)}.--direction-row .inner{margin:0 calc(var(--rs-unit-x2) * -1) -40px;overflow:auto;padding:0 var(--rs-unit-x2) 40px;white-space:nowrap;-ms-overflow-style:none;overflow:-moz-scrollbars-none;scrollbar-width:none}.--direction-row .inner::-webkit-scrollbar{display:none}.--direction-row .inner:after{height:1px;inset-inline:var(--rs-unit-x2);bottom:0}.--direction-row .list{align-items:center;display:inline-flex;flex-wrap:nowrap;vertical-align:top}.--direction-row .listItem+.listItem{margin-inline-start:var(--rs-tabs-gap)}.--direction-row .--item-active:after{height:2px;inset-inline:0;bottom:0}.--direction-row .selector{bottom:0;height:2px;left:0;width:calc(var(--rs-tab-selection-scale-x) * 1px)}.--direction-row .button{box-sizing:initial;margin:var(--rs-unit-x1) calc(var(--rs-unit-x2) * -1);padding:0 var(--rs-unit-x2)}.--direction-row .buttonContent{justify-content:center;padding:var(--rs-tabs-item-p-v) 0}.--direction-column .inner:after{bottom:0;height:100%;inset-inline-end:0;top:0;width:1px}.--direction-column .list{display:flex;flex-direction:column}.--direction-column .listItem{--rs-tabs-gap:var(--rs-unit-x1)}.--direction-column .item{padding-inline-end:var(--rs-unit-x1)}.--direction-column .listItem+.listItem{margin-top:var(--rs-tabs-gap)}.--direction-column .--item-active:after{bottom:0}.--direction-column .--item-active:after,.--direction-column .selector{height:100%;inset-inline-end:0;width:2px}.--direction-column .selector{height:calc(var(--rs-tab-selection-scale-y) * 1px);top:0}.--direction-column .button{margin-inline-start:calc(var(--rs-unit-x2) * -1);padding:var(--rs-unit-x2);width:calc(100% + var(--rs-unit-x1))}.--direction-column .buttonContent{justify-content:flex-start}.--variant-borderless .inner:after,.--variant-pills .inner:after,.--variant-pills-elevated .inner:after{content:none}.--variant-pills .button,.--variant-pills-elevated .button{margin:0;padding:0}.--variant-pills .buttonContent,.--variant-pills-elevated .buttonContent{margin:0;padding:var(--rs-tabs-item-p-v) var(--rs-tabs-item-p-h)}.--variant-pills .buttonContent:hover,.--variant-pills-elevated .buttonContent:hover{background:none}.--variant-pills .listItem,.--variant-pills-elevated .listItem{--rs-tabs-gap:var(--rs-unit-x1)}.--variant-pills .selector,.--variant-pills-elevated .selector{background-color:var(--rs-color-background-neutral);height:calc(var(--rs-tab-selection-scale-y) * 1px);opacity:.6;width:calc(var(--rs-tab-selection-scale-x) * 1px);z-index:0}.--direction-column.--variant-pills .selector,.--direction-column.--variant-pills-elevated .selector{left:0}.--direction-row.--variant-pills .selector,.--direction-row.--variant-pills-elevated .selector{top:0}.--variant-pills .--item-active:after,.--variant-pills-elevated .--item-active:after{background-color:var(--rs-color-background-neutral);opacity:.6;z-index:0}.--direction-column.--variant-pills .--item-active:after,.--direction-column.--variant-pills-elevated .--item-active:after{width:100%}.--direction-row.--variant-pills .--item-active:after,.--direction-row.--variant-pills-elevated .--item-active:after{height:100%}.--variant-pills-elevated .list{background:var(--rs-color-background-neutral-faded);border:2px solid transparent;border-radius:var(--rs-radius-medium)}.--variant-pills-elevated .--item-active:after,.--variant-pills-elevated .selector{background:var(--rs-color-background-elevation-raised);box-shadow:var(--rs-shadow-raised);box-sizing:border-box;opacity:1}.--size-medium{--rs-tabs-item-p-v:var(--rs-unit-x2);--rs-tabs-item-p-h:var(--rs-unit-x3)}.--size-large{--rs-tabs-item-p-v:var(--rs-unit-x3);--rs-tabs-item-p-h:var(--rs-unit-x4)}.--item-width-equal{max-width:none}.--item-width-equal .inner{flex-wrap:wrap;overflow:hidden}.--item-width-equal .list{display:flex}.--item-width-equal .listItem{flex-basis:0;flex-grow:1;margin:0}.--fade-end .inner,[dir=rtl] .--fade-start .inner{--rs-tabs-stop-r:85%}.--fade-start .inner,[dir=rtl] .--fade-end .inner{--rs-tabs-stop-l:15%}@media (--rs-viewport-s ){.next,.prev{display:none}}
1
+ @property --rs-tabs-stop-l{syntax:"<percentage>";initial-value:.01%;inherits:false}@property --rs-tabs-stop-r{syntax:"<percentage>";initial-value:100%;inherits:false}.root{box-sizing:initial;max-width:100%}.list,.root{position:relative}.inner{mask-image:linear-gradient(to right,transparent 0,#000 var(--rs-tabs-stop-l),#000 var(--rs-tabs-stop-r),transparent 100%);transition:var(--rs-duration-fast) var(--rs-easing-decelerate);transition-property:--rs-tabs-stop-l,--rs-tabs-stop-r}.inner:after{background-color:var(--rs-color-border-neutral-faded);content:"";position:absolute;z-index:2}.listItem{--rs-tabs-gap:var(--rs-unit-x6);flex-shrink:0;position:relative}.button{overflow:hidden;position:relative;z-index:1;-webkit-tap-highlight-color:transparent}.button,.buttonContent{border-radius:var(--rs-radius-medium);width:100%}.buttonContent{align-items:center;box-sizing:border-box;display:flex}.buttonContent:hover{color:var(--rs-color-foreground-neutral-faded)}.icon{color:inherit;transition:color var(--rs-duration-fast) var(--rs-easing-standard)}[data-rs-keyboard] .radio:focus+.buttonContent{box-shadow:var(--rs-focus-inset-shadow)}.icon:not(:last-child){margin-inline-end:var(--rs-unit-x2)}.--item-active:after{content:""}.--item-active:after,.selector{background:var(--rs-color-border-primary);border-radius:calc(var(--rs-radius-medium) - 1px);position:absolute;z-index:var(--rs-z-index-raised)}.selector{--rs-tab-selection-x:0;--rs-tab-selection-y:0;--rs-tab-selection-scale-x:0;--rs-tab-selection-scale-y:0;transform:translate(calc(var(--rs-tab-selection-x) * 1px),calc(var(--rs-tab-selection-y) * 1px)) translateZ(0);transform-origin:0 0}.--selector-hidden{visibility:hidden}.--selector-animated{transition:var(--rs-duration-medium) var(--rs-easing-decelerate);transition-property:transform,height,width;will-change:transform,height,width}.next,.prev{align-items:center;display:flex;inset-block:0;position:absolute;z-index:var(--rs-z-index-raised)}[dir=rtl] .next,[dir=rtl] .prev{transform:scaleX(-1)}.next{inset-inline-end:var(--rs-unit-x1)}.prev{inset-inline-start:var(--rs-unit-x1)}.panel{outline:none}[data-rs-keyboard] .panel:focus{box-shadow:var(--rs-focus-shadow)}.--panel-hidden{display:none}.--direction-row{margin:0 calc(var(--rs-unit-x2) * -1);overflow:hidden;padding:0 var(--rs-unit-x2)}.--direction-row .inner{margin:0 calc(var(--rs-unit-x2) * -1) -40px;overflow:auto;padding:0 var(--rs-unit-x2) 40px;white-space:nowrap;-ms-overflow-style:none;overflow:-moz-scrollbars-none;scrollbar-width:none}.--direction-row .inner::-webkit-scrollbar{display:none}.--direction-row .inner:after{height:1px;inset-inline:var(--rs-unit-x2);bottom:0}.--direction-row .list{align-items:center;display:inline-flex;flex-wrap:nowrap;vertical-align:top}.--direction-row .listItem+.listItem{margin-inline-start:var(--rs-tabs-gap)}.--direction-row .--item-active:after{height:2px;inset-inline:0;bottom:0}.--direction-row .selector{bottom:0;height:2px;left:0;width:calc(var(--rs-tab-selection-scale-x) * 1px)}.--direction-row .button{box-sizing:initial;margin:var(--rs-unit-x1) calc(var(--rs-unit-x2) * -1);padding:0 var(--rs-unit-x2)}.--direction-row .buttonContent{justify-content:center;padding:var(--rs-tabs-item-p-v) 0}.--direction-column .inner:after{bottom:0;height:100%;inset-inline-end:0;top:0;width:1px}.--direction-column .list{display:flex;flex-direction:column}.--direction-column .listItem{--rs-tabs-gap:var(--rs-unit-x1)}.--direction-column .item{padding-inline-end:var(--rs-unit-x1)}.--direction-column .listItem+.listItem{margin-top:var(--rs-tabs-gap)}.--direction-column .--item-active:after{bottom:0}.--direction-column .--item-active:after,.--direction-column .selector{height:100%;inset-inline-end:0;width:2px}.--direction-column .selector{height:calc(var(--rs-tab-selection-scale-y) * 1px);top:0}.--direction-column .button{margin-inline-start:calc(var(--rs-unit-x2) * -1);padding:var(--rs-unit-x2);width:calc(100% + var(--rs-unit-x1))}.--direction-column .buttonContent{justify-content:flex-start}.--variant-borderless .inner:after,.--variant-pills .inner:after,.--variant-pills-elevated .inner:after{content:none}.--variant-pills .button,.--variant-pills-elevated .button{margin:0;padding:0}.--variant-pills .buttonContent,.--variant-pills-elevated .buttonContent{margin:0;padding:var(--rs-tabs-item-p-v) var(--rs-tabs-item-p-h)}.--variant-pills .buttonContent:hover,.--variant-pills-elevated .buttonContent:hover{background:none}.--variant-pills .listItem,.--variant-pills-elevated .listItem{--rs-tabs-gap:var(--rs-unit-x1)}.--variant-pills .selector,.--variant-pills-elevated .selector{background-color:var(--rs-color-background-neutral);height:calc(var(--rs-tab-selection-scale-y) * 1px);opacity:.6;width:calc(var(--rs-tab-selection-scale-x) * 1px);z-index:0}.--direction-column.--variant-pills .selector,.--direction-column.--variant-pills-elevated .selector{left:0}.--direction-row.--variant-pills .selector,.--direction-row.--variant-pills-elevated .selector{top:0}.--variant-pills .--item-active:after,.--variant-pills-elevated .--item-active:after{background-color:var(--rs-color-background-neutral);opacity:.6;z-index:0}.--direction-column.--variant-pills .--item-active:after,.--direction-column.--variant-pills-elevated .--item-active:after{width:100%}.--direction-row.--variant-pills .--item-active:after,.--direction-row.--variant-pills-elevated .--item-active:after{height:100%}.--variant-pills-elevated .list{background:var(--rs-color-background-neutral-faded);border:2px solid transparent;border-radius:var(--rs-radius-medium)}.--variant-pills-elevated .--item-active:after,.--variant-pills-elevated .selector{background:var(--rs-color-background-elevation-raised);box-shadow:var(--rs-shadow-raised);box-sizing:border-box;opacity:1}.--size-medium{--rs-tabs-item-p-v:var(--rs-unit-x2);--rs-tabs-item-p-h:var(--rs-unit-x3)}.--size-large{--rs-tabs-item-p-v:var(--rs-unit-x3);--rs-tabs-item-p-h:var(--rs-unit-x4)}.--item-width-equal{max-width:none}.--item-width-equal .inner{flex-wrap:wrap;overflow:hidden}.--item-width-equal .list{display:flex}.--item-width-equal .listItem{flex-basis:0;flex-grow:1;margin:0}.--fade-end .inner,[dir=rtl] .--fade-start .inner{--rs-tabs-stop-r:85%}.--fade-start .inner,[dir=rtl] .--fade-end .inner{--rs-tabs-stop-l:15%}@media (--rs-viewport-s ){.next,.prev{display:none}}
@@ -9,8 +9,8 @@ export declare const useTabs: (value?: string) => {
9
9
  value: string;
10
10
  name?: string;
11
11
  }) => void) | undefined;
12
- direction?: ("column" | "row") | undefined;
13
12
  variant?: ("bordered" | "borderless" | "pills" | "pills-elevated") | undefined;
13
+ direction?: ("column" | "row") | undefined;
14
14
  itemWidth?: "equal" | undefined;
15
15
  size: NonNullable<T.BaseProps["size"]>;
16
16
  value?: string;
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
2
  import type * as T from "./Tabs.types";
3
- declare const _default: React.ForwardRefExoticComponent<T.ItemProps & React.RefAttributes<HTMLAnchorElement | HTMLButtonElement>>;
3
+ declare const _default: React.ForwardRefExoticComponent<T.ItemProps & React.RefAttributes<HTMLButtonElement | HTMLAnchorElement>>;
4
4
  export default _default;
@@ -6,6 +6,7 @@ import HiddenInput from "../_private/HiddenInput/index.js";
6
6
  import Actionable from "../Actionable/index.js";
7
7
  import Icon from "../Icon/index.js";
8
8
  import Text from "../Text/index.js";
9
+ import useIsomorphicLayoutEffect from "../../hooks/useIsomorphicLayoutEffect.js";
9
10
  import { useTabs } from "./TabsContext.js";
10
11
  import s from "./Tabs.module.css";
11
12
  const TabsItem = (props, ref) => {
@@ -34,8 +35,6 @@ const TabsItem = (props, ref) => {
34
35
  const listEl = elScrollableRef.current;
35
36
  const currentListItem = itemRef.current?.parentElement;
36
37
  const prevListItem = elActiveRef.current?.parentElement;
37
- // Updating refs after saving the elements
38
- updateRefs();
39
38
  if (onChange)
40
39
  onChange({ value, name });
41
40
  if (!listEl || !currentListItem || !prevListItem || listEl.scrollWidth === listEl.clientWidth) {
@@ -50,7 +49,7 @@ const TabsItem = (props, ref) => {
50
49
  return;
51
50
  itemRef.current?.scrollIntoView({ behavior: "smooth", block: "center", inline: "center" });
52
51
  };
53
- React.useEffect(() => {
52
+ useIsomorphicLayoutEffect(() => {
54
53
  if (!active)
55
54
  return;
56
55
  updateRefs();
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import React from "react";
4
4
  import { classNames, throttle } from "../../utilities/helpers.js";
5
5
  import useRTL from "../../hooks/useRTL.js";
6
- import { focusNextElement, focusPreviousElement, focusFirstElement, focusLastElement, } from "../../utilities/a11y/focus.js";
6
+ import { focusNextElement, focusPreviousElement, focusFirstElement, focusLastElement, } from "../../utilities/a11y/index.js";
7
7
  import useIsomorphicLayoutEffect from "../../hooks/useIsomorphicLayoutEffect.js";
8
8
  import useHotkeys from "../../hooks/useHotkeys.js";
9
9
  import Button from "../Button/index.js";
@@ -1,10 +1,11 @@
1
+ import React from "react";
1
2
  declare const _default: {
2
3
  title: string;
3
4
  component: {
4
- (props: import("./..").TabsProps): import("react").JSX.Element;
5
- Item: import("react").ForwardRefExoticComponent<import("./..").TabsItemProps & import("react").RefAttributes<HTMLAnchorElement | HTMLButtonElement>>;
6
- List: (props: import("../Tabs.types").ListProps) => import("react").JSX.Element;
7
- Panel: (props: import("../Tabs.types").PanelProps) => import("react").JSX.Element;
5
+ (props: import("./..").TabsProps): React.JSX.Element;
6
+ Item: React.ForwardRefExoticComponent<import("./..").TabsItemProps & React.RefAttributes<HTMLAnchorElement | HTMLButtonElement>>;
7
+ List: (props: import("../Tabs.types").ListProps) => React.JSX.Element;
8
+ Panel: (props: import("../Tabs.types").PanelProps) => React.JSX.Element;
8
9
  };
9
10
  parameters: {
10
11
  iframe: {
@@ -13,12 +14,13 @@ declare const _default: {
13
14
  };
14
15
  };
15
16
  export default _default;
16
- export declare const variant: () => import("react").JSX.Element;
17
- export declare const size: () => import("react").JSX.Element;
18
- export declare const direction: () => import("react").JSX.Element;
19
- export declare const composition: () => import("react").JSX.Element;
20
- export declare const icon: () => import("react").JSX.Element;
21
- export declare const equalWidth: () => import("react").JSX.Element;
22
- export declare const selection: () => import("react").JSX.Element;
23
- export declare const navigation: () => import("react").JSX.Element;
24
- export declare const edgeCases: () => import("react").JSX.Element;
17
+ export declare const variant: () => React.JSX.Element;
18
+ export declare const size: () => React.JSX.Element;
19
+ export declare const direction: () => React.JSX.Element;
20
+ export declare const composition: () => React.JSX.Element;
21
+ export declare const icon: () => React.JSX.Element;
22
+ export declare const equalWidth: () => React.JSX.Element;
23
+ export declare const selection: () => React.JSX.Element;
24
+ export declare const navigation: () => React.JSX.Element;
25
+ export declare const edgeCases: () => React.JSX.Element;
26
+ export declare const edgeCaseDom: () => React.JSX.Element;
@@ -1,6 +1,9 @@
1
+ import React from "react";
1
2
  import { Example } from "../../../utilities/storybook/index.js";
2
3
  import Tabs from "../index.js";
3
4
  import View from "../../View/index.js";
5
+ import Text from "../../Text/index.js";
6
+ import ScrollArea from "../../ScrollArea/index.js";
4
7
  import IconZap from "../../../icons/Zap.js";
5
8
  export default {
6
9
  title: "Components/Tabs",
@@ -126,15 +129,17 @@ export const direction = () => (<Example>
126
129
  export const composition = () => (<Example>
127
130
  <Example.Item title="switching panels">
128
131
  <Tabs>
129
- <Tabs.List>
130
- <Tabs.Item value="0">Item 1</Tabs.Item>
131
- <Tabs.Item value="1">Long item 2</Tabs.Item>
132
- <Tabs.Item value="2">Very long item 3</Tabs.Item>
133
- </Tabs.List>
132
+ <View gap={4}>
133
+ <Tabs.List>
134
+ <Tabs.Item value="0">Item 1</Tabs.Item>
135
+ <Tabs.Item value="1">Long item 2</Tabs.Item>
136
+ <Tabs.Item value="2">Very long item 3</Tabs.Item>
137
+ </Tabs.List>
134
138
 
135
- <Tabs.Panel value="0">Tab 1</Tabs.Panel>
136
- <Tabs.Panel value="1">Tab 2</Tabs.Panel>
137
- <Tabs.Panel value="2">Tab 3</Tabs.Panel>
139
+ <Tabs.Panel value="0">Tab 1</Tabs.Panel>
140
+ <Tabs.Panel value="1">Tab 2</Tabs.Panel>
141
+ <Tabs.Panel value="2">Tab 3</Tabs.Panel>
142
+ </View>
138
143
  </Tabs>
139
144
  </Example.Item>
140
145
  </Example>);
@@ -273,3 +278,61 @@ export const edgeCases = () => (<Example>
273
278
  </Tabs>
274
279
  </Example.Item>
275
280
  </Example>);
281
+ export const edgeCaseDom = () => {
282
+ const [activeItem, setActiveItem] = React.useState("1");
283
+ const sectionsRef = React.useRef(null);
284
+ return (<Example>
285
+ <Example.Item title="active item changes on scroll">
286
+ <View justify="center" align="center" padding={10}>
287
+ <View width={60} gap={2}>
288
+ <Tabs value={activeItem} onChange={(args) => setActiveItem(args.value)}>
289
+ <Tabs.List>
290
+ <Tabs.Item value="1">Item 1</Tabs.Item>
291
+ <Tabs.Item value="2">Item 2</Tabs.Item>
292
+ <Tabs.Item value="3">Item 3</Tabs.Item>
293
+ <Tabs.Item value="4">Item 4</Tabs.Item>
294
+ </Tabs.List>
295
+ </Tabs>
296
+
297
+ <ScrollArea attributes={{ ref: sectionsRef }} height={70} onScroll={(args) => {
298
+ setActiveItem(Math.min(4, Math.floor(args.y * 10) + 1).toString());
299
+ }}>
300
+ <View gap={4}>
301
+ <View gap={2}>
302
+ <Text>Section 1</Text>
303
+
304
+ <View gap={1} direction="row">
305
+ {[...Array(4)].map((i) => (<View grow height="100px" backgroundColor="neutral-faded" key={i}/>))}
306
+ </View>
307
+ </View>
308
+
309
+ <View gap={2}>
310
+ <Text>Section 2</Text>
311
+
312
+ <View gap={1} direction="row">
313
+ {[...Array(4)].map((i) => (<View grow height="100px" backgroundColor="neutral-faded"/>))}
314
+ </View>
315
+ </View>
316
+
317
+ <View gap={2}>
318
+ <Text>Section 3</Text>
319
+
320
+ <View gap={1} direction="row">
321
+ {[...Array(4)].map((i) => (<View grow height="100px" backgroundColor="neutral-faded"/>))}
322
+ </View>
323
+ </View>
324
+
325
+ <View gap={2}>
326
+ <Text>Section 4</Text>
327
+
328
+ <View gap={1} direction="row">
329
+ {[...Array(4)].map((i) => (<View grow height="100px" backgroundColor="neutral-faded"/>))}
330
+ </View>
331
+ </View>
332
+ </View>
333
+ </ScrollArea>
334
+ </View>
335
+ </View>
336
+ </Example.Item>
337
+ </Example>);
338
+ };
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React from "react";
3
4
  import { classNames, responsiveClassNames, responsivePropDependency } from "../../utilities/helpers.js";
4
5
  import useElementId from "../../hooks/useElementId.js";
5
6
  import { useFormControl } from "../FormControl/index.js";
@@ -10,8 +11,11 @@ const TextFieldSlot = (props) => {
10
11
  const { slot, icon, size, affix, position } = props;
11
12
  if (!icon && !slot && !affix)
12
13
  return null;
14
+ // In case fragment is used, map over its children instead
15
+ const renderedSlot = React.isValidElement(slot) && slot.type === React.Fragment ? slot.props.children : slot;
13
16
  const content = [
14
- slot && (_jsx("div", { className: classNames(s.slot, s[`slot--position-${position}`]), children: slot }, "slot")),
17
+ slot &&
18
+ React.Children.map(renderedSlot, (child) => (_jsx("div", { className: classNames(s.slot, s[`slot--position-${position}`]), children: child }, "slot"))),
15
19
  icon && (_jsx("div", { className: s.icon, children: _jsx(Icon, { size: responsivePropDependency(size, (size) => {
16
20
  if (size === "large")
17
21
  return 5;
@@ -1 +1 @@
1
- .root{--rs-p-h:var(--rs-text-field-gap);background:var(--rs-color-background-elevation-base);border:1px solid var(--rs-color-border-neutral);display:flex;gap:var(--rs-text-field-gap);padding:calc(var(--rs-unit-x1) - 1px) var(--rs-text-field-gap);position:relative;row-gap:var(--rs-unit-x1);z-index:0}.root:not(:has(button:focus,a:focus,[tabindex="0"]:focus)):focus-within{border-color:var(--rs-color-border-primary);box-shadow:0 0 0 1px var(--rs-color-border-primary)}.root.--multiline{flex-wrap:wrap}.root.--multiline .input{width:auto}.input{background:none;border:none;box-sizing:border-box;color:var(--rs-color-foreground-neutral);flex-grow:1;font-family:var(--rs-font-family-body);font-weight:var(--rs-font-weight-regular);margin:calc(var(--rs-unit-x1) * -1) calc(var(--rs-text-field-gap) * -1);outline:none;padding-inline:var(--rs-text-field-gap);position:relative;width:100%;z-index:1}.input:-webkit-autofill{-webkit-background-clip:text;-webkit-text-fill-color:var(--rs-color-foreground-neutral)}.affix,.icon,.slot{align-items:center;display:flex;flex-shrink:0;min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x1) * 2);position:relative;z-index:5}.slot--position-end{margin-inline-end:calc(var(--rs-unit-x1) * -1)}.icon{pointer-events:none}.affix{color:var(--rs-color-foreground-neutral-faded)}.affix.affix--position-start{padding-inline-end:var(--rs-text-field-gap)}.affix.affix--position-start:after{border-inline-end:1px solid var(--rs-color-border-neutral-faded);content:"";inset-block:var(--rs-unit-x1);inset-inline-end:0;position:absolute}.affix.affix--position-end{padding-inline-start:var(--rs-text-field-gap)}.affix.affix--position-end:after{border-inline-start:1px solid var(--rs-color-border-neutral-faded);content:"";inset-block:var(--rs-unit-x1);inset-inline-start:0;position:absolute}.root.--disabled{background:var(--rs-color-background-disabled-faded);border-color:var(--rs-color-border-disabled)}.root.--disabled,.root.--disabled .input{color:var(--rs-color-foreground-disabled);cursor:not-allowed}.--size-medium{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-line-height:var(--rs-line-height-body-3);border-radius:var(--rs-radius-small)}.--size-medium .input{padding-block:var(--rs-unit-x2)}.--size-medium .affix,.--size-medium .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3)}.--size-large{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-large .input{padding-block:var(--rs-unit-x3)}.--size-large .affix,.--size-large .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}.--size-xlarge{--rs-text-field-gap:var(--rs-unit-x4);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-xlarge .input{padding-block:var(--rs-unit-x4)}.--size-xlarge .affix,.--size-xlarge .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}.root.--variant-faded{background:var(--rs-color-background-neutral-faded);border-color:transparent}.root.--variant-faded:focus-within{border-color:var(--rs-color-border-primary)}.root.--variant-headless{background:transparent;border-color:transparent}.root.--variant-headless.--status-error,.root.--variant-headless.--status-error:focus-within,.root.--variant-headless:focus-within{border-color:transparent;box-shadow:none}.root.--status-error{border-color:var(--rs-color-border-critical)}.root.--status-error:focus-within{border-color:var(--rs-color-border-primary)}@media (--rs-viewport-s ) and (hover:none){.input{font-size:var(--rs-font-size-body-2)!important}}@media (--rs-viewport-m ){.--size-medium--m{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-line-height:var(--rs-line-height-body-3);border-radius:var(--rs-radius-small)}.--size-medium--m .input{padding-block:var(--rs-unit-x2)}.--size-medium--m .affix,.--size-medium--m .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3)}.--size-large--m{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-large--m .input{padding-block:var(--rs-unit-x3)}.--size-large--m .affix,.--size-large--m .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}.--size-xlarge--m{--rs-text-field-gap:var(--rs-unit-x4);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-xlarge--m .input{padding-block:var(--rs-unit-x4)}.--size-xlarge--m .affix,.--size-xlarge--m .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}}@media (--rs-viewport-l ){.--size-medium--l{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-line-height:var(--rs-line-height-body-3);border-radius:var(--rs-radius-small)}.--size-medium--l .input{padding-block:var(--rs-unit-x2)}.--size-medium--l .affix,.--size-medium--l .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3)}.--size-large--l{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-large--l .input{padding-block:var(--rs-unit-x3)}.--size-large--l .affix,.--size-large--l .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}.--size-xlarge--l{--rs-text-field-gap:var(--rs-unit-x4);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-xlarge--l .input{padding-block:var(--rs-unit-x4)}.--size-xlarge--l .affix,.--size-xlarge--l .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}}@media (--rs-viewport-xl ){.--size-medium--xl{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-line-height:var(--rs-line-height-body-3);border-radius:var(--rs-radius-small)}.--size-medium--xl .input{padding-block:var(--rs-unit-x2)}.--size-medium--xl .affix,.--size-medium--xl .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3)}.--size-large--xl{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-large--xl .input{padding-block:var(--rs-unit-x3)}.--size-large--xl .affix,.--size-large--xl .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}.--size-xlarge--xl{--rs-text-field-gap:var(--rs-unit-x4);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-xlarge--xl .input{padding-block:var(--rs-unit-x4)}.--size-xlarge--xl .affix,.--size-xlarge--xl .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}}
1
+ .root{--rs-p-h:var(--rs-text-field-gap);align-items:center;background:var(--rs-color-background-elevation-base);border:1px solid var(--rs-color-border-neutral);display:flex;gap:var(--rs-text-field-gap);padding:calc(var(--rs-unit-x1) - 1px) var(--rs-text-field-gap);position:relative;row-gap:var(--rs-unit-x1);z-index:0}.root:not(:has(button:focus,a:focus,[tabindex="0"]:focus)):focus-within{border-color:var(--rs-color-border-primary);box-shadow:0 0 0 1px var(--rs-color-border-primary)}.root.--multiline{flex-wrap:wrap}.root.--multiline .input{width:auto}.input{background:none;border:none;box-sizing:border-box;color:var(--rs-color-foreground-neutral);flex-grow:1;font-family:var(--rs-font-family-body);font-weight:var(--rs-font-weight-regular);margin:calc(var(--rs-unit-x1) * -1) calc(var(--rs-text-field-gap) * -1);outline:none;padding-inline:var(--rs-text-field-gap);position:relative;width:100%;z-index:1}.input:-webkit-autofill{-webkit-background-clip:text;-webkit-text-fill-color:var(--rs-color-foreground-neutral)}.affix,.icon,.slot{align-items:center;display:flex;flex-shrink:0;min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x1) * 2);position:relative;z-index:5}.slot--position-end:last-child{margin-inline-end:calc(var(--rs-unit-x1) * -1)}.icon{pointer-events:none}.affix{color:var(--rs-color-foreground-neutral-faded)}.affix.affix--position-start{padding-inline-end:var(--rs-text-field-gap)}.affix.affix--position-start:after{border-inline-end:1px solid var(--rs-color-border-neutral-faded);content:"";inset-block:var(--rs-unit-x1);inset-inline-end:0;position:absolute}.affix.affix--position-end{padding-inline-start:var(--rs-text-field-gap)}.affix.affix--position-end:after{border-inline-start:1px solid var(--rs-color-border-neutral-faded);content:"";inset-block:var(--rs-unit-x1);inset-inline-start:0;position:absolute}.root.--disabled{background:var(--rs-color-background-disabled-faded);border-color:var(--rs-color-border-disabled)}.root.--disabled,.root.--disabled .input{color:var(--rs-color-foreground-disabled);cursor:not-allowed}.--size-medium{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-line-height:var(--rs-line-height-body-3);border-radius:var(--rs-radius-small)}.--size-medium .input{padding-block:var(--rs-unit-x2)}.--size-medium .affix,.--size-medium .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3)}.--size-large{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-large .input{padding-block:var(--rs-unit-x3)}.--size-large .affix,.--size-large .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}.--size-xlarge{--rs-text-field-gap:var(--rs-unit-x4);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-xlarge .input{padding-block:var(--rs-unit-x4)}.--size-xlarge .affix,.--size-xlarge .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}.root.--variant-faded{background:var(--rs-color-background-neutral-faded);border-color:transparent}.root.--variant-faded:focus-within{border-color:var(--rs-color-border-primary)}.root.--variant-headless{background:transparent;border-color:transparent}.root.--variant-headless.--status-error,.root.--variant-headless.--status-error:focus-within,.root.--variant-headless:focus-within{border-color:transparent;box-shadow:none}.root.--status-error{border-color:var(--rs-color-border-critical)}.root.--status-error:focus-within{border-color:var(--rs-color-border-primary)}@media (--rs-viewport-s ) and (hover:none){.input{font-size:var(--rs-font-size-body-2)!important}}@media (--rs-viewport-m ){.--size-medium--m{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-line-height:var(--rs-line-height-body-3);border-radius:var(--rs-radius-small)}.--size-medium--m .input{padding-block:var(--rs-unit-x2)}.--size-medium--m .affix,.--size-medium--m .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3)}.--size-large--m{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-large--m .input{padding-block:var(--rs-unit-x3)}.--size-large--m .affix,.--size-large--m .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}.--size-xlarge--m{--rs-text-field-gap:var(--rs-unit-x4);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-xlarge--m .input{padding-block:var(--rs-unit-x4)}.--size-xlarge--m .affix,.--size-xlarge--m .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}}@media (--rs-viewport-l ){.--size-medium--l{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-line-height:var(--rs-line-height-body-3);border-radius:var(--rs-radius-small)}.--size-medium--l .input{padding-block:var(--rs-unit-x2)}.--size-medium--l .affix,.--size-medium--l .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3)}.--size-large--l{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-large--l .input{padding-block:var(--rs-unit-x3)}.--size-large--l .affix,.--size-large--l .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}.--size-xlarge--l{--rs-text-field-gap:var(--rs-unit-x4);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-xlarge--l .input{padding-block:var(--rs-unit-x4)}.--size-xlarge--l .affix,.--size-xlarge--l .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}}@media (--rs-viewport-xl ){.--size-medium--xl{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-line-height:var(--rs-line-height-body-3);border-radius:var(--rs-radius-small)}.--size-medium--xl .input{padding-block:var(--rs-unit-x2)}.--size-medium--xl .affix,.--size-medium--xl .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3)}.--size-large--xl{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-large--xl .input{padding-block:var(--rs-unit-x3)}.--size-large--xl .affix,.--size-large--xl .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}.--size-xlarge--xl{--rs-text-field-gap:var(--rs-unit-x4);--rs-text-field-line-height:var(--rs-line-height-body-2);border-radius:var(--rs-radius-medium)}.--size-xlarge--xl .input{padding-block:var(--rs-unit-x4)}.--size-xlarge--xl .affix,.--size-xlarge--xl .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2)}}
@@ -5,6 +5,7 @@ import FormControl from "../../FormControl/index.js";
5
5
  import View from "../../View/index.js";
6
6
  import Text from "../../Text/index.js";
7
7
  import Button from "../../Button/index.js";
8
+ import Badge from "../../Badge/index.js";
8
9
  export default {
9
10
  title: "Components/TextField",
10
11
  component: TextField,
@@ -98,6 +99,9 @@ export const slots = () => (<Example>
98
99
  <Example.Item title={["endSlot", "vertical and horizontal padding aligned"]}>
99
100
  <TextField name="Name" placeholder="Enter your name" value="Reshaped" endSlot={<Button icon={IconZap} size="small" onClick={() => { }}/>}/>
100
101
  </Example.Item>
102
+ <Example.Item title="multiline wrap">
103
+ <TextField name="Name" placeholder="Enter your name" value="Reshaped" startSlot={[...Array(10).keys()].map((i) => (<Badge key={i}>Item {i + 1}</Badge>))} multiline/>
104
+ </Example.Item>
101
105
  </Example>);
102
106
  export const formControl = () => (<Example>
103
107
  <Example.Item title="with helper">
@@ -3,8 +3,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import React from "react";
4
4
  import { classNames } from "../../utilities/helpers.js";
5
5
  import { onNextFrame } from "../../utilities/animation.js";
6
- import { checkKeyboardMode } from "../../utilities/a11y/keyboardMode.js";
7
- import TrapFocus from "../../utilities/a11y/TrapFocus.js";
6
+ import { checkKeyboardMode, TrapFocus } from "../../utilities/a11y/index.js";
8
7
  import Toast from "./Toast.js";
9
8
  import ToastContext from "./Toast.context.js";
10
9
  import { timeouts } from "./Toast.constants.js";