@@ -35,48 +35,29 @@ const id = useId()
3535 : 'grid-template-areas: \'label-text . toggle\''
3636 "
3737 >
38- <span
39- class =" relative inline-flex items-center shrink-0"
40- style =" grid-area : toggle; justify-self : end "
41- >
42- <input type =" checkbox" :id =" id" role =" switch" v-model =" checked" class =" sr-only peer" />
43-
44- <!-- Track -->
45- <span
46- class =" w-11 h-6 bg-fg-subtle peer-focus:outline-none peer-focus-visible:ring-2 peer-focus-visible:ring-fg peer-focus-visible:ring-offset-2 rounded-full peer peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-bg after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-fg transition-colors duration-200 ease-in-out"
47- ></span >
48-
49- <!-- Thumb Icon (Check) - Positioned absolutely over the thumb area -->
50- <span
51- class =" absolute top-[2px] start-[2px] h-5 w-5 rounded-full flex items-center justify-center transition-transform duration-200 ease-in-out pointer-events-none"
52- :class =" checked ? 'translate-x-5 rtl:-translate-x-5' : 'translate-x-0'"
53- >
54- <span
55- class =" i-lucide:check w-3.5 h-3.5 text-fg transition-transform duration-200"
56- :class =" checked ? 'scale-100 opacity-100' : 'scale-0 opacity-0'"
57- aria-hidden =" true"
58- ></span >
59- </span >
60- </span >
61-
6238 <template v-if =" props .reverseOrder " >
39+ <input
40+ role =" switch"
41+ type =" checkbox"
42+ :id =" id"
43+ v-model =" checked"
44+ class =" toggle appearance-none h-6 w-11 rounded-full border border-fg relative shrink-0 bg-fg-subtle transition-colors duration-200 ease-in-out checked:bg-fg checked:border-fg hover:bg-fg-muted checked:hover:bg-fg-muted checked:hover:border-fg-muted focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2 before:content-[''] before:absolute before:h-5 before:w-5 before:top-[1px] before:start-[1px] before:rounded-full before:bg-bg before:transition-transform before:duration-200 before:ease-in-out checked:before:translate-x-[20px] rtl:checked:before:-translate-x-[20px] after:content-[''] after:absolute after:h-3.5 after:w-3.5 after:top-[4px] after:start-[4px] after:i-lucide:check after:bg-fg after:opacity-0 checked:after:opacity-100 after:transition-all after:duration-200 after:ease-in-out checked:after:translate-x-[20px] rtl:checked:after:-translate-x-[20px]"
45+ style =" grid-area : toggle"
46+ />
6347 <TooltipApp
6448 v-if =" tooltip && label"
6549 :text =" tooltip"
6650 :position =" tooltipPosition ?? 'top'"
6751 :to =" tooltipTo"
6852 :offset =" tooltipOffset"
6953 >
70- <span
71- class =" toggle-label text-sm text-fg font-medium text-start"
72- style =" grid-area : label-text"
73- >
54+ <span class =" text-sm text-fg font-medium text-start" style =" grid-area : label-text" >
7455 {{ label }}
7556 </span >
7657 </TooltipApp >
7758 <span
7859 v-else-if =" label"
79- class =" toggle-label text-sm text-fg font-medium text-start"
60+ class =" text-sm text-fg font-medium text-start"
8061 style =" grid-area : label-text"
8162 >
8263 {{ label }}
@@ -90,20 +71,25 @@ const id = useId()
9071 :to =" tooltipTo"
9172 :offset =" tooltipOffset"
9273 >
93- <span
94- class =" toggle-label text-sm text-fg font-medium text-start"
95- style =" grid-area : label-text"
96- >
74+ <span class =" text-sm text-fg font-medium text-start" style =" grid-area : label-text" >
9775 {{ label }}
9876 </span >
9977 </TooltipApp >
10078 <span
10179 v-else-if =" label"
102- class =" toggle-label text-sm text-fg font-medium text-start"
80+ class =" text-sm text-fg font-medium text-start"
10381 style =" grid-area : label-text"
10482 >
10583 {{ label }}
10684 </span >
85+ <input
86+ role =" switch"
87+ type =" checkbox"
88+ :id =" id"
89+ v-model =" checked"
90+ class =" toggle appearance-none h-6 w-11 rounded-full border border-fg relative shrink-0 bg-fg-subtle transition-colors duration-200 ease-in-out checked:bg-fg checked:border-fg hover:bg-fg-muted checked:hover:bg-fg-muted checked:hover:border-fg-muted focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2 before:content-[''] before:absolute before:h-5 before:w-5 before:top-[1px] before:start-[1px] before:rounded-full before:bg-bg before:transition-transform before:duration-200 before:ease-in-out checked:before:translate-x-[20px] rtl:checked:before:-translate-x-[20px] after:content-[''] after:absolute after:h-3.5 after:w-3.5 after:top-[4px] after:start-[4px] after:i-lucide:check after:bg-fg after:opacity-0 checked:after:opacity-100 after:transition-all after:duration-200 after:ease-in-out checked:after:translate-x-[20px] rtl:checked:after:-translate-x-[20px]"
91+ style =" grid-area : toggle; justify-self : end "
92+ />
10793 </template >
10894 </label >
10995 <p v-if =" description" class =" text-sm text-fg-muted mt-2" >
@@ -114,49 +100,33 @@ const id = useId()
114100<style scoped>
115101/* Support forced colors */
116102@media (forced-colors: active) {
117- /* Label text */
118- .toggle-label {
119- color : Highlight !important ;
120- forced-color-adjust : none ;
121- background : Canvas !important ;
122- }
123-
124- /* Track (OFF & ON base) */
125- input + span {
126- forced-color-adjust : none ;
127- border : 1px solid CanvasText !important ;
128- background : Canvas !important ;
103+ .toggle {
104+ background : Canvas;
105+ border-color : CanvasText;
129106 }
130107
131- /* Track ON */
132- input :checked + span {
133- background : Highlight !important ;
134- border-color : CanvasText !important ;
108+ .toggle :checked {
109+ background : Highlight ;
110+ border-color : CanvasText;
135111 }
136112
137- /* Thumb (OFF) - Purple circle */
138- input + span ::after {
139- forced-color-adjust : none ;
140- background-color : Highlight !important ;
141- border : none !important ;
113+ .toggle ::before {
114+ background-color : CanvasText;
142115 }
143116
144- /* Thumb (ON) - White circle on purple track */
145- input :checked + span ::after {
146- background-color : Canvas !important ;
117+ .toggle :checked ::before {
118+ background-color : Canvas;
147119 }
148120
149- /* Icon (ON) - Purple check on white thumb */
150- .i-lucide\: check {
151- color : Highlight !important ;
152- forced-color-adjust : none ;
121+ .toggle ::after {
122+ background-color : Highlight ;
153123 }
154124}
155125
156126@media (prefers-reduced-motion: reduce) {
157- span ,
158- span ::after ,
159- .i-lucide \: check {
127+ .toggle ,
128+ .toggle ::before ,
129+ .toggle ::after {
160130 transition : none !important ;
161131 animation : none !important ;
162132 }
0 commit comments