⟦Škíp tó çóñtéñt~~~~~~⟧
uiify

Alert

⟦Štátíç méššágé çóñtáíñér fór péršíštéñt íñlíñé féédbáçk.~~~~~~~~~~~~~~~~~~~~⟧

⟦Brówšérš~~~⟧
Chrome 123+Firefox 121+Safari 17.5+
⟦Tíér~~⟧
0
⟦Búñdlé çómpréššéd~~~~~~⟧
387 B
⟦Fórçéd láýóút búdgét~~~~~~~⟧
0 ms
⟦Áxé búdgét~~~~⟧
0
⟦ŠŠR çómpátíblé~~~~~⟧
⟦Ýéš~~⟧
⟦Públíšhéd çóñtráçt~~~~~~~⟧
⟦Téšt hárñéšš~~~~~⟧

⟦Pláýgróúñd~~~~⟧

Alert

Warning: browser support is incomplete.
Check the support matrix before release.
import { Alert, AlertDescription, AlertTitle } from "@gunkin/uiify";

export default function Example() {
  return (
    <Alert className="" variant="warning">
      <AlertTitle className="">Warning: browser support is incomplete.</AlertTitle>
      <AlertDescription className="">Check the support matrix before release.</AlertDescription>
    </Alert>
  );
}
@layer components {
  :where([data-uiify-alert]) {
    --uiify-alert-tone: var(--muted-foreground);

    position: relative;
    display: block;
    box-sizing: border-box;
    inline-size: 100%;
    min-inline-size: 0;
    padding-block: 0.75rem;
    padding-inline: 1rem;
    border: var(--border-width) solid var(--border);
    border-radius: var(--radius-1);
    corner-shape: round;
    background: var(--card);
    color: var(--card-foreground);
    font-size: var(--text-sm);
    line-height: 1.25rem;
    overflow-wrap: anywhere;
    text-wrap: pretty;
  }

  :where([data-uiify-alert][data-variant="success"]) {
    --uiify-alert-tone: var(--success);
  }

  :where([data-uiify-alert][data-variant="warning"]) {
    --uiify-alert-tone: var(--warning);
  }

  :where([data-uiify-alert][data-variant="destructive"]) {
    --uiify-alert-tone: var(--destructive);
  }

  :where([data-uiify-alert]:has(> [data-part="symbol"])) {
    padding-inline-start: 2.75rem;
  }

  :where([data-uiify-alert]) > [data-part="symbol"] {
    position: absolute;
    inset-block-start: 0.875rem;
    inset-inline-start: 1rem;
    display: grid;
    place-items: center;
    inline-size: 1rem;
    block-size: 1rem;
    color: color-mix(in oklab, var(--uiify-alert-tone) 65%, var(--card-foreground));
    font-size: 1rem;
    line-height: 1;
  }

  :where([data-uiify-alert-title]) {
    margin: 0;
    font-size: inherit;
    font-weight: var(--weight-semibold);
    line-height: inherit;
  }

  :where([data-uiify-alert-description]) {
    margin: 0;
    color: var(--muted-foreground);
    font-size: inherit;
    line-height: 1.5;
  }

  :where([data-uiify-alert-title] + [data-uiify-alert-description]) {
    margin-block-start: 0.25rem;
  }

  :where([data-uiify-alert-description]) > p {
    margin: 0;
  }

  :where([data-uiify-alert-description]) > p + p {
    margin-block-start: 0.5rem;
  }
}
import { Alert, AlertDescription, AlertTitle } from "@gunkin/uiify";

