1.0.50 โ€ข Published 12 months ago

floating-ui-solid v1.0.50

Weekly downloads
-
License
MIT
Repository
github
Last release
12 months ago

floating-ui-solid

NPM

Why choose floating-ui-solid?

  • ๐Ÿ“ฆ Smaller bundle size
  • ๐Ÿงน Proper cleanup: cleanup function with autoUpdate is properly handled
  • ๐Ÿ’ช Improved TypeScript support
  • ๐Ÿค– Better API

Installation

Choose your preferred package manager:

npm install floating-ui-solid
# or
yarn add floating-ui-solid
# or
pnpm add floating-ui-solid
# or
bun add floating-ui-solid

Usage

Here's a basic example of how to use floating-ui-solid:

import { createSignal } from 'solid-js';
import { useFloating } from 'floating-ui-solid';

export default function App() {
  const [isOpen, setIsOpen] = createSignal(false);
  const { refs, floatingStyles } = useFloating({
    placement: "bottom",
    isOpen: isOpen,
    strategy: "absolute",
  });

  return (
    <main>
      <div
        ref={refs.setReference}
        onMouseEnter={() => setIsOpen(true)}
        onMouseLeave={() => setIsOpen(false)}
        class="reference"
      >
        Hover me
      </div>
      {isOpen() && (
        <div
          ref={refs.setFloating}
          style={...floatingStyles()}
          class="floating"
        >
          Floating
        </div>
      )}
    </main>
  );
}

Using autoUpdate

To keep the floating element positioned correctly when the reference element changes, use the autoUpdate function:

import { autoUpdate, useFloating } from 'floating-ui-solid';

const { refs, floatingStyles } = useFloating({
  placement: "bottom",
  isOpen: isOpen,
  strategy: "absolute",
  whileElementsMounted: autoUpdate,
  // or for more control:
  whileElementsMounted: (reference, floating, update) => {
    const cleanup = autoUpdate(reference, floating, update, { elementResize: true });
    return cleanup;
  },
});

Applying Custom Styles

You can apply custom styles to the floating element using middleware:

import { autoUpdate, useFloating, size, offset } from 'floating-ui-solid';

const [reactiveMiddleware, setReactiveMiddleware] = createSignal([
    offset(10),
    size({
      apply({ availableHeight }) {
        setFloatingStyles({ ...floatingStyles(), "max-height": `${availableHeight}px` });
      }
    })
  ]);

const { refs, floatingStyles, setFloatingStyles } = useFloating({
  placement: "bottom",
  isOpen: isOpen,
  strategy: "absolute",
  middleware: reactiveMiddleware,
});

Arrow Element

import { autoUpdate, useFloating, arrow } from 'floating-ui-solid';
const [reactiveMiddleware, setReactiveMiddleware] = createSignal([]);
const { refs, floatingStyles, setFloatingStyles } = useFloating({
  placement: "bottom",
  isOpen: isOpen,
  strategy: "absolute",
  middleware: reactiveMiddleware,
});

  return (
        <div>
            <div
                onMouseEnter={() => setIsOpen(true)}
                onMouseLeave={() => setIsOpen(false)}
                class="reference"
                ref={refs.setReference}
            >
                Reference
            </div>

            {isOpen() && (
                <div class="floating" style={{ ...floatingStyles() }} ref={refs.setFloating}>
                    Floating
                    <div
                        class="arrow"
                        style={{
                            position: 'absolute',
                            left: middleware()?.arrow?.x != null ? `${middleware().arrow?.x}px` : '',
                            top: arrowState()?.offsetHeight != null ? `${-arrowState()?.offsetHeight! / 2}px` : '',
                        }}
                        ref={(node) => {
                            setArrow(node)
                            setReactiveMiddleware((prev) => [...prev, arrow({ element: node })]); // set it once it's ready
                        }}
                    ></div>
                </div>
            )}
        </div>
    )

License

This project is licensed under the MIT License.

1.0.48

12 months ago

1.0.47

12 months ago

1.0.49

12 months ago

1.0.50

12 months ago

1.0.46

1 year ago

1.0.45

1 year ago

1.0.44

1 year ago

1.0.43

1 year ago

1.0.42

1 year ago

1.0.41

1 year ago

1.0.40

1 year ago

1.0.39

1 year ago

1.0.38

1 year ago

1.0.37

1 year ago

1.0.36

1 year ago

1.0.35

1 year ago

1.0.34

1 year ago

1.0.33

1 year ago

1.0.32

1 year ago

1.0.31

1 year ago

1.0.30

1 year ago

1.0.29

1 year ago

1.0.28

1 year ago

1.0.27

1 year ago

1.0.26

1 year ago

1.0.25

1 year ago

1.0.24

1 year ago

1.0.23

1 year ago

1.0.22

1 year ago

1.0.21

1 year ago

1.0.20

1 year ago

1.0.19

1 year ago

1.0.18

1 year ago

1.0.17

1 year ago

1.0.16

1 year ago

1.0.15

1 year ago

1.0.14

1 year ago

1.0.13

1 year ago

1.0.12

1 year ago

1.0.11

1 year ago

1.0.10

1 year ago

1.0.8

1 year ago

1.0.7

1 year ago

1.0.6

1 year ago

1.0.5

1 year ago

1.0.4

1 year ago

1.0.3

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago