דילוג לתוכן
uiify

Toggle

כפתור שמחליף בין מצב לחוץ למצב לא לחוץ.

דפדפנים
Chrome 123+Firefox 121+Safari 17.5+
שכבה
0
גודל חבילה דחוסה
383 B
מגבלת פריסה כפויה
0 ms
מגבלת Axe
0
תואם SSR
כן
חוזה מפורסם
סביבת בדיקות

מגרש ניסויים

Toggle

ברירת מחדל

מושבת

import { Toggle } from "@gunkin/uiify";

export default function Example() {
  return (
    <Toggle
      className=""
      id="bold"
      label="Bold"
      slotProps={{
        control: { className: "" },
        label: { className: "" },
      }}
    />
  );
}
/* Toggle + native-control toggle groups. The labels are styled by the Button skin
   (`data-uiify-button`); this file only places the native controls behind them. */

@layer components {
  [data-uiify-toggle] {
    position: relative;
    display: inline-flex;
  }

  [data-uiify-toggle] > input {
    position: absolute;
    inset: 0;
    inline-size: 100%;
    block-size: 100%;
    margin: 0;
    opacity: 0;
    cursor: pointer;
  }

  [data-uiify-toggle] > input:disabled {
    cursor: not-allowed;
  }

  [data-uiify-toggle] > input:focus-visible + [data-uiify-button],
  [data-uiify-toggle-group] [data-part="item"] > input:focus-visible + [data-uiify-button] {
    box-shadow: 0 0 0 var(--ring-width) color-mix(in oklch, var(--ring) 20%, transparent);
  }

  [data-uiify-toggle-group] {
    display: inline-flex;
    gap: var(--space-xs);
  }

  [data-uiify-toggle-group][data-orientation="vertical"] {
    flex-direction: column;
  }

  [data-uiify-toggle-group] [data-part="item"] {
    position: relative;
  }

  [data-uiify-toggle-group] [data-part="item"] > input {
    position: absolute;
    inline-size: 1px;
    block-size: 1px;
    margin: -1px;
    overflow: hidden;
    /* stylelint-disable-next-line property-no-deprecated -- fallback for older browsers */
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
  }

  /* Group items are tighter than a standalone button, so a one-glyph item stays square. */
  [data-uiify-toggle-group] [data-part="item"] > label {
    padding-inline: 0.75rem;
  }
}
import { Toggle } from "@gunkin/uiify";

export default function Example() {
  return (
    <Toggle
      className={
        "relative inline-flex [&>input:focus-visible+[data-uiify-button]]:[box-shadow:0_0_0_var(--ring-width)_color-" +
        "mix(in_oklch,_var(--ring)_20%,_transparent)] data-[disabled]:[&>label]:opacity-50 data-[disabled]:[&>label]" +
        ":cursor-not-allowed"
      }
      id="bold"
      label="Bold"
      slotProps={{
        control: {
          className:
            "absolute inset-0 [inline-size:100%] [block-size:100%] m-0 opacity-0 " +
            "cursor-pointer disabled:cursor-not-allowed",
        },
        label: {
          className:
            "relative isolate inline-flex items-center justify-center gap-1.5 min-h-10 " +
            "min-w-10 px-5 py-px border-[length:var(--border-width)] border-solid " +
            "border-transparent rounded-full bg-clip-padding text-base font-medium leading-6 " +
            "no-underline cursor-pointer [transition:var(--transition-colors)] " +
            "focus-visible:[outline:none] " +
            "focus-visible:[box-shadow:0_0_0_var(--ring-width)_color-mix(in_oklch,_var(--ring)_20%,_transparent)] " +
            "disabled:opacity-50 disabled:cursor-not-allowed data-[disabled]:opacity-50 " +
            "data-[disabled]:cursor-not-allowed " +
            "[&:is([data-selected],[aria-pressed=true],[aria-current=page])]:[--uiify-button-rim:rgb(255_255_255_/_20%)] " +
            "[&:is([data-selected],[aria-pressed=true],[aria-current=page])]:[--uiify-button-wash:rgb(255_255_255_/_15%)] " +
            "[&:is([data-selected],[aria-pressed=true],[aria-current=page])]:border-transparent " +
            "[&:is([data-selected],[aria-pressed=true],[aria-current=page])]:bg-primary " +
            "[&:is([data-selected],[aria-pressed=true],[aria-current=page])]:text-primary-foreground " +
            "[:checked+&]:[--uiify-button-rim:rgb(255_255_255_/_20%)] " +
            "[:checked+&]:[--uiify-button-wash:rgb(255_255_255_/_15%)] " +
            "[:checked+&]:border-transparent [:checked+&]:bg-primary " +
            "[:checked+&]:text-primary-foreground " +
            "[@media_(any-hover:_hover)_and_(any-pointer:_fine)]:[&:is([data-selected],[aria-pressed=true],[aria-current=page]):hover:not(:disabled,[data-disabled])]:[background-color:color-mix(in_oklch,_var(--primary)_88%,_var(--primary-foreground))] " +
            "[@media_(any-hover:_hover)_and_(any-pointer:_fine)]:[:checked:not(:disabled)+&:hover]:[background-color:color-mix(in_oklch,_var(--primary)_88%,_var(--primary-foreground))] " +
            "[--uiify-button-rim:color-mix(in_oklch,_var(--foreground)_25%,_transparent)] " +
            "[border-color:color-mix(in_oklch,_var(--foreground)_20%,_transparent)] " +
            "bg-transparent text-foreground before:content-none " +
            "after:[inset:calc(-1_*_var(--border-width))] after:[padding:var(--border-width)] " +
            "hover:[&:not(:disabled,[data-disabled])]:[background-color:color-mix(in_oklch,_var(--foreground)_10%,_transparent)] " +
            "active:[&:not(:disabled,[data-disabled])]:[background-color:color-mix(in_oklch,_var(--foreground)_16%,_transparent)]",
        },
      }}
    />
  );
}

API

Toggle

מאפייןטיפוסברירת מחדלתיאור
id*string—מזהה קלט תיבת הסימון שהתווית מפנה אליו.
label*ReactNode—תוכן התווית שלחיצה עליה מחליפה את מצב הקלט.
pressedboolean—מצב לחיצה מבוקר; אספקתו מעבירה את ניהול המצב לקוד הקורא.
defaultPressedbooleanfalseמצב הלחיצה בהצגה הראשונה. אינו מבוקר, ולכן פועל גם ללא JavaScript.
onPressedChange(pressed: boolean) => void—נקראת עם מצב הלחיצה החדש כשכפתור החלפה מבוקר משתנה.
disabledbooleanfalseמשבית את הקלט ומסמן את המעטפת ב-data-disabled.
classNamestring—המחלקה המוחלת על אלמנט השורש.
slotPropsToggleSlotProps—מאפיינים מובנים לאלמנטי הפקד והתווית שנוצרים.

מקלדת

מקשפעולה
Enter / Spaceהחלפת המצב הלחוץ בעת מיקוד

נגישות

אלמנט <button aria-pressed> מובנה (או קלט תיבת סימון מוסתר בווריאציה הקבוצתית). המצב הלחוץ ניתן לקריאה ללא JavaScript.

נקודות חיבור לעיצוב

data-statedata-disabled
דף זה תורגם אוטומטית וטרם נבדק.