reshaped 3.7.0-canary.8 → 3.7.0-canary.9

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.
@@ -10,8 +10,9 @@ import useHandlerRef from "../../hooks/useHandlerRef.js";
10
10
  import s from "./Autocomplete.module.css";
11
11
  const AutocompleteContext = React.createContext({});
12
12
  const Autocomplete = (props) => {
13
- const { children, onChange, onInput, onItemSelect, name, containerRef, instanceRef, onBackspace, active, onOpen, onClose, ...textFieldProps } = props;
13
+ const { children, onChange, onInput, onItemSelect, name, containerRef, instanceRef, onBackspace, onEnter, active, onOpen, onClose, ...textFieldProps } = props;
14
14
  const onBackspaceRef = useHandlerRef(onBackspace);
15
+ const onEnterRef = useHandlerRef(onEnter);
15
16
  const internalInputRef = React.useRef(null);
16
17
  const inputAttributesRef = textFieldProps.inputAttributes?.ref;
17
18
  const inputRef = inputAttributesRef && typeof inputAttributesRef !== "string" && "current" in inputAttributesRef
@@ -67,9 +68,12 @@ const Autocomplete = (props) => {
67
68
  [keys.BACKSPACE]: () => {
68
69
  onBackspaceRef.current?.();
69
70
  },
70
- }, [onBackspaceRef], {
71
+ [keys.ENTER]: () => {
72
+ onEnterRef.current?.();
73
+ },
74
+ }, [onBackspaceRef, onEnterRef], {
71
75
  ref: inputRef,
72
- disabled: !onBackspaceRef.current,
76
+ disabled: !onBackspaceRef.current && !onEnterRef.current,
73
77
  });
