Skip to content

Commit 89ae695

Browse files
committed
chore: simplify markup adding just the check mark
1 parent 15031a2 commit 89ae695

1 file changed

Lines changed: 35 additions & 65 deletions

File tree

app/components/Settings/Toggle.client.vue

Lines changed: 35 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)