@kjaniec-dev/ui-mcp 0.7.2 → 0.9.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 (2) hide show
  1. package/data/components.json +2399 -217
  2. package/package.json +8 -6
@@ -62,7 +62,7 @@
62
62
  "size": "md"
63
63
  }
64
64
  },
65
- "usageSnippet": "<Button variant=\"primary\">Primary</Button>"
65
+ "usageSnippet": "<Button size=\"sm\">Get Started</Button>"
66
66
  },
67
67
  {
68
68
  "name": "Badge",
@@ -191,6 +191,136 @@
191
191
  "cva": null,
192
192
  "usageSnippet": "<Progress {...args} />"
193
193
  },
194
+ {
195
+ "name": "ProgressRing",
196
+ "importPath": "import { ProgressRing } from \"@kjaniec-dev/ui\";",
197
+ "description": "React component ProgressRing.",
198
+ "props": [
199
+ {
200
+ "name": "value",
201
+ "type": "number",
202
+ "optional": true,
203
+ "defaultValue": "0",
204
+ "description": "Current progress value. Defaults to 0."
205
+ },
206
+ {
207
+ "name": "min",
208
+ "type": "number",
209
+ "optional": true,
210
+ "defaultValue": "0",
211
+ "description": "Minimum progress value. Defaults to 0."
212
+ },
213
+ {
214
+ "name": "max",
215
+ "type": "number",
216
+ "optional": true,
217
+ "defaultValue": "100",
218
+ "description": "Maximum progress value. Defaults to 100."
219
+ },
220
+ {
221
+ "name": "size",
222
+ "type": "ProgressRingSize",
223
+ "optional": true,
224
+ "defaultValue": "\"md\"",
225
+ "description": "Preset size of the ring. Defaults to \"md\"."
226
+ },
227
+ {
228
+ "name": "strokeWidth",
229
+ "type": "number",
230
+ "optional": true,
231
+ "defaultValue": null,
232
+ "description": "Override stroke thickness (in px)."
233
+ },
234
+ {
235
+ "name": "tone",
236
+ "type": "ProgressRingTone",
237
+ "optional": true,
238
+ "defaultValue": "\"primary\"",
239
+ "description": "Color tone of the progress indicator. Defaults to \"primary\"."
240
+ },
241
+ {
242
+ "name": "showValue",
243
+ "type": "boolean",
244
+ "optional": true,
245
+ "defaultValue": "false",
246
+ "description": "Whether to show the percentage text inside the ring center if no children are provided. Defaults to false."
247
+ },
248
+ {
249
+ "name": "formatValue",
250
+ "type": "(value: number, percentage: number) => React.ReactNode",
251
+ "optional": true,
252
+ "defaultValue": null,
253
+ "description": "Optional formatter for the center percentage display."
254
+ },
255
+ {
256
+ "name": "trackClassName",
257
+ "type": "string",
258
+ "optional": true,
259
+ "defaultValue": null,
260
+ "description": "Additional CSS class for the background track circle."
261
+ },
262
+ {
263
+ "name": "indicatorClassName",
264
+ "type": "string",
265
+ "optional": true,
266
+ "defaultValue": null,
267
+ "description": "Additional CSS class for the progress indicator circle."
268
+ },
269
+ {
270
+ "name": "children",
271
+ "type": "React.ReactNode",
272
+ "optional": true,
273
+ "defaultValue": null,
274
+ "description": "Custom center content."
275
+ }
276
+ ],
277
+ "cva": null,
278
+ "usageSnippet": "<ProgressRing value={75} size=\"sm\" showValue />\n <p style={{ marginTop: 8, fontSize: 12 }}>Small (sm)</p>\n </div>\n <div style={{ textAlign: \"center\" }}>\n <ProgressRing value={75} size=\"md\" showValue />\n <p style={{ marginTop: 8, fontSize: 12 }}>Medium (md)</p>\n </div>\n <div style={{ textAlign: \"center\" }}>\n <ProgressRing value={75} size=\"lg\" showValue />\n <p style={{ marginTop: 8, fontSize: 12 }}>Large (lg)</p>\n </div>\n <div style={{ textAlign: \"center\" }}>\n <ProgressRing value={75} size=\"xl\" showValue />\n <p style={{ marginTop: 8, fontSize: 12 }}>Extra Large (xl)</p>\n </div>\n </div>\n ),\n};\n\nexport const Tones: Story = {\n render: () => (\n <div style={{ display: \"flex\", gap: 20, alignItems: \"center\", flexWrap: \"wrap\" }}>\n <ProgressRing value={60} tone=\"primary\" showValue />\n <ProgressRing value={60} tone=\"secondary\" showValue />\n <ProgressRing value={60} tone=\"success\" showValue />\n <ProgressRing value={60} tone=\"warning\" showValue />\n <ProgressRing value={60} tone=\"danger\" showValue />\n <ProgressRing value={60} tone=\"info\" showValue />\n </div>\n ),\n};\n\nexport const CustomFormatting: Story = {\n render: () => (\n <div style={{ display: \"flex\", gap: 24, alignItems: \"center\", flexWrap: \"wrap\" }}>\n <ProgressRing\n value={3}\n max={5}\n size=\"lg\"\n tone=\"success\"\n formatValue={(val) => (\n <span style={{ fontSize: 14, fontWeight: \"bold\" }}>{val} / 5</span>\n )}\n />\n <ProgressRing\n value={80}\n size=\"lg\"\n tone=\"info\"\n formatValue={(val) => (\n <div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\" }}>\n <span style={{ fontSize: 16, fontWeight: \"bold\" }}>{val}GB</span>\n <span style={{ fontSize: 10, opacity: 0.7 }}>of 100GB</span>\n </div>\n )}\n />\n <ProgressRing value={100} size=\"lg\" tone=\"success\">\n <span style={{ fontSize: 20 }}>✓</span>\n </ProgressRing>"
279
+ },
280
+ {
281
+ "name": "ProgressRingField",
282
+ "importPath": "import { ProgressRingField } from \"@kjaniec-dev/ui\";",
283
+ "description": "React component ProgressRingField.",
284
+ "props": [
285
+ {
286
+ "name": "label",
287
+ "type": "string",
288
+ "optional": false,
289
+ "defaultValue": null,
290
+ "description": "Field label text."
291
+ },
292
+ {
293
+ "name": "hint",
294
+ "type": "string",
295
+ "optional": true,
296
+ "defaultValue": null,
297
+ "description": "Helper hint text displayed beneath the control."
298
+ },
299
+ {
300
+ "name": "error",
301
+ "type": "string",
302
+ "optional": true,
303
+ "defaultValue": null,
304
+ "description": "Error message displayed beneath the control."
305
+ },
306
+ {
307
+ "name": "required",
308
+ "type": "boolean",
309
+ "optional": true,
310
+ "defaultValue": null,
311
+ "description": "Renders a required indicator (*)."
312
+ },
313
+ {
314
+ "name": "fieldClassName",
315
+ "type": "string",
316
+ "optional": true,
317
+ "defaultValue": null,
318
+ "description": "Class name for the outer field wrapper div."
319
+ }
320
+ ],
321
+ "cva": null,
322
+ "usageSnippet": "<ProgressRingField\n label=\"Storage Limit\"\n hint=\"75% of your allocated disk storage used\"\n value={75}\n size=\"lg\"\n tone=\"warning\"\n showValue\n/>"
323
+ },
194
324
  {
195
325
  "name": "Input",
196
326
  "importPath": "import { Input } from \"@kjaniec-dev/ui\";",
@@ -305,7 +435,7 @@
305
435
  "description": "Vertical label + control + hint group.",
306
436
  "props": [],
307
437
  "cva": null,
308
- "usageSnippet": "<Field>\n <Label required>Full name</Label>\n <Input placeholder=\"Jane Doe\" />"
438
+ "usageSnippet": "<Field>\n <Label required>Full name</Label>\n <Input placeholder=\"Jane Doe\" />\n <Hint>This is how your team will see you.</Hint>\n</Field>"
309
439
  },
310
440
  {
311
441
  "name": "Select",
@@ -321,7 +451,7 @@
321
451
  }
322
452
  ],
323
453
  "cva": null,
324
- "usageSnippet": "<Select>\n <option>Personal Portfolio</option>\n <option>B2B Landlord SaaS</option>\n <option>Accounting App</option>\n </Select>"
454
+ "usageSnippet": "<Select>\n <option>Personal Portfolio</option>\n <option>B2B Landlord SaaS</option>\n <option>Accounting App</option>\n</Select>"
325
455
  },
326
456
  {
327
457
  "name": "SelectField",
@@ -488,7 +618,58 @@
488
618
  }
489
619
  ],
490
620
  "cva": null,
491
- "usageSnippet": "<Segmented\n value={v}\n onChange={setV}\n options={[\n { value: \"day\", label: \"Day\" },\n { value: \"week\", label: \"Week\" },\n { value: \"month\", label: \"Month\" },\n ]}\n />"
621
+ "usageSnippet": "<Segmented\n value={v}\n onChange={setV}\n options={[\n { value: \"day\", label: \"Day\" },\n { value: \"week\", label: \"Week\" },\n { value: \"month\", label: \"Month\" },\n ]}\n/>"
622
+ },
623
+ {
624
+ "name": "ToggleGroup",
625
+ "importPath": "import { ToggleGroup } from \"@kjaniec-dev/ui\";",
626
+ "description": "Multi-select toggle row. Always controlled — each button's pressed state is independent.",
627
+ "props": [
628
+ {
629
+ "name": "options",
630
+ "type": "ToggleGroupOption<T>[]",
631
+ "optional": false,
632
+ "defaultValue": null,
633
+ "description": ""
634
+ },
635
+ {
636
+ "name": "value",
637
+ "type": "T[]",
638
+ "optional": false,
639
+ "defaultValue": null,
640
+ "description": ""
641
+ },
642
+ {
643
+ "name": "onChange",
644
+ "type": "(value: T[]) => void",
645
+ "optional": false,
646
+ "defaultValue": null,
647
+ "description": ""
648
+ },
649
+ {
650
+ "name": "disabled",
651
+ "type": "boolean",
652
+ "optional": true,
653
+ "defaultValue": null,
654
+ "description": ""
655
+ },
656
+ {
657
+ "name": "className",
658
+ "type": "string",
659
+ "optional": true,
660
+ "defaultValue": null,
661
+ "description": ""
662
+ },
663
+ {
664
+ "name": "\"aria-label\"",
665
+ "type": "string",
666
+ "optional": false,
667
+ "defaultValue": null,
668
+ "description": ""
669
+ }
670
+ ],
671
+ "cva": null,
672
+ "usageSnippet": "<ToggleGroup options={options} value={value} onChange={setValue} aria-label=\"Text formatting\" />"
492
673
  },
493
674
  {
494
675
  "name": "Card",
@@ -518,7 +699,7 @@
518
699
  }
519
700
  ],
520
701
  "cva": null,
521
- "usageSnippet": "<Card elevated>\n <CardContent style={{ paddingTop: \"1.35rem\" }}>\n <CardTitle>Q3 Quarterly Report</CardTitle>\n <CardDescription>A summary of results and key product metrics.</CardDescription>\n </CardContent>\n </Card>"
702
+ "usageSnippet": "<Card>\n <CardHeader>\n <Badge variant=\"primary\" className=\"self-start\">Pro</Badge>\n <CardTitle>Team Workspace</CardTitle>\n <CardDescription>Unlimited projects, roles and activity history for your whole team.</CardDescription>\n </CardHeader>\n <CardFooter>\n <Button size=\"sm\">Choose plan</Button>\n <Button size=\"sm\" variant=\"ghost\">Details</Button>\n </CardFooter>\n</Card>"
522
703
  },
523
704
  {
524
705
  "name": "CardHeader",
@@ -526,7 +707,7 @@
526
707
  "description": "React component CardHeader.",
527
708
  "props": [],
528
709
  "cva": null,
529
- "usageSnippet": "<CardHeader>\n <CardTitle>Semantic Article Card</CardTitle>\n <CardDescription>This card renders as an &lt;article&gt; element.</CardDescription>\n </CardHeader>"
710
+ "usageSnippet": "<CardHeader>\n <Badge variant=\"primary\" className=\"self-start\">Pro</Badge>\n <CardTitle>Team Workspace</CardTitle>\n <CardDescription>Unlimited projects, roles and activity history for your whole team.</CardDescription>\n</CardHeader>"
530
711
  },
531
712
  {
532
713
  "name": "CardTitle",
@@ -550,7 +731,7 @@
550
731
  "description": "Body region with default padding.",
551
732
  "props": [],
552
733
  "cva": null,
553
- "usageSnippet": "<CardContent style={{ paddingTop: \"1.35rem\" }}>\n <CardTitle>Q3 Quarterly Report</CardTitle>\n <CardDescription>A summary of results and key product metrics.</CardDescription>\n </CardContent>"
734
+ "usageSnippet": "<CardContent style={{ paddingTop: \"1.35rem\" }}>\n <CardTitle>Q3 Quarterly Report</CardTitle>\n <CardDescription>A summary of results and key product metrics.</CardDescription>\n</CardContent>"
554
735
  },
555
736
  {
556
737
  "name": "CardFooter",
@@ -558,7 +739,7 @@
558
739
  "description": "React component CardFooter.",
559
740
  "props": [],
560
741
  "cva": null,
561
- "usageSnippet": "<CardFooter>\n <Button size=\"sm\">Choose plan</Button>\n <Button size=\"sm\" variant=\"ghost\">Details</Button>\n </CardFooter>"
742
+ "usageSnippet": "<CardFooter>\n <Button size=\"sm\">Choose plan</Button>\n <Button size=\"sm\" variant=\"ghost\">Details</Button>\n</CardFooter>"
562
743
  },
563
744
  {
564
745
  "name": "Stat",
@@ -698,7 +879,7 @@
698
879
  "tone": "secondary"
699
880
  }
700
881
  },
701
- "usageSnippet": "<AvatarGroup>\n <Avatar>AK</Avatar>\n <Avatar tone=\"primary\">MR</Avatar>\n <Avatar tone=\"info\">JN</Avatar>\n <Avatar tone=\"muted\">+9</Avatar>\n </AvatarGroup>"
882
+ "usageSnippet": "<AvatarGroup>\n <Avatar>AK</Avatar>\n <Avatar tone=\"primary\">MR</Avatar>\n <Avatar tone=\"info\">JN</Avatar>\n <Avatar tone=\"muted\">+9</Avatar>\n</AvatarGroup>"
702
883
  },
703
884
  {
704
885
  "name": "Tabs",
@@ -728,7 +909,7 @@
728
909
  }
729
910
  ],
730
911
  "cva": null,
731
- "usageSnippet": "<Tabs defaultValue=\"overview\">\n <TabsList>\n <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n <TabsTrigger value=\"activity\">Activity</TabsTrigger>\n <TabsTrigger value=\"settings\">Settings</TabsTrigger>\n </TabsList>\n <TabsContent value=\"overview\">A dashboard with key metrics and quick actions.</TabsContent>\n <TabsContent value=\"activity\">An event timeline: sign-ins, edits and comments.</TabsContent>\n <TabsContent value=\"settings\">Workspace preferences, permissions and integrations.</TabsContent>\n </Tabs>"
912
+ "usageSnippet": "<Tabs defaultValue=\"overview\">\n <TabsList>\n <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n <TabsTrigger value=\"activity\">Activity</TabsTrigger>\n <TabsTrigger value=\"settings\">Settings</TabsTrigger>\n </TabsList>\n <TabsContent value=\"overview\">A dashboard with key metrics and quick actions.</TabsContent>\n <TabsContent value=\"activity\">An event timeline: sign-ins, edits and comments.</TabsContent>\n <TabsContent value=\"settings\">Workspace preferences, permissions and integrations.</TabsContent>\n</Tabs>"
732
913
  },
733
914
  {
734
915
  "name": "TabsList",
@@ -736,7 +917,7 @@
736
917
  "description": "React component TabsList.",
737
918
  "props": [],
738
919
  "cva": null,
739
- "usageSnippet": "<TabsList>\n <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n <TabsTrigger value=\"activity\">Activity</TabsTrigger>\n <TabsTrigger value=\"settings\">Settings</TabsTrigger>\n </TabsList>"
920
+ "usageSnippet": "<TabsList>\n <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n <TabsTrigger value=\"activity\">Activity</TabsTrigger>\n <TabsTrigger value=\"settings\">Settings</TabsTrigger>\n</TabsList>"
740
921
  },
741
922
  {
742
923
  "name": "TabsTrigger",
@@ -791,7 +972,7 @@
791
972
  }
792
973
  ],
793
974
  "cva": null,
