reshaped 2.8.4 → 2.9.0

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 (134) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/bundle.css +1 -1
  3. package/bundle.d.ts +2 -0
  4. package/bundle.js +10 -10
  5. package/components/Accordion/tests/Accordion.stories.d.ts +10 -0
  6. package/components/Accordion/tests/Accordion.stories.js +9 -3
  7. package/components/ActionBar/tests/ActionBar.stories.d.ts +9 -4
  8. package/components/ActionBar/tests/ActionBar.stories.js +9 -2
  9. package/components/Actionable/Actionable.d.ts +2 -2
  10. package/components/Actionable/Actionable.js +4 -4
  11. package/components/Actionable/tests/Actionable.stories.d.ts +10 -5
  12. package/components/Actionable/tests/Actionable.stories.js +10 -3
  13. package/components/Alert/tests/Alert.stories.d.ts +9 -4
  14. package/components/Alert/tests/Alert.stories.js +9 -2
  15. package/components/Autocomplete/tests/Autocomplete.stories.d.ts +9 -0
  16. package/components/Autocomplete/tests/Autocomplete.stories.js +9 -1
  17. package/components/Avatar/tests/Avatar.stories.d.ts +10 -5
  18. package/components/Avatar/tests/Avatar.stories.js +9 -2
  19. package/components/Badge/tests/Badge.stories.d.ts +9 -0
  20. package/components/Badge/tests/Badge.stories.js +9 -1
  21. package/components/Breadcrumbs/tests/Breadcrumbs.stories.d.ts +13 -6
  22. package/components/Breadcrumbs/tests/Breadcrumbs.stories.js +9 -2
  23. package/components/Button/Button.js +3 -4
  24. package/components/Button/Button.types.d.ts +2 -6
  25. package/components/Button/tests/Button.stories.d.ts +18 -13
  26. package/components/Button/tests/Button.stories.js +9 -2
  27. package/components/Calendar/tests/Calendar.stories.d.ts +10 -5
  28. package/components/Calendar/tests/Calendar.stories.js +9 -2
  29. package/components/Card/Card.d.ts +2 -2
  30. package/components/Card/Card.js +4 -4
  31. package/components/Card/tests/Card.stories.d.ts +19 -0
  32. package/components/Card/tests/Card.stories.js +9 -1
  33. package/components/Carousel/tests/Carousel.stories.d.ts +6 -0
  34. package/components/Carousel/tests/Carousel.stories.js +9 -1
  35. package/components/Checkbox/tests/Checkbox.stories.d.ts +9 -4
  36. package/components/Checkbox/tests/Checkbox.stories.js +9 -2
  37. package/components/CheckboxGroup/tests/CheckboxGroup.stories.d.ts +8 -3
  38. package/components/CheckboxGroup/tests/CheckboxGroup.stories.js +9 -2
  39. package/components/Container/tests/Container.stories.d.ts +8 -3
  40. package/components/Container/tests/Container.stories.js +9 -2
  41. package/components/Dismissible/tests/Dismissible.stories.d.ts +9 -4
  42. package/components/Dismissible/tests/Dismissible.stories.js +9 -2
  43. package/components/Divider/tests/Divider.stories.d.ts +8 -3
  44. package/components/Divider/tests/Divider.stories.js +9 -2
  45. package/components/DropdownMenu/tests/DropdownMenu.stories.d.ts +20 -7
  46. package/components/DropdownMenu/tests/DropdownMenu.stories.js +9 -2
  47. package/components/FileUpload/tests/FileUpload.stories.d.ts +9 -0
  48. package/components/FileUpload/tests/FileUpload.stories.js +9 -1
  49. package/components/FormControl/tests/FormControl.stories.d.ts +16 -6
  50. package/components/FormControl/tests/FormControl.stories.js +9 -2
  51. package/components/Hidden/tests/Hidden.stories.d.ts +6 -0
  52. package/components/Hidden/tests/Hidden.stories.js +9 -1
  53. package/components/HiddenVisually/tests/HiddenVisually.stories.d.ts +7 -2
  54. package/components/HiddenVisually/tests/HiddenVisually.stories.js +9 -2
  55. package/components/Hotkey/tests/Hotkey.stories.d.ts +7 -2
  56. package/components/Hotkey/tests/Hotkey.stories.js +9 -2
  57. package/components/Icon/tests/Icon.stories.d.ts +9 -4
  58. package/components/Icon/tests/Icon.stories.js +9 -2
  59. package/components/Image/tests/Image.stories.d.ts +11 -6
  60. package/components/Image/tests/Image.stories.js +9 -2
  61. package/components/Link/Link.d.ts +4 -5
  62. package/components/Link/Link.js +4 -4
  63. package/components/Link/tests/Link.stories.d.ts +15 -6
  64. package/components/Link/tests/Link.stories.js +9 -2
  65. package/components/Loader/tests/Loader.stories.d.ts +8 -3
  66. package/components/Loader/tests/Loader.stories.js +9 -2
  67. package/components/MenuItem/MenuItem.js +3 -4
  68. package/components/MenuItem/MenuItem.types.d.ts +1 -1
  69. package/components/MenuItem/tests/MenuItem.stories.d.ts +13 -8
  70. package/components/MenuItem/tests/MenuItem.stories.js +9 -2
  71. package/components/Modal/Modal.js +3 -0
  72. package/components/Modal/tests/Modal.stories.d.ts +17 -8
  73. package/components/Modal/tests/Modal.stories.js +9 -2
  74. package/components/Overlay/tests/Overlay.stories.d.ts +7 -2
  75. package/components/Overlay/tests/Overlay.stories.js +9 -2
  76. package/components/Popover/tests/Popover.stories.d.ts +15 -6
  77. package/components/Popover/tests/Popover.stories.js +9 -2
  78. package/components/Progress/tests/Progress.stories.d.ts +6 -0
  79. package/components/Progress/tests/Progress.stories.js +9 -1
  80. package/components/Radio/tests/Radio.stories.d.ts +9 -4
  81. package/components/Radio/tests/Radio.stories.js +9 -2
  82. package/components/RadioGroup/tests/RadioGroup.stories.d.ts +8 -3
  83. package/components/RadioGroup/tests/RadioGroup.stories.js +9 -2
  84. package/components/Reshaped/Reshaped.css +1 -1
  85. package/components/Scrim/tests/Scrim.stories.d.ts +8 -3
  86. package/components/Scrim/tests/Scrim.stories.js +9 -2
  87. package/components/ScrollArea/ScrollArea.d.ts +4 -0
  88. package/components/ScrollArea/ScrollArea.js +139 -0
  89. package/components/ScrollArea/ScrollArea.module.css +1 -0
  90. package/components/ScrollArea/ScrollArea.types.d.ts +23 -0
  91. package/components/ScrollArea/ScrollArea.types.js +1 -0
  92. package/components/ScrollArea/index.d.ts +2 -0
  93. package/components/ScrollArea/index.js +1 -0
  94. package/components/ScrollArea/tests/ScrollArea.stories.d.ts +13 -0
  95. package/components/ScrollArea/tests/ScrollArea.stories.js +115 -0
  96. package/components/Select/tests/Select.stories.d.ts +15 -10
  97. package/components/Select/tests/Select.stories.js +9 -2
  98. package/components/Skeleton/tests/Skeleton.stories.d.ts +8 -3
  99. package/components/Skeleton/tests/Skeleton.stories.js +9 -2
  100. package/components/Slider/SliderControlled.js +3 -0
  101. package/components/Slider/tests/Slider.stories.d.ts +11 -6
  102. package/components/Slider/tests/Slider.stories.js +9 -2
  103. package/components/Stepper/tests/Stepper.stories.d.ts +9 -0
  104. package/components/Stepper/tests/Stepper.stories.js +9 -1
  105. package/components/Switch/tests/Switch.stories.d.ts +10 -5
  106. package/components/Switch/tests/Switch.stories.js +9 -2
  107. package/components/Table/tests/Table.stories.d.ts +13 -0
  108. package/components/Table/tests/Table.stories.js +9 -1
  109. package/components/Tabs/tests/Tabs.stories.d.ts +20 -10
  110. package/components/Tabs/tests/Tabs.stories.js +9 -2
  111. package/components/Text/tests/Text.stories.d.ts +12 -7
  112. package/components/Text/tests/Text.stories.js +9 -2
  113. package/components/TextArea/tests/TextArea.stories.d.ts +9 -0
  114. package/components/TextArea/tests/TextArea.stories.js +9 -1
  115. package/components/TextField/tests/TextField.stories.d.ts +19 -11
  116. package/components/TextField/tests/TextField.stories.js +9 -2
  117. package/components/Theme/tests/Theme.stories.d.ts +8 -3
  118. package/components/Theme/tests/Theme.stories.js +9 -2
  119. package/components/Timeline/tests/Timeline.stories.d.ts +11 -3
  120. package/components/Timeline/tests/Timeline.stories.js +9 -2
  121. package/components/Toast/tests/Toast.stories.d.ts +13 -9
  122. package/components/Toast/tests/Toast.stories.js +8 -2
  123. package/components/Tooltip/tests/Tooltip.stories.d.ts +8 -3
  124. package/components/Tooltip/tests/Tooltip.stories.js +9 -2
  125. package/components/View/tests/View.stories.d.ts +10 -0
  126. package/components/View/tests/View.stories.js +9 -1
  127. package/index.d.ts +2 -0
  128. package/index.js +1 -0
  129. package/package.json +10 -7
  130. package/styles/width/width.module.css +1 -1
  131. package/themes/_generator/tests/themes.stories.d.ts +8 -4
  132. package/themes/_generator/tests/themes.stories.js +6 -2
  133. package/utilities/dom.d.ts +2 -0
  134. package/utilities/dom.js +6 -0
