spoko-design-system 0.9.3 → 0.9.4

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 (172) hide show
  1. package/.astro/settings.json +4 -4
  2. package/.astro/types.d.ts +1 -1
  3. package/.claude/settings.local.json +2 -1
  4. package/.github/dependabot.yml +11 -11
  5. package/.github/todo.yml +3 -3
  6. package/.github/workflows/deploy.yml +39 -39
  7. package/.stackblitzrc +5 -5
  8. package/.vscode/extensions.json +5 -5
  9. package/.vscode/launch.json +11 -11
  10. package/.vscode/settings.json +5 -5
  11. package/LICENSE +21 -21
  12. package/README.md +116 -116
  13. package/astro-i18next.config.mjs +17 -17
  14. package/astro-i18next.config.ts +10 -10
  15. package/astro.config.mjs +86 -86
  16. package/dev-dist/sw.js +91 -91
  17. package/dev-dist/workbox-c676b6d3.js +3391 -3391
  18. package/icon.config.ts +310 -310
  19. package/index.ts +70 -70
  20. package/package.json +124 -124
  21. package/public/arrow-bottom.svg +7 -7
  22. package/public/fonts/lg.svg +53 -53
  23. package/public/fonts/vwhead-bold-demo.html +549 -549
  24. package/public/fonts/vwhead-regular-demo.html +549 -549
  25. package/public/fonts/vwtext-bold-demo.html +549 -549
  26. package/public/fonts/vwtext-regular-demo.html +549 -549
  27. package/public/github.svg +3 -3
  28. package/public/grid_dot.svg +4 -4
  29. package/public/linkedin.svg +44 -44
  30. package/public/locales/en/translation.json +12 -12
  31. package/public/locales/pl/translation.json +12 -12
  32. package/public/make-scrollable-code-focusable.js +3 -3
  33. package/public/pagefind.yml +3 -3
  34. package/public/polo.blue.svg +29 -29
  35. package/public/spoko.space.svg +71 -71
  36. package/public/twitter.svg +46 -46
  37. package/renovate.json +6 -6
  38. package/sandbox.config.json +11 -11
  39. package/src/MyComponent.astro +8 -8
  40. package/src/components/Badge.vue +19 -19
  41. package/src/components/Badges.vue +21 -21
  42. package/src/components/Breadcrumbs.vue +94 -94
  43. package/src/components/Button.vue +101 -101
  44. package/src/components/ButtonCopy.astro +183 -183
  45. package/src/components/ButtonCopy.vue +36 -36
  46. package/src/components/Card.astro +27 -27
  47. package/src/components/Carousel.astro +26 -26
  48. package/src/components/Category/CategoriesCarousel.astro +101 -101
  49. package/src/components/Category/CategoryDetails.astro +169 -169
  50. package/src/components/Category/CategoryLink.vue +28 -28
  51. package/src/components/Category/CategorySidebarToggler.vue +9 -9
  52. package/src/components/Category/CategoryTile.astro +37 -37
  53. package/src/components/Category/CategoryViewToggler.astro +89 -89
  54. package/src/components/Category/SubCategoryLink.vue +19 -19
  55. package/src/components/Copyright.astro +12 -12
  56. package/src/components/Date.astro +7 -7
  57. package/src/components/Faq.astro +33 -33
  58. package/src/components/FaqItem.astro +80 -80
  59. package/src/components/FeaturesList.vue +37 -37
  60. package/src/components/FuckRussia.vue +62 -62
  61. package/src/components/HandDrive.astro +29 -29
  62. package/src/components/Header/Header.astro +210 -210
  63. package/src/components/Header/SkipToContent.astro +1 -1
  64. package/src/components/Headline.vue +87 -87
  65. package/src/components/Image.astro +30 -30
  66. package/src/components/{layout → Layout}/CallToAction.astro +52 -52
  67. package/src/components/{layout → Layout}/Container.astro +7 -7
  68. package/src/components/{layout → Layout}/Header.astro +80 -80
  69. package/src/components/LeftSidebar.astro +53 -53
  70. package/src/components/MainColors.vue +22 -22
  71. package/src/components/MainInput.vue +15 -15
  72. package/src/components/Modal.astro +27 -27
  73. package/src/components/PageContent.astro +5 -5
  74. package/src/components/PartNumber.vue +27 -27
  75. package/src/components/Post/PostCategories.astro +41 -41
  76. package/src/components/Post/PostCategories.vue +30 -30
  77. package/src/components/PostHeader.astro +103 -103
  78. package/src/components/PrCode.vue +141 -141
  79. package/src/components/Product/ProductButton.vue +18 -18
  80. package/src/components/Product/ProductCarousel.astro +35 -35
  81. package/src/components/Product/ProductEngineType.vue +42 -42
  82. package/src/components/Product/ProductImage.astro +40 -40
  83. package/src/components/Product/ProductLink.astro +101 -101
  84. package/src/components/Product/ProductLink.vue +59 -59
  85. package/src/components/Product/ProductLinkInfo.astro +37 -37
  86. package/src/components/Product/ProductNumber.astro +60 -60
  87. package/src/components/ProductCarousel.astro +38 -38
  88. package/src/components/ProductCodes.vue +39 -39
  89. package/src/components/ProductDetailName.vue +52 -52
  90. package/src/components/ProductDetailsList.vue +216 -216
  91. package/src/components/ProductTile.astro +48 -48
  92. package/src/components/Quote.vue +23 -23
  93. package/src/components/ReloadPrompt.astro +50 -50
  94. package/src/components/SlimBanner.vue +72 -72
  95. package/src/components/Table.vue +32 -32
  96. package/src/components/TableOfContents.astro +15 -15
  97. package/src/components/Translations.vue +23 -23
  98. package/src/components/flags/FlagPL.vue +3 -3
  99. package/src/components/flags/FlagUA.vue +2 -2
  100. package/src/config.ts +56 -56
  101. package/src/design.config.ts +98 -98
  102. package/src/env.d.ts +6 -6
  103. package/src/layouts/Layout.astro +61 -61
  104. package/src/layouts/MainLayout.astro +81 -81
  105. package/src/layouts/partials/FooterCommon.astro +4 -4
  106. package/src/layouts/partials/HeadCommon.astro +44 -44
  107. package/src/layouts/partials/HeadSEO.astro +41 -41
  108. package/src/pages/components/badges.mdx +57 -57
  109. package/src/pages/components/breadcrumbs.mdx +139 -139
  110. package/src/pages/components/buttons.mdx +360 -360
  111. package/src/pages/components/card.mdx +294 -294
  112. package/src/pages/components/carousel.mdx +62 -62
  113. package/src/pages/components/copyright.mdx +42 -42
  114. package/src/pages/components/details-list.mdx +115 -115
  115. package/src/pages/components/features-list.mdx +37 -37
  116. package/src/pages/components/flags.mdx +49 -49
  117. package/src/pages/components/fuck-russia.mdx +39 -39
  118. package/src/pages/components/hand-drive.mdx +38 -38
  119. package/src/pages/components/headline.mdx +137 -137
  120. package/src/pages/components/icons.astro +135 -135
  121. package/src/pages/components/image.mdx +513 -513
  122. package/src/pages/components/input.mdx +367 -367
  123. package/src/pages/components/jumbotron.mdx +359 -359
  124. package/src/pages/components/modal.mdx +64 -64
  125. package/src/pages/components/post-header.mdx +64 -64
  126. package/src/pages/components/pr-code.mdx +65 -65
  127. package/src/pages/components/product-number.mdx +58 -58
  128. package/src/pages/components/product-tile.mdx +51 -51
  129. package/src/pages/components/quote.mdx +33 -33
  130. package/src/pages/components/slimbanner.mdx +35 -35
  131. package/src/pages/components/table.mdx +108 -108
  132. package/src/pages/core/colors.mdx +10 -10
  133. package/src/pages/core/grid.mdx +89 -89
  134. package/src/pages/core/introduction.mdx +77 -77
  135. package/src/pages/core/shadows.astro +20 -20
  136. package/src/pages/core/typography.astro +49 -49
  137. package/src/pages/index.astro +133 -133
  138. package/src/pages/patterns/introduction.mdx +60 -60
  139. package/src/pwa.ts +12 -12
  140. package/src/styles/_variables.scss +70 -70
  141. package/src/styles/base/base.css +184 -184
  142. package/src/styles/base/grid.css +92 -92
  143. package/src/styles/base/typography.css +70 -70
  144. package/src/styles/content.css +73 -73
  145. package/src/styles/main.css +7 -7
  146. package/src/types/Product.ts +31 -31
  147. package/src/types/astro.d.ts +3 -3
  148. package/src/utils/product/getPriceFormatted.ts +15 -15
  149. package/src/utils/product/getProductChecklist.ts +17 -17
  150. package/src/utils/product/useFormatProductNumber.ts +41 -41
  151. package/src/utils/seo/getShorterDescription.ts +14 -14
  152. package/src/utils/text/formatDate.ts +5 -5
  153. package/src/utils/text/formatLocaleNumber.ts +6 -6
  154. package/src/utils/text/formatPad.ts +12 -12
  155. package/src/utils/text/getNumberFormatted.ts +33 -33
  156. package/src/utils/text/getTranslatedLink.ts +5 -5
  157. package/src/utils/text.ts +19 -19
  158. package/tailwind.config.cjs +8 -8
  159. package/tsconfig.json +28 -28
  160. package/uno-config/index.ts +268 -268
  161. package/uno-config/theme/breakpoints.ts +9 -9
  162. package/uno-config/theme/colors.ts +64 -64
  163. package/uno-config/theme/dimensions.ts +17 -17
  164. package/uno-config/theme/effects.ts +14 -14
  165. package/uno-config/theme/grid.ts +10 -10
  166. package/uno-config/theme/index.ts +28 -28
  167. package/uno-config/theme/shortcuts/buttons.ts +53 -53
  168. package/uno-config/theme/shortcuts/components.ts +123 -123
  169. package/uno-config/theme/shortcuts/index.ts +20 -20
  170. package/uno-config/theme/shortcuts/layout.ts +74 -74
  171. package/uno-config/theme/typography.ts +29 -29
  172. 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 |