794
- "usageSnippet": "<Accordion type=\"single\" defaultValue={[\"a\"]}>\n <AccordionItem value=\"a\"><AccordionTrigger>How does billing work?</AccordionTrigger><AccordionContent>Monthly or annually — the annual plan includes two months free.</AccordionContent></AccordionItem>\n <AccordionItem value=\"b\"><AccordionTrigger>Can I change my plan later?</AccordionTrigger><AccordionContent>Yes, at any time. The difference is prorated.</AccordionContent></AccordionItem>\n <AccordionItem value=\"c\"><AccordionTrigger>What payment methods are supported?</AccordionTrigger><AccordionContent>Visa, Mastercard and Apple Pay.</AccordionContent></AccordionItem>\n </Accordion>"
975
+ "usageSnippet": "<Accordion type=\"single\" defaultValue={[\"a\"]}>\n <AccordionItem value=\"a\"><AccordionTrigger>How does billing work?</AccordionTrigger><AccordionContent>Monthly or annually — the annual plan includes two months free.</AccordionContent></AccordionItem>\n <AccordionItem value=\"b\"><AccordionTrigger>Can I change my plan later?</AccordionTrigger><AccordionContent>Yes, at any time. The difference is prorated.</AccordionContent></AccordionItem>\n <AccordionItem value=\"c\"><AccordionTrigger>What payment methods are supported?</AccordionTrigger><AccordionContent>Visa, Mastercard and Apple Pay.</AccordionContent></AccordionItem>\n</Accordion>"
795
976
  },
796
977
  {
797
978
  "name": "AccordionItem",
@@ -839,7 +1020,7 @@
839
1020
  }
840
1021
  ],
841
1022
  "cva": null,
842
- "usageSnippet": "<DropdownMenu>\n <DropdownMenuTrigger>\n <Button variant=\"outline\">Actions</Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem>Edit</DropdownMenuItem>\n <DropdownMenuItem>Duplicate</DropdownMenuItem>\n <DropdownMenuSeparator />"
1023
+ "usageSnippet": "<DropdownMenu>\n <DropdownMenuTrigger>\n <Button variant=\"outline\">Actions</Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem>Edit</DropdownMenuItem>\n <DropdownMenuItem>Duplicate</DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem danger>Delete</DropdownMenuItem>\n </DropdownMenuContent>\n</DropdownMenu>"
843
1024
  },
844
1025
  {
845
1026
  "name": "DropdownMenuTrigger",
@@ -847,7 +1028,7 @@
847
1028
  "description": "React component DropdownMenuTrigger.",
848
1029
  "props": [],
849
1030
  "cva": null,
850
- "usageSnippet": "<DropdownMenuTrigger>\n <Button variant=\"outline\">Actions</Button>\n </DropdownMenuTrigger>"
1031
+ "usageSnippet": "<DropdownMenuTrigger>\n <Button variant=\"outline\">Actions</Button>\n</DropdownMenuTrigger>"
851
1032
  },
852
1033
  {
853
1034
  "name": "DropdownMenuContent",
@@ -863,7 +1044,7 @@
863
1044
  }
864
1045
  ],
865
1046
  "cva": null,
866
- "usageSnippet": "<DropdownMenuContent>\n <DropdownMenuItem>Edit</DropdownMenuItem>\n <DropdownMenuItem>Duplicate</DropdownMenuItem>\n <DropdownMenuSeparator />"
1047
+ "usageSnippet": "<DropdownMenuContent>\n <DropdownMenuItem>Edit</DropdownMenuItem>\n <DropdownMenuItem>Duplicate</DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem danger>Delete</DropdownMenuItem>\n</DropdownMenuContent>"
867
1048
  },
868
1049
  {
869
1050
  "name": "DropdownMenuItem",
@@ -910,7 +1091,7 @@
910
1091
  }
911
1092
  ],
912
1093
  "cva": null,
913
- "usageSnippet": "<Breadcrumb>\n <BreadcrumbItem href=\"#\">Workspace</BreadcrumbItem>\n <BreadcrumbSeparator />"
1094
+ "usageSnippet": "<Breadcrumb>\n <BreadcrumbItem href=\"#\">Workspace</BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem href=\"#\">Projects</BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem current>Q3 Launch</BreadcrumbItem>\n</Breadcrumb>"
914
1095
  },
915
1096
  {
916
1097
  "name": "BreadcrumbItem",
@@ -1010,64 +1191,6 @@
1010
1191
  "cva": null,
1011
1192
  "usageSnippet": "<BottomNavigation items={navItems} fixed={false} showLabels=\"always\" />"
1012
1193
  },
1013
- {
1014
- "name": "BottomNavigationItem",
1015
- "importPath": "import { BottomNavigationItem } from \"@kjaniec-dev/ui\";",
1016
- "description": "React component BottomNavigationItem.",
1017
- "props": [
1018
- {
1019
- "name": "id",
1020
- "type": "string",
1021
- "optional": false,
1022
- "defaultValue": null,
1023
- "description": ""
1024
- },
1025
- {
1026
- "name": "label",
1027
- "type": "string",
1028
- "optional": false,
1029
- "defaultValue": null,
1030
- "description": ""
1031
- },
1032
- {
1033
- "name": "href",
1034
- "type": "string",
1035
- "optional": true,
1036
- "defaultValue": null,
1037
- "description": ""
1038
- },
1039
- {
1040
- "name": "onClick",
1041
- "type": "() => void",
1042
- "optional": true,
1043
- "defaultValue": null,
1044
- "description": ""
1045
- },
1046
- {
1047
- "name": "icon",
1048
- "type": "React.ReactNode",
1049
- "optional": false,
1050
- "defaultValue": null,
1051
- "description": ""
1052
- },
1053
- {
1054
- "name": "active",
1055
- "type": "boolean",
1056
- "optional": true,
1057
- "defaultValue": null,
1058
- "description": ""
1059
- },
1060
- {
1061
- "name": "badge",
1062
- "type": "React.ReactNode",
1063
- "optional": true,
1064
- "defaultValue": null,
1065
- "description": ""
1066
- }
1067
- ],
1068
- "cva": null,
1069
- "usageSnippet": "<BottomNavigationItem>\n <!-- Content -->\n</BottomNavigationItem>"
1070
- },
1071
1194
  {
1072
1195
  "name": "Table",
1073
1196
  "importPath": "import { Table } from \"@kjaniec-dev/ui\";",
@@ -1082,7 +1205,7 @@
1082
1205
  }
1083
1206
  ],
1084
1207
  "cva": null,
1085
- "usageSnippet": "<Table>\n <TableHeader>\n <TableRow>\n <TableHead>User</TableHead>\n <TableHead>Role</TableHead>\n <TableHead>Status</TableHead>\n <TableHead numeric>Projects</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\" tone=\"primary\">AK</Avatar>Anna Kowalski</div></TableCell>\n <TableCell>Administrator</TableCell>\n <TableCell><Badge variant=\"success\" dot>Active</Badge></TableCell>\n <TableCell numeric>24</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\">MR</Avatar>Michael Rutkowski</div></TableCell>\n <TableCell>Editor</TableCell>\n <TableCell><Badge variant=\"warning\" dot>Invited</Badge></TableCell>\n <TableCell numeric>12</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\" tone=\"info\">JN</Avatar>Julia Nowak</div></TableCell>\n <TableCell>Viewer</TableCell>\n <TableCell><Badge>Inactive</Badge></TableCell>\n <TableCell numeric>3</TableCell>\n </TableRow>\n </TableBody>\n </Table>"
1208
+ "usageSnippet": "<Table>\n <TableHeader>\n <TableRow>\n <TableHead>User</TableHead>\n <TableHead>Role</TableHead>\n <TableHead>Status</TableHead>\n <TableHead numeric>Projects</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\" tone=\"primary\">AK</Avatar>Anna Kowalski</div></TableCell>\n <TableCell>Administrator</TableCell>\n <TableCell><Badge variant=\"success\" dot>Active</Badge></TableCell>\n <TableCell numeric>24</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\">MR</Avatar>Michael Rutkowski</div></TableCell>\n <TableCell>Editor</TableCell>\n <TableCell><Badge variant=\"warning\" dot>Invited</Badge></TableCell>\n <TableCell numeric>12</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\" tone=\"info\">JN</Avatar>Julia Nowak</div></TableCell>\n <TableCell>Viewer</TableCell>\n <TableCell><Badge>Inactive</Badge></TableCell>\n <TableCell numeric>3</TableCell>\n </TableRow>\n </TableBody>\n</Table>"
1086
1209
  },
1087
1210
  {
1088
1211
  "name": "TableWrap",
@@ -1090,7 +1213,7 @@
1090
1213
  "description": "Rounded, bordered wrapper around a <Table>.",
1091
1214
  "props": [],
1092
1215
  "cva": null,
1093
- "usageSnippet": "<TableWrap>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>User</TableHead>\n <TableHead>Role</TableHead>\n <TableHead>Status</TableHead>\n <TableHead numeric>Projects</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\" tone=\"primary\">AK</Avatar>Anna Kowalski</div></TableCell>\n <TableCell>Administrator</TableCell>\n <TableCell><Badge variant=\"success\" dot>Active</Badge></TableCell>\n <TableCell numeric>24</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\">MR</Avatar>Michael Rutkowski</div></TableCell>\n <TableCell>Editor</TableCell>\n <TableCell><Badge variant=\"warning\" dot>Invited</Badge></TableCell>\n <TableCell numeric>12</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\" tone=\"info\">JN</Avatar>Julia Nowak</div></TableCell>\n <TableCell>Viewer</TableCell>\n <TableCell><Badge>Inactive</Badge></TableCell>\n <TableCell numeric>3</TableCell>\n </TableRow>\n </TableBody>\n </Table>\n </TableWrap>"
1216
+ "usageSnippet": "<TableWrap>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>User</TableHead>\n <TableHead>Role</TableHead>\n <TableHead>Status</TableHead>\n <TableHead numeric>Projects</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\" tone=\"primary\">AK</Avatar>Anna Kowalski</div></TableCell>\n <TableCell>Administrator</TableCell>\n <TableCell><Badge variant=\"success\" dot>Active</Badge></TableCell>\n <TableCell numeric>24</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\">MR</Avatar>Michael Rutkowski</div></TableCell>\n <TableCell>Editor</TableCell>\n <TableCell><Badge variant=\"warning\" dot>Invited</Badge></TableCell>\n <TableCell numeric>12</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\" tone=\"info\">JN</Avatar>Julia Nowak</div></TableCell>\n <TableCell>Viewer</TableCell>\n <TableCell><Badge>Inactive</Badge></TableCell>\n <TableCell numeric>3</TableCell>\n </TableRow>\n </TableBody>\n </Table>\n</TableWrap>"
1094
1217
  },
1095
1218
  {
1096
1219
  "name": "TableHeader",
@@ -1098,7 +1221,7 @@
1098
1221
  "description": "React component TableHeader.",
1099
1222
  "props": [],
1100
1223
  "cva": null,
1101
- "usageSnippet": "<TableHeader>\n <TableRow>\n <TableHead>User</TableHead>\n <TableHead>Role</TableHead>\n <TableHead>Status</TableHead>\n <TableHead numeric>Projects</TableHead>\n </TableRow>\n </TableHeader>"
1224
+ "usageSnippet": "<TableHeader>\n <TableRow>\n <TableHead>User</TableHead>\n <TableHead>Role</TableHead>\n <TableHead>Status</TableHead>\n <TableHead numeric>Projects</TableHead>\n </TableRow>\n</TableHeader>"
1102
1225
  },
1103
1226
  {
1104
1227
  "name": "TableBody",
@@ -1106,7 +1229,7 @@
1106
1229
  "description": "React component TableBody.",
1107
1230
  "props": [],
1108
1231
  "cva": null,
1109
- "usageSnippet": "<TableBody>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\" tone=\"primary\">AK</Avatar>Anna Kowalski</div></TableCell>\n <TableCell>Administrator</TableCell>\n <TableCell><Badge variant=\"success\" dot>Active</Badge></TableCell>\n <TableCell numeric>24</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\">MR</Avatar>Michael Rutkowski</div></TableCell>\n <TableCell>Editor</TableCell>\n <TableCell><Badge variant=\"warning\" dot>Invited</Badge></TableCell>\n <TableCell numeric>12</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\" tone=\"info\">JN</Avatar>Julia Nowak</div></TableCell>\n <TableCell>Viewer</TableCell>\n <TableCell><Badge>Inactive</Badge></TableCell>\n <TableCell numeric>3</TableCell>\n </TableRow>\n </TableBody>"
1232
+ "usageSnippet": "<TableBody>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\" tone=\"primary\">AK</Avatar>Anna Kowalski</div></TableCell>\n <TableCell>Administrator</TableCell>\n <TableCell><Badge variant=\"success\" dot>Active</Badge></TableCell>\n <TableCell numeric>24</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\">MR</Avatar>Michael Rutkowski</div></TableCell>\n <TableCell>Editor</TableCell>\n <TableCell><Badge variant=\"warning\" dot>Invited</Badge></TableCell>\n <TableCell numeric>12</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}><Avatar size=\"sm\" tone=\"info\">JN</Avatar>Julia Nowak</div></TableCell>\n <TableCell>Viewer</TableCell>\n <TableCell><Badge>Inactive</Badge></TableCell>\n <TableCell numeric>3</TableCell>\n </TableRow>\n</TableBody>"
1110
1233
  },
1111
1234
  {
1112
1235
  "name": "TableRow",
@@ -1114,7 +1237,7 @@
1114
1237
  "description": "React component TableRow.",
1115
1238
  "props": [],
1116
1239
  "cva": null,
1117
- "usageSnippet": "<TableRow>\n <TableHead>User</TableHead>\n <TableHead>Role</TableHead>\n <TableHead>Status</TableHead>\n <TableHead numeric>Projects</TableHead>\n </TableRow>"
1240
+ "usageSnippet": "<TableRow>\n <TableHead>User</TableHead>\n <TableHead>Role</TableHead>\n <TableHead>Status</TableHead>\n <TableHead numeric>Projects</TableHead>\n</TableRow>"
1118
1241
  },
1119
1242
  {
1120
1243
  "name": "TableHead",
@@ -1168,7 +1291,7 @@
1168
1291
  }
1169
1292
  ],
1170
1293
  "cva": null,
1171
- "usageSnippet": "<Tooltip content=\"Contextual tooltip\">\n <Button variant=\"outline\">Hover over me</Button>\n </Tooltip>"
1294
+ "usageSnippet": "<Tooltip content=\"Contextual tooltip\">\n <Button variant=\"outline\">Hover over me</Button>\n</Tooltip>"
1172
1295
  },
1173
1296
  {
1174
1297
  "name": "Modal",
@@ -1219,7 +1342,7 @@
1219
1342
  }
1220
1343
  ],
1221
1344
  "cva": null,
1222
- "usageSnippet": "<Modal open={open} onClose={() => setOpen(false)}>\n <ModalTitle>Delete project “Q3 Launch”?</ModalTitle>\n <ModalDescription>This action cannot be undone. All files and activity history will be permanently deleted.</ModalDescription>\n <ModalActions>\n <Button variant=\"ghost\" onClick={() => setOpen(false)}>Cancel</Button>\n <Button variant=\"danger\" onClick={() => setOpen(false)}>Delete project</Button>\n </ModalActions>\n </Modal>"
1345
+ "usageSnippet": "<Modal open={open} onClose={() => setOpen(false)}>\n <ModalTitle>Delete project “Q3 Launch”?</ModalTitle>\n <ModalDescription>This action cannot be undone. All files and activity history will be permanently deleted.</ModalDescription>\n <ModalActions>\n <Button variant=\"ghost\" onClick={() => setOpen(false)}>Cancel</Button>\n <Button variant=\"danger\" onClick={() => setOpen(false)}>Delete project</Button>\n </ModalActions>\n</Modal>"
1223
1346
  },
1224
1347
  {
1225
1348
  "name": "ModalTitle",
@@ -1243,7 +1366,7 @@
1243
1366
  "description": "React component ModalActions.",
1244
1367
  "props": [],
1245
1368
  "cva": null,
1246
- "usageSnippet": "<ModalActions>\n <Button variant=\"ghost\" onClick={() => setOpen(false)}>Cancel</Button>\n <Button variant=\"danger\" onClick={() => setOpen(false)}>Delete project</Button>\n </ModalActions>"
1369
+ "usageSnippet": "<ModalActions>\n <Button variant=\"ghost\" onClick={() => setOpen(false)}>Cancel</Button>\n <Button variant=\"danger\" onClick={() => setOpen(false)}>Delete project</Button>\n</ModalActions>"
1247
1370
  },
1248
1371
  {
1249
1372
  "name": "ToastProvider",
@@ -1251,7 +1374,7 @@
1251
1374
  "description": "React component ToastProvider.",
1252
1375
  "props": [],
1253
1376
  "cva": null,
1254
- "usageSnippet": "<ToastProvider>\n <ToastDemo />"
1377
+ "usageSnippet": "<ToastProvider>\n <ToastDemo />\n</ToastProvider>"
1255
1378
  },
1256
1379
  {
1257
1380
  "name": "PageHeader",
@@ -1288,7 +1411,65 @@
1288
1411
  }
1289
1412
  ],
1290
1413
  "cva": null,