export default function Example() {
  return (
    <Alert
      className="
        [--uiify-alert-tone:var(--muted-foreground)] relative block box-border [inline-size:100%] [min-inline-size:0]
        [padding-block:0.75rem] [padding-inline:1rem] border-[length:var(--border-width)] border-solid border-border
        [border-radius:var(--radius-1)] [corner-shape:round] bg-card text-card-foreground text-sm leading-5
        [overflow-wrap:anywhere] text-pretty [&[data-variant=success]]:[--uiify-alert-tone:var(--success)]
        [&[data-variant=warning]]:[--uiify-alert-tone:var(--warning)]
        [&[data-variant=destructive]]:[--uiify-alert-tone:var(--destructive)]
        [&:has(>[data-part=symbol])]:[padding-inline-start:2.75rem] [&>[data-part=symbol]]:absolute
        [&>[data-part=symbol]]:[inset-block-start:0.875rem] [&>[data-part=symbol]]:[inset-inline-start:1rem]
        [&>[data-part=symbol]]:grid [&>[data-part=symbol]]:place-items-center [&>[data-part=symbol]]:[inline-size:1rem]
        [&>[data-part=symbol]]:[block-size:1rem]
        [&>[data-part=symbol]]:[color:color-mix(in_oklab,_var(--uiify-alert-tone)_65%,_var(--card-foreground))]
        [&>[data-part=symbol]]:[font-size:1rem] [&>[data-part=symbol]]:leading-none
      "
      variant="warning"
    >
      <AlertTitle
        className="
          m-0 text-[length:inherit] font-[number:var(--weight-semibold)] leading-[inherit]
          [&+[data-uiify-alert-description]]:[margin-block-start:0.25rem]
        "
      >
        Warning: browser support is incomplete.
      </AlertTitle>
      <AlertDescription
        className="
          m-0 text-muted-foreground text-[length:inherit] [line-height:1.5]
          [:where([data-uiify-alert-title]+&)]:[margin-block-start:0.25rem] [&>p]:m-0
          [&>p+p]:[margin-block-start:0.5rem]
        "
      >
        Check the support matrix before release.
      </AlertDescription>
    </Alert>
  );
}
/* app.css */

@layer reset, ui, app, tokens, base, demo, components, utilities, theme;

@import "@gunkin/uiify/styles/reset";

@import "@gunkin/uiify/components/behavior.css";

@import "@gunkin/uiify/styles/tokens";

@import "@gunkin/uiify/styles/tailwind";

@import "tailwindcss/utilities.css";

@theme { --spacing: 0.25rem; --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700; }

@source inline('[--uiify-alert-tone:var(--muted-foreground)] relative block box-border [inline-size:100%] [min-inline-size:0] [padding-block:0.75rem] [padding-inline:1rem] border-[length:var(--border-width)] border-solid border-border [border-radius:var(--radius-1)] [corner-shape:round] bg-card text-card-foreground text-sm leading-5 [overflow-wrap:anywhere] text-pretty [&[data-variant=success]]:[--uiify-alert-tone:var(--success)] [&[data-variant=warning]]:[--uiify-alert-tone:var(--warning)] [&[data-variant=destructive]]:[--uiify-alert-tone:var(--destructive)] [&:has(>[data-part=symbol])]:[padding-inline-start:2.75rem] [&>[data-part=symbol]]:absolute [&>[data-part=symbol]]:[inset-block-start:0.875rem] [&>[data-part=symbol]]:[inset-inline-start:1rem] [&>[data-part=symbol]]:grid [&>[data-part=symbol]]:place-items-center [&>[data-part=symbol]]:[inline-size:1rem] [&>[data-part=symbol]]:[block-size:1rem] [&>[data-part=symbol]]:[color:color-mix(in_oklab,_var(--uiify-alert-tone)_65%,_var(--card-foreground))] [&>[data-part=symbol]]:[font-size:1rem] [&>[data-part=symbol]]:leading-none m-0 text-[length:inherit] font-[number:var(--weight-semibold)] leading-[inherit] [&+[data-uiify-alert-description]]:[margin-block-start:0.25rem] text-muted-foreground [line-height:1.5] [:where([data-uiify-alert-title]+&)]:[margin-block-start:0.25rem] [&>p]:m-0 [&>p+p]:[margin-block-start:0.5rem]');

