spoko-design-system 1.18.1 → 1.20.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/.claude/settings.json +48 -48
- package/.github/dependabot.yml +11 -11
- package/.github/todo.yml +3 -3
- package/.github/workflows/claude.yml +37 -37
- package/.github/workflows/code-quality.yml +72 -72
- package/.github/workflows/deploy.yml +43 -43
- package/.husky/README.md +41 -41
- package/.husky/commit-msg +1 -1
- package/.husky/pre-commit +40 -40
- package/.prettierignore +14 -14
- package/.prettierrc +30 -30
- package/.stackblitzrc +5 -5
- package/.vscode/extensions.json +4 -4
- package/.vscode/launch.json +11 -11
- package/.vscode/settings.json +21 -21
- package/CHANGELOG.md +462 -450
- package/CLAUDE.md +268 -268
- package/LICENSE +21 -21
- package/README.md +303 -132
- package/TOOLTIPS.md +236 -236
- package/astro.config.mjs +84 -84
- package/commitlint.config.js +3 -3
- package/dev-dist/sw.js +91 -91
- package/dev-dist/workbox-c676b6d3.js +3391 -3391
- package/eslint.config.js +70 -70
- package/icon.config.ts +348 -348
- package/index.ts +78 -78
- package/package.json +160 -160
- package/public/arrow-bottom.svg +7 -7
- package/public/fonts/lg.svg +53 -53
- package/public/fonts/vwhead-bold-demo.html +549 -549
- package/public/fonts/vwhead-regular-demo.html +549 -549
- package/public/fonts/vwtext-bold-demo.html +549 -549
- package/public/fonts/vwtext-regular-demo.html +549 -549
- package/public/github.svg +3 -3
- package/public/grid_dot.svg +4 -4
- package/public/linkedin.svg +44 -44
- package/public/make-scrollable-code-focusable.js +3 -3
- package/public/pagefind.yml +3 -3
- package/public/polo.blue.svg +29 -29
- package/public/spoko.space.svg +71 -71
- package/public/twitter.svg +46 -46
- package/renovate.json +6 -6
- package/sandbox.config.json +11 -11
- package/sonar-project.properties +26 -26
- package/src/components/Category/CategoryDetails.astro +46 -18
- package/src/components/Jumbotron/variants/Hero.astro +9 -1
- package/src/components/Jumbotron/variants/PostSplit.astro +8 -0
- package/src/pages/components/badges.mdx +57 -57
- package/src/pages/components/breadcrumbs.mdx +139 -139
- package/src/pages/components/buttons.mdx +359 -359
- package/src/pages/components/card.mdx +294 -294
- package/src/pages/components/carousel.mdx +62 -62
- package/src/pages/components/copyright.mdx +42 -42
- package/src/pages/components/details-list.mdx +207 -207
- package/src/pages/components/features-list.mdx +37 -37
- package/src/pages/components/flags.mdx +49 -49
- package/src/pages/components/fuck-russia.mdx +39 -39
- package/src/pages/components/hand-drive.mdx +78 -78
- package/src/pages/components/headline.mdx +337 -337
- package/src/pages/components/image.mdx +513 -513
- package/src/pages/components/input.mdx +367 -367
- package/src/pages/components/jumbotron.mdx +530 -530
- package/src/pages/components/modal.mdx +212 -212
- package/src/pages/components/post-header.mdx +64 -64
- package/src/pages/components/pr-code.mdx +213 -213
- package/src/pages/components/product-engine.mdx +418 -418
- package/src/pages/components/product-number.mdx +58 -58
- package/src/pages/components/product-tile.mdx +51 -51
- package/src/pages/components/quote.mdx +33 -33
- package/src/pages/components/slimbanner.mdx +260 -260
- package/src/pages/components/table.mdx +108 -108
- package/src/pages/core/colors.mdx +21 -21
- package/src/pages/core/grid.mdx +193 -193
- package/src/pages/core/introduction.mdx +77 -77
- package/src/pages/core/tooltips.mdx +491 -491
- package/src/pages/patterns/introduction.mdx +60 -60
- package/src/styles/_variables.scss +70 -70
- package/tailwind.config.cjs +8 -8
- package/tsconfig.json +28 -28
- package/uno-config/index.ts +269 -269
- package/uno-config/theme/breakpoints.ts +9 -9
- package/uno-config/theme/colors.ts +65 -65
- package/uno-config/theme/dimensions.ts +17 -17
- package/uno-config/theme/effects.ts +14 -14
- package/uno-config/theme/grid.ts +10 -10
- package/uno-config/theme/index.ts +26 -26
- package/uno-config/theme/shortcuts/buttons.ts +53 -53
- package/uno-config/theme/shortcuts/components.ts +124 -124
- package/uno-config/theme/shortcuts/index.ts +20 -20
- package/uno-config/theme/shortcuts/jumbotron.ts +71 -71
- package/uno-config/theme/shortcuts/layout.ts +75 -75
- package/uno-config/theme/typography.ts +29 -29
- package/uno.config.ts +2 -2
|
@@ -1,368 +1,368 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Input
|
|
3
|
-
layout: ../../layouts/MainLayout.astro
|
|
4
|
-
---
|
|
5
|
-
import Input from '../../components/Input.vue';
|
|
6
|
-
|
|
7
|
-
# Floating Label Input
|
|
8
|
-
<div class="component-preview">
|
|
9
|
-
<div class="bg-white grid items-end w-full gap-6 md:grid-cols-3 px-4 py-6">
|
|
10
|
-
<Input
|
|
11
|
-
id="name-filled"
|
|
12
|
-
label="Floating filled"
|
|
13
|
-
variant="filled"
|
|
14
|
-
/>
|
|
15
|
-
<Input
|
|
16
|
-
id="email-standard"
|
|
17
|
-
label="Floating standard"
|
|
18
|
-
variant="standard"
|
|
19
|
-
/>
|
|
20
|
-
</div>
|
|
21
|
-
</div>
|
|
22
|
-
|
|
23
|
-
```js
|
|
24
|
-
// Filled variant
|
|
25
|
-
<Input
|
|
26
|
-
id="name-filled"
|
|
27
|
-
label="Floating filled"
|
|
28
|
-
variant="filled"
|
|
29
|
-
/>
|
|
30
|
-
|
|
31
|
-
// Standard variant
|
|
32
|
-
<Input
|
|
33
|
-
id="email-standard"
|
|
34
|
-
label="Floating standard"
|
|
35
|
-
variant="standard"
|
|
36
|
-
/>
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
# Floating Textarea
|
|
41
|
-
<div class="component-preview">
|
|
42
|
-
<div class="bg-white grid items-end w-full gap-6 md:grid-cols-3 px-4 py-6">
|
|
43
|
-
<Input
|
|
44
|
-
id="name-filled"
|
|
45
|
-
label="Floating filled"
|
|
46
|
-
variant="filled"
|
|
47
|
-
|
|
48
|
-
type="textarea"
|
|
49
|
-
/>
|
|
50
|
-
<Input
|
|
51
|
-
id="email-standard"
|
|
52
|
-
label="Floating standard"
|
|
53
|
-
variant="standard"
|
|
54
|
-
type="textarea"
|
|
55
|
-
/>
|
|
56
|
-
</div>
|
|
57
|
-
</div>
|
|
58
|
-
|
|
59
|
-
```js
|
|
60
|
-
// Filled variant
|
|
61
|
-
<Input
|
|
62
|
-
id="name-filled"
|
|
63
|
-
label="Floating filled"
|
|
64
|
-
variant="filled"
|
|
65
|
-
type="textarea"
|
|
66
|
-
/>
|
|
67
|
-
|
|
68
|
-
// Standard variant
|
|
69
|
-
<Input
|
|
70
|
-
id="email-standard"
|
|
71
|
-
label="Floating standard"
|
|
72
|
-
variant="standard"
|
|
73
|
-
type="textarea"
|
|
74
|
-
/>
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
# Input with Error State
|
|
78
|
-
The Input component supports error states to provide validation feedback to users. You can pass a string as the error prop to display a specific error message.
|
|
79
|
-
|
|
80
|
-
<div class="component-preview">
|
|
81
|
-
<div class="bg-white grid items-end w-full gap-6 md:grid-cols-2 px-4 py-6">
|
|
82
|
-
<Input
|
|
83
|
-
id="error-filled"
|
|
84
|
-
label="With error"
|
|
85
|
-
variant="filled"
|
|
86
|
-
error="This field is required"
|
|
87
|
-
/>
|
|
88
|
-
<Input
|
|
89
|
-
id="error-standard"
|
|
90
|
-
label="With error"
|
|
91
|
-
variant="standard"
|
|
92
|
-
error="Please enter a valid email"
|
|
93
|
-
/>
|
|
94
|
-
</div>
|
|
95
|
-
</div>
|
|
96
|
-
|
|
97
|
-
```js
|
|
98
|
-
// Error with filled variant
|
|
99
|
-
<Input
|
|
100
|
-
id="error-filled"
|
|
101
|
-
label="With error"
|
|
102
|
-
variant="filled"
|
|
103
|
-
error="This field is required"
|
|
104
|
-
/>
|
|
105
|
-
|
|
106
|
-
// Error with standard variant
|
|
107
|
-
<Input
|
|
108
|
-
id="error-standard"
|
|
109
|
-
label="With error"
|
|
110
|
-
variant="standard"
|
|
111
|
-
error="Please enter a valid email"
|
|
112
|
-
/>
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
You can also pass a boolean `true` to indicate an error state without a message:
|
|
116
|
-
|
|
117
|
-
```js
|
|
118
|
-
<Input
|
|
119
|
-
label="Username"
|
|
120
|
-
error={true}
|
|
121
|
-
/>
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
# Input with Success State
|
|
125
|
-
Similar to errors, you can indicate a successful validation state using the success prop:
|
|
126
|
-
|
|
127
|
-
<div class="component-preview">
|
|
128
|
-
<div class="bg-white grid items-end w-full gap-6 md:grid-cols-2 px-4 py-6">
|
|
129
|
-
<Input
|
|
130
|
-
id="success-filled"
|
|
131
|
-
label="With success"
|
|
132
|
-
variant="filled"
|
|
133
|
-
success="Username is available"
|
|
134
|
-
/>
|
|
135
|
-
<Input
|
|
136
|
-
id="success-standard"
|
|
137
|
-
label="With success"
|
|
138
|
-
variant="standard"
|
|
139
|
-
success={true}
|
|
140
|
-
/>
|
|
141
|
-
</div>
|
|
142
|
-
</div>
|
|
143
|
-
|
|
144
|
-
```js
|
|
145
|
-
// Success with message
|
|
146
|
-
<Input
|
|
147
|
-
id="success-filled"
|
|
148
|
-
label="With success"
|
|
149
|
-
variant="filled"
|
|
150
|
-
success="Username is available"
|
|
151
|
-
/>
|
|
152
|
-
|
|
153
|
-
// Success without message
|
|
154
|
-
<Input
|
|
155
|
-
id="success-standard"
|
|
156
|
-
label="With success"
|
|
157
|
-
variant="standard"
|
|
158
|
-
success={true}
|
|
159
|
-
/>
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
# Input Sizes
|
|
163
|
-
The Input component supports different sizes: `sm`, `md` (default), and `lg`.
|
|
164
|
-
|
|
165
|
-
<div class="component-preview">
|
|
166
|
-
<div class="bg-white grid items-end w-full gap-6 px-4 py-6">
|
|
167
|
-
<Input
|
|
168
|
-
id="small-input"
|
|
169
|
-
label="Small input"
|
|
170
|
-
variant="filled"
|
|
171
|
-
size="sm"
|
|
172
|
-
/>
|
|
173
|
-
<Input
|
|
174
|
-
id="medium-input"
|
|
175
|
-
label="Medium input (default)"
|
|
176
|
-
variant="filled"
|
|
177
|
-
size="md"
|
|
178
|
-
/>
|
|
179
|
-
<Input
|
|
180
|
-
id="large-input"
|
|
181
|
-
label="Large input"
|
|
182
|
-
variant="filled"
|
|
183
|
-
size="lg"
|
|
184
|
-
/>
|
|
185
|
-
</div>
|
|
186
|
-
</div>
|
|
187
|
-
|
|
188
|
-
```js
|
|
189
|
-
// Small input
|
|
190
|
-
<Input
|
|
191
|
-
id="small-input"
|
|
192
|
-
label="Small input"
|
|
193
|
-
variant="filled"
|
|
194
|
-
size="sm"
|
|
195
|
-
/>
|
|
196
|
-
|
|
197
|
-
// Medium input (default)
|
|
198
|
-
<Input
|
|
199
|
-
id="medium-input"
|
|
200
|
-
label="Medium input (default)"
|
|
201
|
-
variant="filled"
|
|
202
|
-
size="md"
|
|
203
|
-
/>
|
|
204
|
-
|
|
205
|
-
// Large input
|
|
206
|
-
<Input
|
|
207
|
-
id="large-input"
|
|
208
|
-
label="Large input"
|
|
209
|
-
variant="filled"
|
|
210
|
-
size="lg"
|
|
211
|
-
/>
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
# Required Input
|
|
215
|
-
You can mark an input as required, which will add a red asterisk to the label:
|
|
216
|
-
|
|
217
|
-
<div class="component-preview">
|
|
218
|
-
<div class="bg-white grid items-end w-full gap-6 md:grid-cols-2 px-4 py-6">
|
|
219
|
-
<Input
|
|
220
|
-
id="required-filled"
|
|
221
|
-
label="Required field"
|
|
222
|
-
variant="filled"
|
|
223
|
-
required
|
|
224
|
-
/>
|
|
225
|
-
<Input
|
|
226
|
-
id="required-standard"
|
|
227
|
-
label="Required field"
|
|
228
|
-
variant="standard"
|
|
229
|
-
required
|
|
230
|
-
/>
|
|
231
|
-
</div>
|
|
232
|
-
</div>
|
|
233
|
-
|
|
234
|
-
```js
|
|
235
|
-
<Input
|
|
236
|
-
id="required-filled"
|
|
237
|
-
label="Required field"
|
|
238
|
-
variant="filled"
|
|
239
|
-
required
|
|
240
|
-
/>
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
# Input Types
|
|
244
|
-
The Input component supports all standard HTML input types, plus a special `textarea` type:
|
|
245
|
-
|
|
246
|
-
<div class="component-preview">
|
|
247
|
-
<div class="bg-white grid items-end w-full gap-6 md:grid-cols-2 px-4 py-6">
|
|
248
|
-
<Input
|
|
249
|
-
id="email-input"
|
|
250
|
-
label="Email"
|
|
251
|
-
type="email"
|
|
252
|
-
variant="filled"
|
|
253
|
-
/>
|
|
254
|
-
<Input
|
|
255
|
-
id="password-input"
|
|
256
|
-
label="Password"
|
|
257
|
-
type="password"
|
|
258
|
-
variant="standard"
|
|
259
|
-
/>
|
|
260
|
-
<Input
|
|
261
|
-
id="number-input"
|
|
262
|
-
label="Age"
|
|
263
|
-
type="number"
|
|
264
|
-
variant="filled"
|
|
265
|
-
/>
|
|
266
|
-
<Input
|
|
267
|
-
id="date-input"
|
|
268
|
-
label="Date"
|
|
269
|
-
type="date"
|
|
270
|
-
variant="standard"
|
|
271
|
-
/>
|
|
272
|
-
</div>
|
|
273
|
-
</div>
|
|
274
|
-
|
|
275
|
-
```js
|
|
276
|
-
// Email input
|
|
277
|
-
<Input
|
|
278
|
-
id="email-input"
|
|
279
|
-
label="Email"
|
|
280
|
-
type="email"
|
|
281
|
-
variant="filled"
|
|
282
|
-
/>
|
|
283
|
-
|
|
284
|
-
// Password input
|
|
285
|
-
<Input
|
|
286
|
-
id="password-input"
|
|
287
|
-
label="Password"
|
|
288
|
-
type="password"
|
|
289
|
-
variant="standard"
|
|
290
|
-
/>
|
|
291
|
-
|
|
292
|
-
// Number input
|
|
293
|
-
<Input
|
|
294
|
-
id="number-input"
|
|
295
|
-
label="Age"
|
|
296
|
-
type="number"
|
|
297
|
-
variant="filled"
|
|
298
|
-
/>
|
|
299
|
-
|
|
300
|
-
// Date input
|
|
301
|
-
<Input
|
|
302
|
-
id="date-input"
|
|
303
|
-
label="Date"
|
|
304
|
-
type="date"
|
|
305
|
-
variant="standard"
|
|
306
|
-
/>
|
|
307
|
-
```
|
|
308
|
-
|
|
309
|
-
# Using with v-model
|
|
310
|
-
The Input component fully supports Vue's v-model for two-way binding:
|
|
311
|
-
|
|
312
|
-
```js
|
|
313
|
-
<script setup>
|
|
314
|
-
import { ref } from 'vue';
|
|
315
|
-
import { Input } from 'spoko-design-system';
|
|
316
|
-
|
|
317
|
-
const username = ref('');
|
|
318
|
-
const email = ref('');
|
|
319
|
-
</script>
|
|
320
|
-
|
|
321
|
-
<template>
|
|
322
|
-
<Input
|
|
323
|
-
v-model="username"
|
|
324
|
-
label="Username"
|
|
325
|
-
variant="filled"
|
|
326
|
-
/>
|
|
327
|
-
|
|
328
|
-
<Input
|
|
329
|
-
v-model="email"
|
|
330
|
-
label="Email"
|
|
331
|
-
variant="standard"
|
|
332
|
-
type="email"
|
|
333
|
-
/>
|
|
334
|
-
|
|
335
|
-
<div>
|
|
336
|
-
Current values:
|
|
337
|
-
<p>Username: {{ username }}</p>
|
|
338
|
-
<p>Email: {{ email }}</p>
|
|
339
|
-
</div>
|
|
340
|
-
</template>
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
# Props Reference
|
|
344
|
-
|
|
345
|
-
| Prop | Type | Default | Description |
|
|
346
|
-
|------|------|---------|-------------|
|
|
347
|
-
| `id` | `string` | Random ID | Unique identifier for the input |
|
|
348
|
-
| `name` | `string` | Same as id | Name attribute for the input field |
|
|
349
|
-
| `label` | `string` | Required | Label text for the input |
|
|
350
|
-
| `variant` | `'standard' \| 'filled'` | `'standard'` | Visual style variant |
|
|
351
|
-
| `type` | `string` | `'text'` | Input type (all HTML types + 'textarea') |
|
|
352
|
-
| `modelValue` | `string \| number` | `''` | Value for v-model binding |
|
|
353
|
-
| `required` | `boolean` | `false` | Whether the field is required |
|
|
354
|
-
| `rows` | `number` | `3` | Number of rows (for textarea only) |
|
|
355
|
-
| `placeholder` | `string` | `' '` | Placeholder text (space for floating label) |
|
|
356
|
-
| `error` | `string \| boolean` | `false` | Error state or message |
|
|
357
|
-
| `success` | `string \| boolean` | `false` | Success state or message |
|
|
358
|
-
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Size of the input |
|
|
359
|
-
| `class` | `string` | `''` | Additional CSS classes |
|
|
360
|
-
|
|
361
|
-
# Events
|
|
362
|
-
|
|
363
|
-
| Event | Parameters | Description |
|
|
364
|
-
|-------|------------|-------------|
|
|
365
|
-
| `update:modelValue` | `(value: string \| number)` | Emitted when input value changes (for v-model) |
|
|
366
|
-
| `input` | `(event: Event)` | Native input event |
|
|
367
|
-
| `focus` | `(event: FocusEvent)` | Native focus event |
|
|
1
|
+
---
|
|
2
|
+
title: Input
|
|
3
|
+
layout: ../../layouts/MainLayout.astro
|
|
4
|
+
---
|
|
5
|
+
import Input from '../../components/Input.vue';
|
|
6
|
+
|
|
7
|
+
# Floating Label Input
|
|
8
|
+
<div class="component-preview">
|
|
9
|
+
<div class="bg-white grid items-end w-full gap-6 md:grid-cols-3 px-4 py-6">
|
|
10
|
+
<Input
|
|
11
|
+
id="name-filled"
|
|
12
|
+
label="Floating filled"
|
|
13
|
+
variant="filled"
|
|
14
|
+
/>
|
|
15
|
+
<Input
|
|
16
|
+
id="email-standard"
|
|
17
|
+
label="Floating standard"
|
|
18
|
+
variant="standard"
|
|
19
|
+
/>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
```js
|
|
24
|
+
// Filled variant
|
|
25
|
+
<Input
|
|
26
|
+
id="name-filled"
|
|
27
|
+
label="Floating filled"
|
|
28
|
+
variant="filled"
|
|
29
|
+
/>
|
|
30
|
+
|
|
31
|
+
// Standard variant
|
|
32
|
+
<Input
|
|
33
|
+
id="email-standard"
|
|
34
|
+
label="Floating standard"
|
|
35
|
+
variant="standard"
|
|
36
|
+
/>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# Floating Textarea
|
|
41
|
+
<div class="component-preview">
|
|
42
|
+
<div class="bg-white grid items-end w-full gap-6 md:grid-cols-3 px-4 py-6">
|
|
43
|
+
<Input
|
|
44
|
+
id="name-filled"
|
|
45
|
+
label="Floating filled"
|
|
46
|
+
variant="filled"
|
|
47
|
+
|
|
48
|
+
type="textarea"
|
|
49
|
+
/>
|
|
50
|
+
<Input
|
|
51
|
+
id="email-standard"
|
|
52
|
+
label="Floating standard"
|
|
53
|
+
variant="standard"
|
|
54
|
+
type="textarea"
|
|
55
|
+
/>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
```js
|
|
60
|
+
// Filled variant
|
|
61
|
+
<Input
|
|
62
|
+
id="name-filled"
|
|
63
|
+
label="Floating filled"
|
|
64
|
+
variant="filled"
|
|
65
|
+
type="textarea"
|
|
66
|
+
/>
|
|
67
|
+
|
|
68
|
+
// Standard variant
|
|
69
|
+
<Input
|
|
70
|
+
id="email-standard"
|
|
71
|
+
label="Floating standard"
|
|
72
|
+
variant="standard"
|
|
73
|
+
type="textarea"
|
|
74
|
+
/>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
# Input with Error State
|
|
78
|
+
The Input component supports error states to provide validation feedback to users. You can pass a string as the error prop to display a specific error message.
|
|
79
|
+
|
|
80
|
+
<div class="component-preview">
|
|
81
|
+
<div class="bg-white grid items-end w-full gap-6 md:grid-cols-2 px-4 py-6">
|
|
82
|
+
<Input
|
|
83
|
+
id="error-filled"
|
|
84
|
+
label="With error"
|
|
85
|
+
variant="filled"
|
|
86
|
+
error="This field is required"
|
|
87
|
+
/>
|
|
88
|
+
<Input
|
|
89
|
+
id="error-standard"
|
|
90
|
+
label="With error"
|
|
91
|
+
variant="standard"
|
|
92
|
+
error="Please enter a valid email"
|
|
93
|
+
/>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
|
|
97
|
+
```js
|
|
98
|
+
// Error with filled variant
|
|
99
|
+
<Input
|
|
100
|
+
id="error-filled"
|
|
101
|
+
label="With error"
|
|
102
|
+
variant="filled"
|
|
103
|
+
error="This field is required"
|
|
104
|
+
/>
|
|
105
|
+
|
|
106
|
+
// Error with standard variant
|
|
107
|
+
<Input
|
|
108
|
+
id="error-standard"
|
|
109
|
+
label="With error"
|
|
110
|
+
variant="standard"
|
|
111
|
+
error="Please enter a valid email"
|
|
112
|
+
/>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
You can also pass a boolean `true` to indicate an error state without a message:
|
|
116
|
+
|
|
117
|
+
```js
|
|
118
|
+
<Input
|
|
119
|
+
label="Username"
|
|
120
|
+
error={true}
|
|
121
|
+
/>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
# Input with Success State
|
|
125
|
+
Similar to errors, you can indicate a successful validation state using the success prop:
|
|
126
|
+
|
|
127
|
+
<div class="component-preview">
|
|
128
|
+
<div class="bg-white grid items-end w-full gap-6 md:grid-cols-2 px-4 py-6">
|
|
129
|
+
<Input
|
|
130
|
+
id="success-filled"
|
|
131
|
+
label="With success"
|
|
132
|
+
variant="filled"
|
|
133
|
+
success="Username is available"
|
|
134
|
+
/>
|
|
135
|
+
<Input
|
|
136
|
+
id="success-standard"
|
|
137
|
+
label="With success"
|
|
138
|
+
variant="standard"
|
|
139
|
+
success={true}
|
|
140
|
+
/>
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
|
|
144
|
+
```js
|
|
145
|
+
// Success with message
|
|
146
|
+
<Input
|
|
147
|
+
id="success-filled"
|
|
148
|
+
label="With success"
|
|
149
|
+
variant="filled"
|
|
150
|
+
success="Username is available"
|
|
151
|
+
/>
|
|
152
|
+
|
|
153
|
+
// Success without message
|
|
154
|
+
<Input
|
|
155
|
+
id="success-standard"
|
|
156
|
+
label="With success"
|
|
157
|
+
variant="standard"
|
|
158
|
+
success={true}
|
|
159
|
+
/>
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
# Input Sizes
|
|
163
|
+
The Input component supports different sizes: `sm`, `md` (default), and `lg`.
|
|
164
|
+
|
|
165
|
+
<div class="component-preview">
|
|
166
|
+
<div class="bg-white grid items-end w-full gap-6 px-4 py-6">
|
|
167
|
+
<Input
|
|
168
|
+
id="small-input"
|
|
169
|
+
label="Small input"
|
|
170
|
+
variant="filled"
|
|
171
|
+
size="sm"
|
|
172
|
+
/>
|
|
173
|
+
<Input
|
|
174
|
+
id="medium-input"
|
|
175
|
+
label="Medium input (default)"
|
|
176
|
+
variant="filled"
|
|
177
|
+
size="md"
|
|
178
|
+
/>
|
|
179
|
+
<Input
|
|
180
|
+
id="large-input"
|
|
181
|
+
label="Large input"
|
|
182
|
+
variant="filled"
|
|
183
|
+
size="lg"
|
|
184
|
+
/>
|
|
185
|
+
</div>
|
|
186
|
+
</div>
|
|
187
|
+
|
|
188
|
+
```js
|
|
189
|
+
// Small input
|
|
190
|
+
<Input
|
|
191
|
+
id="small-input"
|
|
192
|
+
label="Small input"
|
|
193
|
+
variant="filled"
|
|
194
|
+
size="sm"
|
|
195
|
+
/>
|
|
196
|
+
|
|
197
|
+
// Medium input (default)
|
|
198
|
+
<Input
|
|
199
|
+
id="medium-input"
|
|
200
|
+
label="Medium input (default)"
|
|
201
|
+
variant="filled"
|
|
202
|
+
size="md"
|
|
203
|
+
/>
|
|
204
|
+
|
|
205
|
+
// Large input
|
|
206
|
+
<Input
|
|
207
|
+
id="large-input"
|
|
208
|
+
label="Large input"
|
|
209
|
+
variant="filled"
|
|
210
|
+
size="lg"
|
|
211
|
+
/>
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
# Required Input
|
|
215
|
+
You can mark an input as required, which will add a red asterisk to the label:
|
|
216
|
+
|
|
217
|
+
<div class="component-preview">
|
|
218
|
+
<div class="bg-white grid items-end w-full gap-6 md:grid-cols-2 px-4 py-6">
|
|
219
|
+
<Input
|
|
220
|
+
id="required-filled"
|
|
221
|
+
label="Required field"
|
|
222
|
+
variant="filled"
|
|
223
|
+
required
|
|
224
|
+
/>
|
|
225
|
+
<Input
|
|
226
|
+
id="required-standard"
|
|
227
|
+
label="Required field"
|
|
228
|
+
variant="standard"
|
|
229
|
+
required
|
|
230
|
+
/>
|
|
231
|
+
</div>
|
|
232
|
+
</div>
|
|
233
|
+
|
|
234
|
+
```js
|
|
235
|
+
<Input
|
|
236
|
+
id="required-filled"
|
|
237
|
+
label="Required field"
|
|
238
|
+
variant="filled"
|
|
239
|
+
required
|
|
240
|
+
/>
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
# Input Types
|
|
244
|
+
The Input component supports all standard HTML input types, plus a special `textarea` type:
|
|
245
|
+
|
|
246
|
+
<div class="component-preview">
|
|
247
|
+
<div class="bg-white grid items-end w-full gap-6 md:grid-cols-2 px-4 py-6">
|
|
248
|
+
<Input
|
|
249
|
+
id="email-input"
|
|
250
|
+
label="Email"
|
|
251
|
+
type="email"
|
|
252
|
+
variant="filled"
|
|
253
|
+
/>
|
|
254
|
+
<Input
|
|
255
|
+
id="password-input"
|
|
256
|
+
label="Password"
|
|
257
|
+
type="password"
|
|
258
|
+
variant="standard"
|
|
259
|
+
/>
|
|
260
|
+
<Input
|
|
261
|
+
id="number-input"
|
|
262
|
+
label="Age"
|
|
263
|
+
type="number"
|
|
264
|
+
variant="filled"
|
|
265
|
+
/>
|
|
266
|
+
<Input
|
|
267
|
+
id="date-input"
|
|
268
|
+
label="Date"
|
|
269
|
+
type="date"
|
|
270
|
+
variant="standard"
|
|
271
|
+
/>
|
|
272
|
+
</div>
|
|
273
|
+
</div>
|
|
274
|
+
|
|
275
|
+
```js
|
|
276
|
+
// Email input
|
|
277
|
+
<Input
|
|
278
|
+
id="email-input"
|
|
279
|
+
label="Email"
|
|
280
|
+
type="email"
|
|
281
|
+
variant="filled"
|
|
282
|
+
/>
|
|
283
|
+
|
|
284
|
+
// Password input
|
|
285
|
+
<Input
|
|
286
|
+
id="password-input"
|
|
287
|
+
label="Password"
|
|
288
|
+
type="password"
|
|
289
|
+
variant="standard"
|
|
290
|
+
/>
|
|
291
|
+
|
|
292
|
+
// Number input
|
|
293
|
+
<Input
|
|
294
|
+
id="number-input"
|
|
295
|
+
label="Age"
|
|
296
|
+
type="number"
|
|
297
|
+
variant="filled"
|
|
298
|
+
/>
|
|
299
|
+
|
|
300
|
+
// Date input
|
|
301
|
+
<Input
|
|
302
|
+
id="date-input"
|
|
303
|
+
label="Date"
|
|
304
|
+
type="date"
|
|
305
|
+
variant="standard"
|
|
306
|
+
/>
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
# Using with v-model
|
|
310
|
+
The Input component fully supports Vue's v-model for two-way binding:
|
|
311
|
+
|
|
312
|
+
```js
|
|
313
|
+
<script setup>
|
|
314
|
+
import { ref } from 'vue';
|
|
315
|
+
import { Input } from 'spoko-design-system';
|
|
316
|
+
|
|
317
|
+
const username = ref('');
|
|
318
|
+
const email = ref('');
|
|
319
|
+
</script>
|
|
320
|
+
|
|
321
|
+
<template>
|
|
322
|
+
<Input
|
|
323
|
+
v-model="username"
|
|
324
|
+
label="Username"
|
|
325
|
+
variant="filled"
|
|
326
|
+
/>
|
|
327
|
+
|
|
328
|
+
<Input
|
|
329
|
+
v-model="email"
|
|
330
|
+
label="Email"
|
|
331
|
+
variant="standard"
|
|
332
|
+
type="email"
|
|
333
|
+
/>
|
|
334
|
+
|
|
335
|
+
<div>
|
|
336
|
+
Current values:
|
|
337
|
+
<p>Username: {{ username }}</p>
|
|
338
|
+
<p>Email: {{ email }}</p>
|
|
339
|
+
</div>
|
|
340
|
+
</template>
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
# Props Reference
|
|
344
|
+
|
|
345
|
+
| Prop | Type | Default | Description |
|
|
346
|
+
|------|------|---------|-------------|
|
|
347
|
+
| `id` | `string` | Random ID | Unique identifier for the input |
|
|
348
|
+
| `name` | `string` | Same as id | Name attribute for the input field |
|
|
349
|
+
| `label` | `string` | Required | Label text for the input |
|
|
350
|
+
| `variant` | `'standard' \| 'filled'` | `'standard'` | Visual style variant |
|
|
351
|
+
| `type` | `string` | `'text'` | Input type (all HTML types + 'textarea') |
|
|
352
|
+
| `modelValue` | `string \| number` | `''` | Value for v-model binding |
|
|
353
|
+
| `required` | `boolean` | `false` | Whether the field is required |
|
|
354
|
+
| `rows` | `number` | `3` | Number of rows (for textarea only) |
|
|
355
|
+
| `placeholder` | `string` | `' '` | Placeholder text (space for floating label) |
|
|
356
|
+
| `error` | `string \| boolean` | `false` | Error state or message |
|
|
357
|
+
| `success` | `string \| boolean` | `false` | Success state or message |
|
|
358
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Size of the input |
|
|
359
|
+
| `class` | `string` | `''` | Additional CSS classes |
|
|
360
|
+
|
|
361
|
+
# Events
|
|
362
|
+
|
|
363
|
+
| Event | Parameters | Description |
|
|
364
|
+
|-------|------------|-------------|
|
|
365
|
+
| `update:modelValue` | `(value: string \| number)` | Emitted when input value changes (for v-model) |
|
|
366
|
+
| `input` | `(event: Event)` | Native input event |
|
|
367
|
+
| `focus` | `(event: FocusEvent)` | Native focus event |
|
|
368
368
|
| `blur` | `(event: FocusEvent)` | Native blur event |
|