1291
- "usageSnippet": "<PageHeader\n eyebrow=\"B2B SaaS\"\n title=\"Dashboard Shell\"\n description=\"The shell structure renders a responsive frame container with a sticky sidebar, topbar, and main canvas.\"\n actions={<Button size=\"sm\">New Project</Button>}\n />"
1414
+ "usageSnippet": "<PageHeader\n eyebrow=\"B2B SaaS\"\n title=\"Dashboard Shell\"\n description=\"The shell structure renders a responsive frame container with a sticky sidebar, topbar, and main canvas.\"\n actions={<Button size=\"sm\">New Project</Button>}\n/>"
1415
+ },
1416
+ {
1417
+ "name": "SectionHeader",
1418
+ "importPath": "import { SectionHeader } from \"@kjaniec-dev/ui\";",
1419
+ "description": "React component SectionHeader.",
1420
+ "props": [
1421
+ {
1422
+ "name": "kicker",
1423
+ "type": "React.ReactNode",
1424
+ "optional": true,
1425
+ "defaultValue": null,
1426
+ "description": ""
1427
+ },
1428
+ {
1429
+ "name": "title",
1430
+ "type": "React.ReactNode",
1431
+ "optional": true,
1432
+ "defaultValue": null,
1433
+ "description": ""
1434
+ },
1435
+ {
1436
+ "name": "description",
1437
+ "type": "React.ReactNode",
1438
+ "optional": true,
1439
+ "defaultValue": null,
1440
+ "description": ""
1441
+ },
1442
+ {
1443
+ "name": "actions",
1444
+ "type": "React.ReactNode",
1445
+ "optional": true,
1446
+ "defaultValue": null,
1447
+ "description": ""
1448
+ },
1449
+ {
1450
+ "name": "align",
1451
+ "type": "SectionHeaderAlign",
1452
+ "optional": true,
1453
+ "defaultValue": null,
1454
+ "description": ""
1455
+ },
1456
+ {
1457
+ "name": "headingLevel",
1458
+ "type": "SectionHeaderHeadingLevel",
1459
+ "optional": true,
1460
+ "defaultValue": null,
1461
+ "description": ""
1462
+ },
1463
+ {
1464
+ "name": "divider",
1465
+ "type": "boolean",
1466
+ "optional": true,
1467
+ "defaultValue": null,
1468
+ "description": ""
1469
+ }
1470
+ ],
1471
+ "cva": null,
1472
+ "usageSnippet": "<SectionHeader align=\"center\" divider>\n <SectionHeader.Kicker>Custom Section</SectionHeader.Kicker>\n <SectionHeader.Title as=\"h3\">Custom Compound Layout</SectionHeader.Title>\n <SectionHeader.Description>\n Fully customized layout constructed using compound sub-components.\n </SectionHeader.Description>\n <SectionHeader.Actions className=\"justify-center mt-4\">\n <Button variant=\"secondary\" size=\"sm\">\n Learn More\n </Button>\n </SectionHeader.Actions>\n</SectionHeader>"
1292
1473
  },
1293
1474
  {
1294
1475
  "name": "EmptyState",
@@ -1325,7 +1506,7 @@
1325
1506
  }
1326
1507
  ],
1327
1508
  "cva": null,
1328
- "usageSnippet": "<EmptyState\n title=\"No integrations active\"\n description=\"Connect your Slack, GitHub, or Discord channel to start receiving automated notifications.\"\n icon={\n <svg fill=\"none\" stroke=\"currentColor\" strokeWidth={2} viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" />"
1509
+ "usageSnippet": "<EmptyState\ntitle=\"No integrations active\"\ndescription=\"Connect your Slack, GitHub, or Discord channel to start receiving automated notifications.\"\nicon={\n <svg fill=\"none\" stroke=\"currentColor\" strokeWidth={2} viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" />"
1329
1510
  },
1330
1511
  {
1331
1512
  "name": "MetricCard",
@@ -1376,7 +1557,7 @@
1376
1557
  }
1377
1558
  ],
1378
1559
  "cva": null,
1379
- "usageSnippet": "<MetricCard\n title=\"Revenue\"\n value=\"$48,259.00\"\n trend=\"+8.2%\"\n trendDirection=\"up\"\n description=\"Total sales this quarter\"\n />"
1560
+ "usageSnippet": "<MetricCard\n title=\"Revenue\"\n value=\"$48,259.00\"\n trend=\"+8.2%\"\n trendDirection=\"up\"\n description=\"Total sales this quarter\"\n/>"
1380
1561
  },
1381
1562
  {
1382
1563
  "name": "DataTable",
@@ -1500,85 +1681,34 @@
1500
1681
  "usageSnippet": "<DataTable columns={columns} data={sampleData} />"
1501
1682
  },
1502
1683
  {
1503
- "name": "DataTableColumn",
1504
- "importPath": "import { DataTableColumn } from \"@kjaniec-dev/ui\";",
1505
- "description": "React component DataTableColumn.",
1684
+ "name": "FormField",
1685
+ "importPath": "import { FormField } from \"@kjaniec-dev/ui\";",
1686
+ "description": "React component FormField.",
1506
1687
  "props": [
1507
1688
  {
1508
- "name": "header",
1509
- "type": "React.ReactNode",
1689
+ "name": "label",
1690
+ "type": "string",
1510
1691
  "optional": false,
1511
1692
  "defaultValue": null,
1512
1693
  "description": ""
1513
1694
  },
1514
1695
  {
1515
- "name": "accessor",
1516
- "type": "(row: T) => React.ReactNode",
1517
- "optional": false,
1696
+ "name": "hint",
1697
+ "type": "string",
1698
+ "optional": true,
1518
1699
  "defaultValue": null,
1519
1700
  "description": ""
1520
1701
  },
1521
1702
  {
1522
- "name": "className",
1703
+ "name": "error",
1523
1704
  "type": "string",
1524
1705
  "optional": true,
1525
1706
  "defaultValue": null,
1526
1707
  "description": ""
1527
1708
  },
1528
1709
  {
1529
- "name": "align",
1530
- "type": "\"left\" | \"center\" | \"right\"",
1531
- "optional": true,
1532
- "defaultValue": null,
1533
- "description": ""
1534
- },
1535
- {
1536
- "name": "sortable",
1537
- "type": "boolean",
1538
- "optional": true,
1539
- "defaultValue": null,
1540
- "description": ""
1541
- },
1542
- {
1543
- "name": "sortKey",
1544
- "type": "string",
1545
- "optional": true,
1546
- "defaultValue": null,
1547
- "description": ""
1548
- }
1549
- ],
1550
- "cva": null,
1551
- "usageSnippet": "<DataTableColumn>\n <!-- Content -->\n</DataTableColumn>"
1552
- },
1553
- {
1554
- "name": "FormField",
1555
- "importPath": "import { FormField } from \"@kjaniec-dev/ui\";",
1556
- "description": "React component FormField.",
1557
- "props": [
1558
- {
1559
- "name": "label",
1560
- "type": "string",
1561
- "optional": false,
1562
- "defaultValue": null,
1563
- "description": ""
1564
- },
1565
- {
1566
- "name": "hint",
1567
- "type": "string",
1568
- "optional": true,
1569
- "defaultValue": null,
1570
- "description": ""
1571
- },
1572
- {
1573
- "name": "error",
1574
- "type": "string",
1575
- "optional": true,
1576
- "defaultValue": null,
1577
- "description": ""
1578
- },
1579
- {
1580
- "name": "required",
1581
- "type": "boolean",
1710
+ "name": "required",
1711
+ "type": "boolean",
1582
1712
  "optional": true,
1583
1713
  "defaultValue": null,
1584
1714
  "description": ""
@@ -1592,7 +1722,7 @@
1592
1722
  }
1593
1723
  ],
1594
1724
  "cva": null,
1595
- "usageSnippet": "<FormField label=\"Full Name\">\n <Input placeholder=\"John Doe\" />"
1725
+ "usageSnippet": "<FormField label=\"Full Name\">\n <Input placeholder=\"John Doe\" />\n</FormField>"
1596
1726
  },
1597
1727
  {
1598
1728
  "name": "ErrorState",
@@ -1629,7 +1759,7 @@
1629
1759
  }
1630
1760
  ],
1631
1761
  "cva": null,
1632
- "usageSnippet": "<ErrorState\n title=\"Failed to Load Invoices\"\n message=\"We encountered a temporary database error while retrieving your billing records.\"\n onRetry={() => alert(\"Retrying...\")}\n retryLabel=\"Reload Invoices\"\n />"
1762
+ "usageSnippet": "<ErrorState\n title=\"Failed to Load Invoices\"\n message=\"We encountered a temporary database error while retrieving your billing records.\"\n onRetry={() => alert(\"Retrying...\")}\n retryLabel=\"Reload Invoices\"\n/>"
1633
1763
  },
1634
1764
  {
1635
1765
  "name": "Skeleton",
@@ -1717,7 +1847,7 @@
1717
1847
  }
1718
1848
  ],
1719
1849
  "cva": null,
1720
- "usageSnippet": "<DashboardShell\n sidebar={\n <div className=\"p-6 flex flex-col gap-6 h-full bg-subtle\">\n <div className=\"font-bold text-lg tracking-tight text-primary\">KJ Product Kit</div>\n <nav className=\"flex flex-col gap-2\">\n <a href=\"#\" className=\"text-sm font-medium text-foreground hover:text-primary transition-colors\">Dashboard</a>\n <a href=\"#\" className=\"text-sm font-medium text-muted-foreground hover:text-primary transition-colors\">Projects</a>\n <a href=\"#\" className=\"text-sm font-medium text-muted-foreground hover:text-primary transition-colors\">Invoices</a>\n <a href=\"#\" className=\"text-sm font-medium text-muted-foreground hover:text-primary transition-colors\">Settings</a>\n </nav>\n </div>\n }\n topbar={\n <div className=\"w-full flex items-center justify-between\">\n <span className=\"text-sm font-medium text-muted-foreground\">Workspace / Personal</span>\n <Button size=\"sm\" variant=\"ghost\">Profile</Button>\n </div>\n }\n >\n <PageHeader\n eyebrow=\"B2B SaaS\"\n title=\"Dashboard Shell\"\n description=\"The shell structure renders a responsive frame container with a sticky sidebar, topbar, and main canvas.\"\n actions={<Button size=\"sm\">New Project</Button>}\n />"
1850
+ "usageSnippet": "<DashboardShell\n sidebar={\n <div className=\"p-6 flex flex-col gap-6 h-full bg-subtle\">\n <div className=\"font-bold text-lg tracking-tight text-primary\">KJ Product Kit</div>\n <nav className=\"flex flex-col gap-2\">\n <a href=\"#\" className=\"text-sm font-medium text-foreground hover:text-primary transition-colors\">Dashboard</a>\n <a href=\"#\" className=\"text-sm font-medium text-muted-foreground hover:text-primary transition-colors\">Projects</a>\n <a href=\"#\" className=\"text-sm font-medium text-muted-foreground hover:text-primary transition-colors\">Invoices</a>\n <a href=\"#\" className=\"text-sm font-medium text-muted-foreground hover:text-primary transition-colors\">Settings</a>\n </nav>\n </div>\n }\n topbar={\n <div className=\"w-full flex items-center justify-between\">\n <span className=\"text-sm font-medium text-muted-foreground\">Workspace / Personal</span>\n <Button size=\"sm\" variant=\"ghost\">Profile</Button>\n </div>\n }\n>\n <PageHeader\n eyebrow=\"B2B SaaS\"\n title=\"Dashboard Shell\"\n description=\"The shell structure renders a responsive frame container with a sticky sidebar, topbar, and main canvas.\"\n actions={<Button size=\"sm\">New Project</Button>}\n />\n <div className=\"border border-dashed border-border rounded-kj-lg h-96 grid place-items-center bg-surface\">\n <span className=\"text-sm text-muted-foreground\">Main Content Canvas Area</span>\n </div>\n</DashboardShell>"
1721
1851
  },
1722
1852
  {
1723
1853
  "name": "SettingsLayout",
@@ -1754,7 +1884,7 @@
1754
1884
  }
1755
1885
  ],
1756
1886
  "cva": null,
1757
- "usageSnippet": "<SettingsLayout\n title=\"Profile Settings\"\n description=\"Customize how your profile appears to other members.\"\n sidebar={\n <div className=\"flex flex-row lg:flex-col gap-1 w-full\">\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start bg-primary/10 text-primary\">General</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start text-muted-foreground\">Team</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start text-muted-foreground\">Billing</Button>\n </div>\n }\n >\n <Card className=\"p-6 space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <TextField label=\"First Name\" defaultValue=\"John\" />"
1887
+ "usageSnippet": "<SettingsLayout\n title=\"Profile Settings\"\n description=\"Customize how your profile appears to other members.\"\n sidebar={\n <div className=\"flex flex-row lg:flex-col gap-1 w-full\">\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start bg-primary/10 text-primary\">General</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start text-muted-foreground\">Team</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start text-muted-foreground\">Billing</Button>\n </div>\n }\n>\n <Card className=\"p-6 space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <TextField label=\"First Name\" defaultValue=\"John\" />\n <TextField label=\"Last Name\" defaultValue=\"Doe\" />\n </div>\n <TextField label=\"Email Address\" defaultValue=\"john.doe@gmail.com\" />\n <div className=\"flex justify-end pt-2\">\n <Button size=\"sm\">Save profile</Button>\n </div>\n </Card>\n</SettingsLayout>"
1758
1888
  },
1759
1889
  {
1760
1890
  "name": "DetailPageLayout",
@@ -1819,7 +1949,7 @@
1819
1949
  }
1820
1950
  ],
1821
1951
  "cva": null,
1822
- "usageSnippet": "<DetailPageLayout\n title=\"Transaction #TRN-9022\"\n description=\"Captured via Stripe checkout flow.\"\n backLabel=\"Back to payments\"\n onBackClick={() => alert(\"Back\")}\n actions={\n <>\n <Button variant=\"outline\" size=\"sm\">Refund</Button>\n <Button size=\"sm\">Receipt</Button>\n </>"
1952
+ "usageSnippet": "<DetailPageLayout\n title=\"Transaction #TRN-9022\"\n description=\"Captured via Stripe checkout flow.\"\n backLabel=\"Back to payments\"\n onBackClick={() => alert(\"Back\")}\n actions={\n <>\n <Button variant=\"outline\" size=\"sm\">Refund</Button>\n <Button size=\"sm\">Receipt</Button>\n </>\n }\n aside={\n <div className=\"space-y-4 text-sm\">\n <h4 className=\"font-bold\">Payment Details</h4>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Status</span>\n <Badge variant=\"success\">Paid</Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Amount</span>\n <span className=\"font-bold font-mono\">$1,450.00</span>\n </div>\n </div>\n }\n>\n <Card className=\"p-6\">\n <h3 className=\"text-base font-bold mb-3\">Billing Address</h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n John Doe<br />\n ul. Marszałkowska 10/24<br />\n 00-001 Warszawa, Poland\n </p>\n </Card>\n</DetailPageLayout>"
1823
1953
  },
1824
1954
  {
1825
1955
  "name": "TableToolbar",
@@ -1935,7 +2065,7 @@
1935
2065
  }
1936
2066
  ],
1937
2067
  "cva": null,
1938
- "usageSnippet": "<ConfirmDialog\n open={open}\n onClose={() => setOpen(false)}\n title=\"Delete Workspace?\"\n description=\"This action cannot be undone. All database records and configs will be deleted.\"\n confirmLabel=\"Delete Workspace\"\n tone=\"danger\"\n loading={loading}\n onConfirm={() => {\n setLoading(true);\n setTimeout(() => {\n setLoading(false);\n setOpen(false);\n }, 1000);\n }}\n />"
2068
+ "usageSnippet": "<ConfirmDialog\n open={open}\n onClose={() => setOpen(false)}\n title=\"Delete Workspace?\"\n description=\"This action cannot be undone. All database records and configs will be deleted.\"\n confirmLabel=\"Delete Workspace\"\n tone=\"danger\"\n loading={loading}\n onConfirm={() => {\n setLoading(true);\n setTimeout(() => {\n setLoading(false);\n setOpen(false);\n }, 1000);\n }}\n/>"
1939
2069
  },
1940
2070
  {
1941
2071
  "name": "Drawer",
@@ -1993,7 +2123,7 @@
1993
2123
  }
1994
2124
  ],
1995
2125
  "cva": null,
1996
- "usageSnippet": "<Drawer\n open={open}\n onClose={() => setOpen(false)}\n title=\"Edit Configuration\"\n description=\"Manage property options and backup intervals.\"\n >\n <div className=\"space-y-6\">\n <TextField label=\"Connection String\" defaultValue=\"postgresql://db.kjaniec.dev:5432\" />"
2126
+ "usageSnippet": "<Drawer\n open={open}\n onClose={() => setOpen(false)}\n title=\"Edit Configuration\"\n description=\"Manage property options and backup intervals.\"\n>\n <div className=\"space-y-6\">\n <TextField label=\"Connection String\" defaultValue=\"postgresql://db.kjaniec.dev:5432\" />\n <CheckboxField label=\"Enable auto-backups daily\" defaultChecked />\n <div className=\"flex gap-2 justify-end pt-4 border-t border-border\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setOpen(false)}>Cancel</Button>\n <Button size=\"sm\" onClick={() => setOpen(false)}>Save Changes</Button>\n </div>\n </div>\n</Drawer>"
1997
2127
  },
1998
2128
  {
1999
2129
  "name": "CommandPalette",
@@ -2033,165 +2163,2217 @@
2033
2163
  "usageSnippet": "<CommandPalette open={open} onClose={() => setOpen(false)} items={items} />"
2034
2164
  },