@layer base { :root { --uiify-control-text: var(--text-sm); } @media (pointer: coarse) { :root { --uiify-control-text: var(--text-base); } } }

/* Authored animation and registered properties used by the Tailwind skin.
 * Visual rules belong in utility recipes; only at-rule definitions live here. */
@layer components {
  @keyframes uiify-presence-in {
    from {
      opacity: 0;
      scale: var(--presence-scale);
    }
  }
}

@layer components {
  @keyframes uiify-presence-out {
    to {
      opacity: 0;
      scale: var(--presence-scale);
    }
  }
}

@property --uiify-spinner-tail {
  syntax: "<angle>";
  inherits: false;
  initial-value: 0deg;
}

@property --uiify-spinner-length {
  syntax: "<angle>";
  inherits: false;
  initial-value: 36deg;
}

@layer components {
  @keyframes uiify-spinner-rotate {
    to {
      transform: rotate(360deg);
    }
  }
}

@layer components {
  @keyframes uiify-spinner-orbit {
    0% {
      --uiify-spinner-tail: 0deg;
      --uiify-spinner-length: 36deg;
    }

    50% {
      --uiify-spinner-tail: 90deg;
      --uiify-spinner-length: 324deg;
    }

    100% {
      --uiify-spinner-tail: 360deg;
      --uiify-spinner-length: 36deg;
    }
  }
}

@layer components {
  @keyframes uiify-skeleton-pulse {
    50% {
      opacity: 0.45;
    }
  }
}

@layer components {
  @keyframes uiify-skeleton-shimmer {
    to {
      background-position: -200% 0;
    }
  }
}

@layer components {
  @keyframes uiify-skeleton-reveal {
    from {
      opacity: 0;
    }
    to {
      opacity: 1;
    }
  }
}

@property --candle-body-height {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 0%;
}

@property --candle-body-top {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 50%;
}

@property --candle-slot {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 100%;
}

@property --candle-wick-height {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 0%;
}

@property --candle-wick-top {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 50%;
}

@property --candle-x {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 0%;
}

@property --candle-scale {
  syntax: "<number>";
  inherits: true;
  initial-value: 1;
}

@property --line-y {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 50%;
}

@property --line-prev-y {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 50%;
}

@property --line-count {
  syntax: "<integer>";
  inherits: false;
  initial-value: 1;
}

@property --line-scale {
  syntax: "<number>";
  inherits: true;
  initial-value: 1;
}

@layer components {
  @keyframes uiify-otp-input-caret-blink {
    50% {
      opacity: 0;
    }
  }
}

⟦Éxámpléš~~~⟧

Outcome messages

The variant provides the status symbol and accent; keep the meaning clear in the title and description.

Payment successful
Your payment has been processed successfully.
Upload failed
Check your connection and try again.
Action needs review
Check the support matrix before release.
Update available
Review the latest changes in this release.
import { Alert, AlertDescription, AlertTitle } from "@gunkin/uiify";

export default function Example() {
  return (
    <>
      <Alert variant="success">
        <AlertTitle>Payment successful</AlertTitle>
        <AlertDescription>Your payment has been processed successfully.</AlertDescription>
      </Alert>
      <Alert variant="destructive">
        <AlertTitle>Upload failed</AlertTitle>
        <AlertDescription>Check your connection and try again.</AlertDescription>
      </Alert>
      <Alert variant="warning">
        <AlertTitle>Action needs review</AlertTitle>
        <AlertDescription>Check the support matrix before release.</AlertDescription>
      </Alert>
      <Alert variant="secondary">
        <AlertTitle>Update available</AlertTitle>
        <AlertDescription>Review the latest changes in this release.</AlertDescription>
      </Alert>
    </>
  );
}

⟦ÁPÍ~~⟧

Alert

