reshaped 3.0.6 → 3.0.8-rc.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.
- package/CHANGELOG.md +1 -2
- package/dist/bundle.css +1 -1
- package/dist/bundle.js +10 -10
- package/dist/components/Modal/Modal.js +2 -2
- package/dist/components/Modal/Modal.module.css +1 -1
- package/dist/components/Modal/Modal.types.d.ts +1 -1
- package/dist/components/Modal/tests/Modal.stories.d.ts +0 -1
- package/dist/components/Modal/tests/Modal.stories.js +0 -36
- package/dist/components/Overlay/Overlay.js +6 -6
- package/dist/components/Overlay/Overlay.module.css +1 -1
- package/dist/components/Overlay/Overlay.types.d.ts +0 -1
- package/dist/components/Overlay/tests/Overlay.stories.d.ts +1 -0
- package/dist/components/Overlay/tests/Overlay.stories.js +24 -0
- package/dist/components/_private/Flyout/FlyoutControlled.js +12 -9
- package/dist/components/_private/Flyout/utilities/cooldown.js +1 -1
- package/dist/components/_private/Portal/Portal.js +8 -2
- package/dist/components/_private/Portal/Portal.module.css +1 -0
- package/dist/hooks/useScrollLock.d.ts +1 -4
- package/dist/hooks/useScrollLock.js +2 -7
- package/dist/utilities/a11y/TrapFocus.js +2 -3
- package/package.json +1 -1
@@ -39,7 +39,7 @@ const ModalSubtitle = (props) => {
|
|
39
39
|
return (_jsx(Text, { variant: "body-3", color: "neutral-faded", attributes: { id: `${id}-subtitle` }, children: children }));
|
40
40
|
};
|
41
41
|
const Modal = (props) => {
|
42
|
-
const { children, onClose, onOpen, active, size, padding = 4, position = "center", transparentOverlay, ariaLabel, autoFocus = true, disableSwipeGesture, overlayClassName,
|
42
|
+
const { children, onClose, onOpen, active, size, padding = 4, position = "center", transparentOverlay, ariaLabel, autoFocus = true, disableSwipeGesture, overlayClassName, className, attributes, } = props;
|
43
43
|
const id = useElementId();
|
44
44
|
const clientPosition = useResponsiveClientValue(position);
|
45
45
|
const [titleMounted, setTitleMounted] = React.useState(false);
|
@@ -164,7 +164,7 @@ const Modal = (props) => {
|
|
164
164
|
setHideProgress(progress / 2);
|
165
165
|
dragDistanceRef.current = dragDistance;
|
166
166
|
}, [dragDistance, clientPosition, rootRef]);
|
167
|
-
return (_jsx(Overlay, { onClose: onClose, onOpen: onOpen, active: active, transparent: transparentOverlay || hideProgress, className: overlayClassName,
|
167
|
+
return (_jsx(Overlay, { onClose: onClose, onOpen: onOpen, active: active, transparent: transparentOverlay || hideProgress, className: overlayClassName, attributes: {
|
168
168
|
onTouchStart: handleDragStart,
|
169
169
|
}, children: ({ active }) => {
|
170
170
|
const rootClassNames = classNames(s.root, className, paddingStyles?.classNames, active && s["--active"], dragging && s["--dragging"], responsiveClassNames(s, "--position", position));
|
@@ -1 +1 @@
|
|
1
|
-
.root{background:var(--rs-color-background-elevation-overlay);box-shadow:var(--rs-shadow-overlay);color:var(--rs-color-foreground-neutral);transition:var(--rs-easing-accelerate) var(--rs-duration-medium);transition-property:transform,opacity;will-change:transform}.root:focus-visible{box-shadow:var(--rs-focus-shadow);outline:none}.--dragging{transition:none}.root{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);--rs-modal-size-m:var(--rs-modal-size-s);--rs-modal-size-l:var(--rs-modal-size-m);--rs-modal-size-xl:var(--rs-modal-size-l);--rs-modal-size:var(--rs-modal-size-s)}.--position-center{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(100vw - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center.--active,[dir=rtl] .--position-center.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(100vh - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:absolute;transform:translateY(100%);width:100%}.--position-bottom.--active,[dir=rtl] .--position-bottom.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:absolute;transform:translate(-100%);width:var(--rs-modal-size)}[dir=rtl] .--position-start{transform:translate(100%)}.--position-start.--active,[dir=rtl] .--position-start.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:absolute;transform:translate(100%);width:var(--rs-modal-size)}[dir=rtl] .--position-end{transform:translate(-100%)}.--position-end.--active,[dir=rtl] .--position-end.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:100%;opacity:0;overflow:auto;position:absolute;transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen.--active,[dir=rtl] .--position-full-screen.--active{opacity:1;transform:translate(0)!important}.--active,[dir=rtl] .--active{transition-timing-function:var(--rs-easing-decelerate)}@media (--rs-viewport-m ){.root{--rs-modal-size:var(--rs-modal-size-m)}.--position-center--m{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(100vw - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center--m.--active,[dir=rtl] .--position-center--m.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom--m{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(100vh - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:absolute;transform:translateY(100%);width:100%}.--position-bottom--m.--active,[dir=rtl] .--position-bottom--m.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start--m{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:absolute;transform:translate(-100%);width:var(--rs-modal-size)}[dir=rtl] .--position-start--m{transform:translate(100%)}.--position-start--m.--active,[dir=rtl] .--position-start--m.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end--m{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:absolute;transform:translate(100%);width:var(--rs-modal-size)}[dir=rtl] .--position-end--m{transform:translate(-100%)}.--position-end--m.--active,[dir=rtl] .--position-end--m.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen--m{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:100%;opacity:0;overflow:auto;position:absolute;transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen--m.--active,[dir=rtl] .--position-full-screen--m.--active{opacity:1;transform:translate(0)!important}}@media (--rs-viewport-l ){.root{--rs-modal-size:var(--rs-modal-size-l)}.--position-center--l{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(100vw - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center--l.--active,[dir=rtl] .--position-center--l.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom--l{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(100vh - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:absolute;transform:translateY(100%);width:100%}.--position-bottom--l.--active,[dir=rtl] .--position-bottom--l.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start--l{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:absolute;transform:translate(-100%);width:var(--rs-modal-size)}[dir=rtl] .--position-start--l{transform:translate(100%)}.--position-start--l.--active,[dir=rtl] .--position-start--l.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end--l{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:absolute;transform:translate(100%);width:var(--rs-modal-size)}[dir=rtl] .--position-end--l{transform:translate(-100%)}.--position-end--l.--active,[dir=rtl] .--position-end--l.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen--l{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:100%;opacity:0;overflow:auto;position:absolute;transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen--l.--active,[dir=rtl] .--position-full-screen--l.--active{opacity:1;transform:translate(0)!important}}@media (--rs-viewport-xl ){.root{--rs-modal-size:var(--rs-modal-size-xl)}.--position-center--xl{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(100vw - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center--xl.--active,[dir=rtl] .--position-center--xl.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom--xl{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(100vh - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:absolute;transform:translateY(100%);width:100%}.--position-bottom--xl.--active,[dir=rtl] .--position-bottom--xl.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start--xl{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:absolute;transform:translate(-100%);width:var(--rs-modal-size)}[dir=rtl] .--position-start--xl{transform:translate(100%)}.--position-start--xl.--active,[dir=rtl] .--position-start--xl.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end--xl{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:absolute;transform:translate(100%);width:var(--rs-modal-size)}[dir=rtl] .--position-end--xl{transform:translate(-100%)}.--position-end--xl.--active,[dir=rtl] .--position-end--xl.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen--xl{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:100%;opacity:0;overflow:auto;position:absolute;transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen--xl.--active,[dir=rtl] .--position-full-screen--xl.--active{opacity:1;transform:translate(0)!important}}
|
1
|
+
.root{background:var(--rs-color-background-elevation-overlay);box-shadow:var(--rs-shadow-overlay);color:var(--rs-color-foreground-neutral);transition:var(--rs-easing-accelerate) var(--rs-duration-medium);transition-property:transform,opacity;will-change:transform}.root:focus-visible{box-shadow:var(--rs-focus-shadow);outline:none}.root{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);--rs-modal-size-m:var(--rs-modal-size-s);--rs-modal-size-l:var(--rs-modal-size-m);--rs-modal-size-xl:var(--rs-modal-size-l);--rs-modal-size:var(--rs-modal-size-s)}.--position-center{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(100vw - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center.--active,[dir=rtl] .--position-center.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(100vh - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:fixed;transform:translateY(100%);width:100%}.--position-bottom.--active,[dir=rtl] .--position-bottom.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(-100%);width:var(--rs-modal-size)}[dir=rtl] .--position-start{transform:translate(100%)}.--position-start.--active,[dir=rtl] .--position-start.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(100%);width:var(--rs-modal-size)}[dir=rtl] .--position-end{transform:translate(-100%)}.--position-end.--active,[dir=rtl] .--position-end.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:100%;opacity:0;overflow:auto;position:fixed;transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen.--active,[dir=rtl] .--position-full-screen.--active{opacity:1;transform:translate(0)!important}.--active,[dir=rtl] .--active{transition-timing-function:var(--rs-easing-decelerate)}.--dragging{transition:none}@media (--rs-viewport-m ){.root{--rs-modal-size:var(--rs-modal-size-m)}.--position-center--m{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(100vw - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center--m.--active,[dir=rtl] .--position-center--m.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom--m{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(100vh - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:fixed;transform:translateY(100%);width:100%}.--position-bottom--m.--active,[dir=rtl] .--position-bottom--m.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start--m{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(-100%);width:var(--rs-modal-size)}[dir=rtl] .--position-start--m{transform:translate(100%)}.--position-start--m.--active,[dir=rtl] .--position-start--m.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end--m{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(100%);width:var(--rs-modal-size)}[dir=rtl] .--position-end--m{transform:translate(-100%)}.--position-end--m.--active,[dir=rtl] .--position-end--m.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen--m{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:100%;opacity:0;overflow:auto;position:fixed;transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen--m.--active,[dir=rtl] .--position-full-screen--m.--active{opacity:1;transform:translate(0)!important}}@media (--rs-viewport-l ){.root{--rs-modal-size:var(--rs-modal-size-l)}.--position-center--l{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(100vw - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center--l.--active,[dir=rtl] .--position-center--l.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom--l{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(100vh - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:fixed;transform:translateY(100%);width:100%}.--position-bottom--l.--active,[dir=rtl] .--position-bottom--l.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start--l{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(-100%);width:var(--rs-modal-size)}[dir=rtl] .--position-start--l{transform:translate(100%)}.--position-start--l.--active,[dir=rtl] .--position-start--l.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end--l{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(100%);width:var(--rs-modal-size)}[dir=rtl] .--position-end--l{transform:translate(-100%)}.--position-end--l.--active,[dir=rtl] .--position-end--l.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen--l{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:100%;opacity:0;overflow:auto;position:fixed;transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen--l.--active,[dir=rtl] .--position-full-screen--l.--active{opacity:1;transform:translate(0)!important}}@media (--rs-viewport-xl ){.root{--rs-modal-size:var(--rs-modal-size-xl)}.--position-center--xl{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:var(--rs-radius-large);height:auto;inset:0;margin:var(--rs-unit-x4);max-height:none;max-width:calc(100vw - var(--rs-unit-x8));opacity:0;overflow:hidden;position:relative;transform:scale(.96);width:var(--rs-modal-size)}.--position-center--xl.--active,[dir=rtl] .--position-center--xl.--active{opacity:1;transform:translate(0) scale(1)!important}.--position-bottom--xl{--rs-modal-size-s:auto;border-radius:var(--rs-radius-large) var(--rs-radius-large) 0 0;height:var(--rs-modal-size);inset:0;inset-block-start:auto;margin:0;margin-top:var(--rs-unit-x4);max-height:calc(100vh - var(--rs-unit-x4));max-width:100%;opacity:1;overflow:auto;position:fixed;transform:translateY(100%);width:100%}.--position-bottom--xl.--active,[dir=rtl] .--position-bottom--xl.--active{transform:translateY(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-start--xl{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-end:auto;margin:0;margin-inline-end:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(-100%);width:var(--rs-modal-size)}[dir=rtl] .--position-start--xl{transform:translate(100%)}.--position-start--xl.--active,[dir=rtl] .--position-start--xl.--active{transform:translate(min(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-end--xl{--rs-modal-size-s:calc(var(--rs-unit-x1) * 100);border-radius:0;height:100%;inset:0;inset-inline-start:auto;margin:0;margin-inline-start:var(--rs-unit-x4);max-height:100%;max-width:calc(100vw - var(--rs-unit-x4));opacity:1;overflow:auto;position:fixed;transform:translate(100%);width:var(--rs-modal-size)}[dir=rtl] .--position-end--xl{transform:translate(-100%)}.--position-end--xl.--active,[dir=rtl] .--position-end--xl.--active{transform:translate(max(var(--rs-modal-drag,0px),0px)) scale(1)!important}.--position-full-screen--xl{--rs-modal-size-s:100%;border-radius:0;height:100%;inset:0;inset-block-start:auto;margin:0;max-height:100%;max-width:100%;opacity:0;overflow:auto;position:fixed;transform:translateY(var(--rs-unit-x4));width:100%}.--position-full-screen--xl.--active,[dir=rtl] .--position-full-screen--xl.--active{opacity:1;transform:translate(0)!important}}
|
@@ -19,6 +19,5 @@ export declare const size: () => React.JSX.Element;
|
|
19
19
|
export declare const padding: () => React.JSX.Element;
|
20
20
|
export declare const composition: () => React.JSX.Element;
|
21
21
|
export declare const overlay: () => React.JSX.Element;
|
22
|
-
export declare const customContainer: () => React.JSX.Element;
|
23
22
|
export declare const edgeCases: () => React.JSX.Element;
|
24
23
|
export declare const trapFocusEdgeCases: () => React.JSX.Element;
|
@@ -1,5 +1,4 @@
|
|
1
1
|
import React from "react";
|
2
|
-
import { createRoot } from "react-dom/client";
|
3
2
|
import { Example } from "../../../utilities/storybook/index.js";
|
4
3
|
import Modal from "../index.js";
|
5
4
|
import View from "../../View/index.js";
|
@@ -8,7 +7,6 @@ import Dismissible from "../../Dismissible/index.js";
|
|
8
7
|
import DropdownMenu from "../../DropdownMenu/index.js";
|
9
8
|
import Switch from "../../Switch/index.js";
|
10
9
|
import TextField from "../../TextField/index.js";
|
11
|
-
import Reshaped from "../../Reshaped/index.js";
|
12
10
|
import useToggle from "../../../hooks/useToggle.js";
|
13
11
|
import Radio from "../../Radio/index.js";
|
14
12
|
export default {
|
@@ -102,40 +100,6 @@ export const overlay = () => (<Example>
|
|
102
100
|
<View height="1000px"/>
|
103
101
|
</Example.Item>
|
104
102
|
</Example>);
|
105
|
-
export const customContainer = () => {
|
106
|
-
const toggle = useToggle();
|
107
|
-
const containerRef = React.useRef(null);
|
108
|
-
const shadowRootRef = React.useRef(null);
|
109
|
-
React.useEffect(() => {
|
110
|
-
if (!shadowRootRef.current)
|
111
|
-
return;
|
112
|
-
if (shadowRootRef.current.shadowRoot)
|
113
|
-
return;
|
114
|
-
const shadowRoot = shadowRootRef.current?.attachShadow({ mode: "open" });
|
115
|
-
const root = createRoot(shadowRoot);
|
116
|
-
root.render(<Reshaped theme="reshaped">
|
117
|
-
<Modal active containerRef={{ current: shadowRootRef.current?.shadowRoot }}>
|
118
|
-
Modal content
|
119
|
-
</Modal>
|
120
|
-
</Reshaped>);
|
121
|
-
}, []);
|
122
|
-
return (<Example>
|
123
|
-
<Example.Item title="inside an element">
|
124
|
-
<View backgroundColor="neutral-faded" height="400px" borderRadius="medium" attributes={{ ref: containerRef }} padding={4} overflow="auto">
|
125
|
-
<View height="5000px">
|
126
|
-
<Button onClick={toggle.activate}>Open</Button>
|
127
|
-
</View>
|
128
|
-
</View>
|
129
|
-
<Modal onClose={toggle.deactivate} active={toggle.active} containerRef={containerRef} position="end">
|
130
|
-
Modal content
|
131
|
-
</Modal>
|
132
|
-
</Example.Item>
|
133
|
-
|
134
|
-
<Example.Item title="shadow DOM">
|
135
|
-
<div ref={shadowRootRef} style={{ height: 400 }}/>
|
136
|
-
</Example.Item>
|
137
|
-
</Example>);
|
138
|
-
};
|
139
103
|
export const edgeCases = () => {
|
140
104
|
const menuModalToggle = useToggle();
|
141
105
|
const scrollModalToggle = useToggle();
|
@@ -12,14 +12,14 @@ import useIsDismissible from "../../hooks/_private/useIsDismissible.js";
|
|
12
12
|
import Portal from "../_private/Portal/index.js";
|
13
13
|
import s from "./Overlay.module.css";
|
14
14
|
const Overlay = (props) => {
|
15
|
-
const { active, children, transparent, onClose, onOpen,
|
16
|
-
const clickThrough = transparent === true
|
17
|
-
const opacity =
|
15
|
+
const { active, children, transparent, onClose, onOpen, className, attributes } = props;
|
16
|
+
const clickThrough = transparent === true;
|
17
|
+
const opacity = clickThrough ? 0 : (1 - (transparent || 0)) * 0.7;
|
18
18
|
const [mounted, setMounted] = React.useState(false);
|
19
19
|
const [animated, setAnimated] = React.useState(false);
|
20
20
|
const contentRef = React.useRef(null);
|
21
21
|
const isMouseDownValidRef = React.useRef(false);
|
22
|
-
const { lockScroll, unlockScroll } = useScrollLock(
|
22
|
+
const { lockScroll, unlockScroll } = useScrollLock();
|
23
23
|
const { active: rendered, activate: render, deactivate: remove } = useToggle(active || false);
|
24
24
|
const { active: visible, activate: show, deactivate: hide } = useToggle(active || false);
|
25
25
|
const isDismissible = useIsDismissible(active, contentRef);
|
@@ -50,7 +50,7 @@ const Overlay = (props) => {
|
|
50
50
|
close();
|
51
51
|
};
|
52
52
|
const handleTransitionEnd = (e) => {
|
53
|
-
if (e.propertyName !== "
|
53
|
+
if (e.propertyName !== "background-color")
|
54
54
|
return;
|
55
55
|
setAnimated(false);
|
56
56
|
if (visible)
|
@@ -101,6 +101,6 @@ const Overlay = (props) => {
|
|
101
101
|
}, []);
|
102
102
|
if (!rendered || !mounted)
|
103
103
|
return null;
|
104
|
-
return (_jsx(Portal, {
|
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 }) }) }) })) }) }));
|
105
105
|
};
|
106
106
|
export default Overlay;
|
@@ -1 +1 @@
|
|
1
|
-
.root{overflow:auto;-webkit-overflow-scrolling:touch;color:var(--rs-color-
|
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:0;opacity:0;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.--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,transform,opacity}.root.--animated.--visible{transition-timing-function:var(--rs-easing-decelerate)}
|
@@ -1,6 +1,8 @@
|
|
1
|
+
import { createRoot } from "react-dom/client";
|
1
2
|
import { Example } from "../../../utilities/storybook/index.js";
|
2
3
|
import Overlay from "../index.js";
|
3
4
|
import Button from "../../Button/index.js";
|
5
|
+
import Reshaped from "../../Reshaped/index.js";
|
4
6
|
import useToggle from "../../../hooks/useToggle.js";
|
5
7
|
export default {
|
6
8
|
title: "Utilities/Overlay",
|
@@ -32,3 +34,25 @@ export const base = () => {
|
|
32
34
|
</Example.Item>
|
33
35
|
</Example>);
|
34
36
|
};
|
37
|
+
class CustomElement extends window.HTMLElement {
|
38
|
+
constructor() {
|
39
|
+
super();
|
40
|
+
this.attachShadow({ mode: "open" });
|
41
|
+
if (!this.shadowRoot)
|
42
|
+
return;
|
43
|
+
const overlay = (<Reshaped>
|
44
|
+
<Overlay active>Content</Overlay>
|
45
|
+
</Reshaped>);
|
46
|
+
const root = createRoot(this.shadowRoot);
|
47
|
+
root.render(overlay);
|
48
|
+
}
|
49
|
+
}
|
50
|
+
window.customElements.define("custom-element", CustomElement);
|
51
|
+
export const shadowDom = () => {
|
52
|
+
return (<Example>
|
53
|
+
<Example.Item>
|
54
|
+
{/* @ts-ignore */}
|
55
|
+
<custom-element />
|
56
|
+
</Example.Item>
|
57
|
+
</Example>);
|
58
|
+
};
|
@@ -15,6 +15,7 @@ import cooldown from "./utilities/cooldown.js";
|
|
15
15
|
import { Provider, useFlyoutTriggerContext, useFlyoutContext } from "./Flyout.context.js";
|
16
16
|
const FlyoutRoot = (props) => {
|
17
17
|
const { triggerType = "click", onOpen, onClose, children, disabled, forcePosition, trapFocusMode, width, disableHideAnimation, disableContentHover, contentGap, contentClassName, contentAttributes, position: passedPosition, active: passedActive, id: passedId, instanceRef, containerRef, } = props;
|
18
|
+
const resolvedActive = disabled === true ? false : passedActive;
|
18
19
|
const parentFlyoutContext = useFlyoutContext();
|
19
20
|
const parentFlyoutTriggerContext = useFlyoutTriggerContext();
|
20
21
|
const isSubmenu = parentFlyoutContext.trapFocusMode === "action-menu" ||
|
@@ -37,7 +38,7 @@ const FlyoutRoot = (props) => {
|
|
37
38
|
const flyout = useFlyout(triggerElRef, flyoutElRef, {
|
38
39
|
width,
|
39
40
|
position: passedPosition,
|
40
|
-
defaultActive:
|
41
|
+
defaultActive: resolvedActive,
|
41
42
|
container: containerRef?.current,
|
42
43
|
forcePosition,
|
43
44
|
});
|
@@ -53,15 +54,15 @@ const FlyoutRoot = (props) => {
|
|
53
54
|
* Called from the internal actions
|
54
55
|
*/
|
55
56
|
const handleOpen = React.useCallback(() => {
|
56
|
-
const canOpen = !lockedRef.current && status === "idle"
|
57
|
+
const canOpen = !lockedRef.current && status === "idle";
|
57
58
|
if (!canOpen)
|
58
59
|
return;
|
59
60
|
onOpen?.();
|
60
61
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
61
|
-
}, [status
|
62
|
+
}, [status]);
|
62
63
|
const handleClose = React.useCallback((options) => {
|
63
64
|
const isLocked = triggerType === "click" && !isDismissible();
|
64
|
-
const canClose = !isLocked && status !== "idle"
|
65
|
+
const canClose = !isLocked && (status !== "idle" || disabled);
|
65
66
|
if (!canClose)
|
66
67
|
return;
|
67
68
|
onClose?.();
|
@@ -69,7 +70,7 @@ const FlyoutRoot = (props) => {
|
|
69
70
|
parentFlyoutContext?.handleClose?.();
|
70
71
|
},
|
71
72
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
72
|
-
[status, isDismissible, triggerType
|
73
|
+
[status, isDismissible, triggerType]);
|
73
74
|
/**
|
74
75
|
* Trigger event handlers
|
75
76
|
*/
|
@@ -111,12 +112,12 @@ const FlyoutRoot = (props) => {
|
|
111
112
|
const handleContentMouseDown = () => (lockedBlurEffects.current = true);
|
112
113
|
const handleContentMouseUp = () => (lockedBlurEffects.current = false);
|
113
114
|
const handleTransitionStart = React.useCallback((e) => {
|
114
|
-
if (!
|
115
|
+
if (!resolvedActive)
|
115
116
|
return;
|
116
117
|
if (flyoutElRef.current !== e.currentTarget || e.propertyName !== "transform")
|
117
118
|
return;
|
118
119
|
transitionStartedRef.current = true;
|
119
|
-
}, [
|
120
|
+
}, [resolvedActive]);
|
120
121
|
const handleTransitionEnd = React.useCallback((e) => {
|
121
122
|
if (flyoutElRef.current !== e.currentTarget || e.propertyName !== "transform")
|
122
123
|
return;
|
@@ -129,10 +130,12 @@ const FlyoutRoot = (props) => {
|
|
129
130
|
* Control the display based on the props
|
130
131
|
*/
|
131
132
|
useIsomorphicLayoutEffect(() => {
|
132
|
-
if (
|
133
|
+
if (resolvedActive) {
|
133
134
|
render();
|
134
135
|
return;
|
135
136
|
}
|
137
|
+
if (disabled)
|
138
|
+
cooldown.cool();
|
136
139
|
/**
|
137
140
|
* Check that transitions are enabled and it has been triggered on tooltip open
|
138
141
|
* - keyboard focus navigation could move too fast and ignore the transitions completely
|
@@ -148,7 +151,7 @@ const FlyoutRoot = (props) => {
|
|
148
151
|
// In case transitions are disabled globally - remove from the DOM immediately
|
149
152
|
remove();
|
150
153
|
}
|
151
|
-
}, [
|
154
|
+
}, [resolvedActive, render, hide, remove, disableHideAnimation, disabled]);
|
152
155
|
React.useEffect(() => {
|
153
156
|
// Wait after positioning before show is triggered to animate flyout from the right side
|
154
157
|
if (status === "positioned")
|
@@ -1,8 +1,9 @@
|
|
1
1
|
"use client";
|
2
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
3
3
|
import React from "react";
|
4
4
|
import ReactDOM from "react-dom";
|
5
5
|
import Theme from "../../Theme/index.js";
|
6
|
+
import s from "./Portal.module.css";
|
6
7
|
const PortalScopeContext = React.createContext({});
|
7
8
|
export const usePortalScope = () => {
|
8
9
|
return React.useContext(PortalScopeContext);
|
@@ -13,6 +14,10 @@ export const usePortalScope = () => {
|
|
13
14
|
*/
|
14
15
|
const Portal = (props) => {
|
15
16
|
const { children, targetRef } = props;
|
17
|
+
const rootRef = React.useRef(null);
|
18
|
+
const rootNode = rootRef.current?.getRootNode();
|
19
|
+
const isShadowDom = rootNode instanceof ShadowRoot;
|
20
|
+
const defaultTargetEl = isShadowDom ? rootNode : document.body;
|
16
21
|
/**
|
17
22
|
* Check for parent portal to render inside it
|
18
23
|
* To avoid z-iondex issues
|
@@ -22,8 +27,9 @@ const Portal = (props) => {
|
|
22
27
|
*/
|
23
28
|
const portal = usePortalScope();
|
24
29
|
const nextScopeRef = targetRef || portal.scopeRef;
|
30
|
+
const targetEl = nextScopeRef?.current || defaultTargetEl;
|
25
31
|
/* Preserve the current theme when rendered in body */
|
26
|
-
return ReactDOM.createPortal(_jsx(Theme, { children: children }),
|
32
|
+
return (_jsxs(_Fragment, { children: [ReactDOM.createPortal(_jsx(Theme, { children: children }), targetEl), _jsx("div", { ref: rootRef, className: s.root })] }));
|
27
33
|
};
|
28
34
|
function PortalScope(props) {
|
29
35
|
const { children } = props;
|
@@ -0,0 +1 @@
|
|
1
|
+
.root{display:contents}
|
@@ -17,16 +17,11 @@ const getScrollbarWidth = (() => {
|
|
17
17
|
return scrollbarWidth;
|
18
18
|
};
|
19
19
|
})();
|
20
|
-
const useScrollLock = (
|
21
|
-
const { ref } = args || {};
|
20
|
+
const useScrollLock = () => {
|
22
21
|
const [locked, setLocked] = React.useState(false);
|
23
22
|
const overflowStyleRef = React.useRef();
|
24
23
|
const isOverflowingRef = React.useRef(false);
|
25
|
-
|
26
|
-
if (ref?.current) {
|
27
|
-
targetEl =
|
28
|
-
ref?.current instanceof ShadowRoot ? ref?.current?.host : ref.current;
|
29
|
-
}
|
24
|
+
const targetEl = document.body;
|
30
25
|
const lockScroll = React.useCallback(() => {
|
31
26
|
const rect = targetEl.getBoundingClientRect();
|
32
27
|
isOverflowingRef.current = rect.left + rect.right < window.innerWidth;
|
@@ -112,9 +112,8 @@ class TrapFocus {
|
|
112
112
|
if (!this.trapped || !this.chainId)
|
113
113
|
return;
|
114
114
|
this.trapped = false;
|
115
|
-
if (this.trigger) {
|
116
|
-
|
117
|
-
this.trigger.focus({ preventScroll });
|
115
|
+
if (this.trigger && !withoutFocusReturn) {
|
116
|
+
this.trigger.focus({ preventScroll: !checkKeyboardMode() });
|
118
117
|
}
|
119
118
|
TrapFocus.chain.removePreviousTill(this.chainId, (item) => document.body.contains(item.data.trigger));
|
120
119
|
this.mutationObserver?.disconnect();
|
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.0.
|
4
|
+
"version": "3.0.8-rc.0",
|
5
5
|
"license": "MIT",
|
6
6
|
"email": "hello@reshaped.so",
|
7
7
|
"homepage": "https://reshaped.so",
|