Releases: everweij/react-laag
v2.0.5
v2.0.4
This release contains a couple of small fixes:
- #78 Fix incorrect window bounds (by looking at
document.scrollingElement) - #81 Fix to prevent layer close on touch devices
- #85 Limiting of multiple updates at once is now handled without
requestAnimationFrame. With RAF, sometimes style-glitches could occur which should be fixed with this release.
Thanks @simonlindholm , @btravel and @jhnns !!
v2.0.3
v2.0.2
v2.0.1
v2.0.0
🎉 Finally... after more than a year after the initial release, I'm proud to preset to you v2.0.0! 🎉
The past months I've been really busy with a complete rewrite of this project. The result is cleaner and better documented code 👨🏼💻, better performance 🚀, and the most important part: everything is a hook!
Migration guide
<ToggleLayer />
The thing that definitely will have to most impact is <ToggleLayer /> (and useToggleLayer() in some sense). However, I'm optimistic in the amount of work it will take to migrate.
Let's do a comparison of the before and after:
// old
import { ToggleLayer } from "react-laag";
function Old() {
return (
<ToggleLayer
renderLayer={({ isOpen, layerProps }) =>
isOpen && <div {...layerProps}>Layer</div>
}
>
{({ triggerRef, toggle }) => (
<button ref={triggerRef} onClick={toggle}>
Trigger
</button>
)}
</ToggleLayer>
);
}
// new
import { useLayer } from "react-laag";
function New() {
const [isOpen, setOpen] = React.useState(false);
const { layerProps, triggerProps, renderLayer } = useLayer({ isOpen });
return (
<>
<button {...triggerProps} onClick={() => setOpen(!isOpen)}>Trigger</button>
{isOpen && renderLayer(<div {...layerProps}>Layer</div>)}
</>
);
}As you can see a lot of concepts still remain the same. One of the big differences is that the rendering of the layer now happens in a different place -> under the trigger element and wrapped inside a renderLayer() function.
This reads a lot nicer, because mentally the layer will follow after the trigger. Also this pattern opens the door for better composition.
anchors -> placements
The previously known 'anchors' have been renamed to the 'placement' prop. Possible placements are now: top-start, top-center, top-end, right-start, right-center, ...etc
So, before it was "BOTTOM_LEFT", now it is "bottom-start".
Options
The new option-object has been flattened and some properties have been renamed. Here's a map from old to new:
| old | new | notes |
|---|---|---|
| isOpen | isOpen | now controlled by default |
| fixed | overflowContainer | now true by default |
| placement.anchor | placement | |
| placement.possibleAnchors | possiblePlacements | |
| placement.autoAdjust | auto | |
| placement.snapToAnchor | snap | |
| placement.preferX | preferX | |
| placement.preferY | preferY | |
| placement.triggerOffset | triggerOffset | |
| placement.scrollOffset | containerOffset | this option has been renamed |
| placement.arrowOffset | arrowOffset | |
| placement.layerDimensions | layerDimensions | |
| onDisappear | onDisappear | |
| onOutsideClick | onOutsideClick | |
| closeOnDisappear | x | this option has been removed |
| closeOnOutsideClick | x | this option has been removed |
| ResizeObserver | ResizeObserver | |
| container | container | |
| environment | environment |
useTooltip()
This hook has been removed. Fortunately is pretty easy to replace this hook with useLayer() and useHover:
// before
import { useTooltip } from "react-laag";
function Before() {
const [element, triggerProps] = useTooltip(
({ isOpen, layerProps }) =>
isOpen && <div {...layerProps}>I'm a tooltip!</div>,
{
delayEnter: 100,
delayLeave: 100
}
);
return (
<>
{element}
<div {...triggerProps}>Hover me</div>
</>
);
}
// after
import { useLayer, useHover } from "react-laag";
function After() {
const [isOpen, hoverProps] = useHover({ delayEnter: 100, delayLeave: 100 });
const { renderLayer, triggerProps, layerProps } = useLayer({ isOpen });
return (
<>
<div {...triggerProps} {...hoverProps}>
Hover me...
</div>
{isOpen && renderLayer(<div {...layerProps}>I'm a tooltip!</div>)}
</>
);
}<Transition />
This small utility component has been marked as deprecated and will be removed somewhere in de upcoming releases. I recommend to look for alternatives like framer-motion, react-spring or react-transition-group.