@@ -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 = Omit<ActionableProps, "type"> & {
6
+ export type Props = Pick<ActionableProps, "attributes" | "className" | "disabled" | "children" | "href" | "onClick"> & {
7
7
  color?: "neutral" | "critical" | "primary";
8
8
  icon?: IconProps["svg"];
9
9
  startSlot?: React.ReactNode;
@@ -1,12 +1,17 @@
1
- import React from "react";
2
1
  declare const _default: {
3
2
  title: string;
3
+ component: import("../MenuItem.types").Export;
4
+ parameters: {
5
+ iframe: {
6
+ url: string;
7
+ };
8
+ };
4
9
  };
5
10
  export default _default;
6
- export declare const size: () => React.JSX.Element;
7
- export declare const color: () => React.JSX.Element;
8
- export declare const selected: () => React.JSX.Element;
9
- export declare const disabled: () => React.JSX.Element;
10
- export declare const roundedCorners: () => React.JSX.Element;
11
- export declare const slots: () => React.JSX.Element;
12
- export declare const aligner: () => React.JSX.Element;
11
+ export declare const size: () => import("react").JSX.Element;
12
+ export declare const color: () => import("react").JSX.Element;
13
+ export declare const selected: () => import("react").JSX.Element;
14
+ export declare const disabled: () => import("react").JSX.Element;
15
+ export declare const roundedCorners: () => import("react").JSX.Element;
16
+ export declare const slots: () => import("react").JSX.Element;
17
+ export declare const aligner: () => import("react").JSX.Element;
@@ -1,10 +1,17 @@
1
- import React from "react";
2
1
  import { Example, Placeholder } from "../../../utilities/storybook/index.js";
3
2
  import View from "../../View/index.js";
4
3
  import Text from "../../Text/index.js";
5
4
  import MenuItem from "../index.js";
6
5
  import IconZap from "../../../icons/Zap.js";
7
- export default { title: "Components/MenuItem" };
6
+ export default {
7
+ title: "Components/MenuItem",
8
+ component: MenuItem,
9
+ parameters: {
10
+ iframe: {
11
+ url: "https://reshaped.so/docs/components/menu-item",
12
+ },
13
+ },
14
+ };
8
15
  export const size = () => (<Example>
9
16
  <Example.Item title="size: small">
10
17
  <MenuItem size="small" icon={IconZap} onClick={() => { }}>
@@ -2,6 +2,7 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import React from "react";
4
4
  import { classNames, responsiveVariables, responsiveClassNames } from "../../utilities/helpers.js";
5
+ import { enableUserSelect, disableUserSelect } from "../../utilities/dom.js";
5
6
  import useResponsiveClientValue from "../../hooks/useResponsiveClientValue.js";
6
7
  import Text from "../Text/index.js";
7
8
  import Overlay from "../Overlay/index.js";
@@ -76,6 +77,7 @@ const Modal = (props) => {
76
77
  // Prevent the drag handling when browser tab swiping is triggering
77
78
  if (clientPosition === "start" && e.targetTouches[0].clientX < DRAG_EDGE_BOUNDARY)
78
79
  return;
80
+ disableUserSelect();
79
81
  setDragging(true);
80
82
  };
81
83
  // Once modal is closed - reset its drag data
@@ -92,6 +94,7 @@ const Modal = (props) => {
92
94
  if (!dragging)
93
95
  return;
94
96
  const handleDragEnd = () => {
97
+ enableUserSelect();
95
98
  setDragging(false);
96
99
  // Close only when dragging in the closing direction
97
100
  // Changing to a different direction will keep the modal opened
@@ -1,12 +1,21 @@
1
- import React from "react";
2
1
  declare const _default: {
3
2
  title: string;
3
+ component: {
4
+ (props: import("./..").ModalProps): import("react").JSX.Element;
5
+ Title: (props: import("../Modal.types").TitleProps) => import("react").JSX.Element;
6
+ Subtitle: (props: import("../Modal.types").SubtitleProps) => import("react").JSX.Element;
7
+ };
8
+ parameters: {
9
+ iframe: {
10
+ url: string;
11
+ };
12
+ };
4
13
  };
5
14
  export default _default;
6
- export declare const position: () => React.JSX.Element;
7
- export declare const size: () => React.JSX.Element;
8
- export declare const padding: () => React.JSX.Element;
9
- export declare const composition: () => React.JSX.Element;
10
- export declare const overlay: () => React.JSX.Element;
11
- export declare const edgeCases: () => React.JSX.Element;
12
- export declare const trapFocusEdgeCases: () => React.JSX.Element;
15
+ export declare const position: () => import("react").JSX.Element;
16
+ export declare const size: () => import("react").JSX.Element;
17
+ export declare const padding: () => import("react").JSX.Element;
18
+ export declare const composition: () => import("react").JSX.Element;
19
+ export declare const overlay: () => import("react").JSX.Element;
20
+ export declare const edgeCases: () => import("react").JSX.Element;
21
+ export declare const trapFocusEdgeCases: () => import("react").JSX.Element;
@@ -9,7 +9,6 @@ var __rest = (this && this.__rest) || function (s, e) {
9
9
  }
10
10
  return t;
11
11
  };
12
- import React from "react";
13
12
  import { Example } from "../../../utilities/storybook/index.js";
14
13
  import Modal from "../index.js";
15
14
  import View from "../../View/index.js";
@@ -20,7 +19,15 @@ import Switch from "../../Switch/index.js";
20
19
  import TextField from "../../TextField/index.js";
21
20
  import useToggle from "../../../hooks/useToggle.js";
22
21
  import Radio from "../../Radio/index.js";
23
- export default { title: "Components/Modal" };
22
+ export default {
23
+ title: "Components/Modal",
24
+ component: Modal,
25
+ parameters: {
26
+ iframe: {
27
+ url: "https://reshaped.so/docs/components/modal",
28
+ },
29
+ },
30
+ };
24
31
  const Demo = (props) => {
25
32
  const { active: activeProp, title, subtitle, children } = props, modalProps = __rest(props, ["active", "title", "subtitle", "children"]);
26
33
  const { active, activate, deactivate } = useToggle(activeProp);
@@ -1,6 +1,11 @@
1
- import React from "react";
2
1
  declare const _default: {
3
2
  title: string;
3
+ component: (props: import("./..").OverlayProps) => import("react").JSX.Element | null;
4
+ parameters: {
5
+ iframe: {
6
+ url: string;
7
+ };
8
+ };
4
9
  };
5
10
  export default _default;
6
- export declare const base: () => React.JSX.Element;
11
+ export declare const base: () => import("react").JSX.Element;
@@ -1,9 +1,16 @@
1
- import React from "react";
2
1
  import { Example } from "../../../utilities/storybook/index.js";
3
2
  import Overlay from "../index.js";
4
3
  import Button from "../../Button/index.js";
5
4
  import useToggle from "../../../hooks/useToggle.js";
6
- export default { title: "Utilities/Overlay" };
5
+ export default {
6
+ title: "Utilities/Overlay",
7
+ component: Overlay,
8
+ parameters: {
9
+ iframe: {
10
+ url: "https://reshaped.so/docs/components/overlay",
11
+ },
12
+ },
13
+ };
7
14
  export const base = () => {
8
15
  const baseToggle = useToggle(true);
9
16
  const transparentToggle = useToggle(false);
@@ -1,10 +1,19 @@
1
- import React from "react";
2
1
  declare const _default: {
3
2
  title: string;
3
+ component: {
4
+ (props: import("./..").PopoverProps): import("react").JSX.Element;
5
+ Trigger: (props: import("../../_private/Flyout").FlyoutTriggerProps) => import("react").JSX.Element;
6
+ Content: (props: import("../../_private/Flyout").FlyoutContentProps) => import("react").JSX.Element | null;
7
+ };
8
+ parameters: {
9
+ iframe: {
10
+ url: string;
11
+ };
12
+ };
4
13
  };
5
14
  export default _default;
6
- export declare const position: () => React.JSX.Element;
7
- export declare const width: () => React.JSX.Element;
8
- export declare const variant: () => React.JSX.Element;
9
- export declare const padding: () => React.JSX.Element;
10
- export declare const triggerType: () => React.JSX.Element;
15
+ export declare const position: () => import("react").JSX.Element;
16
+ export declare const width: () => import("react").JSX.Element;
17
+ export declare const variant: () => import("react").JSX.Element;
18
+ export declare const padding: () => import("react").JSX.Element;
19
+ export declare const triggerType: () => import("react").JSX.Element;
@@ -9,12 +9,19 @@ var __rest = (this && this.__rest) || function (s, e) {
9
9
  }
10
10
  return t;
11
11
  };
12
- import React from "react";
13
12
  import { Example } from "../../../utilities/storybook/index.js";
14
13
  import View from "../../View/index.js";
15
14
  import Popover from "../index.js";
16
15
  import Button from "../../Button/index.js";
17
- export default { title: "Components/Popover" };
16
+ export default {
17
+ title: "Components/Popover",
18
+ component: Popover,
19
+ parameters: {
20
+ iframe: {
21
+ url: "https://reshaped.so/docs/components/popover",
22
+ },
23
+ },
24
+ };
18
25
  const Demo = (props) => {
19
26
  const { position } = props, rest = __rest(props, ["position"]);
20
27
  return (<Popover position={position} {...rest}>
@@ -1,6 +1,12 @@
1
1
  import React from "react";
2
2
  declare const _default: {
3
3
  title: string;
4
+ component: (props: import("./..").ProgressProps) => React.JSX.Element;
5
+ parameters: {
6
+ iframe: {
7
+ url: string;
8
+ };
9
+ };
4
10
  };
5
11
  export default _default;
6
12
  export declare const value: () => React.JSX.Element;
@@ -3,7 +3,15 @@ import { Example } from "../../../utilities/storybook/index.js";
3
3
  import View from "../../View/index.js";
4
4
  import Progress from "../index.js";
5
5
  import Button from "../../Button/index.js";
6
- export default { title: "Components/Progress" };
6
+ export default {
7
+ title: "Components/Progress",
8
+ component: Progress,
9
+ parameters: {
10
+ iframe: {
11
+ url: "https://reshaped.so/docs/components/progress",
12
+ },
13
+ },
14
+ };
7
15
  export const value = () => (<Example>
8
16
  <Example.Item title="value: 50">
9
17
  <Progress value={50}/>
@@ -1,8 +1,13 @@
1
- import React from "react";
2
1
  declare const _default: {
3
2
  title: string;
3
+ component: (props: import("./..").RadioProps) => import("react").JSX.Element;
4
+ parameters: {
5
+ iframe: {
6
+ url: string;
7
+ };
8
+ };
4
9
  };
5
10
  export default _default;
6
- export declare const selection: () => React.JSX.Element;
7
- export declare const error: () => React.JSX.Element;
8
- export declare const disabled: () => React.JSX.Element;
11
+ export declare const selection: () => import("react").JSX.Element;
12
+ export declare const error: () => import("react").JSX.Element;
13
+ export declare const disabled: () => import("react").JSX.Element;
@@ -1,7 +1,14 @@
1
- import React from "react";
2
1
  import { Example } from "../../../utilities/storybook/index.js";
3
2
  import Radio from "../index.js";
4
- export default { title: "Components/Radio" };
3
+ export default {
4
+ title: "Components/Radio",
5
+ component: Radio,
6
+ parameters: {
7
+ iframe: {
8
+ url: "https://reshaped.so/docs/components/radio",
9
+ },
10
+ },
11
+ };
5
12
  export const selection = () => (<Example>
6
13
  <Example.Item title="unselected">
7
14
  <Radio name="unselected" value="dog">
@@ -1,7 +1,12 @@
1
- import React from "react";
2
1
  declare const _default: {
3
2
  title: string;
3
+ component: (props: import("./..").RadioGroupProps) => import("react").JSX.Element;
4
+ parameters: {
5
+ iframe: {
6
+ url: string;
7
+ };
8
+ };
4
9
  };
5
10
  export default _default;
6
- export declare const selection: () => React.JSX.Element;
7
- export declare const disabled: () => React.JSX.Element;
11
+ export declare const selection: () => import("react").JSX.Element;
12
+ export declare const disabled: () => import("react").JSX.Element;
@@ -1,9 +1,16 @@
1
- import React from "react";
2
1
  import { Example } from "../../../utilities/storybook/index.js";
3
2
  import View from "../../View/index.js";
4
3
  import RadioGroup from "../index.js";
5
4
  import Radio from "../../Radio/index.js";
6
- export default { title: "Components/RadioGroup" };
5
+ export default {
6
+ title: "Components/RadioGroup",
7
+ component: RadioGroup,
8
+ parameters: {
9
+ iframe: {
10
+ url: "https://reshaped.so/docs/components/radio",
11
+ },
12
+ },
13
+ };
7
14
  export const selection = () => (<Example>
8
15
  <Example.Item title="unselected">
9
16
  <RadioGroup name="unselected">
@@ -1 +1 @@
1
- :root{--rs-z-index-raised:5;--rs-z-index-flyout:80;--rs-z-index-fixed:90;--rs-z-index-overlay:100;--rs-z-index-notification:110}[data-rs-color-mode=light]{color-scheme:light}[data-rs-color-mode=dark]{color-scheme:dark}*{box-sizing:border-box}blockquote,body,dd,dl,figcaption,figure,h1,h2,h3,h4,h5,h6,li,ol,p,ul{margin:0;padding:0}ol[class],ul[class]{list-style:none}a:not([class]){text-decoration-skip-ink:auto}img{display:block;max-width:100%}button,input,select,textarea{font:inherit}option{background:var(--rs-color-background-elevation-base)}label{cursor:pointer}@media (prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}[data-rs-no-transition] *,[data-rs-no-transition] :after,[data-rs-no-transition] :before{transition:none!important}input::placeholder,textarea::placeholder{color:var(--rs-color-foreground-neutral-faded);opacity:.5}html{-webkit-text-size-adjust:100%;-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;touch-action:manipulation}body,html{height:100%}body{background:var(--rs-color-background-page);color:var(--rs-color-foreground-neutral);scroll-behavior:smooth;text-rendering:optimizespeed}[data-rs-theme],body{font-family:var(--rs-font-family-body);font-size:var(--rs-font-size-body-3);font-weight:var(--rs-font-weight-regular);line-height:var(--rs-line-height-body-3)}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}fieldset{border:0;margin:0;padding:0}a{color:var(--rs-color-foreground-primary);text-decoration:underline}a:hover{text-decoration:none}
1
+ :root{--rs-z-index-raised:5;--rs-z-index-flyout:80;--rs-z-index-fixed:90;--rs-z-index-overlay:100;--rs-z-index-notification:110}[data-rs-color-mode=light]{color-scheme:light}[data-rs-color-mode=dark]{color-scheme:dark}*{box-sizing:border-box}blockquote,body,dd,dl,figcaption,figure,h1,h2,h3,h4,h5,h6,li,ol,p,ul{margin:0;padding:0}ol[class],ul[class]{list-style:none}a:not([class]){text-decoration-skip-ink:auto}img{display:block;max-width:100%}button,input,select,textarea{font:inherit}option{background:var(--rs-color-background-elevation-base)}label{cursor:pointer}@media (prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}[data-rs-no-transition] *,[data-rs-no-transition] :after,[data-rs-no-transition] :before{transition:none!important}input::placeholder,textarea::placeholder{color:var(--rs-color-foreground-neutral-faded);opacity:.5}html{-webkit-text-size-adjust:100%;-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;touch-action:manipulation}body,html{background:var(--rs-color-background-page);color:var(--rs-color-foreground-neutral);height:100%;scroll-behavior:smooth}[data-rs-theme],body{font-family:var(--rs-font-family-body);font-size:var(--rs-font-size-body-3);font-weight:var(--rs-font-weight-regular);line-height:var(--rs-line-height-body-3)}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}fieldset{border:0;margin:0;padding:0}a{color:var(--rs-color-foreground-primary);text-decoration:underline}a:hover{text-decoration:none}
@@ -1,7 +1,12 @@
1
- import React from "react";
2
1
  declare const _default: {
3
2
  title: string;
3
+ component: (props: import("./..").ScrimProps) => import("react").JSX.Element;
4
+ parameters: {
5
+ iframe: {
6
+ url: string;
7
+ };
8
+ };
4
9
  };
5
10
  export default _default;
6
- export declare const position: () => React.JSX.Element;
7
- export declare const composition: () => React.JSX.Element;
11
+ export declare const position: () => import("react").JSX.Element;
12
+ export declare const composition: () => import("react").JSX.Element;
@@ -1,7 +1,14 @@
1
- import React from "react";
2
1
  import { Example, Placeholder } from "../../../utilities/storybook/index.js";
3
2
  import Scrim from "../index.js";
4
- export default { title: "Components/Scrim" };
3
+ export default {
4
+ title: "Components/Scrim",
5
+ component: Scrim,
6
+ parameters: {
7
+ iframe: {
8
+ url: "https://reshaped.so/docs/components/scrim",
9
+ },
10
+ },
11
+ };
5
12
  export const position = () => (<Example>
6
13
  <Example.Item title="position: center">
7
14
  <Scrim backgroundSlot={<Placeholder h={200}/>}>Scrim</Scrim>
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import type * as T from "./ScrollArea.types";
3
+ declare const ScrollArea: React.ForwardRefExoticComponent<T.Props & React.RefAttributes<HTMLDivElement>>;
4
+ export default ScrollArea;
@@ -0,0 +1,139 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React, { forwardRef } from "react";
4
+ import { classNames } from "../../utilities/helpers.js";
5
+ import { disableUserSelect, enableUserSelect } from "../../utilities/dom.js";
6
+ import getHeightStyles from "../../styles/height/index.js";
7
+ import getMaxHeightStyles from "../../styles/maxHeight/index.js";
8
+ import useIsomorphicLayoutEffect from "../../hooks/useIsomorphicLayoutEffect.js";
9
+ import s from "./ScrollArea.module.css";
10
+ const ScrollAreaBar = (props) => {
11
+ const { ratio, position, vertical, onThumbMove } = props;
12
+ const [dragging, setDragging] = React.useState(false);
13
+ const dragStartPositionRef = React.useRef(0);
14
+ const barRef = React.useRef(null);
15
+ const barClassNames = classNames(s.scrollbar, vertical ? s["--scrollbar-y"] : s["--scrollbar-x"], dragging && s["--scrollbar-dragging"]);
16
+ const handleClick = (e) => {
17
+ const elBar = barRef.current;
18
+ const isDirty = dragStartPositionRef.current;
19
+ dragStartPositionRef.current = 0;
20
+ if (isDirty)
21
+ return;
22
+ if (!elBar || e.currentTarget !== elBar)
23
+ return;
24
+ const rect = elBar.getBoundingClientRect();
25
+ const diff = vertical ? e.pageY - rect.top : e.pageX - rect.left;
26
+ const total = vertical ? elBar.clientHeight : elBar.clientWidth;
27
+ // Move the center of the thumb to the clicked coordinates
28
+ onThumbMove({ value: diff / total - ratio / 2, type: "absolute" });
29
+ };
30
+ const handleDrag = React.useCallback((e) => {
31
+ if (!dragStartPositionRef.current) {
32
+ dragStartPositionRef.current = vertical ? e.pageY : e.pageX;
33
+ }
34
+ const elBar = barRef.current;
35
+ if (!elBar)
36
+ return;
37
+ if (!dragging)
38
+ return;
39
+ const diff = vertical ? e.movementY : e.movementX;
40
+ const total = vertical ? elBar.scrollHeight : elBar.scrollWidth;
41
+ onThumbMove({ value: diff / total, type: "relative" });
42
+ },
43
+ // eslint-disable-next-line react-hooks/exhaustive-deps
44
+ [ratio, vertical, dragging]);
45
+ const handleDragEnd = React.useCallback(() => {
46
+ setDragging(false);
47
+ enableUserSelect();
48
+ }, []);
49
+ const handleDragStart = () => {
50
+ setDragging(true);
51
+ disableUserSelect();
52
+ };
53
+ React.useEffect(() => {
54
+ if (!dragging)
55
+ return;
56
+ document.addEventListener("mousemove", handleDrag);
57
+ document.addEventListener("mouseup", handleDragEnd);
58
+ return () => {
59
+ document.removeEventListener("mousemove", handleDrag);
60
+ document.removeEventListener("mouseup", handleDragEnd);
61
+ };
62
+ }, [handleDrag, handleDragEnd, dragging]);
63
+ return (_jsx("div", { className: barClassNames, style: {
64
+ "--rs-scroll-area-ratio": ratio,
65
+ "--rs-scroll-area-position": position,
66
+ }, ref: barRef, onClick: handleClick, onMouseDown: handleDragStart, "aria-hidden": "true", children: _jsx("div", { className: s.thumb }) }));
67
+ };
68
+ const ScrollArea = forwardRef((props, ref) => {
69
+ const { children, height, maxHeight, scrollbarDisplay = "hover", onScroll, className, attributes, } = props;
70
+ const [scrollRatio, setScrollRatio] = React.useState({ x: 1, y: 1 });
71
+ const [scrollPosition, setScrollPosition] = React.useState({ x: 0, y: 0 });
72
+ const scrollableRef = React.useRef(null);
73
+ const resizeObserverRef = React.useRef();
74
+ const heightStyles = getHeightStyles(height);
75
+ const maxHeightStyles = getMaxHeightStyles(maxHeight);
76
+ const rootClassNames = classNames(s.root, scrollbarDisplay && s[`--display-${scrollbarDisplay}`], heightStyles === null || heightStyles === void 0 ? void 0 : heightStyles.classNames, maxHeightStyles === null || maxHeightStyles === void 0 ? void 0 : maxHeightStyles.classNames, className);
77
+ const rootVariables = Object.assign(Object.assign({}, heightStyles === null || heightStyles === void 0 ? void 0 : heightStyles.variables), maxHeightStyles === null || maxHeightStyles === void 0 ? void 0 : maxHeightStyles.variables);
78
+ const updateScroll = React.useCallback(() => {
79
+ const scrollableEl = scrollableRef.current;
80
+ if (!scrollableEl)
81
+ return;
82
+ setScrollRatio({
83
+ x: scrollableEl.clientWidth / scrollableEl.scrollWidth,
84
+ y: scrollableEl.clientHeight / scrollableEl.scrollHeight,
85
+ });
86
+ }, []);
87
+ const handleScroll = (e) => {
88
+ const scrollableEl = scrollableRef.current;
89
+ if (!scrollableEl)
90
+ return;
91
+ const next = {
92
+ x: e.currentTarget.scrollLeft / scrollableEl.scrollWidth,
93
+ y: e.currentTarget.scrollTop / scrollableEl.scrollHeight,
94
+ };
95
+ setScrollPosition(next);
96
+ onScroll === null || onScroll === void 0 ? void 0 : onScroll(next);
97
+ };
98
+ const handleThumbYMove = (args) => {
99
+ const scrollableEl = scrollableRef.current;
100
+ if (!scrollableEl)
101
+ return;
102
+ const value = scrollableEl.scrollHeight * args.value;
103
+ if (args.type === "absolute") {
104
+ scrollableEl.scrollTop = value;
105
+ }
106
+ else {
107
+ scrollableEl.scrollTop += value;
108
+ }
109
+ };
110
+ const handleThumbXMove = (args) => {
111
+ const scrollableEl = scrollableRef.current;
112
+ if (!scrollableEl)
113
+ return;
114
+ const value = scrollableEl.clientWidth * args.value;
115
+ if (args.type === "absolute") {
116
+ scrollableEl.scrollLeft = value;
117
+ }
118
+ else {
119
+ scrollableEl.scrollLeft += value;
120
+ }
121
+ };
122
+ React.useImperativeHandle(ref, () => scrollableRef.current);
123
+ useIsomorphicLayoutEffect(() => {
124
+ updateScroll();
125
+ }, [updateScroll]);
126
+ useIsomorphicLayoutEffect(() => {
127
+ const scrollableEl = scrollableRef.current;
128
+ if (!scrollableEl)
129
+ return;
130
+ resizeObserverRef.current = new ResizeObserver(updateScroll);
131
+ resizeObserverRef.current.observe(scrollableEl);
132
+ return () => {
133
+ var _a;
134
+ (_a = resizeObserverRef.current) === null || _a === void 0 ? void 0 : _a.disconnect();
135
+ };
136
+ }, [updateScroll]);
137
+ return (_jsxs("div", Object.assign({}, attributes, { className: rootClassNames, style: rootVariables, children: [_jsx("div", { className: s.scrollable, ref: scrollableRef, onScroll: handleScroll, children: children }), scrollRatio.y < 1 && scrollbarDisplay !== "hidden" && (_jsx(ScrollAreaBar, { vertical: true, onThumbMove: handleThumbYMove, ratio: scrollRatio.y, position: scrollPosition.y })), scrollRatio.x < 1 && scrollbarDisplay !== "hidden" && (_jsx(ScrollAreaBar, { onThumbMove: handleThumbXMove, ratio: scrollRatio.x, position: scrollPosition.x }))] })));
138
+ });
139
+ export default ScrollArea;
@@ -0,0 +1 @@
1
+ .root{--rs-scroll-area-thumb-size:calc(var(--rs-unit-x1) * 1.5);--rs-scroll-area-thumb-offset:calc(var(--rs-unit-x1) / 2)}.root,.scrollable{height:100%;position:relative}.scrollable{overflow:auto;scrollbar-width:none}.scrollable::-webkit-scrollbar{height:0;width:0}.scrollbar{box-sizing:initial;padding:var(--rs-scroll-area-thumb-offset);position:absolute}.scrollbar.--scrollbar-dragging .thumb:before,.scrollbar:hover .thumb:before{opacity:.4}.thumb{height:100%;position:relative;width:100%}.thumb:before{background:var(--rs-color-foreground-neutral);border-radius:999px;content:"";display:block;opacity:0;position:absolute;transition:opacity var(--rs-duration-fast) var(--rs-easing-standard)}.--scrollbar-y{inset-block:0;inset-inline-end:0;width:var(--rs-scroll-area-thumb-size)}.--scrollbar-y .thumb:before{height:calc(var(--rs-scroll-area-ratio) * 100%);inset-block-start:calc(var(--rs-scroll-area-position) * 100%);width:100%}.--scrollbar-x{height:var(--rs-scroll-area-thumb-size);inset-block-end:0;inset-inline:0}.--scrollbar-x .thumb:before{height:100%;inset-inline-start:calc(var(--rs-scroll-area-position) * 100%);width:calc(var(--rs-scroll-area-ratio) * 100%)}.--scrollbar-y:not(:last-child){inset-block-end:calc(var(--rs-scroll-area-thumb-size) + var(--rs-scroll-area-thumb-offset) * 2)}.--scrollbar-y~.--scrollbar-x{inset-inline-end:calc(var(--rs-scroll-area-thumb-size) + var(--rs-scroll-area-thumb-offset) * 2)}.--display-hover:hover .thumb:before,.--display-visible .thumb:before{opacity:.2}
@@ -0,0 +1,23 @@
1
+ import type React from "react";
2
+ import type * as G from "../../types/global";
3
+ export type Props = {
4
+ children: React.ReactNode;
5
+ scrollbarDisplay?: "visible" | "hover" | "hidden";
6
+ onScroll?: (args: {
7
+ x: number;
8
+ y: number;
9
+ }) => void;
10
+ height?: G.Responsive<string | number>;
11
+ maxHeight?: G.Responsive<string | number>;
12
+ className?: G.ClassName;
13
+ attributes?: G.Attributes<"div", Props>;
14
+ };
15
+ export type BarProps = {
16
+ ratio: number;
17
+ position: number;
18
+ vertical?: boolean;
19
+ onThumbMove: (args: {
20
+ value: number;
21
+ type: "absolute" | "relative";
22
+ }) => void;
23
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export { default } from "./ScrollArea";
2
+ export type { Props as ScrollAreaProps } from "./ScrollArea.types";
@@ -0,0 +1 @@
1
+ export { default } from "./ScrollArea.js";
@@ -0,0 +1,13 @@
1
+ declare const _default: {
2
+ title: string;
3
+ component: import("react").ForwardRefExoticComponent<import("./..").ScrollAreaProps & import("react").RefAttributes<HTMLDivElement>>;
4
+ parameters: {
5
+ iframe: {
6
+ url: string;
7
+ };
8
+ };
9
+ };
10
+ export default _default;
11
+ export declare const direction: () => import("react").JSX.Element;
12
+ export declare const visibility: () => import("react").JSX.Element;
13
+ export declare const ref: () => import("react").JSX.Element;