2035
2165
  {
2036
- "name": "CommandPaletteItem",
2037
- "importPath": "import { CommandPaletteItem } from \"@kjaniec-dev/ui\";",
2038
- "description": "React component CommandPaletteItem.",
2166
+ "name": "SidebarNav",
2167
+ "importPath": "import { SidebarNav } from \"@kjaniec-dev/ui\";",
2168
+ "description": "React component SidebarNav.",
2039
2169
  "props": [
2040
2170
  {
2041
- "name": "id",
2042
- "type": "string",
2171
+ "name": "groups",
2172
+ "type": "SidebarNavGroup[]",
2043
2173
  "optional": false,
2044
2174
  "defaultValue": null,
2045
2175
  "description": ""
2046
2176
  },
2047
2177
  {
2048
- "name": "title",
2178
+ "name": "currentHref",
2049
2179
  "type": "string",
2050
- "optional": false,
2180
+ "optional": true,
2051
2181
  "defaultValue": null,
2052
2182
  "description": ""
2183
+ }
2184
+ ],
2185
+ "cva": null,
2186
+ "usageSnippet": "<SidebarNav>\n <!-- Content -->\n</SidebarNav>"
2187
+ },
2188
+ {
2189
+ "name": "Fab",
2190
+ "importPath": "import { Fab } from \"@kjaniec-dev/ui\";",
2191
+ "description": "React component Fab.",
2192
+ "props": [
2193
+ {
2194
+ "name": "icon",
2195
+ "type": "React.ReactNode",
2196
+ "optional": false,
2197
+ "defaultValue": null,
2198
+ "description": "Icon rendered inside the button."
2053
2199
  },
2054
2200
  {
2055
- "name": "subtitle",
2201
+ "name": "label",
2056
2202
  "type": "string",
2203
+ "optional": false,
2204
+ "defaultValue": null,
2205
+ "description": "Text label for accessibility (aria-label)."
2206
+ },
2207
+ {
2208
+ "name": "mobileOnly",
2209
+ "type": "boolean",
2057
2210
  "optional": true,
2058
2211
  "defaultValue": null,
2059
- "description": ""
2212
+ "description": "If true, the FAB will only be visible on mobile screens (< 768px)."
2060
2213
  },
2061
2214
  {
2062
- "name": "category",
2063
- "type": "string",
2215
+ "name": "loading",
2216
+ "type": "boolean",
2064
2217
  "optional": true,
2065
2218
  "defaultValue": null,
2066
- "description": ""
2219
+ "description": "Shows a spinner and disables interaction."
2067
2220
  },
2068
2221
  {
2069
- "name": "shortcut",
2070
- "type": "string[]",
2222
+ "name": "variant",
2223
+ "type": "\"primary\" | \"secondary\" | \"outline\" | \"danger\"",
2224
+ "optional": true,
2225
+ "defaultValue": "\"primary\"",
2226
+ "description": "Style variant of the component: variant."
2227
+ },
2228
+ {
2229
+ "name": "size",
2230
+ "type": "\"sm\" | \"md\" | \"lg\"",
2231
+ "optional": true,
2232
+ "defaultValue": "\"md\"",
2233
+ "description": "Style variant of the component: size."
2234
+ },
2235
+ {
2236
+ "name": "position",
2237
+ "type": "\"bottom-right\" | \"bottom-left\" | \"bottom-center\" | \"none\"",
2071
2238
  "optional": true,
2239
+ "defaultValue": "\"bottom-right\"",
2240
+ "description": "Style variant of the component: position."
2241
+ }
2242
+ ],
2243
+ "cva": {
2244
+ "variants": {
2245
+ "variant": [
2246
+ "primary",
2247
+ "secondary",
2248
+ "outline",
2249
+ "danger"
2250
+ ],
2251
+ "size": [
2252
+ "sm",
2253
+ "md",
2254
+ "lg"
2255
+ ],
2256
+ "position": [
2257
+ "bottom-right",
2258
+ "bottom-left",
2259
+ "bottom-center",
2260
+ "none"
2261
+ ]
2262
+ },
2263
+ "defaultVariants": {
2264
+ "variant": "primary",
2265
+ "size": "md",
2266
+ "position": "bottom-right"
2267
+ }
2268
+ },
2269
+ "usageSnippet": "<Fab {...args} variant=\"primary\" label=\"Primary variant\" />"
2270
+ },
2271
+ {
2272
+ "name": "BottomSheet",
2273
+ "importPath": "import { BottomSheet } from \"@kjaniec-dev/ui\";",
2274
+ "description": "React component BottomSheet.",
2275
+ "props": [
2276
+ {
2277
+ "name": "open",
2278
+ "type": "boolean",
2279
+ "optional": false,
2072
2280
  "defaultValue": null,
2073
2281
  "description": ""
2074
2282
  },
2075
2283
  {
2076
- "name": "action",
2284
+ "name": "onClose",
2077
2285
  "type": "() => void",
2078
2286
  "optional": false,
2079
2287
  "defaultValue": null,
2080
2288
  "description": ""
2081
2289
  },
2082
2290
  {
2083
- "name": "icon",
2291
+ "name": "children",
2084
2292
  "type": "React.ReactNode",
2293
+ "optional": false,
2294
+ "defaultValue": null,
2295
+ "description": ""
2296
+ },
2297
+ {
2298
+ "name": "maxWidth",
2299
+ "type": "\"max-w-sm\" | \"max-w-md\" | \"max-w-lg\" | \"max-w-xl\" | \"max-w-2xl\"",
2300
+ "optional": true,
2301
+ "defaultValue": "\"max-w-lg\"",
2302
+ "description": ""
2303
+ },
2304
+ {
2305
+ "name": "className",
2306
+ "type": "string",
2085
2307
  "optional": true,
2086
2308
  "defaultValue": null,
2087
2309
  "description": ""
2310
+ },
2311
+ {
2312
+ "name": "showClose",
2313
+ "type": "boolean",
2314
+ "optional": true,
2315
+ "defaultValue": "true",
2316
+ "description": ""
2088
2317
  }
2089
2318
  ],
2090
2319
  "cva": null,
2091
- "usageSnippet": "<CommandPaletteItem>\n <!-- Content -->\n</CommandPaletteItem>"
2320
+ "usageSnippet": "<BottomSheet>\n <!-- Content -->\n</BottomSheet>"
2092
2321
  },
2093
2322
  {
2094
- "name": "SidebarNav",
2095
- "importPath": "import { SidebarNav } from \"@kjaniec-dev/ui\";",
2096
- "description": "React component SidebarNav.",
2323
+ "name": "BottomSheetHeader",
2324
+ "importPath": "import { BottomSheetHeader } from \"@kjaniec-dev/ui\";",
2325
+ "description": "React component BottomSheetHeader.",
2326
+ "props": [],
2327
+ "cva": null,
2328
+ "usageSnippet": "<BottomSheetHeader>\n <!-- Content -->\n</BottomSheetHeader>"
2329
+ },
2330
+ {
2331
+ "name": "BottomSheetTitle",
2332
+ "importPath": "import { BottomSheetTitle } from \"@kjaniec-dev/ui\";",
2333
+ "description": "React component BottomSheetTitle.",
2334
+ "props": [],
2335
+ "cva": null,
2336
+ "usageSnippet": "<BottomSheetTitle>\n <!-- Content -->\n</BottomSheetTitle>"
2337
+ },
2338
+ {
2339
+ "name": "BottomSheetDescription",
2340
+ "importPath": "import { BottomSheetDescription } from \"@kjaniec-dev/ui\";",
2341
+ "description": "React component BottomSheetDescription.",
2342
+ "props": [],
2343
+ "cva": null,
2344
+ "usageSnippet": "<BottomSheetDescription>\n <!-- Content -->\n</BottomSheetDescription>"
2345
+ },
2346
+ {
2347
+ "name": "BottomSheetContent",
2348
+ "importPath": "import { BottomSheetContent } from \"@kjaniec-dev/ui\";",
2349
+ "description": "React component BottomSheetContent.",
2350
+ "props": [],
2351
+ "cva": null,
2352
+ "usageSnippet": "<BottomSheetContent>\n <!-- Content -->\n</BottomSheetContent>"
2353
+ },
2354
+ {
2355
+ "name": "BottomSheetFooter",
2356
+ "importPath": "import { BottomSheetFooter } from \"@kjaniec-dev/ui\";",
2357
+ "description": "React component BottomSheetFooter.",
2358
+ "props": [],
2359
+ "cva": null,
2360
+ "usageSnippet": "<BottomSheetFooter>\n <!-- Content -->\n</BottomSheetFooter>"
2361
+ },
2362
+ {
2363
+ "name": "Kbd",
2364
+ "importPath": "import { Kbd } from \"@kjaniec-dev/ui\";",
2365
+ "description": "React component Kbd.",
2097
2366
  "props": [
2098
2367
  {
2099
- "name": "groups",
2100
- "type": "SidebarNavGroup[]",
2101
- "optional": false,
2368
+ "name": "keys",
2369
+ "type": "string[]",
2370
+ "optional": true,
2102
2371
  "defaultValue": null,
2103
- "description": ""
2372
+ "description": "Render one <kbd> chip per key (separated by a small gap); children are ignored."
2104
2373
  },
2105
2374
  {
2106
- "name": "currentHref",
2107
- "type": "string",
2375
+ "name": "size",
2376
+ "type": "\"sm\" | \"md\"",
2108
2377
  "optional": true,
2109
- "defaultValue": null,
2110
- "description": ""
2378
+ "defaultValue": "\"sm\"",
2379
+ "description": "Style variant of the component: size."
2111
2380
  }
2112
2381
  ],
2113
- "cva": null,
2114
- "usageSnippet": "<SidebarNav>\n <!-- Content -->\n</SidebarNav>"
2382
+ "cva": {
2383
+ "variants": {
2384
+ "size": [
2385
+ "sm",
2386
+ "md"
2387
+ ]
2388
+ },
2389
+ "defaultVariants": {
2390
+ "size": "sm"
2391
+ }
2392
+ },
2393
+ "usageSnippet": "<Kbd keys={[\"⌘\", \"K\"]} />\n<Kbd keys={[\"⌘\", \"Shift\", \"P\"]} size=\"md\" />\n<Kbd>Esc</Kbd>"
2115
2394
  },
2116
2395
  {
2117
- "name": "SidebarNavItem",
2118
- "importPath": "import { SidebarNavItem } from \"@kjaniec-dev/ui\";",
2119
- "description": "React component SidebarNavItem.",
2396
+ "name": "CodeBlock",
2397
+ "importPath": "import { CodeBlock } from \"@kjaniec-dev/ui\";",
2398
+ "description": "React component CodeBlock.",
2120
2399
  "props": [
2121
2400
  {
2122
- "name": "id",
2401
+ "name": "code",
2123
2402
  "type": "string",
2124
2403
  "optional": false,
2125
2404
  "defaultValue": null,
2126
- "description": ""
2405
+ "description": "The snippet text to display."
2127
2406
  },
2128
2407
  {
2129
- "name": "label",
2408
+ "name": "language",
2130
2409
  "type": "string",
2131
- "optional": false,
2410
+ "optional": true,
2132
2411
  "defaultValue": null,
2133
- "description": ""
2412
+ "description": "Language label shown in the header when no filename is set (e.g. \"tsx\")."
2134
2413
  },
2135
2414
  {
2136
- "name": "href",
2415
+ "name": "filename",
2137
2416
  "type": "string",
2138
2417
  "optional": true,
2139
2418
  "defaultValue": null,
2140
- "description": ""
2419
+ "description": "Optional filename label shown in the header; takes precedence over language."
2141
2420
  },
2142
2421
  {
2143
- "name": "onClick",
2144
- "type": "() => void",
2422
+ "name": "copyable",
2423
+ "type": "boolean",
2145
2424
  "optional": true,
2146
- "defaultValue": null,
2147
- "description": ""
2425
+ "defaultValue": "true",
2426
+ "description": "Show the copy-to-clipboard button."
2148
2427
  },
2149
2428
  {
2150
- "name": "active",
2151
- "type": "boolean",
2429
+ "name": "maxHeight",
2430
+ "type": "number",
2152
2431
  "optional": true,
2153
2432
  "defaultValue": null,
2433
+ "description": "Max height in pixels; content scrolls vertically beyond it."
2434
+ }
2435
+ ],
2436
+ "cva": null,
2437
+ "usageSnippet": "<CodeBlock>\n <!-- Content -->\n</CodeBlock>"
2438
+ },
2439
+ {
2440
+ "name": "Separator",
2441
+ "importPath": "import { Separator } from \"@kjaniec-dev/ui\";",
2442
+ "description": "Thin layout divider. Decorative by default; pass decorative={false} for a semantic role=\"separator\".",
2443
+ "props": [
2444
+ {
2445
+ "name": "orientation",
2446
+ "type": "\"horizontal\" | \"vertical\"",
2447
+ "optional": true,
2448
+ "defaultValue": "\"horizontal\"",
2154
2449
  "description": ""
2155
2450
  },
2156
2451
  {
2157
- "name": "icon",
2158
- "type": "React.ReactNode",
2452
+ "name": "decorative",
2453
+ "type": "boolean",
2159
2454
  "optional": true,
2160
- "defaultValue": null,
2161
- "description": ""
2455
+ "defaultValue": "true",
2456
+ "description": "Purely visual by default (role=\"none\", hidden from a11y tree). Set false for a semantically meaningful divider."
2162
2457
  },
2163
2458
  {
2164
- "name": "badge",
2165
- "type": "React.ReactNode",
2459
+ "name": "className",
2460
+ "type": "string",
2166
2461
  "optional": true,
2167
2462
  "defaultValue": null,
2168
2463
  "description": ""
2169
2464
  }
2170
2465
  ],
2171
2466
  "cva": null,
2172
- "usageSnippet": "<SidebarNavItem>\n <!-- Content -->\n</SidebarNavItem>"
2467
+ "usageSnippet": "<Separator className=\"my-3\" />"
2173
2468
  },
