דילוג לתוכן
uiify

Checkbox

תיבת סימון המבוססת על קלט תיבת הסימון המובנה.

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

מגרש ניסויים

Checkbox

ברירת מחדל

Indeterminate

מושבת

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

export default function Example() {
  return <Checkbox className="" id="terms" label="Accept terms" slotProps={{ input: { className: "" } }} />;
}
/* Checkbox, Radio, Switch — all native <input>s styled with appearance:none.
   State comes from :checked / :indeterminate (works uncontrolled) and the
   [data-state] / [data-disabled] attributes (set when controlled). Thumbs and
   checkmarks are pseudo-elements on the input itself. */

@layer components {
  :where([data-uiify-checkbox] > input, [data-uiify-radio]) {
    appearance: none;
    inline-size: 1.25rem;
    block-size: 1.25rem;
    margin: 0;
    border: var(--border-width) solid var(--input);
    background-color: var(--card);
    display: inline-grid;
    place-content: center;
    cursor: pointer;
    transition: var(--transition-colors);
  }

  [data-uiify-checkbox] {
    display: inline-flex;
    align-items: center;
    gap: var(--space-sm);
    cursor: pointer;
    user-select: none;
    color: var(--foreground);
    font-size: var(--text-sm);
    line-height: var(--leading-normal);
  }

  [data-uiify-checkbox] > input {
    border-radius: var(--radius-xs);
  }

  [data-uiify-radio] {
    border-radius: var(--radius-full);
  }

  /* Checked fill (covers controlled [data-state] and uncontrolled :checked). */
  [data-uiify-checkbox] > input:checked,
  [data-uiify-checkbox] > input[data-state="checked"] {
    border-color: var(--primary);
    background-color: var(--primary);
  }

  /* Radio checked state is a thick accent ring around a white center, not a
     filled dot — matches the 2a/2b handoff's target/bullseye radio anatomy. */
  [data-uiify-radio]:checked,
  [data-uiify-radio][data-state="checked"] {
    border-width: 5px;
    border-color: var(--primary);
    background-color: var(--card);
  }

  /* Checkmark. */
  [data-uiify-checkbox] > input::before {
    content: "";
    inline-size: 1rem;
    block-size: 1rem;
    transform: scale(0);
    transition: transform var(--duration-fast) var(--ease-out);
    background-color: var(--primary-foreground);
    clip-path: polygon(28.4% 46.4%, 20% 59%, 42.8% 80%, 80% 33.2%, 70.4% 23.6%, 42.8% 60.8%);
  }

  [data-uiify-checkbox] > input:checked::before,
  [data-uiify-checkbox] > input[data-state="checked"]::before {
    transform: scale(1);
  }

  /* Indeterminate dash. */
  [data-uiify-checkbox] > input:indeterminate,
  [data-uiify-checkbox] > input[data-state="indeterminate"] {
    border-color: var(--primary);
    background-color: var(--primary);
  }

  [data-uiify-checkbox] > input:indeterminate::before,
  [data-uiify-checkbox] > input[data-state="indeterminate"]::before {
    transform: scale(1);
    clip-path: inset(42% 12% 42% 12%);
  }

  :where([data-uiify-checkbox] > input, [data-uiify-radio]):disabled,
  :where([data-uiify-checkbox] > input, [data-uiify-radio])[data-disabled] {
    opacity: 0.5;
    cursor: not-allowed;
  }

  [data-uiify-checkbox]:has(> input:disabled) {
    opacity: 0.5;
    cursor: not-allowed;
  }

  [data-uiify-radio-group] {
    display: flex;
    flex-direction: column;
    gap: var(--space-md);
  }

  /* Switch — a pill track with a sliding thumb pseudo-element. */
  [data-uiify-switch] {
    appearance: none;
    position: relative;
    inline-size: 2.25rem;
    block-size: 1.25rem;
    margin: 0;
    flex: none;
    border: none;
    border-radius: var(--radius-full);
    background-color: var(--input);
    cursor: pointer;
    transition: background-color var(--duration-fast) var(--ease-out);
  }

  [data-uiify-switch]::before {
    content: "";
    position: absolute;
    inset-block-start: 2px;
    inset-inline-start: 2px;
    inline-size: calc(1.25rem - 4px);
    block-size: calc(1.25rem - 4px);
    border-radius: var(--radius-full);
    background-color: var(--gray-0);
    box-shadow: var(--shadow-1);
    transition: translate var(--duration-fast) var(--ease-out);
  }

  [data-uiify-switch]:checked,
  [data-uiify-switch][data-state="checked"] {
    background-color: var(--primary);
  }

  [data-uiify-switch]:checked::before,
  [data-uiify-switch][data-state="checked"]::before {
    translate: 1rem 0;
  }

  [data-uiify-switch]:disabled,
  [data-uiify-switch][data-disabled] {
    opacity: 0.5;
    cursor: not-allowed;
  }
}

