@petrarca/sonnet-playground 0.2.0 → 0.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.
Files changed (74) hide show
  1. package/dist/PlayAdvancedComponents-ZYK66UII.js +8 -0
  2. package/dist/PlayColorPalette-IWECRZUS.js +8 -0
  3. package/dist/PlayCoreComponents-F2OFSQZK.js +8 -0
  4. package/dist/PlayDataComponents-BA3NA225.js +8 -0
  5. package/dist/PlayFormComponents-MZC7CNES.js +8 -0
  6. package/dist/PlayFormWidgets-IWJJQ5XL.js +8 -0
  7. package/dist/PlayForms-FOF3XE6G.js +7 -0
  8. package/dist/PlayGraph-RHFIDAS3.js +7 -0
  9. package/dist/PlayJsonEditor-SYZYEJEA.js +7 -0
  10. package/dist/PlayShellApi-3T4FZPEV.js +8 -0
  11. package/dist/PlayShellApi-3T4FZPEV.js.map +1 -0
  12. package/dist/PlayTypography-T6SMPHUB.js +8 -0
  13. package/dist/PlayTypography-T6SMPHUB.js.map +1 -0
  14. package/dist/chunk-4S2ITDB3.js +322 -0
  15. package/dist/chunk-4S2ITDB3.js.map +1 -0
  16. package/dist/chunk-4Y4JFKAK.js +240 -0
  17. package/dist/chunk-4Y4JFKAK.js.map +1 -0
  18. package/dist/{chunk-QIETZUEN.js → chunk-6DZ3TSV4.js} +66 -71
  19. package/dist/chunk-6DZ3TSV4.js.map +1 -0
  20. package/dist/{chunk-CYNK2P2Q.js → chunk-7IBZEHLI.js} +14 -13
  21. package/dist/chunk-7IBZEHLI.js.map +1 -0
  22. package/dist/chunk-C2EZ2ECG.js +40 -0
  23. package/dist/chunk-C2EZ2ECG.js.map +1 -0
  24. package/dist/{chunk-A3IK3CVW.js → chunk-DA3BIB5N.js} +24 -25
  25. package/dist/{chunk-A3IK3CVW.js.map → chunk-DA3BIB5N.js.map} +1 -1
  26. package/dist/{chunk-TZGJH7YS.js → chunk-DKLALDHR.js} +325 -331
  27. package/dist/chunk-DKLALDHR.js.map +1 -0
  28. package/dist/chunk-DZB6WFHA.js +401 -0
  29. package/dist/chunk-DZB6WFHA.js.map +1 -0
  30. package/dist/{chunk-KAT24CQQ.js → chunk-FZ3ZC7VM.js} +8 -6
  31. package/dist/chunk-FZ3ZC7VM.js.map +1 -0
  32. package/dist/chunk-MT4ILA37.js +563 -0
  33. package/dist/chunk-MT4ILA37.js.map +1 -0
  34. package/dist/chunk-QCK2M4KD.js +907 -0
  35. package/dist/chunk-QCK2M4KD.js.map +1 -0
  36. package/dist/{chunk-PGI54O43.js → chunk-SBKZRIJC.js} +39 -44
  37. package/dist/chunk-SBKZRIJC.js.map +1 -0
  38. package/dist/index.d.ts +10 -6
  39. package/dist/index.js +41 -17
  40. package/dist/index.js.map +1 -1
  41. package/dist/pages/index.d.ts +15 -11
  42. package/dist/pages/index.js +20 -12
  43. package/package.json +6 -6
  44. package/dist/PlayColorPalette-UFMTJTUB.js +0 -8
  45. package/dist/PlayCoreComponents-7QCDFQLT.js +0 -7
  46. package/dist/PlayDataComponents-GZSRTW4F.js +0 -7
  47. package/dist/PlayFormComponents-RJB6WZHD.js +0 -7
  48. package/dist/PlayFormWidgets-OFV7TJKH.js +0 -7
  49. package/dist/PlayForms-24XX5DC6.js +0 -7
  50. package/dist/PlayGraph-FLGLSUWV.js +0 -8
  51. package/dist/PlayJsonEditor-4L5INQPU.js +0 -7
  52. package/dist/PlayTypography-ID6DLFZD.js +0 -8
  53. package/dist/chunk-5V27QDAY.js +0 -617
  54. package/dist/chunk-5V27QDAY.js.map +0 -1
  55. package/dist/chunk-CYNK2P2Q.js.map +0 -1
  56. package/dist/chunk-FTN2A5YL.js +0 -20
  57. package/dist/chunk-FTN2A5YL.js.map +0 -1
  58. package/dist/chunk-GYKEPHHA.js +0 -1154
  59. package/dist/chunk-GYKEPHHA.js.map +0 -1
  60. package/dist/chunk-KAT24CQQ.js.map +0 -1
  61. package/dist/chunk-P7I5IDXA.js +0 -432
  62. package/dist/chunk-P7I5IDXA.js.map +0 -1
  63. package/dist/chunk-PGI54O43.js.map +0 -1
  64. package/dist/chunk-QIETZUEN.js.map +0 -1
  65. package/dist/chunk-TZGJH7YS.js.map +0 -1
  66. /package/dist/{PlayColorPalette-UFMTJTUB.js.map → PlayAdvancedComponents-ZYK66UII.js.map} +0 -0
  67. /package/dist/{PlayCoreComponents-7QCDFQLT.js.map → PlayColorPalette-IWECRZUS.js.map} +0 -0
  68. /package/dist/{PlayDataComponents-GZSRTW4F.js.map → PlayCoreComponents-F2OFSQZK.js.map} +0 -0
  69. /package/dist/{PlayFormComponents-RJB6WZHD.js.map → PlayDataComponents-BA3NA225.js.map} +0 -0
  70. /package/dist/{PlayFormWidgets-OFV7TJKH.js.map → PlayFormComponents-MZC7CNES.js.map} +0 -0
  71. /package/dist/{PlayForms-24XX5DC6.js.map → PlayFormWidgets-IWJJQ5XL.js.map} +0 -0
  72. /package/dist/{PlayGraph-FLGLSUWV.js.map → PlayForms-FOF3XE6G.js.map} +0 -0
  73. /package/dist/{PlayJsonEditor-4L5INQPU.js.map → PlayGraph-RHFIDAS3.js.map} +0 -0
  74. /package/dist/{PlayTypography-ID6DLFZD.js.map → PlayJsonEditor-SYZYEJEA.js.map} +0 -0