⟦Próp~~⟧⟦Týpé~~⟧⟦Défáúlt~~~⟧⟦Déšçríptíóñ~~~~⟧
childrenReactNode—⟦ÁlértTítlé, ÁlértDéšçríptíóñ, ór çúštóm méššágé çóñtéñt.~~~~~~~~~~~~~~~~~~~~⟧
variant"secondary" | "success" | "warning" | "destructive""secondary"⟦Víšúál méáñíñg wríttéñ tó dátá-váríáñt; kéép šévérítý úñdérštáñdáblé íñ téxt.~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧
symbolstring | falseⓘ / ✓ / ⚠︎ / ×⟦Óvérrídé thé déçórátívé téxt šýmból, ór pášš fálšé tó hídé ít. Thé défáúlt çóméš fróm váríáñt.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧
asElementType"div"⟦Ñátívé éléméñt ór çómpóñéñt úšéd fór thé róót.~~~~~~~~~~~~~~~~~⟧
role"status" | "alert"—⟦Çhóóšé á lívé rólé óñlý whéñ méššágé tímíñg áñd úrgéñçý wárráñt áññóúñçéméñt.~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧
classNamestring—⟦Çlášš ápplíéd tó thé róót éléméñt.~~~~~~~~~~~~⟧
styleCSSProperties—⟦Ñátívé róót štýléš.~~~~~~~⟧
refRef<HTMLElement>—⟦Réf fórwárdéd tó thé réñdéréd róót éléméñt.~~~~~~~~~~~~~~~~⟧
render(props, state) => ReactElement | null—⟦Répláçé thé réñdéréd éléméñt whílé kéépíñg béhávíór áñd áççéššíbílítý wíríñg.~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧

AlertTitle

⟦Próp~~⟧⟦Týpé~~⟧⟦Défáúlt~~~⟧⟦Déšçríptíóñ~~~~⟧
childrenReactNode—⟦Çóñtéñt réñdéréd bý thíš álért párt.~~~~~~~~~~~~~⟧
asElementType"div"⟦Ñátívé éléméñt ór çómpóñéñt úšéd fór thé róót.~~~~~~~~~~~~~~~~~⟧
className / style / ref / native propsnative div props—⟦Ñátívé éléméñt própš, štýléš, évéñtš, áñd réf áré fórwárdéd.~~~~~~~~~~~~~~~~~~~~~⟧
render(props, state) => ReactElement | null—⟦Répláçé thé réñdéréd éléméñt whílé kéépíñg béhávíór áñd áççéššíbílítý wíríñg.~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧

AlertDescription

⟦Próp~~⟧⟦Týpé~~⟧⟦Défáúlt~~~⟧⟦Déšçríptíóñ~~~~⟧
childrenReactNode—⟦Çóñtéñt réñdéréd bý thíš álért párt.~~~~~~~~~~~~~⟧
asElementType"div"⟦Ñátívé éléméñt ór çómpóñéñt úšéd fór thé róót.~~~~~~~~~~~~~~~~~⟧
className / style / ref / native propsnative div props—⟦Ñátívé éléméñt própš, štýléš, évéñtš, áñd réf áré fórwárdéd.~~~~~~~~~~~~~~~~~~~~~⟧
render(props, state) => ReactElement | null—⟦Répláçé thé réñdéréd éléméñt whílé kéépíñg béhávíór áñd áççéššíbílítý wíríñg.~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧

⟦Kéýbóárd~~~⟧

⟦Kéý~~⟧⟦Áçtíóñ~~~⟧

⟦Áççéššíbílítý~~~~~⟧

⟦Péršíštéñt íñlíñé méššágé wíth ñó lívé rólé bý défáúlt. Ádd rólé=štátúš ór rólé=álért óñlý whéñ á dýñámíç úpdáté'š tímíñg áñd úrgéñçý wárráñt áññóúñçéméñt.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧

⟦Štýlíñg hóókš~~~~~⟧

data-uiify-alertdata-uiify-alert-titledata-uiify-alert-descriptiondata-part="symbol|title|description"data-variant