@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.
Files changed (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +405 -0
  3. package/dist/Sform/Sfield.svelte +164 -0
  4. package/dist/Sform/Sfield.svelte.d.ts +4 -0
  5. package/dist/Sform/Sform.svelte +101 -0
  6. package/dist/Sform/Sform.svelte.d.ts +51 -0
  7. package/dist/Sform/context.svelte.d.ts +3 -0
  8. package/dist/Sform/context.svelte.js +65 -0
  9. package/dist/Sform/index.d.ts +5 -0
  10. package/dist/Sform/index.js +7 -0
  11. package/dist/Sform/inputs/ButtonInput.svelte +75 -0
  12. package/dist/Sform/inputs/ButtonInput.svelte.d.ts +32 -0
  13. package/dist/Sform/inputs/CheckboxGroupInput.svelte +81 -0
  14. package/dist/Sform/inputs/CheckboxGroupInput.svelte.d.ts +4 -0
  15. package/dist/Sform/inputs/CheckboxInput.svelte +47 -0
  16. package/dist/Sform/inputs/CheckboxInput.svelte.d.ts +4 -0
  17. package/dist/Sform/inputs/MaskedInput.svelte +220 -0
  18. package/dist/Sform/inputs/MaskedInput.svelte.d.ts +4 -0
  19. package/dist/Sform/inputs/NumberInput.svelte +116 -0
  20. package/dist/Sform/inputs/NumberInput.svelte.d.ts +4 -0
  21. package/dist/Sform/inputs/PasswordInput.svelte +142 -0
  22. package/dist/Sform/inputs/PasswordInput.svelte.d.ts +4 -0
  23. package/dist/Sform/inputs/RadioInput.svelte +81 -0
  24. package/dist/Sform/inputs/RadioInput.svelte.d.ts +4 -0
  25. package/dist/Sform/inputs/RangeInput.svelte +67 -0
  26. package/dist/Sform/inputs/RangeInput.svelte.d.ts +4 -0
  27. package/dist/Sform/inputs/SelectInput.svelte +36 -0
  28. package/dist/Sform/inputs/SelectInput.svelte.d.ts +4 -0
  29. package/dist/Sform/inputs/TextInput.svelte +61 -0
  30. package/dist/Sform/inputs/TextInput.svelte.d.ts +4 -0
  31. package/dist/Sform/inputs/TextareaInput.svelte +56 -0
  32. package/dist/Sform/inputs/TextareaInput.svelte.d.ts +4 -0
  33. package/dist/Sform/inputs/ToggleInput.svelte +101 -0
  34. package/dist/Sform/inputs/ToggleInput.svelte.d.ts +4 -0
  35. package/dist/Sform/inputs/ToggleOptionsInput.svelte +118 -0
  36. package/dist/Sform/inputs/ToggleOptionsInput.svelte.d.ts +4 -0
  37. package/dist/Sform/sform.css +628 -0
  38. package/dist/Sform/types.d.ts +610 -0
  39. package/dist/Sform/types.js +5 -0
  40. package/dist/Sform/utils/mask.d.ts +68 -0
  41. package/dist/Sform/utils/mask.js +155 -0
  42. package/dist/index.d.ts +2 -0
  43. package/dist/index.js +1 -0
  44. package/package.json +78 -0
@@ -0,0 +1,4 @@
1
+ import type { ToggleInputProps } from '../types.js';
2
+ declare const ToggleInput: import("svelte").Component<ToggleInputProps, {}, "">;
3
+ type ToggleInput = ReturnType<typeof ToggleInput>;
4
+ export default ToggleInput;
@@ -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>
@@ -0,0 +1,4 @@
1
+ import type { ToggleOptionsInputProps } from '../types.js';
2
+ declare const ToggleOptionsInput: import("svelte").Component<ToggleOptionsInputProps, {}, "">;
3
+ type ToggleOptionsInput = ReturnType<typeof ToggleOptionsInput>;
4
+ export default ToggleOptionsInput;