@layer components {
  label:has([data-uiify-radio]),
  [data-uiify-radio-group] label {
    user-select: none;
    cursor: pointer;
  }
}
import { Checkbox } from "@gunkin/uiify";

export default function Example() {
  return (
    <Checkbox
      className="
        inline-flex items-center gap-sm cursor-pointer select-none text-foreground text-sm
        [line-height:var(--leading-normal)] [&:has(>input:disabled)]:opacity-50
        [&:has(>input:disabled)]:cursor-not-allowed
      "
      id="terms"
      label="Accept terms"
      slotProps={{
        input: {
          className:
            "appearance-none [inline-size:1.25rem] [block-size:1.25rem] m-0 " +
            "border-[length:var(--border-width)] border-solid border-input bg-card " +
            "inline-grid place-content-center cursor-pointer " +
            "[transition:var(--transition-colors)] rounded-xs focus-visible:[outline:none] " +
            "focus-visible:[box-shadow:0_0_0_var(--ring-width)_color-mix(in_oklch,_var(--ring)_20%,_transparent)] " +
            "checked:border-primary checked:bg-primary data-[state=checked]:border-primary " +
            "data-[state=checked]:bg-primary before:content-[''] before:[inline-size:1rem] " +
            "before:[block-size:1rem] before:[transform:scale(0)] " +
            "before:[transition:transform_var(--duration-fast)_var(--ease-out)] " +
            "before:bg-primary-foreground " +
            "before:[clip-path:polygon(28.4%_46.4%,20%_59%,42.8%_80%,80%_33.2%,70.4%_23.6%,42.8%_60.8%)] " +
            "checked:before:[transform:scale(1)] " +
            "data-[state=checked]:before:[transform:scale(1)] indeterminate:border-primary " +
            "indeterminate:bg-primary data-[state=indeterminate]:border-primary " +
            "data-[state=indeterminate]:bg-primary indeterminate:before:[transform:scale(1)] " +
            "indeterminate:before:[clip-path:inset(42%_12%_42%_12%)] " +
            "data-[state=indeterminate]:before:[transform:scale(1)] " +
            "data-[state=indeterminate]:before:[clip-path:inset(42%_12%_42%_12%)] " +
            "disabled:opacity-50 disabled:cursor-not-allowed data-[disabled]:opacity-50 " +
            "data-[disabled]:cursor-not-allowed",
        },
      }}
    />
  );
}

API

Checkbox

מאפייןטיפוסברירת מחדלתיאור
id*string—מזהה הקלט המובנה, המשמש גם לקישור אלמנט התווית.
labelReactNode—תוכן התווית המוצג לצד הקלט בתוך אלמנט תווית עוטף.
checkedboolean | "indeterminate"—מצב הסימון, ההופך את תיבת הסימון למבוקרת; "indeterminate" מציג מצב מעורב.
defaultCheckedboolean—מצב הסימון ההתחלתי של תיבת הסימון הלא מבוקרת, שלאחר מכן מנוהל על ידי הדפדפן.
disabledbooleanfalseמשבית את הקלט המובנה ומגדיר את המאפיין data-disabled.
namestring—השם המשמש לשליחת תיבת הסימון עם טופס.
valuestring—הערך הנשלח כשתיבת הסימון מסומנת.
classNamestring—המחלקה המוחלת על אלמנט התווית העוטף כשמסופקת תווית.
onCheckedChange(checked: boolean) => void—נקראת עם מצב הסימון החדש כשהמשתמש משנה את מצב תיבת הסימון.
aria-labelstring—שם נגיש המשמש כשלא סופקה תווית.
slotPropsCheckboxSlotProps—מאפיינים מובנים לקלט ולתווית העוטפת שנוצרים.

מקלדת

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

נגישות

קלט תיבת סימון מובנה. מצב לא מוגדר כשמתאים.

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

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