Skip to content

Commit 99bc099

Browse files
committed
feat(input): adds switch
1 parent b1ba008 commit 99bc099

File tree

7 files changed

+463
-10
lines changed

7 files changed

+463
-10
lines changed

README.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,7 @@ Neomorphic ui library for svelte 5
2525
- [x] pin
2626
- [x] time/date/week
2727
- [ ] range
28-
- [ ] switch
29-
- [ ] loading
30-
- [ ] border loading
31-
- [ ] skeleton
28+
- [x] switch
3229
- [ ] slider
3330
- [ ] range
3431
- [ ] steps/ticks

demo/components/DemoInputs.svelte

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import NeoPassword from '~/inputs/NeoPassword.svelte';
1818
import NeoPin from '~/inputs/NeoPin.svelte';
1919
import NeoRadio from '~/inputs/NeoRadio.svelte';
20+
import NeoSwitch from '~/inputs/NeoSwitch.svelte';
2021
import NeoTextArea from '~/inputs/NeoTextarea.svelte';
2122
import NeoInput from '~/inputs/common/NeoInput.svelte';
2223
@@ -127,6 +128,9 @@
127128
128129
const radioState = new ValidationState({ type: 'radio' });
129130
131+
const switchState = new ValidationState({ type: 'checkbox' });
132+
const switchGroupState = new ValidationState({ type: 'checkbox' });
133+
130134
const onClear = () =>
131135
[
132136
validation,
@@ -150,6 +154,9 @@
150154
checkboxGroupState,
151155
152156
radioState,
157+
158+
switchState,
159+
switchGroupState,
153160
].forEach(state => state.clear());
154161
155162
const columns: ColumProps[] = [
@@ -801,6 +808,42 @@
801808
</div>
802809
</div>
803810

811+
<!-- Radio inputs -->
812+
<div class="row">
813+
<div class="column content">
814+
<span class="label">Switch</span>
815+
{@render validationState(switchState, true)}
816+
<SphereBackdrop glass={options.glass}>
817+
<div class="column">
818+
<NeoSwitch
819+
label="Switch"
820+
bind:touched={switchState.touched}
821+
bind:dirty={switchState.dirty}
822+
bind:valid={switchState.valid}
823+
bind:checked={switchState.checked}
824+
bind:indeterminate={switchState.indeterminate}
825+
required
826+
validation
827+
{...options}
828+
wrapperProps={{ style: 'min-width: 20rem' }}
829+
/>
830+
</div>
831+
</SphereBackdrop>
832+
</div>
833+
834+
<div class="column content">
835+
<span class="label">Switch Group</span>
836+
<div class="label">Group: {switchGroupState.group}</div>
837+
<SphereBackdrop glass={options.glass}>
838+
<div class="column" style:gap="0.5rem">
839+
<NeoSwitch label="Switch 1" value="Switch 1" name="switch-group" bind:group={switchGroupState.group} {...options} />
840+
<NeoSwitch label="Switch 2" value="Switch 2" name="switch-group" bind:group={switchGroupState.group} {...options} />
841+
<NeoSwitch label="Switch 3" value="Switch 3" name="switch-group" bind:group={switchGroupState.group} {...options} />
842+
</div>
843+
</SphereBackdrop>
844+
</div>
845+
</div>
846+
804847
<style lang="scss">
805848
@use 'src/lib/styles/common/flex' as flex;
806849

src/lib/inputs/NeoCheckbox.svelte

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
class:neo-disabled={disabled}
128128
class:neo-skeleton={skeleton}
129129
class:neo-flat={!elevation}
130+
class:neo-inset={elevation <= 0}
130131
style:--neo-checkbox-box-shadow={boxShadow}
131132
style:--neo-checkbox-checked-shadow={checkedShadow}
132133
onclick={() => ref?.click()}
@@ -214,7 +215,7 @@
214215
padding: 0.125rem;
215216
color: inherit;
216217
text-decoration: none;
217-
background: transparent;
218+
background-color: color-mix(in srgb, transparent, currentcolor 1%);
218219
border: var(--neo-checkbox-border-width, var(--neo-border-width, 1px)) var(--neo-checkbox-border-color, transparent) solid;
219220
border-radius: var(--neo-border-radius-sm);
220221
outline: none;
@@ -224,9 +225,12 @@
224225
color 0.3s ease,
225226
box-shadow 0.3s ease,
226227
border-radius 0.3s ease,
227-
border-color 0.3s ease;
228+
border-color 0.3s ease,
229+
background-color 0.3s ease;
228230
231+
&.neo-disabled,
229232
&.neo-flat {
233+
background-color: transparent;
230234
border-color: var(--neo-input-border-color, var(--neo-border-color));
231235
}
232236
@@ -235,6 +239,10 @@
235239
box-shadow: var(--neo-checkbox-checked-shadow, var(--neo-box-shadow-pressed-2));
236240
}
237241
242+
&.neo-inset:focus-visible {
243+
border-color: var(--neo-checkbox-border-color-focused, var(--neo-border-color-focused));
244+
}
245+
238246
&.neo-disabled {
239247
color: var(--neo-text-color-disabled);
240248
box-shadow: var(--neo-box-shadow-flat);
@@ -249,7 +257,7 @@
249257
&.neo-glass {
250258
@include mixin.glass;
251259
252-
background-color: var(--neo-btn-bg-color, var(--neo-glass-background-color));
260+
background-color: var(--neo-checkbox-bg-color, var(--neo-glass-background-color));
253261
border-color: var(
254262
--neo-checkbox-border-color,
255263
var(--neo-glass-top-border-color) var(--neo-glass-right-border-color) var(--neo-glass-bottom-border-color)

src/lib/inputs/NeoRadio.svelte

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
class:neo-disabled={disabled}
7171
class:neo-skeleton={skeleton}
7272
class:neo-flat={!elevation}
73+
class:neo-inset={elevation <= 0}
7374
style:--neo-radio-box-shadow={boxShadow}
7475
style:--neo-radio-checked-shadow={checkedShadow}
7576
onclick={() => ref?.click()}
@@ -152,7 +153,7 @@
152153
padding: 0;
153154
color: inherit;
154155
text-decoration: none;
155-
background: transparent;
156+
background-color: color-mix(in srgb, transparent, currentcolor 1%);
156157
border: var(--neo-radio-border-width, var(--neo-border-width, 1px)) var(--neo-radio-border-color, transparent) solid;
157158
border-radius: var(--neo-border-radius-sm);
158159
outline: none;
@@ -162,9 +163,12 @@
162163
color 0.3s ease,
163164
box-shadow 0.3s ease,
164165
border-radius 0.3s ease,
165-
border-color 0.3s ease;
166+
border-color 0.3s ease,
167+
background-color 0.3s ease;
166168
169+
&.neo-disabled,
167170
&.neo-flat {
171+
background-color: transparent;
168172
border-color: var(--neo-input-border-color, var(--neo-border-color));
169173
}
170174
@@ -173,6 +177,10 @@
173177
box-shadow: var(--neo-radio-checked-shadow, var(--neo-box-shadow-pressed-2));
174178
}
175179
180+
&.neo-inset:focus-visible {
181+
border-color: var(--neo-checkbox-border-color-focused, var(--neo-border-color-focused));
182+
}
183+
176184
&.neo-disabled {
177185
color: var(--neo-text-color-disabled);
178186
box-shadow: var(--neo-box-shadow-flat);
@@ -187,7 +195,7 @@
187195
&.neo-glass {
188196
@include mixin.glass;
189197
190-
background-color: var(--neo-btn-bg-color, var(--neo-glass-background-color));
198+
background-color: var(--neo-radio-bg-color, var(--neo-glass-background-color));
191199
border-color: var(
192200
--neo-radio-border-color,
193201
var(--neo-glass-top-border-color) var(--neo-glass-right-border-color) var(--neo-glass-bottom-border-color)

0 commit comments

Comments
 (0)