@samuel-charpentier/sform 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +405 -0
- package/dist/Sform/Sfield.svelte +164 -0
- package/dist/Sform/Sfield.svelte.d.ts +4 -0
- package/dist/Sform/Sform.svelte +101 -0
- package/dist/Sform/Sform.svelte.d.ts +51 -0
- package/dist/Sform/context.svelte.d.ts +3 -0
- package/dist/Sform/context.svelte.js +65 -0
- package/dist/Sform/index.d.ts +5 -0
- package/dist/Sform/index.js +7 -0
- package/dist/Sform/inputs/ButtonInput.svelte +75 -0
- package/dist/Sform/inputs/ButtonInput.svelte.d.ts +32 -0
- package/dist/Sform/inputs/CheckboxGroupInput.svelte +81 -0
- package/dist/Sform/inputs/CheckboxGroupInput.svelte.d.ts +4 -0
- package/dist/Sform/inputs/CheckboxInput.svelte +47 -0
- package/dist/Sform/inputs/CheckboxInput.svelte.d.ts +4 -0
- package/dist/Sform/inputs/MaskedInput.svelte +220 -0
- package/dist/Sform/inputs/MaskedInput.svelte.d.ts +4 -0
- package/dist/Sform/inputs/NumberInput.svelte +116 -0
- package/dist/Sform/inputs/NumberInput.svelte.d.ts +4 -0
- package/dist/Sform/inputs/PasswordInput.svelte +142 -0
- package/dist/Sform/inputs/PasswordInput.svelte.d.ts +4 -0
- package/dist/Sform/inputs/RadioInput.svelte +81 -0
- package/dist/Sform/inputs/RadioInput.svelte.d.ts +4 -0
- package/dist/Sform/inputs/RangeInput.svelte +67 -0
- package/dist/Sform/inputs/RangeInput.svelte.d.ts +4 -0
- package/dist/Sform/inputs/SelectInput.svelte +36 -0
- package/dist/Sform/inputs/SelectInput.svelte.d.ts +4 -0
- package/dist/Sform/inputs/TextInput.svelte +61 -0
- package/dist/Sform/inputs/TextInput.svelte.d.ts +4 -0
- package/dist/Sform/inputs/TextareaInput.svelte +56 -0
- package/dist/Sform/inputs/TextareaInput.svelte.d.ts +4 -0
- package/dist/Sform/inputs/ToggleInput.svelte +101 -0
- package/dist/Sform/inputs/ToggleInput.svelte.d.ts +4 -0
- package/dist/Sform/inputs/ToggleOptionsInput.svelte +118 -0
- package/dist/Sform/inputs/ToggleOptionsInput.svelte.d.ts +4 -0
- package/dist/Sform/sform.css +628 -0
- package/dist/Sform/types.d.ts +610 -0
- package/dist/Sform/types.js +5 -0
- package/dist/Sform/utils/mask.d.ts +68 -0
- package/dist/Sform/utils/mask.js +155 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { ToggleOptionsInputProps, ToggleOption } from '../types.js';
|
|
3
|
+
|
|
4
|
+
let {
|
|
5
|
+
field,
|
|
6
|
+
name,
|
|
7
|
+
label,
|
|
8
|
+
class: className,
|
|
9
|
+
labelClass,
|
|
10
|
+
disabled,
|
|
11
|
+
options,
|
|
12
|
+
multiple = false,
|
|
13
|
+
showIssues,
|
|
14
|
+
onblur,
|
|
15
|
+
oninput
|
|
16
|
+
}: ToggleOptionsInputProps = $props();
|
|
17
|
+
|
|
18
|
+
// Normalize options to ToggleOption format
|
|
19
|
+
const normalizedOptions: ToggleOption[] = $derived(
|
|
20
|
+
options.map((opt) => (typeof opt === 'string' ? { value: opt, label: opt } : opt))
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
// Helper to get field attrs with controlled aria-invalid
|
|
24
|
+
function getFieldAttrs(optionValue: string) {
|
|
25
|
+
const inputType = multiple ? 'checkbox' : 'radio';
|
|
26
|
+
const attrs = field.as(inputType, optionValue);
|
|
27
|
+
return {
|
|
28
|
+
...attrs,
|
|
29
|
+
'aria-invalid': showIssues ? attrs['aria-invalid'] : undefined
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
{#if label}
|
|
35
|
+
<span id="{name}-label" class={labelClass}>{label}</span>
|
|
36
|
+
{/if}
|
|
37
|
+
<div
|
|
38
|
+
class="sform-toggle-options {className ?? ''}"
|
|
39
|
+
role={multiple ? 'group' : 'radiogroup'}
|
|
40
|
+
aria-labelledby={label ? `${name}-label` : undefined}
|
|
41
|
+
aria-label={!label ? name : undefined}
|
|
42
|
+
>
|
|
43
|
+
{#each normalizedOptions as option (option.value)}
|
|
44
|
+
{@const optionDisabled = disabled || option.disabled}
|
|
45
|
+
{@const fieldAttrs = getFieldAttrs(option.value)}
|
|
46
|
+
{@const inputId = `${name}-${option.value}`}
|
|
47
|
+
<label class="sform-toggle-option" class:disabled={optionDisabled} for={inputId}>
|
|
48
|
+
<input
|
|
49
|
+
{...fieldAttrs}
|
|
50
|
+
type={multiple ? 'checkbox' : 'radio'}
|
|
51
|
+
id={inputId}
|
|
52
|
+
disabled={optionDisabled}
|
|
53
|
+
{onblur}
|
|
54
|
+
{oninput}
|
|
55
|
+
/>
|
|
56
|
+
<span>{option.label}</span>
|
|
57
|
+
</label>
|
|
58
|
+
{/each}
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
<style>
|
|
62
|
+
.sform-toggle-options {
|
|
63
|
+
display: inline-flex;
|
|
64
|
+
border-radius: 0.375rem;
|
|
65
|
+
overflow: hidden;
|
|
66
|
+
border: 1px solid #ccc;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.sform-toggle-option {
|
|
70
|
+
display: flex;
|
|
71
|
+
align-items: center;
|
|
72
|
+
justify-content: center;
|
|
73
|
+
padding: 0.5rem 1rem;
|
|
74
|
+
background: white;
|
|
75
|
+
cursor: pointer;
|
|
76
|
+
transition:
|
|
77
|
+
background-color 0.15s,
|
|
78
|
+
color 0.15s;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.sform-toggle-option:not(:last-child) {
|
|
82
|
+
border-right: 1px solid #ccc;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.sform-toggle-option:hover:not(.disabled) {
|
|
86
|
+
background-color: #f5f5f5;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* Hide the actual input but keep it functional */
|
|
90
|
+
.sform-toggle-option input {
|
|
91
|
+
position: absolute;
|
|
92
|
+
opacity: 0;
|
|
93
|
+
width: 0;
|
|
94
|
+
height: 0;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* Style when checked */
|
|
98
|
+
.sform-toggle-option:has(input:checked) {
|
|
99
|
+
background-color: #2196f3;
|
|
100
|
+
color: white;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.sform-toggle-option:has(input:checked):hover {
|
|
104
|
+
background-color: #1976d2;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.sform-toggle-option.disabled {
|
|
108
|
+
opacity: 0.5;
|
|
109
|
+
cursor: not-allowed;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* Focus styles */
|
|
113
|
+
.sform-toggle-option:has(input:focus-visible) {
|
|
114
|
+
outline: 2px solid #2196f3;
|
|
115
|
+
outline-offset: -2px;
|
|
116
|
+
z-index: 1;
|
|
117
|
+
}
|
|
118
|
+
</style>
|