Switch
פקד שמפעיל או מכבה הגדרה אחת.
- דפדפנים
- Chrome 123+, Firefox 121+, Safari 17.5+
- שכבה
- 0
- גודל חבילה דחוסה
- 319 B
- מגבלת פריסה כפויה
- 0 ms
- מגבלת Axe
- 0
- תואם SSR
- כן
- חוזה מפורסם
- סביבת בדיקות
מגרש ניסויים
Switch
ברירת מחדל
מושבת
התראות בדוא״לקבלת עדכונים על סביבת העבודה שלך.
- 1
- 2
- 3
- 4
- 5
import { Switch } from "@gunkin/uiify";
export default function Example() {
return <Switch className="" aria-label="Email notifications" defaultChecked />;
}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
/* 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;
}
}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
import { Switch } from "@gunkin/uiify";
export default function Example() {
return (
<Switch
className="
focus-visible:[outline:none]
focus-visible:[box-shadow:0_0_0_var(--ring-width)_color-mix(in_oklch,_var(--ring)_20%,_transparent)]
appearance-none relative [inline-size:2.25rem] [block-size:1.25rem] m-0 flex-none border-0 border-current
border-none rounded-[var(--radius-full)] bg-input cursor-pointer
[transition:background-color_var(--duration-fast)_var(--ease-out)] before:content-[''] before:absolute
before:[inset-block-start:2px] before:[inset-inline-start:2px] before:[inline-size:calc(1.25rem_-_4px)]
before:[block-size:calc(1.25rem_-_4px)] before:rounded-[var(--radius-full)]
before:[background-color:var(--gray-0)] before:[box-shadow:var(--shadow-1)]
before:[transition:translate_var(--duration-fast)_var(--ease-out)] checked:bg-primary
data-[state=checked]:bg-primary checked:before:[translate:1rem_0] data-[state=checked]:before:[translate:1rem_0]
disabled:opacity-50 disabled:cursor-not-allowed data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed
"
aria-label="Email notifications"
defaultChecked
/>
);
}API
Switch
| מאפיין | טיפוס | ברירת מחדל | תיאור |
|---|---|---|---|
checked | boolean | — | מצב הסימון, ההופך את המתג למבוקר. |
defaultChecked | boolean | — | מצב הסימון ההתחלתי של המתג הלא מבוקר, שלאחר מכן מנוהל על ידי תיבת הסימון המובנית. |
onCheckedChange | (checked: boolean) => void | — | נקראת עם מצב הסימון החדש כשהמשתמש משנה את מצב המתג. |
disabled | boolean | false | משבית את הקלט המובנה ומגדיר את המאפיין data-disabled. |
render | ReactElement | ((props, state) => ReactElement) | — | החלפת האלמנט המוצג תוך שימור ההתנהגות וקישורי הנגישות. |
מקלדת
| מקש | פעולה |
|---|---|
| Space | החלפת מצב בעת מיקוד |
נגישות
תפקיד switch עם aria-checked; התנהגות המקלדת תואמת למוסכמות של תיבת סימון מובנית.
נקודות חיבור לעיצוב
data-statedata-disabled