74
78
  useHotkeys({
75
79
  [keys.DOWN]: () => {
@@ -9,6 +9,7 @@ export type Props = TextFieldProps & Pick<DropdownMenuProps, "containerRef" | "i
9
9
  onInput?: TextFieldProps["onChange"];
10
10
  onItemSelect?: (args: SelectArgs) => void;
11
11
  onBackspace?: () => void;
12
+ onEnter?: () => void;
12
13
  children: React.ReactNode;
13
14
  };
14
15
  export type ItemProps = MenuItemProps & SelectArgs;
@@ -72,7 +72,6 @@ const FlyoutControlled = (props) => {
72
72
  active: isRendered && triggerType !== "hover",
73
73
  contentRef: flyoutElRef,
74
74
  triggerRef: triggerElRef,
75
- blocking: false,
76
75
  });
77
76
  const clearTimer = React.useCallback(() => {
78
77
  if (timerRef.current)
@@ -31,8 +31,7 @@ const Overlay = (props) => {
31
31
  // Separating rendered and visible states to make sure animation is triggered only once overlay was added to the dom
32
32
  const { active: rendered, activate: render, deactivate: remove } = useToggle(active || false);
33
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
35
- const isDismissible = useIsDismissible({ active, contentRef, blocking: true });
34
+ const isDismissible = useIsDismissible({ active, contentRef });
36
35
  const rootClassNames = classNames(s.root, visible && s["--visible"], isTransparent && s["--click-through"], blurred && s["--blurred"], animated && s["--animated"], containerRef && s["--contained"], overflow === "auto" && s["--overflow-auto"], className);
37
36
  const isInsideContent = (el) => {
38
37
  if (!contentRef.current)
@@ -50,15 +50,19 @@ export declare const dismissible: StoryObj<{
50
50
  handleClose: ReturnType<typeof fn>;
51
51
  }>;
52
52
  export declare const className: StoryObj;
53
+ export declare const testNested: {
54
+ name: string;
55
+ render: () => import("react").JSX.Element;
56
+ };
53
57
  export declare const testWithTooltip: {
54
58
  name: string;
55
59
  render: () => import("react").JSX.Element;
56
60
  };
57
- export declare const variant: {
61
+ export declare const testContentEditable: {
58
62
  name: string;
59
63
  render: () => import("react").JSX.Element;
60
64
  };
61
- export declare const teslContentEditable: {
65
+ export declare const variant: {
62
66
  name: string;
63
67
  render: () => import("react").JSX.Element;
64
68
  };
@@ -221,6 +221,25 @@ export const className = {
221
221
  expect(menu).toHaveClass("test-classname");
222
222
  },
223
223
  };
224
+ export const testNested = {
225
+ name: "test: nested",
226
+ render: () => (<Popover position="bottom">
227
+ <Popover.Trigger>
228
+ {(attributes) => <Button attributes={attributes}>Open</Button>}
229
+ </Popover.Trigger>
230
+ <Popover.Content>
231
+ <View gap={2} align="start">
232
+ Popover content
233
+ <Popover>
234
+ <Popover.Trigger>
235
+ {(attributes) => <Button attributes={attributes}>Open</Button>}
236
+ </Popover.Trigger>
237
+ <Popover.Content>Hello</Popover.Content>
238
+ </Popover>
239
+ </View>
240
+ </Popover.Content>
241
+ </Popover>),
242
+ };
224
243
  export const testWithTooltip = {
225
244
  name: "test: with tooltip",
226
245
  render: () => (<View paddingTop={10}>
@@ -244,22 +263,7 @@ export const testWithTooltip = {
244
263
  </Tooltip>
245
264
  </View>),
246
265
  };
247
- export const variant = {
248
- name: "variant [deprecated]",
249
- render: () => (<Example>
250
- <Example.Item title="variant: headless">
251
- <Popover variant="headless" defaultActive position="bottom-start">
252
- <Popover.Trigger>
253
- {(attributes) => <Button attributes={attributes}>Open</Button>}
254
- </Popover.Trigger>
255
- <Popover.Content>
256
- <View height="100px" width="100px" borderColor="primary" borderRadius="medium" backgroundColor="primary-faded"/>
257
- </Popover.Content>
258
- </Popover>
259
- </Example.Item>
260
- </Example>),
261
- };
262
- export const teslContentEditable = {
266
+ export const testContentEditable = {
263
267
  name: "test: contenteditable",
264
268
  render: () => {
265
269
  const [active, setActive] = useState(false);
@@ -299,3 +303,18 @@ export const teslContentEditable = {
299
303
  </Popover>);
300
304
  },
301
305
  };
306
+ export const variant = {
307
+ name: "variant [deprecated]",
308
+ render: () => (<Example>
309
+ <Example.Item title="variant: headless">
310
+ <Popover variant="headless" defaultActive position="bottom-start">
311
+ <Popover.Trigger>
312
+ {(attributes) => <Button attributes={attributes}>Open</Button>}
313
+ </Popover.Trigger>
314
+ <Popover.Content>
315
+ <View height="100px" width="100px" borderColor="primary" borderRadius="medium" backgroundColor="primary-faded"/>
316
+ </Popover.Content>
317
+ </Popover>
318
+ </Example.Item>
319
+ </Example>),
320
+ };
@@ -1 +1 @@
1
- .root{display:grid;position:relative}.root:after{content:attr(data-rs-textarea-value) " ";visibility:hidden;white-space:pre-wrap}.input,.root:after{border:1px solid var(--rs-color-border-neutral);box-sizing:border-box;flex-grow:1;font-family:var(--rs-font-family-body);font-weight:var(--rs-font-weight-regular);grid-area:1/1/2/2;padding:calc(var(--rs-p) - 1px);width:100%;word-break:break-all}.input{background:var(--rs-color-background-elevation-base);border-radius:var(--rs-radius-small);color:var(--rs-color-foreground-neutral);outline:none;position:relative;z-index:1}.input:focus{border-color:var(--rs-color-border-primary);box-shadow:0 0 0 1px var(--rs-color-border-primary)}.input[disabled]{background:var(--rs-color-background-disabled-faded);border-color:var(--rs-color-border-disabled);color:var(--rs-color-foreground-disabled);cursor:not-allowed}.--size-medium{--rs-p:var(--rs-unit-x2);border-radius:var(--rs-radius-small)}.--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-p:var(--rs-unit-x3);border-radius:var(--rs-radius-medium)}.--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-p:var(--rs-unit-x4);border-radius:var(--rs-radius-medium)}.--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 .input{background:var(--rs-color-background-neutral-faded);border-color:transparent}.root.--variant-faded .input:focus{border-color:var(--rs-color-border-primary)}.root.--variant-headless .input{background:transparent;border-color:transparent}.root.--variant-headless .input:focus,.root.--variant-headless.--status-error .input,.root.--variant-headless.--status-error .input:focus{border-color:transparent;box-shadow:none}.root.--status-error .input{border-color:var(--rs-color-border-critical)}.root.--status-error .input:active,.root.--status-error .input:focus{border-color:var(--rs-color-border-primary);box-shadow:0 0 0 1px var(--rs-color-border-primary)}.root.--resize-auto .input,.root.--resize-none .input{resize:none}@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-p:var(--rs-unit-x2);border-radius:var(--rs-radius-small)}.--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-p:var(--rs-unit-x3);border-radius:var(--rs-radius-medium)}.--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-p:var(--rs-unit-x4);border-radius:var(--rs-radius-medium)}.--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-p:var(--rs-unit-x2);border-radius:var(--rs-radius-small)}.--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-p:var(--rs-unit-x3);border-radius:var(--rs-radius-medium)}.--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-p:var(--rs-unit-x4);border-radius:var(--rs-radius-medium)}.--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-p:var(--rs-unit-x2);border-radius:var(--rs-radius-small)}.--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-p:var(--rs-unit-x3);border-radius:var(--rs-radius-medium)}.--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-p:var(--rs-unit-x4);border-radius:var(--rs-radius-medium)}.--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{display:grid;position:relative}.root:after{content:attr(data-rs-textarea-value) " ";overflow:hidden;overflow-wrap:break-word;visibility:hidden;white-space:pre-wrap}.input,.root:after{border:1px solid var(--rs-color-border-neutral);box-sizing:border-box;flex-grow:1;font-family:var(--rs-font-family-body);font-weight:var(--rs-font-weight-regular);grid-area:1/1/2/2;padding:calc(var(--rs-p) - 1px);width:100%}.input{background:var(--rs-color-background-elevation-base);border-radius:var(--rs-radius-small);color:var(--rs-color-foreground-neutral);outline:none;position:relative;z-index:1}.input:focus{border-color:var(--rs-color-border-primary);box-shadow:0 0 0 1px var(--rs-color-border-primary)}.input[disabled]{background:var(--rs-color-background-disabled-faded);border-color:var(--rs-color-border-disabled);color:var(--rs-color-foreground-disabled);cursor:not-allowed}.--size-medium{--rs-p:var(--rs-unit-x2);border-radius:var(--rs-radius-small)}.--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-p:var(--rs-unit-x3);border-radius:var(--rs-radius-medium)}.--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-p:var(--rs-unit-x4);border-radius:var(--rs-radius-medium)}.--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 .input{background:var(--rs-color-background-neutral-faded);border-color:transparent}.root.--variant-faded .input:focus{border-color:var(--rs-color-border-primary)}.root.--variant-headless .input{background:transparent;border-color:transparent}.root.--variant-headless .input:focus,.root.--variant-headless.--status-error .input,.root.--variant-headless.--status-error .input:focus{border-color:transparent;box-shadow:none}.root.--status-error .input{border-color:var(--rs-color-border-critical)}.root.--status-error .input:active,.root.--status-error .input:focus{border-color:var(--rs-color-border-primary);box-shadow:0 0 0 1px var(--rs-color-border-primary)}.root.--resize-auto .input,.root.--resize-none .input{resize:none}@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-p:var(--rs-unit-x2);border-radius:var(--rs-radius-small)}.--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-p:var(--rs-unit-x3);border-radius:var(--rs-radius-medium)}.--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-p:var(--rs-unit-x4);border-radius:var(--rs-radius-medium)}.--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-p:var(--rs-unit-x2);border-radius:var(--rs-radius-small)}.--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-p:var(--rs-unit-x3);border-radius:var(--rs-radius-medium)}.--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-p:var(--rs-unit-x4);border-radius:var(--rs-radius-medium)}.--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-p:var(--rs-unit-x2);border-radius:var(--rs-radius-small)}.--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-p:var(--rs-unit-x3);border-radius:var(--rs-radius-medium)}.--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-p:var(--rs-unit-x4);border-radius:var(--rs-radius-medium)}.--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)}}
@@ -8,6 +8,5 @@ declare const useIsDismissible: (args: {
8
8
  active?: boolean;
9
9
  contentRef: Ref;
10
10
  triggerRef?: Ref;
11
- blocking?: boolean;
12
11
  }) => () => boolean;