2174
2469
  {
2175
- "name": "SidebarNavGroup",
2176
- "importPath": "import { SidebarNavGroup } from \"@kjaniec-dev/ui\";",
2177
- "description": "React component SidebarNavGroup.",
2470
+ "name": "Popover",
2471
+ "importPath": "import { Popover } from \"@kjaniec-dev/ui\";",
2472
+ "description": "React component Popover.",
2178
2473
  "props": [
2179
2474
  {
2180
- "name": "title",
2475
+ "name": "children",
2476
+ "type": "React.ReactNode",
2477
+ "optional": false,
2478
+ "defaultValue": null,
2479
+ "description": "Trigger and content elements."
2480
+ },
2481
+ {
2482
+ "name": "className",
2181
2483
  "type": "string",
2182
2484
  "optional": true,
2183
2485
  "defaultValue": null,
2184
- "description": ""
2486
+ "description": "Additional classes for the positioning wrapper."
2185
2487
  },
2186
2488
  {
2187
- "name": "items",
2188
- "type": "SidebarNavItem[]",
2189
- "optional": false,
2489
+ "name": "open",
2490
+ "type": "boolean",
2491
+ "optional": true,
2492
+ "defaultValue": null,
2493
+ "description": "Controlled open state. Omit for uncontrolled behavior."
2494
+ },
2495
+ {
2496
+ "name": "onOpenChange",
2497
+ "type": "(open: boolean) => void",
2498
+ "optional": true,
2499
+ "defaultValue": null,
2500
+ "description": "Called whenever the open state should change."
2501
+ }
2502
+ ],
2503
+ "cva": null,
2504
+ "usageSnippet": "<Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\">Open popover</Button>\n </PopoverTrigger>\n <PopoverContent side=\"bottom\" align=\"start\" className=\"w-64\">\n <p className=\"m-0 mb-1 text-sm font-semibold\">Quick help</p>\n <p className=\"m-0 text-sm text-muted-foreground\">\n Popovers hold arbitrary content — filters, hints, pickers.\n </p>\n </PopoverContent>\n</Popover>"
2505
+ },
2506
+ {
2507
+ "name": "PopoverTrigger",
2508
+ "importPath": "import { PopoverTrigger } from \"@kjaniec-dev/ui\";",
2509
+ "description": "React component PopoverTrigger.",
2510
+ "props": [],
2511
+ "cva": null,
2512
+ "usageSnippet": "<PopoverTrigger asChild>\n <Button variant=\"outline\">Open popover</Button>\n</PopoverTrigger>"
2513
+ },
2514
+ {
2515
+ "name": "PopoverContent",
2516
+ "importPath": "import { PopoverContent } from \"@kjaniec-dev/ui\";",
2517
+ "description": "React component PopoverContent.",
2518
+ "props": [
2519
+ {
2520
+ "name": "side",
2521
+ "type": "\"top\" | \"bottom\" | \"left\" | \"right\"",
2522
+ "optional": true,
2523
+ "defaultValue": "\"bottom\"",
2524
+ "description": "Which side of the trigger the panel opens on."
2525
+ },
2526
+ {
2527
+ "name": "align",
2528
+ "type": "\"start\" | \"center\" | \"end\"",
2529
+ "optional": true,
2530
+ "defaultValue": "\"center\"",
2531
+ "description": "Alignment along the chosen side."
2532
+ }
2533
+ ],
2534
+ "cva": null,
2535
+ "usageSnippet": "<PopoverContent side=\"bottom\" align=\"start\" className=\"w-64\">\n <p className=\"m-0 mb-1 text-sm font-semibold\">Quick help</p>\n <p className=\"m-0 text-sm text-muted-foreground\">\n Popovers hold arbitrary content — filters, hints, pickers.\n </p>\n</PopoverContent>"
2536
+ },
2537
+ {
2538
+ "name": "Combobox",
2539
+ "importPath": "import { Combobox } from \"@kjaniec-dev/ui\";",
2540
+ "description": "React component Combobox.",
2541
+ "props": [
2542
+ {
2543
+ "name": "value",
2544
+ "type": "string",
2545
+ "optional": false,
2546
+ "defaultValue": null,
2547
+ "description": ""
2548
+ },
2549
+ {
2550
+ "name": "label",
2551
+ "type": "string",
2552
+ "optional": false,
2553
+ "defaultValue": null,
2554
+ "description": ""
2555
+ },
2556
+ {
2557
+ "name": "disabled",
2558
+ "type": "boolean",
2559
+ "optional": true,
2560
+ "defaultValue": null,
2561
+ "description": ""
2562
+ }
2563
+ ],
2564
+ "cva": null,
2565
+ "usageSnippet": "<Combobox options={frameworks} value={value} onChange={setValue} placeholder=\"Select a framework…\" />"
2566
+ },
2567
+ {
2568
+ "name": "ComboboxField",
2569
+ "importPath": "import { ComboboxField } from \"@kjaniec-dev/ui\";",
2570
+ "description": "React component ComboboxField.",
2571
+ "props": [],
2572
+ "cva": null,
2573
+ "usageSnippet": "<ComboboxField\n options={frameworks}\n label=\"Primary framework\"\n required\n hint=\"You can change this later.\"\n/>"
2574
+ },
2575
+ {
2576
+ "name": "Calendar",
2577
+ "importPath": "import { Calendar } from \"@kjaniec-dev/ui\";",
2578
+ "description": "React component Calendar.",
2579
+ "props": [
2580
+ {
2581
+ "name": "value",
2582
+ "type": "Date",
2583
+ "optional": true,
2584
+ "defaultValue": null,
2585
+ "description": ""
2586
+ },
2587
+ {
2588
+ "name": "defaultValue",
2589
+ "type": "Date",
2590
+ "optional": true,
2591
+ "defaultValue": null,
2592
+ "description": ""
2593
+ },
2594
+ {
2595
+ "name": "onChange",
2596
+ "type": "(date: Date) => void",
2597
+ "optional": true,
2598
+ "defaultValue": null,
2599
+ "description": ""
2600
+ },
2601
+ {
2602
+ "name": "month",
2603
+ "type": "Date",
2604
+ "optional": true,
2605
+ "defaultValue": null,
2606
+ "description": "Controlled displayed month. Omit for uncontrolled behavior."
2607
+ },
2608
+ {
2609
+ "name": "defaultMonth",
2610
+ "type": "Date",
2611
+ "optional": true,
2612
+ "defaultValue": null,
2613
+ "description": "Initial displayed month when uncontrolled. Defaults to `value` ?? today."
2614
+ },
2615
+ {
2616
+ "name": "onMonthChange",
2617
+ "type": "(month: Date) => void",
2618
+ "optional": true,
2619
+ "defaultValue": null,
2620
+ "description": ""
2621
+ },
2622
+ {
2623
+ "name": "min",
2624
+ "type": "Date",
2625
+ "optional": true,
2626
+ "defaultValue": null,
2627
+ "description": ""
2628
+ },
2629
+ {
2630
+ "name": "max",
2631
+ "type": "Date",
2632
+ "optional": true,
2633
+ "defaultValue": null,
2634
+ "description": ""
2635
+ },
2636
+ {
2637
+ "name": "disabledDates",
2638
+ "type": "(date: Date) => boolean",
2639
+ "optional": true,
2640
+ "defaultValue": null,
2641
+ "description": ""
2642
+ },
2643
+ {
2644
+ "name": "className",
2645
+ "type": "string",
2646
+ "optional": true,
2647
+ "defaultValue": null,
2648
+ "description": ""
2649
+ }
2650
+ ],
2651
+ "cva": null,
2652
+ "usageSnippet": "<Calendar value={value} onChange={setValue} />"
2653
+ },
2654
+ {
2655
+ "name": "DatePicker",
2656
+ "importPath": "import { DatePicker } from \"@kjaniec-dev/ui\";",
2657
+ "description": "React component DatePicker.",
2658
+ "props": [
2659
+ {
2660
+ "name": "value",
2661
+ "type": "Date",
2662
+ "optional": true,
2663
+ "defaultValue": null,
2664
+ "description": ""
2665
+ },
2666
+ {
2667
+ "name": "defaultValue",
2668
+ "type": "Date",
2669
+ "optional": true,
2670
+ "defaultValue": null,
2671
+ "description": ""
2672
+ },
2673
+ {
2674
+ "name": "onChange",
2675
+ "type": "(date: Date) => void",
2676
+ "optional": true,
2677
+ "defaultValue": null,
2678
+ "description": ""
2679
+ },
2680
+ {
2681
+ "name": "min",
2682
+ "type": "Date",
2683
+ "optional": true,
2684
+ "defaultValue": null,
2685
+ "description": ""
2686
+ },
2687
+ {
2688
+ "name": "max",
2689
+ "type": "Date",
2690
+ "optional": true,
2691
+ "defaultValue": null,
2692
+ "description": ""
2693
+ },
2694
+ {
2695
+ "name": "disabledDates",
2696
+ "type": "(date: Date) => boolean",
2697
+ "optional": true,
2698
+ "defaultValue": null,
2699
+ "description": ""
2700
+ },
2701
+ {
2702
+ "name": "placeholder",
2703
+ "type": "string",
2704
+ "optional": true,
2705
+ "defaultValue": "\"Pick a date…\"",
2706
+ "description": "Trigger text when nothing is selected. Default \"Pick a date…\"."
2707
+ },
2708
+ {
2709
+ "name": "disabled",
2710
+ "type": "boolean",
2711
+ "optional": true,
2712
+ "defaultValue": "false",
2713
+ "description": ""
2714
+ },
2715
+ {
2716
+ "name": "error",
2717
+ "type": "boolean",
2718
+ "optional": true,
2719
+ "defaultValue": "false",
2720
+ "description": "Visual error state (red border + aria-invalid on the trigger)."
2721
+ },
2722
+ {
2723
+ "name": "required",
2724
+ "type": "boolean",
2725
+ "optional": true,
2726
+ "defaultValue": "false",
2727
+ "description": "Marks the trigger aria-required (buttons have no native `required` attribute)."
2728
+ },
2729
+ {
2730
+ "name": "className",
2731
+ "type": "string",
2732
+ "optional": true,
2733
+ "defaultValue": null,
2734
+ "description": ""
2735
+ },
2736
+ {
2737
+ "name": "id",
2738
+ "type": "string",
2739
+ "optional": true,
2740
+ "defaultValue": null,
2741
+ "description": ""
2742
+ },
2743
+ {
2744
+ "name": "name",
2745
+ "type": "string",
2746
+ "optional": true,
2747
+ "defaultValue": null,
2748
+ "description": ""
2749
+ },
2750
+ {
2751
+ "name": "\"aria-describedby\"",
2752
+ "type": "string",
2753
+ "optional": true,
2754
+ "defaultValue": null,
2755
+ "description": ""
2756
+ }
2757
+ ],
2758
+ "cva": null,
2759
+ "usageSnippet": "<DatePicker value={value} onChange={setValue} />"
2760
+ },
2761
+ {
2762
+ "name": "DatePickerField",
2763
+ "importPath": "import { DatePickerField } from \"@kjaniec-dev/ui\";",
2764
+ "description": "React component DatePickerField.",
2765
+ "props": [
2766
+ {
2767
+ "name": "label",
2768
+ "type": "string",
2769
+ "optional": false,
2770
+ "defaultValue": null,
2771
+ "description": ""
2772
+ },
2773
+ {
2774
+ "name": "hint",
2775
+ "type": "string",
2776
+ "optional": true,
2777
+ "defaultValue": null,
2778
+ "description": ""
2779
+ },
2780
+ {
2781
+ "name": "error",
2782
+ "type": "string",
2783
+ "optional": true,
2784
+ "defaultValue": null,
2785
+ "description": ""
2786
+ }
2787
+ ],
2788
+ "cva": null,
2789
+ "usageSnippet": "<DatePickerField label=\"Due date\" required hint=\"Weekdays only.\" value={value} onChange={setValue} disabledDates={(d) => d.getDay() === 0 || d.getDay() === 6} />"
2790
+ },
2791
+ {
2792
+ "name": "RangeCalendar",
2793
+ "importPath": "import { RangeCalendar } from \"@kjaniec-dev/ui\";",
2794
+ "description": "React component RangeCalendar.",
2795
+ "props": [
2796
+ {
2797
+ "name": "value",
2798
+ "type": "DateRange",
2799
+ "optional": true,
2800
+ "defaultValue": null,
2801
+ "description": ""
2802
+ },
2803
+ {
2804
+ "name": "defaultValue",
2805
+ "type": "DateRange",
2806
+ "optional": true,
2807
+ "defaultValue": null,
2808
+ "description": ""
2809
+ },
2810
+ {
2811
+ "name": "onChange",
2812
+ "type": "(range: DateRange) => void",
2813
+ "optional": true,
2814
+ "defaultValue": null,
2815
+ "description": ""
2816
+ },
2817
+ {
2818
+ "name": "month",
2819
+ "type": "Date",
2820
+ "optional": true,
2821
+ "defaultValue": null,
2822
+ "description": "Controlled left-month. The right month is always this + 1 (locked navigation)."
2823
+ },
2824
+ {
2825
+ "name": "defaultMonth",
2826
+ "type": "Date",
2827
+ "optional": true,
2828
+ "defaultValue": null,
2829
+ "description": ""
2830
+ },
2831
+ {
2832
+ "name": "onMonthChange",
2833
+ "type": "(month: Date) => void",
2834
+ "optional": true,
2835
+ "defaultValue": null,
2836
+ "description": ""
2837
+ },
2838
+ {
2839
+ "name": "min",
2840
+ "type": "Date",
2841
+ "optional": true,
2842
+ "defaultValue": null,
2843
+ "description": ""
2844
+ },
2845
+ {
2846
+ "name": "max",
2847
+ "type": "Date",
2848
+ "optional": true,
2849
+ "defaultValue": null,
2850
+ "description": ""
2851
+ },
2852
+ {
2853
+ "name": "disabledDates",
2854
+ "type": "(date: Date) => boolean",
2855
+ "optional": true,
2856
+ "defaultValue": null,
2857
+ "description": ""
2858
+ },
2859
+ {
2860
+ "name": "className",
2861
+ "type": "string",
2862
+ "optional": true,
2863
+ "defaultValue": null,
2864
+ "description": ""
2865
+ }
2866
+ ],
2867
+ "cva": null,
2868
+ "usageSnippet": "<RangeCalendar value={value} onChange={setValue} />"
2869
+ },
2870
+ {
2871
+ "name": "DateRangePicker",
2872
+ "importPath": "import { DateRangePicker } from \"@kjaniec-dev/ui\";",
2873
+ "description": "React component DateRangePicker.",
2874
+ "props": [
2875
+ {
2876
+ "name": "value",
2877
+ "type": "DateRange",
2878
+ "optional": true,
2879
+ "defaultValue": null,
2880
+ "description": ""
2881
+ },
2882
+ {
2883
+ "name": "defaultValue",
2884
+ "type": "DateRange",
2885
+ "optional": true,
2886
+ "defaultValue": null,
2887
+ "description": ""
2888
+ },
2889
+ {
2890
+ "name": "onChange",
2891
+ "type": "(range: DateRange) => void",
2892
+ "optional": true,
2893
+ "defaultValue": null,
2894
+ "description": ""
2895
+ },
2896
+ {
2897
+ "name": "min",
2898
+ "type": "Date",
2899
+ "optional": true,
2900
+ "defaultValue": null,
2901
+ "description": ""
2902
+ },
2903
+ {
2904
+ "name": "max",
2905
+ "type": "Date",
2906
+ "optional": true,
2907
+ "defaultValue": null,
2908
+ "description": ""
2909
+ },
2910
+ {
2911
+ "name": "disabledDates",
2912
+ "type": "(date: Date) => boolean",
2913
+ "optional": true,
2914
+ "defaultValue": null,
2915
+ "description": ""
2916
+ },
2917
+ {
2918
+ "name": "placeholder",
2919
+ "type": "string",
2920
+ "optional": true,
2921
+ "defaultValue": "\"Pick a date range…\"",
2922
+ "description": "Trigger text when nothing is selected. Default \"Pick a date range…\"."
2923
+ },
2924
+ {
2925
+ "name": "disabled",
2926
+ "type": "boolean",
2927
+ "optional": true,
2928
+ "defaultValue": "false",
2929
+ "description": ""
2930
+ },
2931
+ {
2932
+ "name": "error",
2933
+ "type": "boolean",
2934
+ "optional": true,
2935
+ "defaultValue": "false",
2936
+ "description": "Visual error state (red border + aria-invalid on the trigger)."
2937
+ },
2938
+ {
2939
+ "name": "required",
2940
+ "type": "boolean",
2941
+ "optional": true,
2942
+ "defaultValue": "false",
2943
+ "description": "Marks the trigger aria-required (buttons have no native `required` attribute)."
2944
+ },
2945
+ {
2946
+ "name": "className",
2947
+ "type": "string",
2948
+ "optional": true,
2949
+ "defaultValue": null,
2950
+ "description": ""
2951
+ },
2952
+ {
2953
+ "name": "id",
2954
+ "type": "string",
2955
+ "optional": true,
2956
+ "defaultValue": null,
2957
+ "description": ""
2958
+ },
2959
+ {
2960
+ "name": "name",
2961
+ "type": "string",
2962
+ "optional": true,
2963
+ "defaultValue": null,
2964
+ "description": ""
2965
+ },
2966
+ {
2967
+ "name": "\"aria-describedby\"",
2968
+ "type": "string",
2969
+ "optional": true,
2970
+ "defaultValue": null,
2971
+ "description": ""
2972
+ }
2973
+ ],
2974
+ "cva": null,
2975
+ "usageSnippet": "<DateRangePicker value={value} onChange={setValue} />"
2976
+ },
2977
+ {
2978
+ "name": "DateRangePickerField",
2979
+ "importPath": "import { DateRangePickerField } from \"@kjaniec-dev/ui\";",
2980
+ "description": "React component DateRangePickerField.",
2981
+ "props": [
2982
+ {
2983
+ "name": "label",
2984
+ "type": "string",
2985
+ "optional": false,
2986
+ "defaultValue": null,
2987
+ "description": ""
2988
+ },
2989
+ {
2990
+ "name": "hint",
2991
+ "type": "string",
2992
+ "optional": true,
2993
+ "defaultValue": null,
2994
+ "description": ""
2995
+ },
2996
+ {
2997
+ "name": "error",
2998
+ "type": "string",
2999
+ "optional": true,
3000
+ "defaultValue": null,
3001
+ "description": ""
3002
+ }
3003
+ ],
3004
+ "cva": null,
3005
+ "usageSnippet": "<DateRangePickerField\n label=\"Booking dates\"\n required\n hint=\"Weekends are disabled.\"\n value={value}\n onChange={setValue}\n disabledDates={(d) => d.getDay() === 0 || d.getDay() === 6}\n/>"
3006
+ },
3007
+ {
3008
+ "name": "Dropzone",
3009
+ "importPath": "import { Dropzone } from \"@kjaniec-dev/ui\";",
3010
+ "description": "React component Dropzone.",
3011
+ "props": [
3012
+ {
3013
+ "name": "onFiles",
3014
+ "type": "(files: File[]) => void",
3015
+ "optional": false,
3016
+ "defaultValue": null,
3017
+ "description": ""
3018
+ },
3019
+ {
3020
+ "name": "accept",
3021
+ "type": "string",
3022
+ "optional": true,
3023
+ "defaultValue": null,
3024
+ "description": "Native picker filter hint. Real enforcement lives in FileUpload's validation."
3025
+ },
3026
+ {
3027
+ "name": "multiple",
3028
+ "type": "boolean",
3029
+ "optional": true,
3030
+ "defaultValue": "true",
3031
+ "description": ""
3032
+ },
3033
+ {
3034
+ "name": "disabled",
3035
+ "type": "boolean",
3036
+ "optional": true,
3037
+ "defaultValue": "false",
3038
+ "description": ""
3039
+ },
3040
+ {
3041
+ "name": "className",
3042
+ "type": "string",
3043
+ "optional": true,
3044
+ "defaultValue": null,
3045
+ "description": ""
3046
+ },
3047
+ {
3048
+ "name": "children",
3049
+ "type": "React.ReactNode",
3050
+ "optional": true,
3051
+ "defaultValue": null,
3052
+ "description": "Overrides the default drop-region content."
3053
+ },
3054
+ {
3055
+ "name": "id",
3056
+ "type": "string",
3057
+ "optional": true,
3058
+ "defaultValue": null,
3059
+ "description": ""
3060
+ },
3061
+ {
3062
+ "name": "\"aria-describedby\"",
3063
+ "type": "string",
3064
+ "optional": true,
3065
+ "defaultValue": null,
3066
+ "description": ""
3067
+ },
3068
+ {
3069
+ "name": "\"aria-invalid\"",
3070
+ "type": "boolean | \"true\" | \"false\"",
3071
+ "optional": true,
3072
+ "defaultValue": null,
3073
+ "description": ""
3074
+ },
3075
+ {
3076
+ "name": "\"aria-required\"",
3077
+ "type": "boolean",
3078
+ "optional": true,
3079
+ "defaultValue": null,
3080
+ "description": ""
3081
+ }
3082
+ ],
3083
+ "cva": null,
3084
+ "usageSnippet": "<Dropzone onFiles={(files) => setCount((c) => c + files.length)} />"
3085
+ },
3086
+ {
3087
+ "name": "FileUpload",
3088
+ "importPath": "import { FileUpload } from \"@kjaniec-dev/ui\";",
3089
+ "description": "React component FileUpload.",
3090
+ "props": [
3091
+ {
3092
+ "name": "value",
3093
+ "type": "UploadItem[]",
3094
+ "optional": true,
3095
+ "defaultValue": null,
3096
+ "description": ""
3097
+ },
3098
+ {
3099
+ "name": "defaultValue",
3100
+ "type": "UploadItem[]",
3101
+ "optional": true,
3102
+ "defaultValue": null,
3103
+ "description": ""
3104
+ },
3105
+ {
3106
+ "name": "onChange",
3107
+ "type": "(items: UploadItem[]) => void",
3108
+ "optional": true,
3109
+ "defaultValue": null,
3110
+ "description": ""
3111
+ },
3112
+ {
3113
+ "name": "onReject",
3114
+ "type": "(rejections: FileRejection[]) => void",
3115
+ "optional": true,
3116
+ "defaultValue": null,
3117
+ "description": "Called with files rejected by validation on a given drop/selection."
3118
+ },
3119
+ {
3120
+ "name": "accept",
3121
+ "type": "string",
3122
+ "optional": true,
3123
+ "defaultValue": null,
3124
+ "description": ""
3125
+ },
3126
+ {
3127
+ "name": "maxSize",
3128
+ "type": "number",
3129
+ "optional": true,
3130
+ "defaultValue": null,
3131
+ "description": ""
3132
+ },
3133
+ {
3134
+ "name": "maxFiles",
3135
+ "type": "number",
3136
+ "optional": true,
3137
+ "defaultValue": null,
3138
+ "description": ""
3139
+ },
3140
+ {
3141
+ "name": "multiple",
3142
+ "type": "boolean",
3143
+ "optional": true,
3144
+ "defaultValue": "true",
3145
+ "description": ""
3146
+ },
3147
+ {
3148
+ "name": "disabled",
3149
+ "type": "boolean",
3150
+ "optional": true,
3151
+ "defaultValue": "false",
3152
+ "description": ""
3153
+ },
3154
+ {
3155
+ "name": "error",
3156
+ "type": "boolean",
3157
+ "optional": true,
3158
+ "defaultValue": "false",
3159
+ "description": "Visual error state (danger border + aria-invalid on the dropzone)."
3160
+ },
3161
+ {
3162
+ "name": "required",
3163
+ "type": "boolean",
3164
+ "optional": true,
3165
+ "defaultValue": "false",
3166
+ "description": "aria-required on the dropzone."
3167
+ },
3168
+ {
3169
+ "name": "className",
3170
+ "type": "string",
3171
+ "optional": true,
3172
+ "defaultValue": null,
3173
+ "description": ""
3174
+ },
3175
+ {
3176
+ "name": "id",
3177
+ "type": "string",
3178
+ "optional": true,
3179
+ "defaultValue": null,
3180
+ "description": ""
3181
+ },
3182
+ {
3183
+ "name": "\"aria-describedby\"",
3184
+ "type": "string",
3185
+ "optional": true,
3186
+ "defaultValue": null,
3187
+ "description": ""
3188
+ }
3189
+ ],
3190
+ "cva": null,
3191
+ "usageSnippet": "<FileUpload value={items} onChange={setItems} accept=\"image/*,.pdf\" maxSize={5 * 1024 * 1024} />"
3192
+ },
3193
+ {
3194
+ "name": "FileUploadField",
3195
+ "importPath": "import { FileUploadField } from \"@kjaniec-dev/ui\";",
3196
+ "description": "React component FileUploadField.",
3197
+ "props": [
3198
+ {
3199
+ "name": "label",
3200
+ "type": "string",
3201
+ "optional": false,
3202
+ "defaultValue": null,
3203
+ "description": ""
3204
+ },
3205
+ {
3206
+ "name": "hint",
3207
+ "type": "string",
3208
+ "optional": true,
3209
+ "defaultValue": null,
3210
+ "description": ""
3211
+ },
3212
+ {
3213
+ "name": "error",
3214
+ "type": "string",
3215
+ "optional": true,
3216
+ "defaultValue": null,
3217
+ "description": ""
3218
+ }
3219
+ ],
3220
+ "cva": null,
3221
+ "usageSnippet": "<FileUploadField\n label=\"Attachments\"\n hint=\"PDF or images, up to 5 MB each.\"\n accept=\"image/*,.pdf\"\n maxSize={5 * 1024 * 1024}\n value={items}\n onChange={setItems}\n/>"
3222
+ },
3223
+ {
3224
+ "name": "Timeline",
3225
+ "importPath": "import { Timeline } from \"@kjaniec-dev/ui\";",
3226
+ "description": "React component Timeline.",
3227
+ "props": [
3228
+ {
3229
+ "name": "align",
3230
+ "type": "TimelineAlign",
3231
+ "optional": true,
3232
+ "defaultValue": "\"left\"",
3233
+ "description": ""
3234
+ }
3235
+ ],
3236
+ "cva": null,
3237
+ "usageSnippet": "<Timeline>\n <TimelineItem>\n <TimelineSeparator>\n <TimelineDot size=\"sm\" variant=\"success\" />\n <TimelineConnector />\n </TimelineSeparator>\n <TimelineContent>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", width: \"100%\" }}>\n <TimelineTitle>Database Migrated</TimelineTitle>\n <TimelineTime>5m ago</TimelineTime>\n </div>\n </TimelineContent>\n </TimelineItem>\n <TimelineItem>\n <TimelineSeparator>\n <TimelineDot size=\"sm\" variant=\"primary\" />\n <TimelineConnector />\n </TimelineSeparator>\n <TimelineContent>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", width: \"100%\" }}>\n <TimelineTitle>Server Started</TimelineTitle>\n <TimelineTime>15m ago</TimelineTime>\n </div>\n </TimelineContent>\n </TimelineItem>\n <TimelineItem>\n <TimelineSeparator>\n <TimelineDot size=\"sm\" />\n </TimelineSeparator>\n <TimelineContent>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", width: \"100%\" }}>\n <TimelineTitle>Code Repository Created</TimelineTitle>\n <TimelineTime>1h ago</TimelineTime>\n </div>\n </TimelineContent>\n </TimelineItem>\n</Timeline>"
3238
+ },
3239
+ {
3240
+ "name": "TimelineItem",
3241
+ "importPath": "import { TimelineItem } from \"@kjaniec-dev/ui\";",
3242
+ "description": "React component TimelineItem.",
3243
+ "props": [
3244
+ {
3245
+ "name": "index",
3246
+ "type": "number",
3247
+ "optional": true,
3248
+ "defaultValue": "0",
3249
+ "description": ""
3250
+ }
3251
+ ],
3252
+ "cva": null,
3253
+ "usageSnippet": "<TimelineItem>\n <TimelineSeparator>\n <TimelineDot size=\"sm\" variant=\"success\" />\n <TimelineConnector />\n </TimelineSeparator>\n <TimelineContent>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", width: \"100%\" }}>\n <TimelineTitle>Database Migrated</TimelineTitle>\n <TimelineTime>5m ago</TimelineTime>\n </div>\n </TimelineContent>\n</TimelineItem>"
3254
+ },
3255
+ {
3256
+ "name": "TimelineSeparator",
3257
+ "importPath": "import { TimelineSeparator } from \"@kjaniec-dev/ui\";",
3258
+ "description": "React component TimelineSeparator.",
3259
+ "props": [
3260
+ {
3261
+ "name": "isEven",
3262
+ "type": "boolean",
3263
+ "optional": true,
3264
+ "defaultValue": null,
3265
+ "description": ""
3266
+ },
3267
+ {
3268
+ "name": "align",
3269
+ "type": "TimelineAlign",
3270
+ "optional": true,
3271
+ "defaultValue": null,
3272
+ "description": ""
3273
+ }
3274
+ ],
3275
+ "cva": null,
3276
+ "usageSnippet": "<TimelineSeparator>\n <TimelineDot size=\"sm\" variant=\"success\" />\n <TimelineConnector />\n</TimelineSeparator>"
3277
+ },
3278
+ {
3279
+ "name": "TimelineConnector",
3280
+ "importPath": "import { TimelineConnector } from \"@kjaniec-dev/ui\";",
3281
+ "description": "React component TimelineConnector.",
3282
+ "props": [
3283
+ {
3284
+ "name": "dashed",
3285
+ "type": "boolean",
3286
+ "optional": true,
3287
+ "defaultValue": null,
3288
+ "description": ""
3289
+ }
3290
+ ],
3291
+ "cva": null,
3292
+ "usageSnippet": "<TimelineConnector />"
3293
+ },
3294
+ {
3295
+ "name": "TimelineDot",
3296
+ "importPath": "import { TimelineDot } from \"@kjaniec-dev/ui\";",
3297
+ "description": "React component TimelineDot.",
3298
+ "props": [
3299
+ {
3300
+ "name": "variant",
3301
+ "type": "TimelineDotVariant",
3302
+ "optional": true,
3303
+ "defaultValue": "\"default\"",
3304
+ "description": ""
3305
+ },
3306
+ {
3307
+ "name": "size",
3308
+ "type": "TimelineDotSize",
3309
+ "optional": true,
3310
+ "defaultValue": "\"md\"",
3311
+ "description": ""
3312
+ }
3313
+ ],
3314
+ "cva": null,
3315
+ "usageSnippet": "<TimelineDot size=\"lg\" variant=\"success\">\n ✓\n</TimelineDot>"
3316
+ },
3317
+ {
3318
+ "name": "TimelineContent",
3319
+ "importPath": "import { TimelineContent } from \"@kjaniec-dev/ui\";",
3320
+ "description": "React component TimelineContent.",
3321
+ "props": [
3322
+ {
3323
+ "name": "isEven",
3324
+ "type": "boolean",
3325
+ "optional": true,
3326
+ "defaultValue": null,
3327
+ "description": ""
3328
+ },
3329
+ {
3330
+ "name": "align",
3331
+ "type": "TimelineAlign",
3332
+ "optional": true,
3333
+ "defaultValue": null,
3334
+ "description": ""
3335
+ }
3336
+ ],
3337
+ "cva": null,
3338
+ "usageSnippet": "<TimelineContent>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", width: \"100%\" }}>\n <TimelineTitle>Database Migrated</TimelineTitle>\n <TimelineTime>5m ago</TimelineTime>\n </div>\n</TimelineContent>"
3339
+ },
3340
+ {
3341
+ "name": "TimelineTitle",
3342
+ "importPath": "import { TimelineTitle } from \"@kjaniec-dev/ui\";",
3343
+ "description": "React component TimelineTitle.",
3344
+ "props": [],
3345
+ "cva": null,
3346
+ "usageSnippet": "<TimelineTitle>Database Migrated</TimelineTitle>"
3347
+ },
3348
+ {
3349
+ "name": "TimelineTime",
3350
+ "importPath": "import { TimelineTime } from \"@kjaniec-dev/ui\";",
3351
+ "description": "React component TimelineTime.",
3352
+ "props": [],
3353
+ "cva": null,
3354
+ "usageSnippet": "<TimelineTime>5m ago</TimelineTime>"
3355
+ },
3356
+ {
3357
+ "name": "Stepper",
3358
+ "importPath": "import { Stepper } from \"@kjaniec-dev/ui\";",
3359
+ "description": "React component Stepper.",
3360
+ "props": [
3361
+ {
3362
+ "name": "value",
3363
+ "type": "number",
3364
+ "optional": true,
3365
+ "defaultValue": null,
3366
+ "description": ""
3367
+ },
3368
+ {
3369
+ "name": "defaultValue",
3370
+ "type": "number",
3371
+ "optional": true,
3372
+ "defaultValue": null,
3373
+ "description": ""
3374
+ },
3375
+ {
3376
+ "name": "onValueChange",
3377
+ "type": "(value: number) => void",
3378
+ "optional": true,
3379
+ "defaultValue": null,
3380
+ "description": ""
3381
+ },
3382
+ {
3383
+ "name": "orientation",
3384
+ "type": "StepperOrientation",
3385
+ "optional": true,
3386
+ "defaultValue": "\"horizontal\"",
3387
+ "description": ""
3388
+ },
3389
+ {
3390
+ "name": "linear",
3391
+ "type": "boolean",
3392
+ "optional": true,
3393
+ "defaultValue": "true",
3394
+ "description": ""
3395
+ }
3396
+ ],
3397
+ "cva": null,
3398
+ "usageSnippet": "<Stepper value={stepper.activeStep} onValueChange={stepper.setStep}>\n <StepperList>\n <StepperItem value={0}>\n <StepperTrigger>\n <StepperIndicator />\n <div className=\"flex flex-col\">\n <StepperTitle>Profile</StepperTitle>\n <StepperDescription>User details</StepperDescription>\n </div>\n </StepperTrigger>\n </StepperItem>\n <StepperSeparator />\n <StepperItem value={1}>\n <StepperTrigger>\n <StepperIndicator />\n <div className=\"flex flex-col\">\n <StepperTitle>Billing</StepperTitle>\n <StepperDescription>Card info</StepperDescription>\n </div>\n </StepperTrigger>\n </StepperItem>\n <StepperSeparator />\n <StepperItem value={2}>\n <StepperTrigger>\n <StepperIndicator />\n <div className=\"flex flex-col\">\n <StepperTitle>Review</StepperTitle>\n <StepperDescription>Confirm</StepperDescription>\n </div>\n </StepperTrigger>\n </StepperItem>\n </StepperList>\n\n <div className=\"p-4 bg-zinc-900 border border-zinc-800 rounded-lg min-h-[100px]\">\n <StepperContent value={0}>\n <p>Step 1 Form Content: Please input username.</p>\n </StepperContent>\n <StepperContent value={1}>\n <p>Step 2 Form Content: Enter credit card details.</p>\n </StepperContent>\n <StepperContent value={2}>\n <p>Step 3 Form Content: Review and click Submit.</p>\n </StepperContent>\n </div>\n\n <div className=\"flex justify-between\">\n <Button variant=\"secondary\" onClick={stepper.prevStep} disabled={stepper.isFirstStep}>\n Back\n </Button>\n <Button onClick={stepper.isLastStep ? () => alert(\"Done\") : stepper.nextStep}>\n {stepper.isLastStep ? \"Submit\" : \"Next\"}\n </Button>\n </div>\n</Stepper>"
3399
+ },
3400
+ {
3401
+ "name": "StepperList",
3402
+ "importPath": "import { StepperList } from \"@kjaniec-dev/ui\";",
3403
+ "description": "React component StepperList.",
3404
+ "props": [],
3405
+ "cva": null,
3406
+ "usageSnippet": "<StepperList>\n <StepperItem value={0}>\n <StepperTrigger>\n <StepperIndicator />\n <div className=\"flex flex-col\">\n <StepperTitle>Profile</StepperTitle>\n <StepperDescription>User details</StepperDescription>\n </div>\n </StepperTrigger>\n </StepperItem>\n <StepperSeparator />\n <StepperItem value={1}>\n <StepperTrigger>\n <StepperIndicator />\n <div className=\"flex flex-col\">\n <StepperTitle>Billing</StepperTitle>\n <StepperDescription>Card info</StepperDescription>\n </div>\n </StepperTrigger>\n </StepperItem>\n <StepperSeparator />\n <StepperItem value={2}>\n <StepperTrigger>\n <StepperIndicator />\n <div className=\"flex flex-col\">\n <StepperTitle>Review</StepperTitle>\n <StepperDescription>Confirm</StepperDescription>\n </div>\n </StepperTrigger>\n </StepperItem>\n</StepperList>"
3407
+ },
3408
+ {
3409
+ "name": "StepperItem",
3410
+ "importPath": "import { StepperItem } from \"@kjaniec-dev/ui\";",
3411
+ "description": "React component StepperItem.",
3412
+ "props": [
3413
+ {
3414
+ "name": "value",
3415
+ "type": "number",
3416
+ "optional": false,
3417
+ "defaultValue": null,
3418
+ "description": ""
3419
+ },
3420
+ {
3421
+ "name": "disabled",
3422
+ "type": "boolean",
3423
+ "optional": true,
3424
+ "defaultValue": "false",
3425
+ "description": ""
3426
+ }
3427
+ ],
3428
+ "cva": null,
3429
+ "usageSnippet": "<StepperItem value={0}>\n <StepperTrigger>\n <StepperIndicator />\n <div className=\"flex flex-col\">\n <StepperTitle>Profile</StepperTitle>\n <StepperDescription>User details</StepperDescription>\n </div>\n </StepperTrigger>\n</StepperItem>"
3430
+ },
3431
+ {
3432
+ "name": "StepperTrigger",
3433
+ "importPath": "import { StepperTrigger } from \"@kjaniec-dev/ui\";",
3434
+ "description": "React component StepperTrigger.",
3435
+ "props": [],
3436
+ "cva": null,
3437
+ "usageSnippet": "<StepperTrigger>\n <StepperIndicator />\n <div className=\"flex flex-col\">\n <StepperTitle>Profile</StepperTitle>\n <StepperDescription>User details</StepperDescription>\n </div>\n</StepperTrigger>"
3438
+ },
3439
+ {
3440
+ "name": "StepperIndicator",
3441
+ "importPath": "import { StepperIndicator } from \"@kjaniec-dev/ui\";",
3442
+ "description": "React component StepperIndicator.",
3443
+ "props": [],
3444
+ "cva": null,
3445
+ "usageSnippet": "<StepperIndicator />"
3446
+ },
3447
+ {
3448
+ "name": "StepperTitle",
3449
+ "importPath": "import { StepperTitle } from \"@kjaniec-dev/ui\";",
3450
+ "description": "React component StepperTitle.",
3451
+ "props": [],
3452
+ "cva": null,
3453
+ "usageSnippet": "<StepperTitle>Profile</StepperTitle>"
3454
+ },
3455
+ {
3456
+ "name": "StepperDescription",
3457
+ "importPath": "import { StepperDescription } from \"@kjaniec-dev/ui\";",
3458
+ "description": "React component StepperDescription.",
3459
+ "props": [],
3460
+ "cva": null,
3461
+ "usageSnippet": "<StepperDescription>User details</StepperDescription>"
3462
+ },
3463
+ {
3464
+ "name": "StepperSeparator",
3465
+ "importPath": "import { StepperSeparator } from \"@kjaniec-dev/ui\";",
3466
+ "description": "React component StepperSeparator.",
3467
+ "props": [],
3468
+ "cva": null,
3469
+ "usageSnippet": "<StepperSeparator />"
3470
+ },
3471
+ {
3472
+ "name": "StepperContent",
3473
+ "importPath": "import { StepperContent } from \"@kjaniec-dev/ui\";",
3474
+ "description": "React component StepperContent.",
3475
+ "props": [
3476
+ {
3477
+ "name": "value",
3478
+ "type": "number",
3479
+ "optional": false,
3480
+ "defaultValue": null,
3481
+ "description": ""
3482
+ }
3483
+ ],
3484
+ "cva": null,
3485
+ "usageSnippet": "<StepperContent value={0}>\n <p>Step 1 Form Content: Please input username.</p>\n</StepperContent>"
3486
+ },
3487
+ {
3488
+ "name": "AppShell",
3489
+ "importPath": "import { AppShell } from \"@kjaniec-dev/ui\";",
3490
+ "description": "React component AppShell.",
3491
+ "props": [
3492
+ {
3493
+ "name": "banner",
3494
+ "type": "React.ReactNode",
3495
+ "optional": true,
3496
+ "defaultValue": null,
3497
+ "description": ""
3498
+ },
3499
+ {
3500
+ "name": "header",
3501
+ "type": "React.ReactNode",
3502
+ "optional": true,
3503
+ "defaultValue": null,
3504
+ "description": ""
3505
+ },
3506
+ {
3507
+ "name": "children",
3508
+ "type": "React.ReactNode",
3509
+ "optional": true,
3510
+ "defaultValue": null,
3511
+ "description": ""
3512
+ },
3513
+ {
3514
+ "name": "footer",
3515
+ "type": "React.ReactNode",
3516
+ "optional": true,
3517
+ "defaultValue": null,
3518
+ "description": ""
3519
+ },
3520
+ {
3521
+ "name": "contentWidth",
3522
+ "type": "\"default\" | \"narrow\" | \"wide\" | \"full\"",
3523
+ "optional": true,
3524
+ "defaultValue": null,
3525
+ "description": ""
3526
+ },
3527
+ {
3528
+ "name": "headerPosition",
3529
+ "type": "\"sticky\" | \"fixed\" | \"static\"",
3530
+ "optional": true,
3531
+ "defaultValue": null,
3532
+ "description": ""
3533
+ },
3534
+ {
3535
+ "name": "headerVariant",
3536
+ "type": "\"glass\" | \"solid\" | \"transparent\"",
3537
+ "optional": true,
3538
+ "defaultValue": null,
3539
+ "description": ""
3540
+ },
3541
+ {
3542
+ "name": "paddedContent",
3543
+ "type": "boolean",
3544
+ "optional": true,
3545
+ "defaultValue": null,
3546
+ "description": ""
3547
+ },
3548
+ {
3549
+ "name": "mobileNav",
3550
+ "type": "React.ReactNode",
3551
+ "optional": true,
3552
+ "defaultValue": null,
3553
+ "description": ""
3554
+ }
3555
+ ],
3556
+ "cva": null,
3557
+ "usageSnippet": "<AppShell\n banner={<div>🚀 Announcement: KJ Product Kit v1.0 released!</div>}\n header={\n <div className=\"w-full flex items-center justify-between\">\n <div className=\"font-bold text-xl tracking-tight\">KJ Product Kit</div>\n <div className=\"hidden md:flex items-center gap-6 text-sm text-muted-foreground font-medium\">\n <a href=\"#\" className=\"hover:text-foreground\">Features</a>\n <a href=\"#\" className=\"hover:text-foreground\">Docs</a>\n <a href=\"#\" className=\"hover:text-foreground\">Pricing</a>\n </div>\n <Button size=\"sm\">Get Started</Button>\n </div>\n }\n mobileNav={\n <div className=\"flex flex-col gap-4 text-sm font-medium\">\n <a href=\"#\" className=\"hover:text-foreground\">Features</a>\n <a href=\"#\" className=\"hover:text-foreground\">Docs</a>\n <a href=\"#\" className=\"hover:text-foreground\">Pricing</a>\n </div>\n }\n footer={\n <div className=\"flex flex-col md:flex-row justify-between items-center gap-4 text-sm text-muted-foreground\">\n <div>© 2026 KJ Product Kit. All rights reserved.</div>\n <div className=\"flex gap-6\">\n <a href=\"#\" className=\"hover:text-foreground\">Privacy</a>\n <a href=\"#\" className=\"hover:text-foreground\">Terms</a>\n <a href=\"#\" className=\"hover:text-foreground\">GitHub</a>\n </div>\n </div>\n }\n>\n <div className=\"py-12 space-y-6\">\n <h1 className=\"text-4xl font-extrabold tracking-tight\">Build faster with KJ UI</h1>\n <p className=\"text-lg text-muted-foreground max-w-2xl\">\n A modern, accessible design system tailored for developer tools, SaaS applications, and developer portfolios.\n </p>\n </div>\n</AppShell>"
3558
+ },
3559
+ {
3560
+ "name": "AppShellBanner",
3561
+ "importPath": "import { AppShellBanner } from \"@kjaniec-dev/ui\";",
3562
+ "description": "React component AppShellBanner.",
3563
+ "props": [
3564
+ {
3565
+ "name": "variant",
3566
+ "type": "\"primary\" | \"accent\" | \"muted\"",
3567
+ "optional": true,
3568
+ "defaultValue": "\"primary\"",
3569
+ "description": ""
3570
+ },
3571
+ {
3572
+ "name": "closable",
3573
+ "type": "boolean",
3574
+ "optional": true,
3575
+ "defaultValue": null,
3576
+ "description": ""
3577
+ },
3578
+ {
3579
+ "name": "onClose",
3580
+ "type": "() => void",
3581
+ "optional": true,
3582
+ "defaultValue": null,
3583
+ "description": ""
3584
+ },
3585
+ {
3586
+ "name": "children",
3587
+ "type": "React.ReactNode",
3588
+ "optional": false,
3589
+ "defaultValue": null,
3590
+ "description": ""
3591
+ }
3592
+ ],
3593
+ "cva": null,
3594
+ "usageSnippet": "<AppShellBanner>\n <!-- Content -->\n</AppShellBanner>"
3595
+ },
3596
+ {
3597
+ "name": "AppShellHeader",
3598
+ "importPath": "import { AppShellHeader } from \"@kjaniec-dev/ui\";",
3599
+ "description": "React component AppShellHeader.",
3600
+ "props": [
3601
+ {
3602
+ "name": "variant",
3603
+ "type": "\"glass\" | \"solid\" | \"transparent\"",
3604
+ "optional": true,
3605
+ "defaultValue": "\"glass\"",
3606
+ "description": ""
3607
+ },
3608
+ {
3609
+ "name": "position",
3610
+ "type": "\"sticky\" | \"fixed\" | \"static\"",
3611
+ "optional": true,
3612
+ "defaultValue": "\"sticky\"",
3613
+ "description": ""
3614
+ },
3615
+ {
3616
+ "name": "bordered",
3617
+ "type": "boolean",
3618
+ "optional": true,
3619
+ "defaultValue": "true",
3620
+ "description": ""
3621
+ },
3622
+ {
3623
+ "name": "children",
3624
+ "type": "React.ReactNode",
3625
+ "optional": true,
3626
+ "defaultValue": null,
3627
+ "description": ""
3628
+ },
3629
+ {
3630
+ "name": "mobileNav",
3631
+ "type": "React.ReactNode",
3632
+ "optional": true,
3633
+ "defaultValue": null,
3634
+ "description": ""
3635
+ }
3636
+ ],
3637
+ "cva": null,
3638
+ "usageSnippet": "<AppShellHeader>\n <!-- Content -->\n</AppShellHeader>"
3639
+ },
3640
+ {
3641
+ "name": "AppShellMain",
3642
+ "importPath": "import { AppShellMain } from \"@kjaniec-dev/ui\";",
3643
+ "description": "React component AppShellMain.",
3644
+ "props": [
3645
+ {
3646
+ "name": "width",
3647
+ "type": "\"default\" | \"narrow\" | \"wide\" | \"full\"",
3648
+ "optional": true,
3649
+ "defaultValue": "\"default\"",
3650
+ "description": ""
3651
+ },
3652
+ {
3653
+ "name": "padded",
3654
+ "type": "boolean",
3655
+ "optional": true,
3656
+ "defaultValue": "true",
3657
+ "description": ""
3658
+ },
3659
+ {
3660
+ "name": "children",
3661
+ "type": "React.ReactNode",
3662
+ "optional": false,
3663
+ "defaultValue": null,
3664
+ "description": ""
3665
+ }
3666
+ ],
3667
+ "cva": null,
3668
+ "usageSnippet": "<AppShellMain>\n <!-- Content -->\n</AppShellMain>"
3669
+ },
3670
+ {
3671
+ "name": "AppShellFooter",
3672
+ "importPath": "import { AppShellFooter } from \"@kjaniec-dev/ui\";",
3673
+ "description": "React component AppShellFooter.",
3674
+ "props": [
3675
+ {
3676
+ "name": "bordered",
3677
+ "type": "boolean",
3678
+ "optional": true,
3679
+ "defaultValue": "true",
3680
+ "description": ""
3681
+ },
3682
+ {
3683
+ "name": "children",
3684
+ "type": "React.ReactNode",
3685
+ "optional": false,
3686
+ "defaultValue": null,
3687
+ "description": ""
3688
+ }
3689
+ ],
3690
+ "cva": null,
3691
+ "usageSnippet": "<AppShellFooter>\n <!-- Content -->\n</AppShellFooter>"
3692
+ },
3693
+ {
3694
+ "name": "Rating",
3695
+ "importPath": "import { Rating } from \"@kjaniec-dev/ui\";",
3696
+ "description": "React component Rating.",
3697
+ "props": [
3698
+ {
3699
+ "name": "stars",
3700
+ "type": "number",
3701
+ "optional": false,
3702
+ "defaultValue": null,
3703
+ "description": ""
3704
+ },
3705
+ {
3706
+ "name": "count",
3707
+ "type": "number",
3708
+ "optional": false,
3709
+ "defaultValue": null,
3710
+ "description": ""
3711
+ },
3712
+ {
3713
+ "name": "percentage",
3714
+ "type": "number",
3715
+ "optional": false,
3716
+ "defaultValue": null,
3717
+ "description": ""
3718
+ }
3719
+ ],
3720
+ "cva": null,
3721
+ "usageSnippet": "<Rating>\n <!-- Content -->\n</Rating>"
3722
+ },
3723
+ {
3724
+ "name": "RatingField",
3725
+ "importPath": "import { RatingField } from \"@kjaniec-dev/ui\";",
3726
+ "description": "React component RatingField.",
3727
+ "props": [],
3728
+ "cva": null,
3729
+ "usageSnippet": "<RatingField>\n <!-- Content -->\n</RatingField>"
3730
+ },
3731
+ {
3732
+ "name": "RatingSummary",
3733
+ "importPath": "import { RatingSummary } from \"@kjaniec-dev/ui\";",
3734
+ "description": "React component RatingSummary.",
3735
+ "props": [
3736
+ {
3737
+ "name": "average",
3738
+ "type": "number",
3739
+ "optional": false,
3740
+ "defaultValue": null,
3741
+ "description": ""
3742
+ },
3743
+ {
3744
+ "name": "totalCount",
3745
+ "type": "number",
3746
+ "optional": false,
3747
+ "defaultValue": null,
3748
+ "description": ""
3749
+ },
3750
+ {
3751
+ "name": "distribution",
3752
+ "type": "RatingDistributionItem[]",
3753
+ "optional": false,
3754
+ "defaultValue": null,
3755
+ "description": ""
3756
+ },
3757
+ {
3758
+ "name": "max",
3759
+ "type": "number",
3760
+ "optional": true,
3761
+ "defaultValue": "5",
3762
+ "description": ""
3763
+ },
3764
+ {
3765
+ "name": "size",
3766
+ "type": "RatingSize",
3767
+ "optional": true,
3768
+ "defaultValue": "\"md\"",
3769
+ "description": ""
3770
+ },
3771
+ {
3772
+ "name": "icon",
3773
+ "type": "RatingIconType | React.ComponentType<{ className?: string }>",
3774
+ "optional": true,
3775
+ "defaultValue": "\"star\"",
3776
+ "description": ""
3777
+ }
3778
+ ],
3779
+ "cva": null,
3780
+ "usageSnippet": "<RatingSummary>\n <!-- Content -->\n</RatingSummary>"
3781
+ },
3782
+ {
3783
+ "name": "PricingCard",
3784
+ "importPath": "import { PricingCard } from \"@kjaniec-dev/ui\";",
3785
+ "description": "React component PricingCard.",
3786
+ "props": [
3787
+ {
3788
+ "name": "name",
3789
+ "type": "string",
3790
+ "optional": false,
3791
+ "defaultValue": null,
3792
+ "description": ""
3793
+ },
3794
+ {
3795
+ "name": "price",
3796
+ "type": "string | number",
3797
+ "optional": false,
3798
+ "defaultValue": null,
3799
+ "description": ""
3800
+ },
3801
+ {
3802
+ "name": "period",
3803
+ "type": "string",
3804
+ "optional": true,
3805
+ "defaultValue": null,
3806
+ "description": ""
3807
+ },
3808
+ {
3809
+ "name": "description",
3810
+ "type": "string",
3811
+ "optional": true,
3812
+ "defaultValue": null,
3813
+ "description": ""
3814
+ },
3815
+ {
3816
+ "name": "features",
3817
+ "type": "PricingFeatureItem[]",
3818
+ "optional": true,
3819
+ "defaultValue": "[]",
3820
+ "description": ""
3821
+ },
3822
+ {
3823
+ "name": "variant",
3824
+ "type": "\"default\" | \"featured\" | \"outline\"",
3825
+ "optional": true,
3826
+ "defaultValue": null,
3827
+ "description": ""
3828
+ },
3829
+ {
3830
+ "name": "badge",
3831
+ "type": "string",
3832
+ "optional": true,
3833
+ "defaultValue": null,
3834
+ "description": ""
3835
+ },
3836
+ {
3837
+ "name": "popular",
3838
+ "type": "boolean",
3839
+ "optional": true,
3840
+ "defaultValue": "false",
3841
+ "description": ""
3842
+ },
3843
+ {
3844
+ "name": "ctaText",
3845
+ "type": "string",
3846
+ "optional": true,
3847
+ "defaultValue": "\"Get Started\"",
3848
+ "description": ""
3849
+ },
3850
+ {
3851
+ "name": "onCtaClick",
3852
+ "type": "React.MouseEventHandler<HTMLButtonElement>",
3853
+ "optional": true,
3854
+ "defaultValue": null,
3855
+ "description": ""
3856
+ },
3857
+ {
3858
+ "name": "ctaHref",
3859
+ "type": "string",
3860
+ "optional": true,
3861
+ "defaultValue": null,
3862
+ "description": ""
3863
+ },
3864
+ {
3865
+ "name": "cta",
3866
+ "type": "React.ReactNode",
3867
+ "optional": true,
3868
+ "defaultValue": null,
3869
+ "description": ""
3870
+ },
3871
+ {
3872
+ "name": "disabled",
3873
+ "type": "boolean",
3874
+ "optional": true,
3875
+ "defaultValue": "false",
3876
+ "description": ""
3877
+ }
3878
+ ],
3879
+ "cva": null,
3880
+ "usageSnippet": "<PricingCard>\n <!-- Content -->\n</PricingCard>"
3881
+ },
3882
+ {
3883
+ "name": "BlogCard",
3884
+ "importPath": "import { BlogCard } from \"@kjaniec-dev/ui\";",
3885
+ "description": "React component BlogCard.",
3886
+ "props": [
3887
+ {
3888
+ "name": "title",
3889
+ "type": "string",
3890
+ "optional": false,
3891
+ "defaultValue": null,
3892
+ "description": ""
3893
+ },
3894
+ {
3895
+ "name": "description",
3896
+ "type": "string",
3897
+ "optional": true,
3898
+ "defaultValue": null,
3899
+ "description": ""
3900
+ },
3901
+ {
3902
+ "name": "coverUrl",
3903
+ "type": "string",
3904
+ "optional": true,
3905
+ "defaultValue": null,
3906
+ "description": ""
3907
+ },
3908
+ {
3909
+ "name": "coverAlt",
3910
+ "type": "string",
3911
+ "optional": true,
3912
+ "defaultValue": null,
3913
+ "description": ""
3914
+ },
3915
+ {
3916
+ "name": "category",
3917
+ "type": "string",
3918
+ "optional": true,
3919
+ "defaultValue": null,
3920
+ "description": ""
3921
+ },
3922
+ {
3923
+ "name": "readTime",
3924
+ "type": "string",
3925
+ "optional": true,
3926
+ "defaultValue": null,
3927
+ "description": ""
3928
+ },
3929
+ {
3930
+ "name": "publishedAt",
3931
+ "type": "string",
3932
+ "optional": true,
3933
+ "defaultValue": null,
3934
+ "description": ""
3935
+ },
3936
+ {
3937
+ "name": "author",
3938
+ "type": "BlogCardAuthor",
3939
+ "optional": true,
3940
+ "defaultValue": null,
3941
+ "description": ""
3942
+ },
3943
+ {
3944
+ "name": "orientation",
3945
+ "type": "\"vertical\" | \"horizontal\"",
3946
+ "optional": true,
3947
+ "defaultValue": "\"vertical\"",
3948
+ "description": ""
3949
+ },
3950
+ {
3951
+ "name": "href",
3952
+ "type": "string",
3953
+ "optional": true,
3954
+ "defaultValue": null,
3955
+ "description": ""
3956
+ }
3957
+ ],
3958
+ "cva": null,
3959
+ "usageSnippet": "<BlogCard>\n <!-- Content -->\n</BlogCard>"
3960
+ },
3961
+ {
3962
+ "name": "ProjectCard",
3963
+ "importPath": "import { ProjectCard } from \"@kjaniec-dev/ui\";",
3964
+ "description": "React component ProjectCard.",
3965
+ "props": [
3966
+ {
3967
+ "name": "title",
3968
+ "type": "string",
3969
+ "optional": false,
3970
+ "defaultValue": null,
3971
+ "description": ""
3972
+ },
3973
+ {
3974
+ "name": "description",
3975
+ "type": "string",
3976
+ "optional": true,
3977
+ "defaultValue": null,
3978
+ "description": ""
3979
+ },
3980
+ {
3981
+ "name": "status",
3982
+ "type": "ProjectCardStatus",
3983
+ "optional": true,
3984
+ "defaultValue": null,
3985
+ "description": ""
3986
+ },
3987
+ {
3988
+ "name": "techStack",
3989
+ "type": "string[]",
3990
+ "optional": true,
3991
+ "defaultValue": "[]",
3992
+ "description": ""
3993
+ },
3994
+ {
3995
+ "name": "metrics",
3996
+ "type": "ProjectCardMetric[]",
3997
+ "optional": true,
3998
+ "defaultValue": "[]",
3999
+ "description": ""
4000
+ },
4001
+ {
4002
+ "name": "updatedAt",
4003
+ "type": "string",
4004
+ "optional": true,
4005
+ "defaultValue": null,
4006
+ "description": ""
4007
+ },
4008
+ {
4009
+ "name": "actions",
4010
+ "type": "React.ReactNode",
4011
+ "optional": true,
4012
+ "defaultValue": null,
4013
+ "description": ""
4014
+ }
4015
+ ],
4016
+ "cva": null,
4017
+ "usageSnippet": "<ProjectCard>\n <!-- Content -->\n</ProjectCard>"
4018
+ },
4019
+ {
4020
+ "name": "InboxPopover",
4021
+ "importPath": "import { InboxPopover } from \"@kjaniec-dev/ui\";",
4022
+ "description": "React component InboxPopover.",
4023
+ "props": [
4024
+ {
4025
+ "name": "children",
4026
+ "type": "React.ReactNode",
4027
+ "optional": false,
4028
+ "defaultValue": null,
4029
+ "description": ""
4030
+ },
4031
+ {
4032
+ "name": "open",
4033
+ "type": "boolean",
4034
+ "optional": true,
4035
+ "defaultValue": null,
4036
+ "description": ""
4037
+ },
4038
+ {
4039
+ "name": "onOpenChange",
4040
+ "type": "(open: boolean) => void",
4041
+ "optional": true,
4042
+ "defaultValue": null,
4043
+ "description": ""
4044
+ },
4045
+ {
4046
+ "name": "className",
4047
+ "type": "string",
4048
+ "optional": true,
4049
+ "defaultValue": null,
4050
+ "description": ""
4051
+ }
4052
+ ],
4053
+ "cva": null,
4054
+ "usageSnippet": "<InboxPopover>\n <InboxTrigger unreadCount={unreadCount} />\n <InboxContent\n items={items}\n onMarkAllRead={markAllRead}\n onDismiss={dismiss}\n viewAllHref=\"#\"\n />\n</InboxPopover>"
4055
+ },
4056
+ {
4057
+ "name": "InboxTrigger",
4058
+ "importPath": "import { InboxTrigger } from \"@kjaniec-dev/ui\";",
4059
+ "description": "React component InboxTrigger.",
4060
+ "props": [
4061
+ {
4062
+ "name": "unreadCount",
4063
+ "type": "number",
4064
+ "optional": true,
4065
+ "defaultValue": null,
4066
+ "description": "Badge count. Hidden when 0 or undefined."
4067
+ },
4068
+ {
4069
+ "name": "label",
4070
+ "type": "string",
4071
+ "optional": true,
4072
+ "defaultValue": "\"Notifications\"",
4073
+ "description": "Accessible label (default: \"Notifications\")."
4074
+ }
4075
+ ],
4076
+ "cva": null,
4077
+ "usageSnippet": "<InboxTrigger unreadCount={unreadCount} />"
4078
+ },
4079
+ {
4080
+ "name": "InboxContent",
4081
+ "importPath": "import { InboxContent } from \"@kjaniec-dev/ui\";",
4082
+ "description": "React component InboxContent.",
4083
+ "props": [
4084
+ {
4085
+ "name": "items",
4086
+ "type": "NotificationItemData[]",
4087
+ "optional": false,
4088
+ "defaultValue": null,
4089
+ "description": ""
4090
+ },
4091
+ {
4092
+ "name": "onMarkAllRead",
4093
+ "type": "() => void",
4094
+ "optional": true,
4095
+ "defaultValue": null,
4096
+ "description": ""
4097
+ },
4098
+ {
4099
+ "name": "onDismiss",
4100
+ "type": "(id: string) => void",
4101
+ "optional": true,
4102
+ "defaultValue": null,
4103
+ "description": ""
4104
+ },
4105
+ {
4106
+ "name": "viewAllHref",
4107
+ "type": "string",
4108
+ "optional": true,
4109
+ "defaultValue": null,
4110
+ "description": ""
4111
+ },
4112
+ {
4113
+ "name": "viewAllLabel",
4114
+ "type": "string",
4115
+ "optional": true,
4116
+ "defaultValue": "\"View all notifications\"",
4117
+ "description": ""
4118
+ },
4119
+ {
4120
+ "name": "emptyState",
4121
+ "type": "React.ReactNode",
4122
+ "optional": true,
4123
+ "defaultValue": null,
4124
+ "description": ""
4125
+ },
4126
+ {
4127
+ "name": "width",
4128
+ "type": "number | string",
4129
+ "optional": true,
4130
+ "defaultValue": "360",
4131
+ "description": ""
4132
+ },
4133
+ {
4134
+ "name": "maxHeight",
4135
+ "type": "number | string",
4136
+ "optional": true,
4137
+ "defaultValue": "320",
4138
+ "description": ""
4139
+ },
4140
+ {
4141
+ "name": "className",
4142
+ "type": "string",
4143
+ "optional": true,
4144
+ "defaultValue": null,
4145
+ "description": ""
4146
+ }
4147
+ ],
4148
+ "cva": null,
4149
+ "usageSnippet": "<InboxContent\n items={items}\n onMarkAllRead={markAllRead}\n onDismiss={dismiss}\n viewAllHref=\"#\"\n/>"
4150
+ },
4151
+ {
4152
+ "name": "NotificationItem",
4153
+ "importPath": "import { NotificationItem } from \"@kjaniec-dev/ui\";",
4154
+ "description": "React component NotificationItem.",
4155
+ "props": [
4156
+ {
4157
+ "name": "item",
4158
+ "type": "NotificationItemData",
4159
+ "optional": false,
4160
+ "defaultValue": null,
4161
+ "description": ""
4162
+ },
4163
+ {
4164
+ "name": "onDismiss",
4165
+ "type": "(id: string) => void",
4166
+ "optional": true,
4167
+ "defaultValue": null,
4168
+ "description": ""
4169
+ },
4170
+ {
4171
+ "name": "className",
4172
+ "type": "string",
4173
+ "optional": true,
4174
+ "defaultValue": null,
4175
+ "description": ""
4176
+ }
4177
+ ],
4178
+ "cva": null,
4179
+ "usageSnippet": "<NotificationItem>\n <!-- Content -->\n</NotificationItem>"
4180
+ },
4181
+ {
4182
+ "name": "ColorPicker",
4183
+ "importPath": "import { ColorPicker } from \"@kjaniec-dev/ui\";",
4184
+ "description": "React component ColorPicker.",
4185
+ "props": [
4186
+ {
4187
+ "name": "value",
4188
+ "type": "string",
4189
+ "optional": true,
4190
+ "defaultValue": null,
4191
+ "description": "Current hex color value (controlled)."
4192
+ },
4193
+ {
4194
+ "name": "defaultValue",
4195
+ "type": "string",
4196
+ "optional": true,
4197
+ "defaultValue": "\"#3B82F6\"",
4198
+ "description": "Initial hex color value (uncontrolled). Defaults to \"#3B82F6\"."
4199
+ },
4200
+ {
4201
+ "name": "onChange",
4202
+ "type": "(hex: string) => void",
4203
+ "optional": true,
4204
+ "defaultValue": null,
4205
+ "description": "Called when color changes."
4206
+ },
4207
+ {
4208
+ "name": "swatches",
4209
+ "type": "readonly string[] | string[]",
4210
+ "optional": true,
4211
+ "defaultValue": "DEFAULT_COLOR_SWATCHES",
4212
+ "description": "Array of hex color strings for preset palette. Defaults to DEFAULT_COLOR_SWATCHES."
4213
+ },
4214
+ {
4215
+ "name": "disabled",
4216
+ "type": "boolean",
4217
+ "optional": true,
4218
+ "defaultValue": "false",
4219
+ "description": "Whether the picker is disabled."
4220
+ },
4221
+ {
4222
+ "name": "showHexInput",
4223
+ "type": "boolean",
4224
+ "optional": true,
4225
+ "defaultValue": "true",
4226
+ "description": "Whether to show the manual Hex text input inside the popover. Defaults to true."
4227
+ },
4228
+ {
4229
+ "name": "className",
4230
+ "type": "string",
4231
+ "optional": true,
4232
+ "defaultValue": null,
4233
+ "description": "Additional class name for the container."
4234
+ }
4235
+ ],
4236
+ "cva": null,
4237
+ "usageSnippet": "<ColorPicker>\n <!-- Content -->\n</ColorPicker>"
4238
+ },
4239
+ {
4240
+ "name": "ColorPickerField",
4241
+ "importPath": "import { ColorPickerField } from \"@kjaniec-dev/ui\";",
4242
+ "description": "React component ColorPickerField.",
4243
+ "props": [
4244
+ {
4245
+ "name": "label",
4246
+ "type": "React.ReactNode",
4247
+ "optional": true,
4248
+ "defaultValue": null,
4249
+ "description": ""
4250
+ },
4251
+ {
4252
+ "name": "hint",
4253
+ "type": "React.ReactNode",
4254
+ "optional": true,
4255
+ "defaultValue": null,
4256
+ "description": ""
4257
+ },
4258
+ {
4259
+ "name": "error",
4260
+ "type": "React.ReactNode",
4261
+ "optional": true,
4262
+ "defaultValue": null,
4263
+ "description": ""
4264
+ },
4265
+ {
4266
+ "name": "required",
4267
+ "type": "boolean",
4268
+ "optional": true,
4269
+ "defaultValue": null,
4270
+ "description": ""
4271
+ }
4272
+ ],
4273
+ "cva": null,
4274
+ "usageSnippet": "<ColorPickerField\n label=\"Brand Primary Color\"\n hint=\"Choose your main product accent color\"\n defaultValue=\"#3B82F6\"\n/>"
4275
+ },
4276
+ {
4277
+ "name": "ColorPickerSwatch",
4278
+ "importPath": "import { ColorPickerSwatch } from \"@kjaniec-dev/ui\";",
4279
+ "description": "React component ColorPickerSwatch.",
4280
+ "props": [
4281
+ {
4282
+ "name": "color",
4283
+ "type": "string",
4284
+ "optional": false,
4285
+ "defaultValue": null,
4286
+ "description": ""
4287
+ },
4288
+ {
4289
+ "name": "selected",
4290
+ "type": "boolean",
4291
+ "optional": true,
4292
+ "defaultValue": "false",
4293
+ "description": ""
4294
+ },
4295
+ {
4296
+ "name": "size",
4297
+ "type": "\"sm\" | \"md\" | \"lg\"",
4298
+ "optional": true,
4299
+ "defaultValue": "\"md\"",
4300
+ "description": ""
4301
+ }
4302
+ ],
4303
+ "cva": null,
4304
+ "usageSnippet": "<ColorPickerSwatch>\n <!-- Content -->\n</ColorPickerSwatch>"
4305
+ },
4306
+ {
4307
+ "name": "DEFAULT_COLOR_SWATCHES",
4308
+ "importPath": "import { DEFAULT_COLOR_SWATCHES } from \"@kjaniec-dev/ui\";",
4309
+ "description": "React component DEFAULT_COLOR_SWATCHES.",
4310
+ "props": [],
4311
+ "cva": null,
4312
+ "usageSnippet": "<DEFAULT_COLOR_SWATCHES>\n <!-- Content -->\n</DEFAULT_COLOR_SWATCHES>"
4313
+ },
4314
+ {
4315
+ "name": "ImageGallery",
4316
+ "importPath": "import { ImageGallery } from \"@kjaniec-dev/ui\";",
4317
+ "description": "React component ImageGallery.",
4318
+ "props": [
4319
+ {
4320
+ "name": "images",
4321
+ "type": "GalleryImage[]",
4322
+ "optional": false,
4323
+ "defaultValue": "[]",
4324
+ "description": ""
4325
+ },
4326
+ {
4327
+ "name": "columns",
4328
+ "type": "2 | 3 | 4 | 5",
4329
+ "optional": true,
4330
+ "defaultValue": "3",
4331
+ "description": ""
4332
+ },
4333
+ {
4334
+ "name": "aspectRatio",
4335
+ "type": "\"square\" | \"video\" | \"4/3\" | \"auto\" | string",
4336
+ "optional": true,
4337
+ "defaultValue": "\"square\"",
4338
+ "description": ""
4339
+ },
4340
+ {
4341
+ "name": "maxVisible",
4342
+ "type": "number",
4343
+ "optional": true,
4344
+ "defaultValue": null,
4345
+ "description": ""
4346
+ },
4347
+ {
4348
+ "name": "className",
4349
+ "type": "string",
4350
+ "optional": true,
4351
+ "defaultValue": null,
4352
+ "description": ""
4353
+ },
4354
+ {
4355
+ "name": "thumbnailClassName",
4356
+ "type": "string",
4357
+ "optional": true,
4358
+ "defaultValue": null,
4359
+ "description": ""
4360
+ },
4361
+ {
4362
+ "name": "lightboxClassName",
4363
+ "type": "string",
4364
+ "optional": true,
4365
+ "defaultValue": null,
4366
+ "description": ""
4367
+ },
4368
+ {
4369
+ "name": "onImageClick",
4370
+ "type": "(index: number) => void",
4371
+ "optional": true,
2190
4372
  "defaultValue": null,
2191
4373
  "description": ""
2192
4374
  }
2193
4375
  ],
2194
4376
  "cva": null,
2195
- "usageSnippet": "<SidebarNavGroup>\n <!-- Content -->\n</SidebarNavGroup>"
4377
+ "usageSnippet": "<ImageGallery images={sampleImages.slice(0, 4)} columns={2} />"
2196
4378
  }
2197
4379
  ]