Toggle
כפתור שמחליף בין מצב לחוץ למצב לא לחוץ.
- דפדפנים
- Chrome 123+Firefox 121+Safari 17.5+
- שכבה
- 0
- גודל חבילה דחוסה
- 383 B
- מגבלת פריסה כפויה
- 0 ms
- מגבלת Axe
- 0
- תואם SSR
- כן
- חוזה מפורסם
- סביבת בדיקות
מגרש ניסויים
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 | — | תוכן התווית שלחיצה עליה מחליפה את מצב הקלט. |
pressed | boolean | — | מצב לחיצה מבוקר; אספקתו מעבירה את ניהול המצב לקוד הקורא. |
defaultPressed | boolean | false | מצב הלחיצה בהצגה הראשונה. אינו מבוקר, ולכן פועל גם ללא JavaScript. |
onPressedChange | (pressed: boolean) => void | — | נקראת עם מצב הלחיצה החדש כשכפתור החלפה מבוקר משתנה. |
disabled | boolean | false | משבית את הקלט ומסמן את המעטפת ב-data-disabled. |
className | string | — | המחלקה המוחלת על אלמנט השורש. |
slotProps | ToggleSlotProps | — | מאפיינים מובנים לאלמנטי הפקד והתווית שנוצרים. |
מקלדת
| מקש | פעולה |
|---|---|
| Enter / Space | החלפת המצב הלחוץ בעת מיקוד |
נגישות
אלמנט <button aria-pressed> מובנה (או קלט תיבת סימון מוסתר בווריאציה הקבוצתית). המצב הלחוץ ניתן לקריאה ללא JavaScript.
נקודות חיבור לעיצוב
data-statedata-disabled