reshaped 3.7.0-canary.7 → 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.
- package/CHANGELOG.md +5 -0
- package/dist/bundle.css +1 -1
- package/dist/bundle.js +10 -10
- package/dist/components/Autocomplete/Autocomplete.js +7 -3
- package/dist/components/Autocomplete/Autocomplete.types.d.ts +1 -0
- package/dist/components/Carousel/Carousel.module.css +1 -1
- package/dist/components/Flyout/FlyoutControlled.js +0 -1
- package/dist/components/Modal/tests/Modal.stories.js +8 -0
- package/dist/components/Overlay/Overlay.js +1 -2
- package/dist/components/Popover/tests/Popover.stories.d.ts +6 -2
- package/dist/components/Popover/tests/Popover.stories.js +35 -16
- package/dist/components/TextArea/TextArea.module.css +1 -1
- package/dist/components/TextField/TextField.js +1 -1
- package/dist/hooks/_private/useIsDismissible.d.ts +0 -1
- package/dist/hooks/_private/useIsDismissible.js +12 -8
- package/dist/utilities/a11y/TrapFocus.js +5 -1
- package/package.json +1 -1
@@ -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
|
-
|
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;
|
@@ -1 +1 @@
|
|
1
|
-
.root{isolation:isolate;position:relative;width:100%}.control{display:none;opacity:0;position:absolute;top:50%;transform:translate(-50%,-50%) scale(.75);transform-origin:50%;transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:opacity,transform;z-index:var(--rs-z-index-relative)}.--control-prev{left:0}.--control-next{left:100%}.--control-visible{opacity:1;transform:translate(-50%,-50%) scale(1)}.scroll{overflow:auto;-ms-overflow-style:none;overflow:-moz-scrollbars-none;-webkit-overflow-scrolling:touch;backface-visibility:hidden;margin:0 calc(var(--rs-unit-x1) * var(--rs-carousel-bleed) * -1);padding:0 calc(var(--rs-unit-x1) * var(--rs-carousel-bleed));scroll-behavior:smooth;scroll-padding-inline-start:calc(var(--rs-unit-x1) * var(--rs-carousel-bleed));scroll-snap-type:x mandatory;scrollbar-width:none}.scroll::-webkit-scrollbar{display:none;height:0;width:0}.item{--rs-carousel-item-width:calc(100% / var(--rs-carousel-items) - var(--rs-view-gap-value) * (var(--rs-carousel-items) - 1) / var(--rs-carousel-items));position:relative;scroll-snap-align:start;width:var(--rs-carousel-item-width)}@media (--rs-viewport-l ),(hover:hover){.--control-rendered{display:block}}@media (hover:none){.--bleed .item{width:calc(var(--rs-carousel-item-width) - 10% / var(--rs-carousel-items))}}@media (--rs-viewport-m ) and (hover:none){.--bleed-true--m .item{width:calc(var(--rs-carousel-item-width) - 10% / var(--rs-carousel-items))}.--bleed-false--m .item{width:var(--rs-carousel-item-width)}}@media (--rs-viewport-l ) and (hover:none){.--bleed-true--l .item{width:calc(var(--rs-carousel-item-width) - 10% / var(--rs-carousel-items))}.--bleed-false--l .item{width:var(--rs-carousel-item-width)}}@media (--rs-viewport-xl ) and (hover:none){.--bleed-true--xl .item{width:calc(var(--rs-carousel-item-width) - 10% / var(--rs-carousel-items))}.--bleed-false--xl .item{width:var(--rs-carousel-item-width)}}.root{--rs-carousel-items-s:unset;--rs-carousel-items-m:var(--rs-carousel-items-s);--rs-carousel-items-l:var(--rs-carousel-items-m);--rs-carousel-items-xl:var(--rs-carousel-items-l);--rs-carousel-items:var(--rs-carousel-items-s);--rs-carousel-bleed-s:0;--rs-carousel-bleed-m:var(--rs-carousel-bleed-s);--rs-carousel-bleed-l:var(--rs-carousel-bleed-m);--rs-carousel-bleed-xl:var(--rs-carousel-bleed-l);--rs-carousel-bleed:var(--rs-carousel-bleed-s)}@media (--rs-viewport-m ){.root{--rs-carousel-items:var(--rs-carousel-items-m);--rs-carousel-bleed:var(--rs-carousel-bleed-m)}}@media (--rs-viewport-l ){.root{--rs-carousel-items:var(--rs-carousel-items-l);--rs-carousel-bleed:var(--rs-carousel-bleed-l)}}@media (--rs-viewport-xl ){.root{--rs-carousel-items:var(--rs-carousel-items-xl);--rs-carousel-bleed:var(--rs-carousel-bleed-xl)}}
|
1
|
+
.root{isolation:isolate;position:relative;width:100%}.control{display:none;opacity:0;position:absolute;top:50%;transform:translate(-50%,-50%) scale(.75);transform-origin:50%;transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:opacity,transform;z-index:var(--rs-z-index-relative)}.--control-prev{left:0}.--control-next{left:100%}.--control-visible{opacity:1;transform:translate(-50%,-50%) scale(1)}.scroll{overflow:auto;-ms-overflow-style:none;overflow:-moz-scrollbars-none;-webkit-overflow-scrolling:touch;backface-visibility:hidden;margin:0 calc(var(--rs-unit-x1) * var(--rs-carousel-bleed) * -1);outline:none;padding:0 calc(var(--rs-unit-x1) * var(--rs-carousel-bleed));scroll-behavior:smooth;scroll-padding-inline-start:calc(var(--rs-unit-x1) * var(--rs-carousel-bleed));scroll-snap-type:x mandatory;scrollbar-width:none}[data-rs-keyboard] .scroll:focus{box-shadow:var(--rs-focus-shadow)}.scroll::-webkit-scrollbar{display:none;height:0;width:0}.item{--rs-carousel-item-width:calc(100% / var(--rs-carousel-items) - var(--rs-view-gap-value) * (var(--rs-carousel-items) - 1) / var(--rs-carousel-items));position:relative;scroll-snap-align:start;width:var(--rs-carousel-item-width)}@media (--rs-viewport-l ),(hover:hover){.--control-rendered{display:block}}@media (hover:none){.--bleed .item{width:calc(var(--rs-carousel-item-width) - 10% / var(--rs-carousel-items))}}@media (--rs-viewport-m ) and (hover:none){.--bleed-true--m .item{width:calc(var(--rs-carousel-item-width) - 10% / var(--rs-carousel-items))}.--bleed-false--m .item{width:var(--rs-carousel-item-width)}}@media (--rs-viewport-l ) and (hover:none){.--bleed-true--l .item{width:calc(var(--rs-carousel-item-width) - 10% / var(--rs-carousel-items))}.--bleed-false--l .item{width:var(--rs-carousel-item-width)}}@media (--rs-viewport-xl ) and (hover:none){.--bleed-true--xl .item{width:calc(var(--rs-carousel-item-width) - 10% / var(--rs-carousel-items))}.--bleed-false--xl .item{width:var(--rs-carousel-item-width)}}.root{--rs-carousel-items-s:unset;--rs-carousel-items-m:var(--rs-carousel-items-s);--rs-carousel-items-l:var(--rs-carousel-items-m);--rs-carousel-items-xl:var(--rs-carousel-items-l);--rs-carousel-items:var(--rs-carousel-items-s);--rs-carousel-bleed-s:0;--rs-carousel-bleed-m:var(--rs-carousel-bleed-s);--rs-carousel-bleed-l:var(--rs-carousel-bleed-m);--rs-carousel-bleed-xl:var(--rs-carousel-bleed-l);--rs-carousel-bleed:var(--rs-carousel-bleed-s)}@media (--rs-viewport-m ){.root{--rs-carousel-items:var(--rs-carousel-items-m);--rs-carousel-bleed:var(--rs-carousel-bleed-m)}}@media (--rs-viewport-l ){.root{--rs-carousel-items:var(--rs-carousel-items-l);--rs-carousel-bleed:var(--rs-carousel-bleed-l)}}@media (--rs-viewport-xl ){.root{--rs-carousel-items:var(--rs-carousel-items-xl);--rs-carousel-bleed:var(--rs-carousel-bleed-xl)}}
|
@@ -190,6 +190,14 @@ export const edgeCases = () => {
|
|
190
190
|
</View>
|
191
191
|
</Demo>
|
192
192
|
</Example.Item>
|
193
|
+
<Example.Item title="Focus moves to the input with autoFocus">
|
194
|
+
<Demo title="Modal title">
|
195
|
+
<View gap={3} direction="row">
|
196
|
+
<Button onClick={() => { }}>Button</Button>
|
197
|
+
<TextField name="name" placeholder="autofocus" inputAttributes={{ autoFocus: true }}/>
|
198
|
+
</View>
|
199
|
+
</Demo>
|
200
|
+
</Example.Item>
|
193
201
|
<Example.Item title="scrollable area in modal ignores swipe-to-close">
|
194
202
|
<View gap={3} direction="row">
|
195
203
|
<Button onClick={scrollModalToggle.activate}>Open</Button>
|
@@ -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
|
-
|
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
|
61
|
+
export declare const testContentEditable: {
|
58
62
|
name: string;
|
59
63
|
render: () => import("react").JSX.Element;
|
60
64
|
};
|
61
|
-
export declare const
|
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
|
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
|
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)}}
|
@@ -50,7 +50,7 @@ const TextField = (props) => {
|
|
50
50
|
return;
|
51
51
|
onChange({ name, value: event.target.value, event });
|
52
52
|
};
|
53
|
-
return (_jsxs("div", { ...attributes, "data-rs-aligner-target": true, className: rootClassName, children: [_jsx(TextFieldSlot, { position: "start", icon: icon, slot: startSlot, size: size, affix: prefix, id: id }), _jsxs("div", { className: s.inner, children: [_jsx("input", { type: "text", ...inputAttributes, className: classNames(s.input, inputAttributes.className), disabled: disabled, name: name, placeholder: placeholder, value: value, defaultValue: defaultValue, onChange: handleChange, onFocus: onFocus || inputAttributes?.onFocus, onBlur: onBlur || inputAttributes?.onBlur, id: inputId }), _jsx(TextFieldSlot, { position: "end", icon: endIcon, slot: endSlot, size: size, affix: suffix, id: id })] })] }));
|
53
|
+
return (_jsxs("div", { ...attributes, "data-rs-aligner-target": true, className: rootClassName, children: [_jsx(TextFieldSlot, { position: "start", icon: icon, slot: startSlot, size: size, affix: prefix, id: id }), _jsxs("div", { className: s.inner, children: [_jsx("input", { type: "text", autoComplete: "off", ...inputAttributes, className: classNames(s.input, inputAttributes.className), disabled: disabled, name: name, placeholder: placeholder, value: value, defaultValue: defaultValue, onChange: handleChange, onFocus: onFocus || inputAttributes?.onFocus, onBlur: onBlur || inputAttributes?.onBlur, id: inputId }), _jsx(TextFieldSlot, { position: "end", icon: endIcon, slot: endSlot, size: size, affix: suffix, id: id })] })] }));
|
54
54
|
};
|
55
55
|
TextField.Aligner = Aligner;
|
56
56
|
TextField.displayName = "TextField";
|
@@ -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
|
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
|
-
|
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
|
40
|
+
return React.useCallback(() => {
|
41
|
+
return active ? latestId === id : true;
|
42
|
+
}, [id, active]);
|
39
43
|
};
|
40
44
|
export default useIsDismissible;
|
@@ -119,9 +119,13 @@ class TrapFocus {
|
|
119
119
|
this.#screenReaderTrap.trap();
|
120
120
|
// Don't add back to the chain if we're traversing back
|
121
121
|
const tailItem = _a.chain.tailId && _a.chain.get(_a.chain.tailId);
|
122
|
+
const currentActiveElement = getActiveElement(this.#root);
|
122
123
|
if (!tailItem || this.#root !== tailItem.data.#root) {
|
123
124
|
this.#chainId = _a.chain.add(this);
|
124
|
-
|
125
|
+
// If the focus was moved manually (e.g. with autoFocus) - keep it there
|
126
|
+
if (!this.#root.contains(currentActiveElement)) {
|
127
|
+
focusElement(initialFocusEl || focusable[0], { pseudoFocus });
|
128
|
+
}
|
125
129
|
}
|
126
130
|
this.trapped = true;
|
127
131
|
};
|
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.
|
4
|
+
"version": "3.7.0-canary.9",
|
5
5
|
"license": "MIT",
|
6
6
|
"email": "hello@reshaped.so",
|
7
7
|
"homepage": "https://reshaped.so",
|