13
12
  export default useIsDismissible;
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import React from "react";
6
6
  import useElementId from "../useElementId.js";
7
+ import { onNextFrame } from "../../utilities/animation.js";
7
8
  let queue = {};
8
9
  let latestId = null;
9
10
  const removeFromQueue = (id) => {
@@ -22,19 +23,22 @@ const addToQueue = (id, contentRef, triggerRef) => {
22
23
  latestId = id;
23
24
  };
24
25
  const useIsDismissible = (args) => {
25
- const { active, contentRef, triggerRef, blocking } = args;
26
+ const { active, contentRef, triggerRef } = args;
26
27
  const id = useElementId();
27
- const isDismissible = React.useCallback(() => {
28
- if (!blocking)
29
- return true;
30
- return active ? latestId === id : true;
31
- }, [id, active, blocking]);
32
28
  React.useEffect(() => {
33
29
  if (!active)
34
30
  return;
35
- addToQueue(id, contentRef, triggerRef);
31
+ if (queue.length) {
32
+ // Make sure new item is added to the queue after others unmount first
33
+ onNextFrame(() => addToQueue(id, contentRef, triggerRef));
34
+ }
35
+ else {
36
+ addToQueue(id, contentRef, triggerRef);
37
+ }
36
38
  return () => removeFromQueue(id);
37
39
  }, [active, id, contentRef, triggerRef]);
38
- return isDismissible;
40
+ return React.useCallback(() => {
41
+ return active ? latestId === id : true;
42
+ }, [id, active]);
39
43
  };
40
44
  export default useIsDismissible;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "reshaped",
3
3
  "description": "Professionally crafted design system in React & Figma for building products of any scale and complexity",
4
- "version": "3.7.0-canary.8",
4
+ "version": "3.7.0-canary.9",
5
5
  "license": "MIT",
6
6
  "email": "hello@reshaped.so",
7
7
  "homepage": "https://reshaped.so",