React + MotionOverlays

Dynamic-Island-Toast

Eine kleine schwarze Pille oben am Bildschirm, die sich beim Antippen zu einer vollen Benachrichtigung aufzieht.

Einstellungen

300px

Code

import { useState } from "react";
import { AnimatePresence, motion } from "framer-motion";
import { Bell, Check } from "lucide-react";

const spring = { type: "spring" as const, stiffness: 300, damping: 30 };

interface DynamicIslandToastProps {
  width?: number;
}

export default function DynamicIslandToast({ width = 300 }: DynamicIslandToastProps) {
  const [open, setOpen] = useState(false);

  return (
    <div className="relative h-40 w-full">
      <motion.button
        type="button"
        aria-expanded={open}
        onClick={() => setOpen((o) => !o)}
        animate={{
          width: open ? width : 130,
          height: open ? 82 : 38,
          borderRadius: open ? 24 : 22,
        }}
        transition={spring}
        className="absolute left-1/2 top-0 -translate-x-1/2 overflow-hidden bg-[#1d1d1f] text-[#f5f5f7] shadow-[0_4px_12px_rgba(0,0,0,0.04),0_24px_60px_rgba(0,0,0,0.1)]"
      >
        <AnimatePresence mode="wait">
          {open ? (
            <motion.span
              key="open"
              initial={{ opacity: 0 }}
              animate={{ opacity: 1 }}
              className="flex items-center gap-3 px-5 text-left"
            >
              <span className="grid h-10 w-10 place-items-center rounded-full bg-[#34c759]">
                <Check className="h-5 w-5" />
              </span>
              <span>
                <b className="block text-sm">Buchung bestätigt</b>
                <small className="text-[#f5f5f7]/60">Alles ist bereit</small>
              </span>
            </motion.span>
          ) : (
            <motion.span
              key="closed"
              initial={{ opacity: 0 }}
              animate={{ opacity: 1 }}
              className="flex items-center justify-center gap-2 text-xs"
            >
              <Bell className="h-3.5 w-3.5" /> Neuer Hinweis
            </motion.span>
          )}
        </AnimatePresence>
      </motion.button>
    </div>
  );
}

Prompt für KI

Füg ihn in ChatGPT, Claude oder Cursor ein und der Baustein wird mit diesen Einstellungen an dein Projekt angepasst, auch ohne React.

Mehr aus Overlays

Wofür du ihn nutzen kannst

Angelehnt an die Dynamic Island des iPhones beginnt dieser Toast als dezente „Neue Meldung“-Pille und öffnet sich zu einer Karte mit Icon, Titel und einer Zeile Details. Er passt zu Buchungsbestätigungen, Bestell-Updates in einer Liefer-App oder „Zahlung eingegangen“ in einem Rechnungstool. Eine Benachrichtigung im Dynamic-Island-Stil in React, modern und unaufdringlich.

In der Demo öffnet sie sich per Klick. In deiner App wirst du sie wahrscheinlich nach einer Aktion automatisch zeigen und nach ein paar Sekunden schließen. Stell die Breite so ein, dass deine längste Nachricht in eine Zeile passt.