reshaped 3.0.4 → 3.0.6
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 +2 -0
- package/dist/bundle.css +1 -1
- package/dist/bundle.js +9 -9
- 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 +2 -4
- package/dist/components/Modal/tests/Modal.stories.d.ts +1 -0
- package/dist/components/Modal/tests/Modal.stories.js +36 -0
- package/dist/components/Overlay/Overlay.js +5 -5
- package/dist/components/Overlay/Overlay.module.css +1 -1
- package/dist/components/Overlay/Overlay.types.d.ts +1 -0
- package/dist/components/Tooltip/tests/Tooltip.stories.js +15 -0
- package/dist/components/_private/Flyout/FlyoutContent.js +2 -1
- package/dist/components/_private/Flyout/FlyoutControlled.js +4 -4
- package/dist/components/_private/Flyout/utilities/cooldown.js +1 -1
- package/dist/components/_private/Portal/Portal.types.d.ts +1 -1
- package/dist/hooks/useScrollLock.d.ts +4 -1
- package/dist/hooks/useScrollLock.js +15 -10
- package/dist/utilities/a11y/TrapScreenReader.js +3 -1
- 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, className, attributes, } = props;
|
42
|
+
const { children, onClose, onOpen, active, size, padding = 4, position = "center", transparentOverlay, ariaLabel, autoFocus = true, disableSwipeGesture, overlayClassName, containerRef, 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, attributes: {
|
167
|
+
return (_jsx(Overlay, { onClose: onClose, onOpen: onOpen, active: active, transparent: transparentOverlay || hideProgress, className: overlayClassName, containerRef: containerRef, 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: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)}@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}}
|
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,5 +1,6 @@
|
|
1
1
|
import type React from "react";
|
2
2
|
import type * as G from "../../types/global";
|
3
|
+
import type { OverlayProps } from "../Overlay";
|
3
4
|
export type Context = {
|
4
5
|
id: string;
|
5
6
|
titleMounted: boolean;
|
@@ -18,16 +19,13 @@ export type Props = {
|
|
18
19
|
position?: G.Responsive<"center" | "end" | "bottom" | "start" | "full-screen">;
|
19
20
|
size?: G.Responsive<string>;
|
20
21
|
padding?: G.Responsive<number>;
|
21
|
-
active?: boolean;
|
22
22
|
transparentOverlay?: boolean;
|
23
23
|
disableSwipeGesture?: boolean;
|
24
24
|
autoFocus?: boolean;
|
25
|
-
onClose?: () => void;
|
26
|
-
onOpen?: () => void;
|
27
25
|
ariaLabel?: string;
|
28
26
|
className?: G.ClassName;
|
29
27
|
overlayClassName?: G.ClassName;
|
30
28
|
attributes?: G.Attributes<"div"> & {
|
31
29
|
ref?: React.RefObject<HTMLDivElement | null>;
|
32
30
|
};
|
33
|
-
}
|
31
|
+
} & Pick<OverlayProps, "onClose" | "onOpen" | "active" | "containerRef">;
|
@@ -19,5 +19,6 @@ 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;
|
22
23
|
export declare const edgeCases: () => React.JSX.Element;
|
23
24
|
export declare const trapFocusEdgeCases: () => React.JSX.Element;
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import React from "react";
|
2
|
+
import { createRoot } from "react-dom/client";
|
2
3
|
import { Example } from "../../../utilities/storybook/index.js";
|
3
4
|
import Modal from "../index.js";
|
4
5
|
import View from "../../View/index.js";
|
@@ -7,6 +8,7 @@ import Dismissible from "../../Dismissible/index.js";
|
|
7
8
|
import DropdownMenu from "../../DropdownMenu/index.js";
|
8
9
|
import Switch from "../../Switch/index.js";
|
9
10
|
import TextField from "../../TextField/index.js";
|
11
|
+
import Reshaped from "../../Reshaped/index.js";
|
10
12
|
import useToggle from "../../../hooks/useToggle.js";
|
11
13
|
import Radio from "../../Radio/index.js";
|
12
14
|
export default {
|
@@ -100,6 +102,40 @@ export const overlay = () => (<Example>
|
|
100
102
|
<View height="1000px"/>
|
101
103
|
</Example.Item>
|
102
104
|
</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
|
+
};
|
103
139
|
export const edgeCases = () => {
|
104
140
|
const menuModalToggle = useToggle();
|
105
141
|
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, className, attributes } = props;
|
16
|
-
const clickThrough = transparent === true;
|
17
|
-
const opacity =
|
15
|
+
const { active, children, transparent, onClose, onOpen, containerRef, className, attributes } = props;
|
16
|
+
const clickThrough = transparent === true && !containerRef?.current;
|
17
|
+
const opacity = transparent === true ? 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({ ref: containerRef });
|
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);
|
@@ -101,6 +101,6 @@ const Overlay = (props) => {
|
|
101
101
|
}, []);
|
102
102
|
if (!rendered || !mounted)
|
103
103
|
return null;
|
104
|
-
return (_jsx(Portal, { children: _jsx(Portal.Scope, { children: (ref) => (_jsx("div", { ...attributes, ref: ref, style: { "--rs-overlay-opacity": opacity }, role: "button", tabIndex: -1, className: rootClassNames, onMouseDown: handleMouseDown, onMouseUp: handleMouseUp, onTransitionEnd: handleTransitionEnd, children: _jsx("div", { className: s.wrapper, children: _jsx("div", { className: s.inner, children: _jsx("div", { className: s.content, ref: contentRef, children: typeof children === "function" ? children({ active: visible }) : children }) }) }) })) }) }));
|
104
|
+
return (_jsx(Portal, { targetRef: containerRef, 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-white);cursor:default!important;z-index:var(--rs-z-index-overlay)}.root,.root:
|
1
|
+
.root{overflow:auto;-webkit-overflow-scrolling:touch;color:var(--rs-color-white);cursor:default!important;z-index:var(--rs-z-index-overlay)}.root,.root:before{inset:0;position:absolute}.root:before{background:var(--rs-color-black);content:"";opacity:0;pointer-events:none;transform:scale(1.01)}.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:before{opacity:var(--rs-overlay-opacity);transform:scale(1)}.root.--click-through{color:inherit;pointer-events:none}.root.--click-through .content,.root.--click-through>:not(.wrapper){pointer-events:all}.root.--animated:before{transition:var(--rs-duration-medium) var(--rs-easing-standard);transition-property:opacity,transform}
|
@@ -4,6 +4,7 @@ import Popover from "../../Popover/index.js";
|
|
4
4
|
import Button from "../../Button/index.js";
|
5
5
|
import View from "../../View/index.js";
|
6
6
|
import useResponsiveClientValue from "../../../hooks/useResponsiveClientValue.js";
|
7
|
+
import Actionable from "../../Actionable/index.js";
|
7
8
|
export default {
|
8
9
|
title: "Components/Tooltip",
|
9
10
|
component: Tooltip,
|
@@ -92,6 +93,7 @@ export const edgeCases = () => (<Example>
|
|
92
93
|
<Example.Item title="responsive visibility">
|
93
94
|
<DemoResponsive text="Responsive"/>
|
94
95
|
</Example.Item>
|
96
|
+
|
95
97
|
<Example.Item title="without text">
|
96
98
|
<Tooltip>{() => <Button>Button</Button>}</Tooltip>
|
97
99
|
</Example.Item>
|
@@ -106,4 +108,17 @@ export const edgeCases = () => (<Example>
|
|
106
108
|
</Popover>)}
|
107
109
|
</Tooltip>
|
108
110
|
</Example.Item>
|
111
|
+
|
112
|
+
<Example.Item title="tooltip with popover on different elements">
|
113
|
+
<Tooltip text="Tooltip" position="top">
|
114
|
+
{(attributes) => (<Actionable attributes={attributes} as="span">
|
115
|
+
<Popover position="bottom">
|
116
|
+
<Popover.Trigger>
|
117
|
+
{(popoverAttributes) => (<Button attributes={{ ...attributes, ...popoverAttributes }}>Action</Button>)}
|
118
|
+
</Popover.Trigger>
|
119
|
+
<Popover.Content>Popover</Popover.Content>
|
120
|
+
</Popover>
|
121
|
+
</Actionable>)}
|
122
|
+
</Tooltip>
|
123
|
+
</Example.Item>
|
109
124
|
</Example>);
|
@@ -31,7 +31,8 @@ const FlyoutContent = (props) => {
|
|
31
31
|
const contentClassNames = classNames(s.content, status === "visible" && s["--visible"],
|
32
32
|
// animating only when we're opening the first flyout or closing the last flyout within the same cooldown
|
33
33
|
// content is rendered only once flyout is already warm so checking for timer instead
|
34
|
-
(cooldown.status === "cooling" || !cooldown.timer || isSubmenu
|
34
|
+
(cooldown.status === "cooling" || !cooldown.timer || isSubmenu || triggerType !== "hover") &&
|
35
|
+
s["--animated"], position && s[`--position-${position}`], width === "trigger" && s["--width-trigger"], triggerType === "hover" && disableContentHover && s["--hover-disabled"]);
|
35
36
|
// className is applied to inner element because it has the transform and is treated like a real root element
|
36
37
|
const innerClassNames = classNames(s.inner, className, contentClassName);
|
37
38
|
let role;
|
@@ -92,9 +92,9 @@ const FlyoutRoot = (props) => {
|
|
92
92
|
const handleMouseEnter = React.useCallback(() => {
|
93
93
|
clearTimer();
|
94
94
|
timerRef.current = setTimeout(handleOpen, cooldown.timer || isSubmenu ? timeouts.mouseEnterShort : timeouts.mouseEnter);
|
95
|
-
if (!isSubmenu)
|
95
|
+
if (!isSubmenu && triggerType === "hover")
|
96
96
|
cooldown.warm();
|
97
|
-
}, [clearTimer, timerRef, handleOpen, isSubmenu]);
|
97
|
+
}, [clearTimer, timerRef, handleOpen, isSubmenu, triggerType]);
|
98
98
|
const handleMouseLeave = React.useCallback(() => {
|
99
99
|
cooldown.cool();
|
100
100
|
clearTimer();
|
@@ -141,14 +141,14 @@ const FlyoutRoot = (props) => {
|
|
141
141
|
if (checkTransitions() &&
|
142
142
|
!disableHideAnimation &&
|
143
143
|
transitionStartedRef.current &&
|
144
|
-
cooldown.status !== "warm") {
|
144
|
+
(cooldown.status !== "warm" || triggerType !== "hover")) {
|
145
145
|
hide();
|
146
146
|
}
|
147
147
|
else {
|
148
148
|
// In case transitions are disabled globally - remove from the DOM immediately
|
149
149
|
remove();
|
150
150
|
}
|
151
|
-
}, [passedActive, render, hide, disableHideAnimation]);
|
151
|
+
}, [passedActive, render, hide, remove, disableHideAnimation]);
|
152
152
|
React.useEffect(() => {
|
153
153
|
// Wait after positioning before show is triggered to animate flyout from the right side
|
154
154
|
if (status === "positioned")
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import React from "react";
|
2
2
|
export type Props = {
|
3
3
|
children?: React.ReactNode;
|
4
|
-
targetRef?: React.RefObject<HTMLElement | null>;
|
4
|
+
targetRef?: React.RefObject<HTMLElement | ShadowRoot | null>;
|
5
5
|
};
|
6
6
|
export type ScopeProps<T extends HTMLElement> = {
|
7
7
|
children: (ref: React.RefObject<T>) => React.ReactNode;
|
@@ -17,28 +17,33 @@ const getScrollbarWidth = (() => {
|
|
17
17
|
return scrollbarWidth;
|
18
18
|
};
|
19
19
|
})();
|
20
|
-
const useScrollLock = () => {
|
20
|
+
const useScrollLock = (args) => {
|
21
|
+
const { ref } = args || {};
|
21
22
|
const [locked, setLocked] = React.useState(false);
|
22
23
|
const overflowStyleRef = React.useRef();
|
23
24
|
const isOverflowingRef = React.useRef(false);
|
25
|
+
let targetEl = document.body;
|
26
|
+
if (ref?.current) {
|
27
|
+
targetEl =
|
28
|
+
ref?.current instanceof ShadowRoot ? ref?.current?.host : ref.current;
|
29
|
+
}
|
24
30
|
const lockScroll = React.useCallback(() => {
|
25
|
-
const
|
26
|
-
const rect = body.getBoundingClientRect();
|
31
|
+
const rect = targetEl.getBoundingClientRect();
|
27
32
|
isOverflowingRef.current = rect.left + rect.right < window.innerWidth;
|
28
|
-
overflowStyleRef.current =
|
29
|
-
|
33
|
+
overflowStyleRef.current = targetEl.style.overflow;
|
34
|
+
targetEl.style.overflow = "hidden";
|
30
35
|
if (isOverflowingRef.current) {
|
31
36
|
const scrollBarWidth = getScrollbarWidth();
|
32
|
-
|
37
|
+
targetEl.style.paddingRight = `${scrollBarWidth}px`;
|
33
38
|
}
|
34
39
|
setLocked(true);
|
35
|
-
}, [setLocked, isOverflowingRef, overflowStyleRef]);
|
40
|
+
}, [setLocked, isOverflowingRef, overflowStyleRef, targetEl]);
|
36
41
|
const unlockScroll = React.useCallback(() => {
|
37
|
-
|
42
|
+
targetEl.style.overflow = overflowStyleRef.current || "";
|
38
43
|
if (isOverflowingRef.current)
|
39
|
-
|
44
|
+
targetEl.style.paddingRight = "";
|
40
45
|
setLocked(false);
|
41
|
-
}, [setLocked, isOverflowingRef, overflowStyleRef]);
|
46
|
+
}, [setLocked, isOverflowingRef, overflowStyleRef, targetEl]);
|
42
47
|
return { scrollLocked: locked, lockScroll, unlockScroll };
|
43
48
|
};
|
44
49
|
export default useScrollLock;
|
@@ -31,7 +31,9 @@ class TrapScreenReader {
|
|
31
31
|
trap = () => {
|
32
32
|
let currentEl = this.root;
|
33
33
|
this.release();
|
34
|
-
|
34
|
+
// Stop at the body level for regular pages
|
35
|
+
// And stop at shadow root
|
36
|
+
while (currentEl !== document.body && currentEl.parentElement) {
|
35
37
|
this.hideSiblingsFromScreenReader(currentEl);
|
36
38
|
currentEl = currentEl.parentElement;
|
37
39
|
}
|
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.6",
|
5
5
|
"license": "MIT",
|
6
6
|
"email": "hello@reshaped.so",
|
7
7
|
"homepage": "https://reshaped.so",
|