@salmexio/ui 1.2.1 → 1.3.0
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/dist/feedback/Alert/Alert.svelte +4 -1
- package/dist/feedback/Alert/Alert.svelte.d.ts +1 -0
- package/dist/feedback/Alert/Alert.svelte.d.ts.map +1 -1
- package/dist/feedback/Spinner/Spinner.svelte +4 -1
- package/dist/feedback/Spinner/Spinner.svelte.d.ts +1 -0
- package/dist/feedback/Spinner/Spinner.svelte.d.ts.map +1 -1
- package/dist/forms/DatePicker/DatePicker.svelte +725 -0
- package/dist/forms/DatePicker/DatePicker.svelte.d.ts +48 -0
- package/dist/forms/DatePicker/DatePicker.svelte.d.ts.map +1 -0
- package/dist/forms/DatePicker/index.d.ts +2 -0
- package/dist/forms/DatePicker/index.d.ts.map +1 -0
- package/dist/forms/DatePicker/index.js +1 -0
- package/dist/forms/FormField/FormField.svelte +173 -0
- package/dist/forms/FormField/FormField.svelte.d.ts +46 -0
- package/dist/forms/FormField/FormField.svelte.d.ts.map +1 -0
- package/dist/forms/FormField/index.d.ts +2 -0
- package/dist/forms/FormField/index.d.ts.map +1 -0
- package/dist/forms/FormField/index.js +1 -0
- package/dist/forms/MultiSelect/MultiSelect.svelte +820 -0
- package/dist/forms/MultiSelect/MultiSelect.svelte.d.ts +69 -0
- package/dist/forms/MultiSelect/MultiSelect.svelte.d.ts.map +1 -0
- package/dist/forms/MultiSelect/index.d.ts +3 -0
- package/dist/forms/MultiSelect/index.d.ts.map +1 -0
- package/dist/forms/MultiSelect/index.js +1 -0
- package/dist/forms/PhoneInput/PhoneInput.svelte +591 -0
- package/dist/forms/PhoneInput/PhoneInput.svelte.d.ts +57 -0
- package/dist/forms/PhoneInput/PhoneInput.svelte.d.ts.map +1 -0
- package/dist/forms/PhoneInput/index.d.ts +4 -0
- package/dist/forms/PhoneInput/index.d.ts.map +1 -0
- package/dist/forms/PhoneInput/index.js +2 -0
- package/dist/forms/RadioGroup/RadioGroup.svelte +417 -0
- package/dist/forms/RadioGroup/RadioGroup.svelte.d.ts +62 -0
- package/dist/forms/RadioGroup/RadioGroup.svelte.d.ts.map +1 -0
- package/dist/forms/RadioGroup/index.d.ts +3 -0
- package/dist/forms/RadioGroup/index.d.ts.map +1 -0
- package/dist/forms/RadioGroup/index.js +1 -0
- package/dist/forms/SearchInput/SearchInput.svelte +788 -0
- package/dist/forms/SearchInput/SearchInput.svelte.d.ts +79 -0
- package/dist/forms/SearchInput/SearchInput.svelte.d.ts.map +1 -0
- package/dist/forms/SearchInput/index.d.ts +3 -0
- package/dist/forms/SearchInput/index.d.ts.map +1 -0
- package/dist/forms/SearchInput/index.js +1 -0
- package/dist/forms/Select/Select.svelte +14 -8
- package/dist/forms/Select/Select.svelte.d.ts +2 -0
- package/dist/forms/Select/Select.svelte.d.ts.map +1 -1
- package/dist/forms/TextInput/TextInput.svelte +38 -16
- package/dist/forms/TextInput/TextInput.svelte.d.ts +6 -0
- package/dist/forms/TextInput/TextInput.svelte.d.ts.map +1 -1
- package/dist/forms/Textarea/Textarea.svelte +7 -1
- package/dist/forms/Textarea/Textarea.svelte.d.ts +2 -0
- package/dist/forms/Textarea/Textarea.svelte.d.ts.map +1 -1
- package/dist/forms/TimePicker/TimePicker.svelte +417 -0
- package/dist/forms/TimePicker/TimePicker.svelte.d.ts +53 -0
- package/dist/forms/TimePicker/TimePicker.svelte.d.ts.map +1 -0
- package/dist/forms/TimePicker/index.d.ts +2 -0
- package/dist/forms/TimePicker/index.d.ts.map +1 -0
- package/dist/forms/TimePicker/index.js +1 -0
- package/dist/forms/index.d.ts +12 -0
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +8 -0
- package/dist/layout/Container/Container.svelte +3 -0
- package/dist/layout/Container/Container.svelte.d.ts +1 -0
- package/dist/layout/Container/Container.svelte.d.ts.map +1 -1
- package/dist/primitives/Badge/Badge.svelte +5 -1
- package/dist/primitives/Badge/Badge.svelte.d.ts +1 -0
- package/dist/primitives/Badge/Badge.svelte.d.ts.map +1 -1
- package/dist/primitives/Tooltip/Tooltip.svelte +7 -1
- package/dist/primitives/Tooltip/Tooltip.svelte.d.ts.map +1 -1
- package/dist/utils/accessibility.d.ts +16 -0
- package/dist/utils/accessibility.d.ts.map +1 -0
- package/dist/utils/accessibility.js +80 -0
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/keyboard.d.ts +6 -0
- package/dist/utils/keyboard.d.ts.map +1 -1
- package/dist/utils/keyboard.js +15 -9
- package/package.json +21 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
type DatePickerSize = 'sm' | 'md' | 'lg';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Visible label. */
|
|
4
|
+
label: string;
|
|
5
|
+
/** Selected date in YYYY-MM-DD format. */
|
|
6
|
+
value?: string;
|
|
7
|
+
/** Placeholder text. */
|
|
8
|
+
placeholder?: string;
|
|
9
|
+
/** Minimum allowed date (YYYY-MM-DD). */
|
|
10
|
+
min?: string;
|
|
11
|
+
/** Maximum allowed date (YYYY-MM-DD). */
|
|
12
|
+
max?: string;
|
|
13
|
+
/** Size variant. */
|
|
14
|
+
size?: DatePickerSize;
|
|
15
|
+
/** Required field. */
|
|
16
|
+
required?: boolean;
|
|
17
|
+
/** Disabled state. */
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
/** Error message. */
|
|
20
|
+
error?: string;
|
|
21
|
+
/** Hint text. */
|
|
22
|
+
hint?: string;
|
|
23
|
+
/** Hide the visible label. */
|
|
24
|
+
hideLabel?: boolean;
|
|
25
|
+
/** Reserve footer space even when empty. */
|
|
26
|
+
alwaysShowFooter?: boolean;
|
|
27
|
+
/** Additional CSS class. */
|
|
28
|
+
class?: string;
|
|
29
|
+
/** Called when date changes. */
|
|
30
|
+
onchange?: (value: string) => void;
|
|
31
|
+
/** Test ID. */
|
|
32
|
+
testId?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* DatePicker
|
|
36
|
+
*
|
|
37
|
+
* INFRARED — Date input with calendar popup, month/year navigation,
|
|
38
|
+
* today button, keyboard navigation, and full ARIA compliance.
|
|
39
|
+
* Zero dependencies.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* <DatePicker label="Launch date" bind:value={date} />
|
|
43
|
+
* <DatePicker label="Start" min="2024-01-01" max="2025-12-31" />
|
|
44
|
+
*/
|
|
45
|
+
declare const DatePicker: import("svelte").Component<Props, {}, "value">;
|
|
46
|
+
type DatePicker = ReturnType<typeof DatePicker>;
|
|
47
|
+
export default DatePicker;
|
|
48
|
+
//# sourceMappingURL=DatePicker.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatePicker.svelte.d.ts","sourceRoot":"","sources":["../../../src/forms/DatePicker/DatePicker.svelte.ts"],"names":[],"mappings":"AAQA,KAAK,cAAc,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzC,UAAU,KAAK;IACd,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,eAAe;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAsYD;;;;;;;;;;GAUG;AACH,QAAA,MAAM,UAAU,gDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/forms/DatePicker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as DatePicker } from './DatePicker.svelte';
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component FormField
|
|
3
|
+
|
|
4
|
+
INFRARED — Generic form field wrapper providing consistent label, hint,
|
|
5
|
+
error, and required indicator treatment. Wrap any custom content that
|
|
6
|
+
needs the same visual treatment as TextInput/Select.
|
|
7
|
+
|
|
8
|
+
@example
|
|
9
|
+
<FormField label="Custom field" hint="Pick something" error={err}>
|
|
10
|
+
<MyCustomWidget />
|
|
11
|
+
</FormField>
|
|
12
|
+
-->
|
|
13
|
+
<script lang="ts">
|
|
14
|
+
import type { Snippet } from 'svelte';
|
|
15
|
+
import { cn } from '../../utils/cn.js';
|
|
16
|
+
import { generateId } from '../../utils/keyboard.js';
|
|
17
|
+
|
|
18
|
+
type FieldSize = 'sm' | 'md' | 'lg';
|
|
19
|
+
|
|
20
|
+
interface Props {
|
|
21
|
+
/** Visible label text (required for a11y). */
|
|
22
|
+
label: string;
|
|
23
|
+
/** Unique id; auto-generated if omitted. */
|
|
24
|
+
id?: string;
|
|
25
|
+
/** Hide the visible label (still accessible to screen readers). */
|
|
26
|
+
hideLabel?: boolean;
|
|
27
|
+
/** Mark as required. */
|
|
28
|
+
required?: boolean;
|
|
29
|
+
/** Error message. */
|
|
30
|
+
error?: string;
|
|
31
|
+
/** Hint text shown below the field. */
|
|
32
|
+
hint?: string;
|
|
33
|
+
/** Success message. */
|
|
34
|
+
successMessage?: string;
|
|
35
|
+
/** Size variant. */
|
|
36
|
+
size?: FieldSize;
|
|
37
|
+
/** Disabled state (visual only). */
|
|
38
|
+
disabled?: boolean;
|
|
39
|
+
/** Reserve footer space even when empty. */
|
|
40
|
+
alwaysShowFooter?: boolean;
|
|
41
|
+
/** Additional CSS class. */
|
|
42
|
+
class?: string;
|
|
43
|
+
/** Test ID. */
|
|
44
|
+
testId?: string;
|
|
45
|
+
/** Field content. */
|
|
46
|
+
children?: Snippet;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
let {
|
|
50
|
+
label,
|
|
51
|
+
id = generateId('field'),
|
|
52
|
+
hideLabel = false,
|
|
53
|
+
required = false,
|
|
54
|
+
error = '',
|
|
55
|
+
hint = '',
|
|
56
|
+
successMessage = '',
|
|
57
|
+
size = 'md',
|
|
58
|
+
disabled = false,
|
|
59
|
+
alwaysShowFooter = true,
|
|
60
|
+
class: className = '',
|
|
61
|
+
testId,
|
|
62
|
+
children
|
|
63
|
+
}: Props = $props();
|
|
64
|
+
|
|
65
|
+
const errorId = $derived(`${id}-error`);
|
|
66
|
+
const hintId = $derived(`${id}-hint`);
|
|
67
|
+
const hasFooterContent = $derived(!!error || !!hint || !!successMessage);
|
|
68
|
+
</script>
|
|
69
|
+
|
|
70
|
+
<div
|
|
71
|
+
class={cn(
|
|
72
|
+
'sx-formfield',
|
|
73
|
+
`sx-formfield-${size}`,
|
|
74
|
+
disabled && 'sx-formfield-disabled',
|
|
75
|
+
className
|
|
76
|
+
)}
|
|
77
|
+
data-testid={testId}
|
|
78
|
+
>
|
|
79
|
+
<label for={id} class={cn('sx-formfield-label', hideLabel && 'sx-sr-only')}>
|
|
80
|
+
{label}
|
|
81
|
+
{#if required}
|
|
82
|
+
<span class="sx-formfield-required" aria-hidden="true">*</span>
|
|
83
|
+
{/if}
|
|
84
|
+
</label>
|
|
85
|
+
|
|
86
|
+
{#if children}
|
|
87
|
+
{@render children()}
|
|
88
|
+
{/if}
|
|
89
|
+
|
|
90
|
+
{#if alwaysShowFooter || hasFooterContent}
|
|
91
|
+
<div class="sx-formfield-footer">
|
|
92
|
+
{#if error}
|
|
93
|
+
<p id={errorId} class="sx-formfield-message sx-formfield-error" role="alert" aria-live="assertive">
|
|
94
|
+
{error}
|
|
95
|
+
</p>
|
|
96
|
+
{:else if successMessage}
|
|
97
|
+
<p class="sx-formfield-message sx-formfield-success" role="status" aria-live="polite">
|
|
98
|
+
{successMessage}
|
|
99
|
+
</p>
|
|
100
|
+
{:else if hint}
|
|
101
|
+
<p id={hintId} class="sx-formfield-message sx-formfield-hint">
|
|
102
|
+
{hint}
|
|
103
|
+
</p>
|
|
104
|
+
{/if}
|
|
105
|
+
</div>
|
|
106
|
+
{/if}
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
<style>
|
|
110
|
+
.sx-formfield {
|
|
111
|
+
display: flex;
|
|
112
|
+
flex-direction: column;
|
|
113
|
+
gap: var(--sx-space-1);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.sx-formfield-disabled {
|
|
117
|
+
opacity: 0.5;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.sx-formfield-label {
|
|
121
|
+
font-family: var(--sx-font-body);
|
|
122
|
+
font-weight: 500;
|
|
123
|
+
font-size: var(--sx-text-sm);
|
|
124
|
+
color: var(--sx-color-text-secondary);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.sx-formfield-required {
|
|
128
|
+
color: var(--sx-color-red);
|
|
129
|
+
margin-left: 2px;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.sx-sr-only {
|
|
133
|
+
position: absolute;
|
|
134
|
+
width: 1px;
|
|
135
|
+
height: 1px;
|
|
136
|
+
padding: 0;
|
|
137
|
+
margin: -1px;
|
|
138
|
+
overflow: hidden;
|
|
139
|
+
clip: rect(0, 0, 0, 0);
|
|
140
|
+
white-space: nowrap;
|
|
141
|
+
border: 0;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.sx-formfield-footer {
|
|
145
|
+
min-height: 1.25rem;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.sx-formfield-message {
|
|
149
|
+
font-size: var(--sx-text-xs);
|
|
150
|
+
margin: 0;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.sx-formfield-error {
|
|
154
|
+
color: var(--sx-color-red);
|
|
155
|
+
font-weight: 500;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.sx-formfield-success {
|
|
159
|
+
color: var(--sx-color-green);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.sx-formfield-hint {
|
|
163
|
+
color: var(--sx-color-text-secondary);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.sx-formfield-sm .sx-formfield-label {
|
|
167
|
+
font-size: var(--sx-text-xs);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.sx-formfield-lg .sx-formfield-label {
|
|
171
|
+
font-size: var(--sx-text-base);
|
|
172
|
+
}
|
|
173
|
+
</style>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
type FieldSize = 'sm' | 'md' | 'lg';
|
|
3
|
+
interface Props {
|
|
4
|
+
/** Visible label text (required for a11y). */
|
|
5
|
+
label: string;
|
|
6
|
+
/** Unique id; auto-generated if omitted. */
|
|
7
|
+
id?: string;
|
|
8
|
+
/** Hide the visible label (still accessible to screen readers). */
|
|
9
|
+
hideLabel?: boolean;
|
|
10
|
+
/** Mark as required. */
|
|
11
|
+
required?: boolean;
|
|
12
|
+
/** Error message. */
|
|
13
|
+
error?: string;
|
|
14
|
+
/** Hint text shown below the field. */
|
|
15
|
+
hint?: string;
|
|
16
|
+
/** Success message. */
|
|
17
|
+
successMessage?: string;
|
|
18
|
+
/** Size variant. */
|
|
19
|
+
size?: FieldSize;
|
|
20
|
+
/** Disabled state (visual only). */
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
/** Reserve footer space even when empty. */
|
|
23
|
+
alwaysShowFooter?: boolean;
|
|
24
|
+
/** Additional CSS class. */
|
|
25
|
+
class?: string;
|
|
26
|
+
/** Test ID. */
|
|
27
|
+
testId?: string;
|
|
28
|
+
/** Field content. */
|
|
29
|
+
children?: Snippet;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* FormField
|
|
33
|
+
*
|
|
34
|
+
* INFRARED — Generic form field wrapper providing consistent label, hint,
|
|
35
|
+
* error, and required indicator treatment. Wrap any custom content that
|
|
36
|
+
* needs the same visual treatment as TextInput/Select.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* <FormField label="Custom field" hint="Pick something" error={err}>
|
|
40
|
+
* <MyCustomWidget />
|
|
41
|
+
* </FormField>
|
|
42
|
+
*/
|
|
43
|
+
declare const FormField: import("svelte").Component<Props, {}, "">;
|
|
44
|
+
type FormField = ReturnType<typeof FormField>;
|
|
45
|
+
export default FormField;
|
|
46
|
+
//# sourceMappingURL=FormField.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormField.svelte.d.ts","sourceRoot":"","sources":["../../../src/forms/FormField/FormField.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAKtC,KAAK,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpC,UAAU,KAAK;IACd,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAsED;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,SAAS,2CAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/forms/FormField/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as FormField } from './FormField.svelte';
|