@@ -0,0 +1,563 @@
1
+ import {
2
+ ExampleBlock
3
+ } from "./chunk-C2EZ2ECG.js";
4
+
5
+ // src/pages/PlayFormComponents.tsx
6
+ import { useState } from "react";
7
+ import { SimpleStack, Card } from "@petrarca/sonnet-ui";
8
+ import {
9
+ FormInput,
10
+ FormTextarea,
11
+ FormNumberInput,
12
+ FormCheckbox,
13
+ FormSelect,
14
+ FormMultiSelect,
15
+ FormTagsInput
16
+ } from "@petrarca/sonnet-forms";
17
+ import { jsx, jsxs } from "react/jsx-runtime";
18
+ function PlayFormComponents() {
19
+ const [textValue, setTextValue] = useState("");
20
+ const [emailValue, setEmailValue] = useState("");
21
+ const [passwordValue, setPasswordValue] = useState("");
22
+ const [urlValue, setUrlValue] = useState("");
23
+ const [textareaValue, setTextareaValue] = useState("");
24
+ const [textareaError, setTextareaError] = useState("");
25
+ const [numberValue, setNumberValue] = useState(void 0);
26
+ const [rangeValue, setRangeValue] = useState(5);
27
+ const [decimalValue, setDecimalValue] = useState(
28
+ void 0
29
+ );
30
+ const [checkboxValue, setCheckboxValue] = useState(false);
31
+ const [checkboxIndeterminate, setCheckboxIndeterminate] = useState("indeterminate");
32
+ const [selectValue, setSelectValue] = useState("");
33
+ const [selectRequired, setSelectRequired] = useState("");
34
+ const [multiSelectValue, setMultiSelectValue] = useState([]);
35
+ const [tagsValue, setTagsValue] = useState(["react", "typescript"]);
36
+ const colorOptions = [
37
+ { label: "Red", value: "red" },
38
+ { label: "Green", value: "green" },
39
+ { label: "Blue", value: "blue" },
40
+ { label: "Yellow", value: "yellow" },
41
+ { label: "Purple", value: "purple" }
42
+ ];
43
+ const countryOptions = [
44
+ { label: "United States", value: "us" },
45
+ { label: "Canada", value: "ca" },
46
+ { label: "United Kingdom", value: "uk" },
47
+ { label: "Germany", value: "de" },
48
+ { label: "France", value: "fr" },
49
+ { label: "Japan", value: "jp" },
50
+ { label: "Australia", value: "au" }
51
+ ];
52
+ return /* @__PURE__ */ jsxs("div", { className: "w-full max-w-4xl space-y-6", children: [
53
+ /* @__PURE__ */ jsxs("div", { children: [
54
+ /* @__PURE__ */ jsx("h1", { children: "Form Components Playground" }),
55
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mb-3", children: "Test all custom Form wrapper components with labels, descriptions, and error states" })
56
+ ] }),
57
+ /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs(SimpleStack, { gap: "md", style: { maxWidth: "900px" }, children: [
58
+ /* @__PURE__ */ jsx(Card, { className: "border shadow-sm p-4", children: /* @__PURE__ */ jsxs(SimpleStack, { gap: "sm", children: [
59
+ /* @__PURE__ */ jsx("h2", { children: "FormInput" }),
60
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Text input wrapper with label, description, and error support. Supports all HTML input types." }),
61
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3 pt-2", children: [
62
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Basic", children: /* @__PURE__ */ jsx(
63
+ FormInput,
64
+ {
65
+ label: "Username",
66
+ value: textValue,
67
+ onChange: (e) => setTextValue(e.target.value),
68
+ placeholder: "Enter username"
69
+ }
70
+ ) }),
71
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "With description", children: /* @__PURE__ */ jsx(
72
+ FormInput,
73
+ {
74
+ label: "Full Name",
75
+ description: "Your first and last name",
76
+ value: textValue,
77
+ onChange: (e) => setTextValue(e.target.value),
78
+ placeholder: "John Doe"
79
+ }
80
+ ) }),
81
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Required", children: /* @__PURE__ */ jsx(
82
+ FormInput,
83
+ {
84
+ label: "Email",
85
+ required: true,
86
+ value: emailValue,
87
+ onChange: (e) => setEmailValue(e.target.value),
88
+ placeholder: "john@example.com"
89
+ }
90
+ ) }),
91
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "With error", children: /* @__PURE__ */ jsx(
92
+ FormInput,
93
+ {
94
+ label: "Email",
95
+ value: emailValue,
96
+ onChange: (e) => setEmailValue(e.target.value),
97
+ error: "Invalid email format",
98
+ placeholder: "john@example.com"
99
+ }
100
+ ) }),
101
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Password", children: /* @__PURE__ */ jsx(
102
+ FormInput,
103
+ {
104
+ label: "Password",
105
+ type: "password",
106
+ value: passwordValue,
107
+ onChange: (e) => setPasswordValue(e.target.value),
108
+ placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"
109
+ }
110
+ ) }),
111
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Disabled", children: /* @__PURE__ */ jsx(
112
+ FormInput,
113
+ {
114
+ label: "Readonly Field",
115
+ value: "Cannot edit this",
116
+ onChange: () => {
117
+ },
118
+ disabled: true
119
+ }
120
+ ) })
121
+ ] }),
122
+ /* @__PURE__ */ jsx("pre", { className: "text-xs bg-muted p-2 rounded overflow-x-auto", children: /* @__PURE__ */ jsx("code", { children: `<FormInput
123
+ label="Username"
124
+ value={textValue}
125
+ onChange={(e) => setTextValue(e.target.value)}
126
+ placeholder="Enter username"
127
+ description="Optional description"
128
+ error="Optional error message"
129
+ required={false}
130
+ disabled={false}
131
+ />` }) }),
132
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
133
+ "Current value: ",
134
+ textValue || "(empty)"
135
+ ] })
136
+ ] }) }),
137
+ /* @__PURE__ */ jsx(Card, { className: "border shadow-sm p-4", children: /* @__PURE__ */ jsxs(SimpleStack, { gap: "sm", children: [
138
+ /* @__PURE__ */ jsx("h2", { children: "FormTextarea" }),
139
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Multi-line text input with label, description, and error support." }),
140
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3 pt-2", children: [
141
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Basic", children: /* @__PURE__ */ jsx(
142
+ FormTextarea,
143
+ {
144
+ label: "Description",
145
+ value: textareaValue,
146
+ onChange: (e) => setTextareaValue(e.target.value),
147
+ placeholder: "Enter a detailed description...",
148
+ rows: 4
149
+ }
150
+ ) }),
151
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "With description", children: /* @__PURE__ */ jsx(
152
+ FormTextarea,
153
+ {
154
+ label: "Bio",
155
+ description: "Tell us about yourself (max 500 characters)",
156
+ value: textareaValue,
157
+ onChange: (e) => setTextareaValue(e.target.value),
158
+ placeholder: "I am a...",
159
+ rows: 3
160
+ }
161
+ ) }),
162
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "With error validation", children: /* @__PURE__ */ jsx(
163
+ FormTextarea,
164
+ {
165
+ label: "Comments",
166
+ value: textareaValue,
167
+ onChange: (e) => {
168
+ setTextareaValue(e.target.value);
169
+ setTextareaError(
170
+ e.target.value.length > 100 ? "Maximum 100 characters allowed" : ""
171
+ );
172
+ },
173
+ error: textareaError,
174
+ placeholder: "Enter your comments...",
175
+ rows: 3
176
+ }
177
+ ) }),
178
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Disabled", children: /* @__PURE__ */ jsx(
179
+ FormTextarea,
180
+ {
181
+ label: "Readonly Text",
182
+ value: "This cannot be edited",
183
+ onChange: () => {
184
+ },
185
+ disabled: true,
186
+ rows: 2
187
+ }
188
+ ) })
189
+ ] }),
190
+ /* @__PURE__ */ jsx("pre", { className: "text-xs bg-muted p-2 rounded overflow-x-auto", children: /* @__PURE__ */ jsx("code", { children: `<FormTextarea
191
+ label="Description"
192
+ value={textareaValue}
193
+ onChange={(e) => setTextareaValue(e.target.value)}
194
+ placeholder="Enter text..."
195
+ rows={4}
196
+ description="Optional description"
197
+ error="Optional error message"
198
+ />` }) }),
199
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
200
+ "Current value: ",
201
+ textareaValue || "(empty)"
202
+ ] })
203
+ ] }) }),
204
+ /* @__PURE__ */ jsx(Card, { className: "border shadow-sm p-4", children: /* @__PURE__ */ jsxs(SimpleStack, { gap: "sm", children: [
205
+ /* @__PURE__ */ jsx("h2", { children: "FormNumberInput" }),
206
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Number input with min/max validation and step control." }),
207
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3 pt-2", children: [
208
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Basic", children: /* @__PURE__ */ jsx(
209
+ FormNumberInput,
210
+ {
211
+ label: "Age",
212
+ value: numberValue,
213
+ onChange: setNumberValue,
214
+ placeholder: "Enter age"
215
+ }
216
+ ) }),
217
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "With min/max/step", children: /* @__PURE__ */ jsx(
218
+ FormNumberInput,
219
+ {
220
+ label: "Rating (1-10)",
221
+ value: rangeValue,
222
+ onChange: setRangeValue,
223
+ min: 1,
224
+ max: 10,
225
+ step: 1,
226
+ description: "Rate from 1 to 10"
227
+ }
228
+ ) }),
229
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Decimal", children: /* @__PURE__ */ jsx(
230
+ FormNumberInput,
231
+ {
232
+ label: "Price",
233
+ value: decimalValue,
234
+ onChange: setDecimalValue,
235
+ allowDecimal: true,
236
+ step: 0.01,
237
+ placeholder: "0.00",
238
+ description: "Enter price with cents"
239
+ }
240
+ ) }),
241
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Required", children: /* @__PURE__ */ jsx(
242
+ FormNumberInput,
243
+ {
244
+ label: "Quantity",
245
+ required: true,
246
+ value: numberValue,
247
+ onChange: setNumberValue,
248
+ min: 0,
249
+ placeholder: "0"
250
+ }
251
+ ) }),
252
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "With error", children: /* @__PURE__ */ jsx(
253
+ FormNumberInput,
254
+ {
255
+ label: "Invalid Input",
256
+ value: numberValue,
257
+ onChange: setNumberValue,
258
+ error: "Value must be greater than 0"
259
+ }
260
+ ) })
261
+ ] }),
262
+ /* @__PURE__ */ jsx("pre", { className: "text-xs bg-muted p-2 rounded overflow-x-auto", children: /* @__PURE__ */ jsx("code", { children: `<FormNumberInput
263
+ label="Age"
264
+ value={numberValue}
265
+ onChange={setNumberValue}
266
+ min={0}
267
+ max={120}
268
+ step={1}
269
+ allowDecimal={false}
270
+ />` }) }),
271
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
272
+ "Current value: ",
273
+ numberValue ?? "(empty)"
274
+ ] })
275
+ ] }) }),
276
+ /* @__PURE__ */ jsx(Card, { className: "border shadow-sm p-4", children: /* @__PURE__ */ jsxs(SimpleStack, { gap: "sm", children: [
277
+ /* @__PURE__ */ jsx("h2", { children: "FormCheckbox" }),
278
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Checkbox with label, description, and indeterminate state support." }),
279
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3 pt-2", children: [
280
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Basic", children: /* @__PURE__ */ jsx(
281
+ FormCheckbox,
282
+ {
283
+ label: "Accept terms and conditions",
284
+ checked: checkboxValue,
285
+ onChange: (checked) => setCheckboxValue(checked === true)
286
+ }
287
+ ) }),
288
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "With description", children: /* @__PURE__ */ jsx(
289
+ FormCheckbox,
290
+ {
291
+ label: "Subscribe to newsletter",
292
+ description: "Receive weekly updates about new features",
293
+ checked: checkboxValue,
294
+ onChange: (checked) => setCheckboxValue(checked === true)
295
+ }
296
+ ) }),
297
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Required", children: /* @__PURE__ */ jsx(
298
+ FormCheckbox,
299
+ {
300
+ label: "I agree to the privacy policy",
301
+ required: true,
302
+ checked: checkboxValue,
303
+ onChange: (checked) => setCheckboxValue(checked === true)
304
+ }
305
+ ) }),
306
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Indeterminate", children: /* @__PURE__ */ jsx(
307
+ FormCheckbox,
308
+ {
309
+ label: "Select all items",
310
+ description: "Some items are selected",
311
+ checked: checkboxIndeterminate,
312
+ onChange: setCheckboxIndeterminate
313
+ }
314
+ ) }),
315
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Disabled", children: /* @__PURE__ */ jsx(
316
+ FormCheckbox,
317
+ {
318
+ label: "Cannot change this",
319
+ checked: true,
320
+ onChange: () => {
321
+ },
322
+ disabled: true
323
+ }
324
+ ) }),
325
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "With error", children: /* @__PURE__ */ jsx(
326
+ FormCheckbox,
327
+ {
328
+ label: "Required checkbox",
329
+ checked: checkboxValue,
330
+ onChange: (checked) => setCheckboxValue(checked === true),
331
+ error: "You must accept to continue"
332
+ }
333
+ ) })
334
+ ] }),
335
+ /* @__PURE__ */ jsx("pre", { className: "text-xs bg-muted p-2 rounded overflow-x-auto", children: /* @__PURE__ */ jsx("code", { children: `<FormCheckbox
336
+ label="Accept terms"
337
+ checked={checkboxValue}
338
+ onChange={(checked) => setCheckboxValue(checked === true)}
339
+ description="Optional description"
340
+ required={false}
341
+ />` }) }),
342
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
343
+ "Current value: ",
344
+ String(checkboxValue)
345
+ ] })
346
+ ] }) }),
347
+ /* @__PURE__ */ jsx(Card, { className: "border shadow-sm p-4", children: /* @__PURE__ */ jsxs(SimpleStack, { gap: "sm", children: [
348
+ /* @__PURE__ */ jsx("h2", { children: "FormSelect" }),
349
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Searchable single-select dropdown with label and error support." }),
350
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3 pt-2", children: [
351
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Basic", children: /* @__PURE__ */ jsx(
352
+ FormSelect,
353
+ {
354
+ label: "Favorite Color",
355
+ value: selectValue,
356
+ onChange: (value) => setSelectValue(value || ""),
357
+ options: colorOptions,
358
+ placeholder: "Choose a color"
359
+ }
360
+ ) }),
361
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "With description", children: /* @__PURE__ */ jsx(
362
+ FormSelect,
363
+ {
364
+ label: "Country",
365
+ description: "Select your country of residence",
366
+ value: selectValue,
367
+ onChange: (value) => setSelectValue(value || ""),
368
+ options: countryOptions,
369
+ placeholder: "Select country"
370
+ }
371
+ ) }),
372
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Required", children: /* @__PURE__ */ jsx(
373
+ FormSelect,
374
+ {
375
+ label: "Required Selection",
376
+ required: true,
377
+ value: selectRequired,
378
+ onChange: (value) => setSelectRequired(value || ""),
379
+ options: colorOptions,
380
+ placeholder: "Must select one"
381
+ }
382
+ ) }),
383
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Disabled", children: /* @__PURE__ */ jsx(
384
+ FormSelect,
385
+ {
386
+ label: "Disabled Select",
387
+ value: "blue",
388
+ onChange: () => {
389
+ },
390
+ options: colorOptions,
391
+ disabled: true,
392
+ placeholder: "Cannot change"
393
+ }
394
+ ) }),
395
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "With error", children: /* @__PURE__ */ jsx(
396
+ FormSelect,
397
+ {
398
+ label: "Invalid Selection",
399
+ value: selectValue,
400
+ onChange: (value) => setSelectValue(value || ""),
401
+ options: colorOptions,
402
+ error: "This field is required",
403
+ placeholder: "Select option"
404
+ }
405
+ ) })
406
+ ] }),
407
+ /* @__PURE__ */ jsx("pre", { className: "text-xs bg-muted p-2 rounded overflow-x-auto", children: /* @__PURE__ */ jsx("code", { children: `<FormSelect
408
+ label="Country"
409
+ value={selectValue}
410
+ onChange={(value) => setSelectValue(value || '')}
411
+ options={[
412
+ { label: 'USA', value: 'us' },
413
+ { label: 'UK', value: 'uk' }
414
+ ]}
415
+ placeholder="Select..."
416
+ />` }) }),
417
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
418
+ "Current value: ",
419
+ selectValue || "(none selected)"
420
+ ] })
421
+ ] }) }),
422
+ /* @__PURE__ */ jsx(Card, { className: "border shadow-sm p-4", children: /* @__PURE__ */ jsxs(SimpleStack, { gap: "sm", children: [
423
+ /* @__PURE__ */ jsx("h2", { children: "FormMultiSelect" }),
424
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Searchable multi-select dropdown with badges." }),
425
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3 pt-2", children: [
426
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Basic", children: /* @__PURE__ */ jsx(
427
+ FormMultiSelect,
428
+ {
429
+ label: "Favorite Colors",
430
+ value: multiSelectValue,
431
+ onChange: setMultiSelectValue,
432
+ options: colorOptions,
433
+ placeholder: "Select multiple colors"
434
+ }
435
+ ) }),
436
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "With description", children: /* @__PURE__ */ jsx(
437
+ FormMultiSelect,
438
+ {
439
+ label: "Visited Countries",
440
+ description: "Select all countries you've visited",
441
+ value: multiSelectValue,
442
+ onChange: setMultiSelectValue,
443
+ options: countryOptions,
444
+ placeholder: "Select countries"
445
+ }
446
+ ) }),
447
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Required", children: /* @__PURE__ */ jsx(
448
+ FormMultiSelect,
449
+ {
450
+ label: "Skills",
451
+ required: true,
452
+ value: multiSelectValue,
453
+ onChange: setMultiSelectValue,
454
+ options: [
455
+ { label: "JavaScript", value: "js" },
456
+ { label: "TypeScript", value: "ts" },
457
+ { label: "Python", value: "py" },
458
+ { label: "Java", value: "java" }
459
+ ],
460
+ placeholder: "Select at least one skill"
461
+ }
462
+ ) }),
463
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "With error", children: /* @__PURE__ */ jsx(
464
+ FormMultiSelect,
465
+ {
466
+ label: "Categories",
467
+ value: multiSelectValue,
468
+ onChange: setMultiSelectValue,
469
+ options: colorOptions,
470
+ error: "Please select at least 2 categories",
471
+ placeholder: "Select categories"
472
+ }
473
+ ) })
474
+ ] }),
475
+ /* @__PURE__ */ jsx("pre", { className: "text-xs bg-muted p-2 rounded overflow-x-auto", children: /* @__PURE__ */ jsx("code", { children: `<FormMultiSelect
476
+ label="Skills"
477
+ value={multiSelectValue}
478
+ onChange={setMultiSelectValue}
479
+ options={skillOptions}
480
+ placeholder="Select skills"
481
+ />` }) }),
482
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
483
+ "Current value:",
484
+ " ",
485
+ multiSelectValue.length > 0 ? multiSelectValue.join(", ") : "(none selected)"
486
+ ] })
487
+ ] }) }),
488
+ /* @__PURE__ */ jsx(Card, { className: "border shadow-sm p-4", children: /* @__PURE__ */ jsxs(SimpleStack, { gap: "sm", children: [
489
+ /* @__PURE__ */ jsx("h2", { children: "FormTagsInput" }),
490
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Free-text tag input with creation and deletion." }),
491
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3 pt-2", children: [
492
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Basic", children: /* @__PURE__ */ jsx(
493
+ FormTagsInput,
494
+ {
495
+ label: "Technologies",
496
+ value: tagsValue,
497
+ onChange: setTagsValue,
498
+ placeholder: "Type and press Enter to add tags"
499
+ }
500
+ ) }),
501
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "With description", children: /* @__PURE__ */ jsx(
502
+ FormTagsInput,
503
+ {
504
+ label: "Skills",
505
+ description: "Add your programming skills (press Enter after each)",
506
+ value: tagsValue,
507
+ onChange: setTagsValue,
508
+ placeholder: "e.g., React, Node.js"
509
+ }
510
+ ) }),
511
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Required", children: /* @__PURE__ */ jsx(
512
+ FormTagsInput,
513
+ {
514
+ label: "Keywords",
515
+ required: true,
516
+ value: tagsValue,
517
+ onChange: setTagsValue,
518
+ placeholder: "Add at least one keyword"
519
+ }
520
+ ) }),
521
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "With error", children: /* @__PURE__ */ jsx(
522
+ FormTagsInput,
523
+ {
524
+ label: "Tags",
525
+ value: tagsValue,
526
+ onChange: setTagsValue,
527
+ error: "Maximum 5 tags allowed",
528
+ placeholder: "Add tags"
529
+ }
530
+ ) }),
531
+ /* @__PURE__ */ jsx(ExampleBlock, { label: "Disabled", children: /* @__PURE__ */ jsx(
532
+ FormTagsInput,
533
+ {
534
+ label: "Fixed Tags",
535
+ value: ["readonly", "tags"],
536
+ onChange: () => {
537
+ },
538
+ disabled: true,
539
+ placeholder: "Cannot edit"
540
+ }
541
+ ) })
542
+ ] }),
543
+ /* @__PURE__ */ jsx("pre", { className: "text-xs bg-muted p-2 rounded overflow-x-auto", children: /* @__PURE__ */ jsx("code", { children: `<FormTagsInput
544
+ label="Technologies"
545
+ value={tagsValue}
546
+ onChange={setTagsValue}
547
+ placeholder="Type and press Enter"
548
+ description="Optional description"
549
+ />` }) }),
550
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
551
+ "Current tags:",
552
+ " ",
553
+ tagsValue.length > 0 ? tagsValue.join(", ") : "(none)"
554
+ ] })
555
+ ] }) })
556
+ ] }) })
557
+ ] });
558
+ }
559
+
560
+ export {
561
+ PlayFormComponents
562
+ };
563
+ //# sourceMappingURL=chunk-MT4ILA37.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pages/PlayFormComponents.tsx"],"sourcesContent":["/**\n * Playground page for testing Form components\n * Accessible at /playground/form-components\n *\n * Tests all custom Form wrapper components that provide consistent\n * label, description, and error handling around base UI components.\n */\n\nimport { useState } from \"react\";\nimport { SimpleStack, Card } from \"@petrarca/sonnet-ui\";\nimport { ExampleBlock } from \"../PlaygroundSection\";\nimport {\n FormInput,\n FormTextarea,\n FormNumberInput,\n FormCheckbox,\n FormSelect,\n FormMultiSelect,\n FormTagsInput,\n} from \"@petrarca/sonnet-forms\";\n\nexport default function PlayFormComponents() {\n // FormInput states\n const [textValue, setTextValue] = useState(\"\");\n const [emailValue, setEmailValue] = useState(\"\");\n const [passwordValue, setPasswordValue] = useState(\"\");\n const [urlValue, setUrlValue] = useState(\"\");\n\n // FormTextarea states\n const [textareaValue, setTextareaValue] = useState(\"\");\n const [textareaError, setTextareaError] = useState(\"\");\n\n // FormNumberInput states\n const [numberValue, setNumberValue] = useState<number | undefined>(undefined);\n const [rangeValue, setRangeValue] = useState<number | undefined>(5);\n const [decimalValue, setDecimalValue] = useState<number | undefined>(\n undefined,\n );\n\n // FormCheckbox states\n const [checkboxValue, setCheckboxValue] = useState(false);\n const [checkboxIndeterminate, setCheckboxIndeterminate] = useState<\n boolean | \"indeterminate\"\n >(\"indeterminate\");\n\n // FormSelect states\n const [selectValue, setSelectValue] = useState(\"\");\n const [selectRequired, setSelectRequired] = useState(\"\");\n\n // FormMultiSelect states\n const [multiSelectValue, setMultiSelectValue] = useState<string[]>([]);\n\n // FormTagsInput states\n const [tagsValue, setTagsValue] = useState<string[]>([\"react\", \"typescript\"]);\n\n // Options for selects\n const colorOptions = [\n { label: \"Red\", value: \"red\" },\n { label: \"Green\", value: \"green\" },\n { label: \"Blue\", value: \"blue\" },\n { label: \"Yellow\", value: \"yellow\" },\n { label: \"Purple\", value: \"purple\" },\n ];\n\n const countryOptions = [\n { label: \"United States\", value: \"us\" },\n { label: \"Canada\", value: \"ca\" },\n { label: \"United Kingdom\", value: \"uk\" },\n { label: \"Germany\", value: \"de\" },\n { label: \"France\", value: \"fr\" },\n { label: \"Japan\", value: \"jp\" },\n { label: \"Australia\", value: \"au\" },\n ];\n\n return (\n <div className=\"w-full max-w-4xl space-y-6\">\n <div>\n <h1>Form Components Playground</h1>\n <p className=\"text-sm text-muted-foreground mb-3\">\n Test all custom Form wrapper components with labels, descriptions, and\n error states\n </p>\n </div>\n\n <div>\n <SimpleStack gap=\"md\" style={{ maxWidth: \"900px\" }}>\n {/* FormInput */}\n <Card className=\"border shadow-sm p-4\">\n <SimpleStack gap=\"sm\">\n <h2>FormInput</h2>\n <p className=\"text-sm text-muted-foreground\">\n Text input wrapper with label, description, and error support.\n Supports all HTML input types.\n </p>\n\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <ExampleBlock label=\"Basic\">\n <FormInput\n label=\"Username\"\n value={textValue}\n onChange={(e) => setTextValue(e.target.value)}\n placeholder=\"Enter username\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"With description\">\n <FormInput\n label=\"Full Name\"\n description=\"Your first and last name\"\n value={textValue}\n onChange={(e) => setTextValue(e.target.value)}\n placeholder=\"John Doe\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"Required\">\n <FormInput\n label=\"Email\"\n required\n value={emailValue}\n onChange={(e) => setEmailValue(e.target.value)}\n placeholder=\"john@example.com\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"With error\">\n <FormInput\n label=\"Email\"\n value={emailValue}\n onChange={(e) => setEmailValue(e.target.value)}\n error=\"Invalid email format\"\n placeholder=\"john@example.com\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"Password\">\n <FormInput\n label=\"Password\"\n type=\"password\"\n value={passwordValue}\n onChange={(e) => setPasswordValue(e.target.value)}\n placeholder=\"••••••••\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"Disabled\">\n <FormInput\n label=\"Readonly Field\"\n value=\"Cannot edit this\"\n onChange={() => {}}\n disabled\n />\n </ExampleBlock>\n </div>\n\n <pre className=\"text-xs bg-muted p-2 rounded overflow-x-auto\">\n <code>{`<FormInput\n label=\"Username\"\n value={textValue}\n onChange={(e) => setTextValue(e.target.value)}\n placeholder=\"Enter username\"\n description=\"Optional description\"\n error=\"Optional error message\"\n required={false}\n disabled={false}\n/>`}</code>\n </pre>\n\n <p className=\"text-xs text-muted-foreground\">\n Current value: {textValue || \"(empty)\"}\n </p>\n </SimpleStack>\n </Card>\n\n {/* FormTextarea */}\n <Card className=\"border shadow-sm p-4\">\n <SimpleStack gap=\"sm\">\n <h2>FormTextarea</h2>\n <p className=\"text-sm text-muted-foreground\">\n Multi-line text input with label, description, and error\n support.\n </p>\n\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <ExampleBlock label=\"Basic\">\n <FormTextarea\n label=\"Description\"\n value={textareaValue}\n onChange={(e) => setTextareaValue(e.target.value)}\n placeholder=\"Enter a detailed description...\"\n rows={4}\n />\n </ExampleBlock>\n <ExampleBlock label=\"With description\">\n <FormTextarea\n label=\"Bio\"\n description=\"Tell us about yourself (max 500 characters)\"\n value={textareaValue}\n onChange={(e) => setTextareaValue(e.target.value)}\n placeholder=\"I am a...\"\n rows={3}\n />\n </ExampleBlock>\n <ExampleBlock label=\"With error validation\">\n <FormTextarea\n label=\"Comments\"\n value={textareaValue}\n onChange={(e) => {\n setTextareaValue(e.target.value);\n setTextareaError(\n e.target.value.length > 100\n ? \"Maximum 100 characters allowed\"\n : \"\",\n );\n }}\n error={textareaError}\n placeholder=\"Enter your comments...\"\n rows={3}\n />\n </ExampleBlock>\n <ExampleBlock label=\"Disabled\">\n <FormTextarea\n label=\"Readonly Text\"\n value=\"This cannot be edited\"\n onChange={() => {}}\n disabled\n rows={2}\n />\n </ExampleBlock>\n </div>\n\n <pre className=\"text-xs bg-muted p-2 rounded overflow-x-auto\">\n <code>{`<FormTextarea\n label=\"Description\"\n value={textareaValue}\n onChange={(e) => setTextareaValue(e.target.value)}\n placeholder=\"Enter text...\"\n rows={4}\n description=\"Optional description\"\n error=\"Optional error message\"\n/>`}</code>\n </pre>\n\n <p className=\"text-xs text-muted-foreground\">\n Current value: {textareaValue || \"(empty)\"}\n </p>\n </SimpleStack>\n </Card>\n\n {/* FormNumberInput */}\n <Card className=\"border shadow-sm p-4\">\n <SimpleStack gap=\"sm\">\n <h2>FormNumberInput</h2>\n <p className=\"text-sm text-muted-foreground\">\n Number input with min/max validation and step control.\n </p>\n\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <ExampleBlock label=\"Basic\">\n <FormNumberInput\n label=\"Age\"\n value={numberValue}\n onChange={setNumberValue}\n placeholder=\"Enter age\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"With min/max/step\">\n <FormNumberInput\n label=\"Rating (1-10)\"\n value={rangeValue}\n onChange={setRangeValue}\n min={1}\n max={10}\n step={1}\n description=\"Rate from 1 to 10\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"Decimal\">\n <FormNumberInput\n label=\"Price\"\n value={decimalValue}\n onChange={setDecimalValue}\n allowDecimal={true}\n step={0.01}\n placeholder=\"0.00\"\n description=\"Enter price with cents\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"Required\">\n <FormNumberInput\n label=\"Quantity\"\n required\n value={numberValue}\n onChange={setNumberValue}\n min={0}\n placeholder=\"0\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"With error\">\n <FormNumberInput\n label=\"Invalid Input\"\n value={numberValue}\n onChange={setNumberValue}\n error=\"Value must be greater than 0\"\n />\n </ExampleBlock>\n </div>\n\n <pre className=\"text-xs bg-muted p-2 rounded overflow-x-auto\">\n <code>{`<FormNumberInput\n label=\"Age\"\n value={numberValue}\n onChange={setNumberValue}\n min={0}\n max={120}\n step={1}\n allowDecimal={false}\n/>`}</code>\n </pre>\n\n <p className=\"text-xs text-muted-foreground\">\n Current value: {numberValue ?? \"(empty)\"}\n </p>\n </SimpleStack>\n </Card>\n\n {/* FormCheckbox */}\n <Card className=\"border shadow-sm p-4\">\n <SimpleStack gap=\"sm\">\n <h2>FormCheckbox</h2>\n <p className=\"text-sm text-muted-foreground\">\n Checkbox with label, description, and indeterminate state\n support.\n </p>\n\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <ExampleBlock label=\"Basic\">\n <FormCheckbox\n label=\"Accept terms and conditions\"\n checked={checkboxValue}\n onChange={(checked) => setCheckboxValue(checked === true)}\n />\n </ExampleBlock>\n <ExampleBlock label=\"With description\">\n <FormCheckbox\n label=\"Subscribe to newsletter\"\n description=\"Receive weekly updates about new features\"\n checked={checkboxValue}\n onChange={(checked) => setCheckboxValue(checked === true)}\n />\n </ExampleBlock>\n <ExampleBlock label=\"Required\">\n <FormCheckbox\n label=\"I agree to the privacy policy\"\n required\n checked={checkboxValue}\n onChange={(checked) => setCheckboxValue(checked === true)}\n />\n </ExampleBlock>\n <ExampleBlock label=\"Indeterminate\">\n <FormCheckbox\n label=\"Select all items\"\n description=\"Some items are selected\"\n checked={checkboxIndeterminate}\n onChange={setCheckboxIndeterminate}\n />\n </ExampleBlock>\n <ExampleBlock label=\"Disabled\">\n <FormCheckbox\n label=\"Cannot change this\"\n checked={true}\n onChange={() => {}}\n disabled\n />\n </ExampleBlock>\n <ExampleBlock label=\"With error\">\n <FormCheckbox\n label=\"Required checkbox\"\n checked={checkboxValue}\n onChange={(checked) => setCheckboxValue(checked === true)}\n error=\"You must accept to continue\"\n />\n </ExampleBlock>\n </div>\n\n <pre className=\"text-xs bg-muted p-2 rounded overflow-x-auto\">\n <code>{`<FormCheckbox\n label=\"Accept terms\"\n checked={checkboxValue}\n onChange={(checked) => setCheckboxValue(checked === true)}\n description=\"Optional description\"\n required={false}\n/>`}</code>\n </pre>\n\n <p className=\"text-xs text-muted-foreground\">\n Current value: {String(checkboxValue)}\n </p>\n </SimpleStack>\n </Card>\n\n {/* FormSelect */}\n <Card className=\"border shadow-sm p-4\">\n <SimpleStack gap=\"sm\">\n <h2>FormSelect</h2>\n <p className=\"text-sm text-muted-foreground\">\n Searchable single-select dropdown with label and error support.\n </p>\n\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <ExampleBlock label=\"Basic\">\n <FormSelect\n label=\"Favorite Color\"\n value={selectValue}\n onChange={(value) => setSelectValue(value || \"\")}\n options={colorOptions}\n placeholder=\"Choose a color\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"With description\">\n <FormSelect\n label=\"Country\"\n description=\"Select your country of residence\"\n value={selectValue}\n onChange={(value) => setSelectValue(value || \"\")}\n options={countryOptions}\n placeholder=\"Select country\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"Required\">\n <FormSelect\n label=\"Required Selection\"\n required\n value={selectRequired}\n onChange={(value) => setSelectRequired(value || \"\")}\n options={colorOptions}\n placeholder=\"Must select one\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"Disabled\">\n <FormSelect\n label=\"Disabled Select\"\n value=\"blue\"\n onChange={() => {}}\n options={colorOptions}\n disabled\n placeholder=\"Cannot change\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"With error\">\n <FormSelect\n label=\"Invalid Selection\"\n value={selectValue}\n onChange={(value) => setSelectValue(value || \"\")}\n options={colorOptions}\n error=\"This field is required\"\n placeholder=\"Select option\"\n />\n </ExampleBlock>\n </div>\n\n <pre className=\"text-xs bg-muted p-2 rounded overflow-x-auto\">\n <code>{`<FormSelect\n label=\"Country\"\n value={selectValue}\n onChange={(value) => setSelectValue(value || '')}\n options={[\n { label: 'USA', value: 'us' },\n { label: 'UK', value: 'uk' }\n ]}\n placeholder=\"Select...\"\n/>`}</code>\n </pre>\n\n <p className=\"text-xs text-muted-foreground\">\n Current value: {selectValue || \"(none selected)\"}\n </p>\n </SimpleStack>\n </Card>\n\n {/* FormMultiSelect */}\n <Card className=\"border shadow-sm p-4\">\n <SimpleStack gap=\"sm\">\n <h2>FormMultiSelect</h2>\n <p className=\"text-sm text-muted-foreground\">\n Searchable multi-select dropdown with badges.\n </p>\n\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <ExampleBlock label=\"Basic\">\n <FormMultiSelect\n label=\"Favorite Colors\"\n value={multiSelectValue}\n onChange={setMultiSelectValue}\n options={colorOptions}\n placeholder=\"Select multiple colors\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"With description\">\n <FormMultiSelect\n label=\"Visited Countries\"\n description=\"Select all countries you've visited\"\n value={multiSelectValue}\n onChange={setMultiSelectValue}\n options={countryOptions}\n placeholder=\"Select countries\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"Required\">\n <FormMultiSelect\n label=\"Skills\"\n required\n value={multiSelectValue}\n onChange={setMultiSelectValue}\n options={[\n { label: \"JavaScript\", value: \"js\" },\n { label: \"TypeScript\", value: \"ts\" },\n { label: \"Python\", value: \"py\" },\n { label: \"Java\", value: \"java\" },\n ]}\n placeholder=\"Select at least one skill\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"With error\">\n <FormMultiSelect\n label=\"Categories\"\n value={multiSelectValue}\n onChange={setMultiSelectValue}\n options={colorOptions}\n error=\"Please select at least 2 categories\"\n placeholder=\"Select categories\"\n />\n </ExampleBlock>\n </div>\n\n <pre className=\"text-xs bg-muted p-2 rounded overflow-x-auto\">\n <code>{`<FormMultiSelect\n label=\"Skills\"\n value={multiSelectValue}\n onChange={setMultiSelectValue}\n options={skillOptions}\n placeholder=\"Select skills\"\n/>`}</code>\n </pre>\n\n <p className=\"text-xs text-muted-foreground\">\n Current value:{\" \"}\n {multiSelectValue.length > 0\n ? multiSelectValue.join(\", \")\n : \"(none selected)\"}\n </p>\n </SimpleStack>\n </Card>\n\n {/* FormTagsInput */}\n <Card className=\"border shadow-sm p-4\">\n <SimpleStack gap=\"sm\">\n <h2>FormTagsInput</h2>\n <p className=\"text-sm text-muted-foreground\">\n Free-text tag input with creation and deletion.\n </p>\n\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <ExampleBlock label=\"Basic\">\n <FormTagsInput\n label=\"Technologies\"\n value={tagsValue}\n onChange={setTagsValue}\n placeholder=\"Type and press Enter to add tags\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"With description\">\n <FormTagsInput\n label=\"Skills\"\n description=\"Add your programming skills (press Enter after each)\"\n value={tagsValue}\n onChange={setTagsValue}\n placeholder=\"e.g., React, Node.js\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"Required\">\n <FormTagsInput\n label=\"Keywords\"\n required\n value={tagsValue}\n onChange={setTagsValue}\n placeholder=\"Add at least one keyword\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"With error\">\n <FormTagsInput\n label=\"Tags\"\n value={tagsValue}\n onChange={setTagsValue}\n error=\"Maximum 5 tags allowed\"\n placeholder=\"Add tags\"\n />\n </ExampleBlock>\n <ExampleBlock label=\"Disabled\">\n <FormTagsInput\n label=\"Fixed Tags\"\n value={[\"readonly\", \"tags\"]}\n onChange={() => {}}\n disabled\n placeholder=\"Cannot edit\"\n />\n </ExampleBlock>\n </div>\n\n <pre className=\"text-xs bg-muted p-2 rounded overflow-x-auto\">\n <code>{`<FormTagsInput\n label=\"Technologies\"\n value={tagsValue}\n onChange={setTagsValue}\n placeholder=\"Type and press Enter\"\n description=\"Optional description\"\n/>`}</code>\n </pre>\n\n <p className=\"text-xs text-muted-foreground\">\n Current tags:{\" \"}\n {tagsValue.length > 0 ? tagsValue.join(\", \") : \"(none)\"}\n </p>\n </SimpleStack>\n </Card>\n </SimpleStack>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}