@thesage/mcp 0.3.0 → 0.6.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 (3) hide show
  1. package/dist/index.js +969 -109
  2. package/dist/index.mjs +969 -109
  3. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -82,7 +82,14 @@ var COMPONENT_REGISTRY = {
82
82
  "Call-to-action elements"
83
83
  ],
84
84
  dependencies: ["@radix-ui/react-slot"],
85
- radixPrimitive: "@radix-ui/react-slot"
85
+ radixPrimitive: "@radix-ui/react-slot",
86
+ props: {
87
+ variant: { type: "'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link'", default: "'default'", description: "Visual style variant" },
88
+ size: { type: "'sm' | 'default' | 'lg' | 'icon'", default: "'default'", description: "Size variant" },
89
+ disabled: { type: "boolean", default: "false", description: "Disable interaction" },
90
+ asChild: { type: "boolean", default: "false", description: "Render as child element via Radix Slot" }
91
+ },
92
+ example: `<Button variant="outline" size="sm" onClick={handleClick}>Click Me</Button>`
86
93
  },
87
94
  toggle: {
88
95
  name: "Toggle",
@@ -96,7 +103,15 @@ var COMPONENT_REGISTRY = {
96
103
  "Filter activation"
97
104
  ],
98
105
  dependencies: ["@radix-ui/react-toggle"],
99
- radixPrimitive: "@radix-ui/react-toggle"
106
+ radixPrimitive: "@radix-ui/react-toggle",
107
+ props: {
108
+ pressed: { type: "boolean", description: "Controlled pressed state" },
109
+ onPressedChange: { type: "(pressed: boolean) => void", description: "Callback on press change" },
110
+ variant: { type: "'default' | 'outline'", default: "'default'", description: "Visual variant" },
111
+ size: { type: "'sm' | 'default' | 'lg'", default: "'default'", description: "Size variant" },
112
+ disabled: { type: "boolean", default: "false", description: "Disable interaction" }
113
+ },
114
+ example: `<Toggle pressed={isBold} onPressedChange={setIsBold}><Bold className="h-4 w-4" /></Toggle>`
100
115
  },
101
116
  "toggle-group": {
102
117
  name: "ToggleGroup",
@@ -110,7 +125,19 @@ var COMPONENT_REGISTRY = {
110
125
  "Option selection"
111
126
  ],
112
127
  dependencies: ["@radix-ui/react-toggle-group"],
113
- radixPrimitive: "@radix-ui/react-toggle-group"
128
+ radixPrimitive: "@radix-ui/react-toggle-group",
129
+ props: {
130
+ type: { type: "'single' | 'multiple'", description: "Selection mode", required: true },
131
+ value: { type: "string | string[]", description: "Selected value(s)" },
132
+ onValueChange: { type: "(value) => void", description: "Callback on value change" },
133
+ variant: { type: "'default' | 'outline'", default: "'default'", description: "Visual variant" },
134
+ size: { type: "'sm' | 'default' | 'lg'", default: "'default'", description: "Size variant" }
135
+ },
136
+ subComponents: ["ToggleGroupItem"],
137
+ example: `<ToggleGroup type="single" value={align} onValueChange={setAlign}>
138
+ <ToggleGroupItem value="left">Left</ToggleGroupItem>
139
+ <ToggleGroupItem value="center">Center</ToggleGroupItem>
140
+ </ToggleGroup>`
114
141
  },
115
142
  // ============================================================================
116
143
  // FORMS (11)
@@ -127,7 +154,16 @@ var COMPONENT_REGISTRY = {
127
154
  "Bulk actions"
128
155
  ],
129
156
  dependencies: ["@radix-ui/react-checkbox"],
130
- radixPrimitive: "@radix-ui/react-checkbox"
157
+ radixPrimitive: "@radix-ui/react-checkbox",
158
+ props: {
159
+ checked: { type: "boolean | 'indeterminate'", description: "Checked state" },
160
+ onCheckedChange: { type: "(checked: boolean) => void", description: "Callback on check change" },
161
+ disabled: { type: "boolean", default: "false", description: "Disable interaction" }
162
+ },
163
+ example: `<div className="flex items-center gap-2">
164
+ <Checkbox id="terms" checked={accepted} onCheckedChange={setAccepted} />
165
+ <Label htmlFor="terms">Accept terms</Label>
166
+ </div>`
131
167
  },
132
168
  combobox: {
133
169
  name: "Combobox",
@@ -141,7 +177,21 @@ var COMPONENT_REGISTRY = {
141
177
  "Large option lists"
142
178
  ],
143
179
  dependencies: ["cmdk", "@radix-ui/react-popover"],
144
- radixPrimitive: "@radix-ui/react-popover"
180
+ radixPrimitive: "@radix-ui/react-popover",
181
+ props: {
182
+ options: { type: "{ value: string; label: string }[]", description: "List of options", required: true },
183
+ value: { type: "string", description: "Selected value" },
184
+ onValueChange: { type: "(value: string) => void", description: "Callback on selection" },
185
+ placeholder: { type: "string", description: "Trigger placeholder text" },
186
+ searchPlaceholder: { type: "string", description: "Search input placeholder" },
187
+ emptyText: { type: "string", description: "Text when no results found" }
188
+ },
189
+ example: `<Combobox
190
+ options={[{ value: 'react', label: 'React' }, { value: 'vue', label: 'Vue' }]}
191
+ value={framework}
192
+ onValueChange={setFramework}
193
+ placeholder="Select framework"
194
+ />`
145
195
  },
146
196
  form: {
147
197
  name: "Form",
@@ -154,7 +204,23 @@ var COMPONENT_REGISTRY = {
154
204
  "Data entry",
155
205
  "Multi-step forms"
156
206
  ],
157
- dependencies: ["react-hook-form", "@hookform/resolvers", "zod"]
207
+ dependencies: ["react-hook-form", "@hookform/resolvers", "zod"],
208
+ props: {
209
+ "...form": { type: "UseFormReturn", description: "Spread react-hook-form useForm() return value", required: true }
210
+ },
211
+ subComponents: ["FormControl", "FormDescription", "FormField", "FormItem", "FormLabel", "FormMessage"],
212
+ example: `<Form {...form}>
213
+ <form onSubmit={form.handleSubmit(onSubmit)}>
214
+ <FormField control={form.control} name="email" render={({ field }) => (
215
+ <FormItem>
216
+ <FormLabel>Email</FormLabel>
217
+ <FormControl><Input {...field} /></FormControl>
218
+ <FormMessage />
219
+ </FormItem>
220
+ )} />
221
+ <Button type="submit">Submit</Button>
222
+ </form>
223
+ </Form>`
158
224
  },
159
225
  input: {
160
226
  name: "Input",
@@ -167,7 +233,13 @@ var COMPONENT_REGISTRY = {
167
233
  "Passwords",
168
234
  "Numeric input"
169
235
  ],
170
- dependencies: []
236
+ dependencies: [],
237
+ props: {
238
+ type: { type: "string", default: "'text'", description: "HTML input type" },
239
+ placeholder: { type: "string", description: "Placeholder text" },
240
+ disabled: { type: "boolean", default: "false", description: "Disable interaction" }
241
+ },
242
+ example: `<Input type="email" placeholder="Enter email" />`
171
243
  },
172
244
  "input-otp": {
173
245
  name: "InputOTP",
@@ -180,7 +252,26 @@ var COMPONENT_REGISTRY = {
180
252
  "Phone verification",
181
253
  "Security codes"
182
254
  ],
183
- dependencies: ["input-otp"]
255
+ dependencies: ["input-otp"],
256
+ props: {
257
+ maxLength: { type: "number", default: "6", description: "Maximum number of characters" },
258
+ value: { type: "string", description: "Controlled input value" },
259
+ onChange: { type: "(value: string) => void", description: "Callback on value change" }
260
+ },
261
+ subComponents: ["InputOTPGroup", "InputOTPSlot", "InputOTPSeparator"],
262
+ example: `<InputOTP maxLength={6}>
263
+ <InputOTPGroup>
264
+ <InputOTPSlot index={0} />
265
+ <InputOTPSlot index={1} />
266
+ <InputOTPSlot index={2} />
267
+ </InputOTPGroup>
268
+ <InputOTPSeparator />
269
+ <InputOTPGroup>
270
+ <InputOTPSlot index={3} />
271
+ <InputOTPSlot index={4} />
272
+ <InputOTPSlot index={5} />
273
+ </InputOTPGroup>
274
+ </InputOTP>`
184
275
  },
185
276
  label: {
186
277
  name: "Label",
@@ -193,7 +284,12 @@ var COMPONENT_REGISTRY = {
193
284
  "Accessible forms"
194
285
  ],
195
286
  dependencies: ["@radix-ui/react-label"],
196
- radixPrimitive: "@radix-ui/react-label"
287
+ radixPrimitive: "@radix-ui/react-label",
288
+ props: {
289
+ htmlFor: { type: "string", description: "ID of the associated form control" }
290
+ },
291
+ example: `<Label htmlFor="email">Email Address</Label>
292
+ <Input id="email" type="email" />`
197
293
  },
198
294
  "radio-group": {
199
295
  name: "RadioGroup",
@@ -207,7 +303,19 @@ var COMPONENT_REGISTRY = {
207
303
  "Shipping options"
208
304
  ],
209
305
  dependencies: ["@radix-ui/react-radio-group"],
210
- radixPrimitive: "@radix-ui/react-radio-group"
306
+ radixPrimitive: "@radix-ui/react-radio-group",
307
+ props: {
308
+ value: { type: "string", description: "Controlled selected value" },
309
+ onValueChange: { type: "(value: string) => void", description: "Callback on selection" },
310
+ disabled: { type: "boolean", default: "false", description: "Disable interaction" }
311
+ },
312
+ subComponents: ["RadioGroupItem"],
313
+ example: `<RadioGroup value={plan} onValueChange={setPlan}>
314
+ <div className="flex items-center gap-2">
315
+ <RadioGroupItem value="free" id="free" />
316
+ <Label htmlFor="free">Free</Label>
317
+ </div>
318
+ </RadioGroup>`
211
319
  },
212
320
  select: {
213
321
  name: "Select",
@@ -221,7 +329,22 @@ var COMPONENT_REGISTRY = {
221
329
  "Data sorting"
222
330
  ],
223
331
  dependencies: ["@radix-ui/react-select"],
224
- radixPrimitive: "@radix-ui/react-select"
332
+ radixPrimitive: "@radix-ui/react-select",
333
+ props: {
334
+ value: { type: "string", description: "Controlled selected value" },
335
+ onValueChange: { type: "(value: string) => void", description: "Callback on selection" },
336
+ defaultValue: { type: "string", description: "Default selected value" }
337
+ },
338
+ subComponents: ["SelectTrigger", "SelectValue", "SelectContent", "SelectItem", "SelectGroup", "SelectLabel", "SelectSeparator"],
339
+ example: `<Select value={theme} onValueChange={setTheme}>
340
+ <SelectTrigger className="w-[180px]">
341
+ <SelectValue placeholder="Select theme" />
342
+ </SelectTrigger>
343
+ <SelectContent>
344
+ <SelectItem value="light">Light</SelectItem>
345
+ <SelectItem value="dark">Dark</SelectItem>
346
+ </SelectContent>
347
+ </Select>`
225
348
  },
226
349
  slider: {
227
350
  name: "Slider",
@@ -235,7 +358,16 @@ var COMPONENT_REGISTRY = {
235
358
  "Zoom level"
236
359
  ],
237
360
  dependencies: ["@radix-ui/react-slider"],
238
- radixPrimitive: "@radix-ui/react-slider"
361
+ radixPrimitive: "@radix-ui/react-slider",
362
+ props: {
363
+ value: { type: "number[]", description: "Current value(s)" },
364
+ onValueChange: { type: "(value: number[]) => void", description: "Callback on value change" },
365
+ min: { type: "number", default: "0", description: "Minimum value" },
366
+ max: { type: "number", default: "100", description: "Maximum value" },
367
+ step: { type: "number", default: "1", description: "Step increment" },
368
+ disabled: { type: "boolean", default: "false", description: "Disable interaction" }
369
+ },
370
+ example: `<Slider value={[volume]} onValueChange={(v) => setVolume(v[0])} max={100} step={1} />`
239
371
  },
240
372
  switch: {
241
373
  name: "Switch",
@@ -249,7 +381,15 @@ var COMPONENT_REGISTRY = {
249
381
  "Mode switches"
250
382
  ],
251
383
  dependencies: ["@radix-ui/react-switch"],
252
- radixPrimitive: "@radix-ui/react-switch"
384
+ radixPrimitive: "@radix-ui/react-switch",
385
+ props: {
386
+ checked: { type: "boolean", description: "Controlled checked state" },
387
+ onCheckedChange: { type: "(checked: boolean) => void", description: "Callback on toggle" },
388
+ size: { type: "'sm' | 'md' | 'lg'", default: "'md'", description: "Size variant" },
389
+ disabled: { type: "boolean", default: "false", description: "Disable interaction" },
390
+ label: { type: "string", description: "Optional label text" }
391
+ },
392
+ example: `<Switch checked={enabled} onCheckedChange={setEnabled} size="md" />`
253
393
  },
254
394
  textarea: {
255
395
  name: "Textarea",
@@ -262,7 +402,13 @@ var COMPONENT_REGISTRY = {
262
402
  "Descriptions",
263
403
  "Long-form text"
264
404
  ],
265
- dependencies: []
405
+ dependencies: [],
406
+ props: {
407
+ placeholder: { type: "string", description: "Placeholder text" },
408
+ disabled: { type: "boolean", default: "false", description: "Disable interaction" },
409
+ rows: { type: "number", description: "Number of visible rows" }
410
+ },
411
+ example: `<Textarea placeholder="Write your message..." rows={4} />`
266
412
  },
267
413
  // ============================================================================
268
414
  // NAVIGATION (6)
@@ -278,7 +424,17 @@ var COMPONENT_REGISTRY = {
278
424
  "Location context",
279
425
  "Back navigation"
280
426
  ],
281
- dependencies: []
427
+ dependencies: [],
428
+ subComponents: ["BreadcrumbList", "BreadcrumbItem", "BreadcrumbLink", "BreadcrumbPage", "BreadcrumbSeparator", "BreadcrumbEllipsis"],
429
+ example: `<Breadcrumb>
430
+ <BreadcrumbList>
431
+ <BreadcrumbItem><BreadcrumbLink href="/">Home</BreadcrumbLink></BreadcrumbItem>
432
+ <BreadcrumbSeparator />
433
+ <BreadcrumbItem><BreadcrumbLink href="/docs">Docs</BreadcrumbLink></BreadcrumbItem>
434
+ <BreadcrumbSeparator />
435
+ <BreadcrumbItem><BreadcrumbPage>Current</BreadcrumbPage></BreadcrumbItem>
436
+ </BreadcrumbList>
437
+ </Breadcrumb>`
282
438
  },
283
439
  command: {
284
440
  name: "Command",
@@ -291,7 +447,18 @@ var COMPONENT_REGISTRY = {
291
447
  "Keyboard shortcuts",
292
448
  "Power user features"
293
449
  ],
294
- dependencies: ["cmdk"]
450
+ dependencies: ["cmdk"],
451
+ subComponents: ["CommandInput", "CommandList", "CommandEmpty", "CommandGroup", "CommandItem", "CommandSeparator", "CommandShortcut", "CommandDialog"],
452
+ example: `<Command>
453
+ <CommandInput placeholder="Type a command..." />
454
+ <CommandList>
455
+ <CommandEmpty>No results found.</CommandEmpty>
456
+ <CommandGroup heading="Actions">
457
+ <CommandItem>Search</CommandItem>
458
+ <CommandItem>Settings</CommandItem>
459
+ </CommandGroup>
460
+ </CommandList>
461
+ </Command>`
295
462
  },
296
463
  menubar: {
297
464
  name: "Menubar",
@@ -305,7 +472,19 @@ var COMPONENT_REGISTRY = {
305
472
  "Editor toolbars"
306
473
  ],
307
474
  dependencies: ["@radix-ui/react-menubar"],
308
- radixPrimitive: "@radix-ui/react-menubar"
475
+ radixPrimitive: "@radix-ui/react-menubar",
476
+ subComponents: ["MenubarMenu", "MenubarTrigger", "MenubarContent", "MenubarItem", "MenubarSeparator", "MenubarLabel", "MenubarCheckboxItem", "MenubarRadioGroup", "MenubarRadioItem", "MenubarSub", "MenubarSubTrigger", "MenubarSubContent", "MenubarShortcut"],
477
+ example: `<Menubar>
478
+ <MenubarMenu>
479
+ <MenubarTrigger>File</MenubarTrigger>
480
+ <MenubarContent>
481
+ <MenubarItem>New <MenubarShortcut>\u2318N</MenubarShortcut></MenubarItem>
482
+ <MenubarItem>Open <MenubarShortcut>\u2318O</MenubarShortcut></MenubarItem>
483
+ <MenubarSeparator />
484
+ <MenubarItem>Exit</MenubarItem>
485
+ </MenubarContent>
486
+ </MenubarMenu>
487
+ </Menubar>`
309
488
  },
310
489
  "navigation-menu": {
311
490
  name: "NavigationMenu",
@@ -319,7 +498,18 @@ var COMPONENT_REGISTRY = {
319
498
  "Multi-level navigation"
320
499
  ],
321
500
  dependencies: ["@radix-ui/react-navigation-menu"],
322
- radixPrimitive: "@radix-ui/react-navigation-menu"
501
+ radixPrimitive: "@radix-ui/react-navigation-menu",
502
+ subComponents: ["NavigationMenuList", "NavigationMenuItem", "NavigationMenuTrigger", "NavigationMenuContent", "NavigationMenuLink", "NavigationMenuIndicator", "NavigationMenuViewport"],
503
+ example: `<NavigationMenu>
504
+ <NavigationMenuList>
505
+ <NavigationMenuItem>
506
+ <NavigationMenuTrigger>Getting Started</NavigationMenuTrigger>
507
+ <NavigationMenuContent>
508
+ <NavigationMenuLink href="/docs">Documentation</NavigationMenuLink>
509
+ </NavigationMenuContent>
510
+ </NavigationMenuItem>
511
+ </NavigationMenuList>
512
+ </NavigationMenu>`
323
513
  },
324
514
  pagination: {
325
515
  name: "Pagination",
@@ -332,7 +522,17 @@ var COMPONENT_REGISTRY = {
332
522
  "Content lists",
333
523
  "Multi-page forms"
334
524
  ],
335
- dependencies: []
525
+ dependencies: [],
526
+ subComponents: ["PaginationContent", "PaginationItem", "PaginationLink", "PaginationPrevious", "PaginationNext", "PaginationEllipsis"],
527
+ example: `<Pagination>
528
+ <PaginationContent>
529
+ <PaginationItem><PaginationPrevious href="#" /></PaginationItem>
530
+ <PaginationItem><PaginationLink href="#">1</PaginationLink></PaginationItem>
531
+ <PaginationItem><PaginationLink href="#" isActive>2</PaginationLink></PaginationItem>
532
+ <PaginationItem><PaginationLink href="#">3</PaginationLink></PaginationItem>
533
+ <PaginationItem><PaginationNext href="#" /></PaginationItem>
534
+ </PaginationContent>
535
+ </Pagination>`
336
536
  },
337
537
  tabs: {
338
538
  name: "Tabs",
@@ -346,7 +546,21 @@ var COMPONENT_REGISTRY = {
346
546
  "Dashboard sections"
347
547
  ],
348
548
  dependencies: ["@radix-ui/react-tabs"],
349
- radixPrimitive: "@radix-ui/react-tabs"
549
+ radixPrimitive: "@radix-ui/react-tabs",
550
+ props: {
551
+ defaultValue: { type: "string", description: "Default active tab value" },
552
+ value: { type: "string", description: "Controlled active tab value" },
553
+ onValueChange: { type: "(value: string) => void", description: "Callback on tab change" }
554
+ },
555
+ subComponents: ["TabsList", "TabsTrigger", "TabsContent"],
556
+ example: `<Tabs defaultValue="account">
557
+ <TabsList>
558
+ <TabsTrigger value="account">Account</TabsTrigger>
559
+ <TabsTrigger value="password">Password</TabsTrigger>
560
+ </TabsList>
561
+ <TabsContent value="account">Account settings here.</TabsContent>
562
+ <TabsContent value="password">Password settings here.</TabsContent>
563
+ </Tabs>`
350
564
  },
351
565
  // ============================================================================
352
566
  // OVERLAYS (9)
@@ -363,7 +577,25 @@ var COMPONENT_REGISTRY = {
363
577
  "Irreversible operations"
364
578
  ],
365
579
  dependencies: ["@radix-ui/react-alert-dialog"],
366
- radixPrimitive: "@radix-ui/react-alert-dialog"
580
+ radixPrimitive: "@radix-ui/react-alert-dialog",
581
+ props: {
582
+ open: { type: "boolean", description: "Controlled open state" },
583
+ onOpenChange: { type: "(open: boolean) => void", description: "Callback on open/close" }
584
+ },
585
+ subComponents: ["AlertDialogTrigger", "AlertDialogContent", "AlertDialogHeader", "AlertDialogTitle", "AlertDialogDescription", "AlertDialogFooter", "AlertDialogAction", "AlertDialogCancel"],
586
+ example: `<AlertDialog>
587
+ <AlertDialogTrigger asChild><Button variant="destructive">Delete</Button></AlertDialogTrigger>
588
+ <AlertDialogContent>
589
+ <AlertDialogHeader>
590
+ <AlertDialogTitle>Are you sure?</AlertDialogTitle>
591
+ <AlertDialogDescription>This cannot be undone.</AlertDialogDescription>
592
+ </AlertDialogHeader>
593
+ <AlertDialogFooter>
594
+ <AlertDialogCancel>Cancel</AlertDialogCancel>
595
+ <AlertDialogAction>Delete</AlertDialogAction>
596
+ </AlertDialogFooter>
597
+ </AlertDialogContent>
598
+ </AlertDialog>`
367
599
  },
368
600
  "context-menu": {
369
601
  name: "ContextMenu",
@@ -377,7 +609,17 @@ var COMPONENT_REGISTRY = {
377
609
  "Item actions"
378
610
  ],
379
611
  dependencies: ["@radix-ui/react-context-menu"],
380
- radixPrimitive: "@radix-ui/react-context-menu"
612
+ radixPrimitive: "@radix-ui/react-context-menu",
613
+ subComponents: ["ContextMenuTrigger", "ContextMenuContent", "ContextMenuItem", "ContextMenuCheckboxItem", "ContextMenuRadioItem", "ContextMenuLabel", "ContextMenuSeparator", "ContextMenuShortcut", "ContextMenuSub", "ContextMenuSubTrigger", "ContextMenuSubContent", "ContextMenuRadioGroup"],
614
+ example: `<ContextMenu>
615
+ <ContextMenuTrigger>Right click here</ContextMenuTrigger>
616
+ <ContextMenuContent>
617
+ <ContextMenuItem>Edit</ContextMenuItem>
618
+ <ContextMenuItem>Duplicate</ContextMenuItem>
619
+ <ContextMenuSeparator />
620
+ <ContextMenuItem>Delete</ContextMenuItem>
621
+ </ContextMenuContent>
622
+ </ContextMenu>`
381
623
  },
382
624
  dialog: {
383
625
  name: "Dialog",
@@ -391,7 +633,25 @@ var COMPONENT_REGISTRY = {
391
633
  "User input"
392
634
  ],
393
635
  dependencies: ["@radix-ui/react-dialog"],
394
- radixPrimitive: "@radix-ui/react-dialog"
636
+ radixPrimitive: "@radix-ui/react-dialog",
637
+ props: {
638
+ open: { type: "boolean", description: "Controlled open state" },
639
+ onOpenChange: { type: "(open: boolean) => void", description: "Callback on open/close" }
640
+ },
641
+ subComponents: ["DialogTrigger", "DialogContent", "DialogHeader", "DialogTitle", "DialogDescription", "DialogFooter", "DialogClose"],
642
+ example: `<Dialog>
643
+ <DialogTrigger asChild><Button>Open</Button></DialogTrigger>
644
+ <DialogContent>
645
+ <DialogHeader>
646
+ <DialogTitle>Title</DialogTitle>
647
+ <DialogDescription>Description here.</DialogDescription>
648
+ </DialogHeader>
649
+ <DialogFooter>
650
+ <Button variant="outline">Cancel</Button>
651
+ <Button>Confirm</Button>
652
+ </DialogFooter>
653
+ </DialogContent>
654
+ </Dialog>`
395
655
  },
396
656
  drawer: {
397
657
  name: "Drawer",
@@ -404,7 +664,26 @@ var COMPONENT_REGISTRY = {
404
664
  "Bottom sheets",
405
665
  "Mobile menus"
406
666
  ],
407
- dependencies: ["vaul"]
667
+ dependencies: ["vaul"],
668
+ props: {
669
+ open: { type: "boolean", description: "Controlled open state" },
670
+ onOpenChange: { type: "(open: boolean) => void", description: "Callback on open/close" }
671
+ },
672
+ subComponents: ["DrawerTrigger", "DrawerContent", "DrawerHeader", "DrawerTitle", "DrawerDescription", "DrawerFooter", "DrawerClose"],
673
+ example: `<Drawer>
674
+ <DrawerTrigger asChild><Button>Open Drawer</Button></DrawerTrigger>
675
+ <DrawerContent>
676
+ <DrawerHeader>
677
+ <DrawerTitle>Settings</DrawerTitle>
678
+ <DrawerDescription>Adjust preferences.</DrawerDescription>
679
+ </DrawerHeader>
680
+ <div className="p-4">Content here.</div>
681
+ <DrawerFooter>
682
+ <Button>Save</Button>
683
+ <DrawerClose asChild><Button variant="outline">Cancel</Button></DrawerClose>
684
+ </DrawerFooter>
685
+ </DrawerContent>
686
+ </Drawer>`
408
687
  },
409
688
  "dropdown-menu": {
410
689
  name: "DropdownMenu",
@@ -418,7 +697,21 @@ var COMPONENT_REGISTRY = {
418
697
  "Overflow menus"
419
698
  ],
420
699
  dependencies: ["@radix-ui/react-dropdown-menu"],
421
- radixPrimitive: "@radix-ui/react-dropdown-menu"
700
+ radixPrimitive: "@radix-ui/react-dropdown-menu",
701
+ props: {
702
+ open: { type: "boolean", description: "Controlled open state" },
703
+ onOpenChange: { type: "(open: boolean) => void", description: "Callback on open/close" }
704
+ },
705
+ subComponents: ["DropdownMenuTrigger", "DropdownMenuContent", "DropdownMenuItem", "DropdownMenuLabel", "DropdownMenuSeparator", "DropdownMenuCheckboxItem", "DropdownMenuRadioGroup", "DropdownMenuRadioItem", "DropdownMenuSub", "DropdownMenuSubTrigger", "DropdownMenuSubContent"],
706
+ example: `<DropdownMenu>
707
+ <DropdownMenuTrigger asChild><Button variant="ghost">Options</Button></DropdownMenuTrigger>
708
+ <DropdownMenuContent>
709
+ <DropdownMenuLabel>Actions</DropdownMenuLabel>
710
+ <DropdownMenuSeparator />
711
+ <DropdownMenuItem>Edit</DropdownMenuItem>
712
+ <DropdownMenuItem>Delete</DropdownMenuItem>
713
+ </DropdownMenuContent>
714
+ </DropdownMenu>`
422
715
  },
423
716
  "hover-card": {
424
717
  name: "HoverCard",
@@ -432,7 +725,21 @@ var COMPONENT_REGISTRY = {
432
725
  "Additional context"
433
726
  ],
434
727
  dependencies: ["@radix-ui/react-hover-card"],
435
- radixPrimitive: "@radix-ui/react-hover-card"
728
+ radixPrimitive: "@radix-ui/react-hover-card",
729
+ props: {
730
+ openDelay: { type: "number", default: "700", description: "Delay in ms before opening" },
731
+ closeDelay: { type: "number", default: "300", description: "Delay in ms before closing" }
732
+ },
733
+ subComponents: ["HoverCardTrigger", "HoverCardContent"],
734
+ example: `<HoverCard>
735
+ <HoverCardTrigger asChild><Link href="#">@username</Link></HoverCardTrigger>
736
+ <HoverCardContent className="w-80">
737
+ <div className="flex gap-4">
738
+ <Avatar />
739
+ <div><p className="text-sm font-semibold">Username</p><p className="text-sm text-muted-foreground">Bio here.</p></div>
740
+ </div>
741
+ </HoverCardContent>
742
+ </HoverCard>`
436
743
  },
437
744
  popover: {
438
745
  name: "Popover",
@@ -446,7 +753,16 @@ var COMPONENT_REGISTRY = {
446
753
  "Inline editors"
447
754
  ],
448
755
  dependencies: ["@radix-ui/react-popover"],
449
- radixPrimitive: "@radix-ui/react-popover"
756
+ radixPrimitive: "@radix-ui/react-popover",
757
+ props: {
758
+ open: { type: "boolean", description: "Controlled open state" },
759
+ onOpenChange: { type: "(open: boolean) => void", description: "Callback on open/close" }
760
+ },
761
+ subComponents: ["PopoverTrigger", "PopoverContent", "PopoverAnchor"],
762
+ example: `<Popover>
763
+ <PopoverTrigger asChild><Button variant="outline">Open</Button></PopoverTrigger>
764
+ <PopoverContent className="w-80">Content here.</PopoverContent>
765
+ </Popover>`
450
766
  },
451
767
  sheet: {
452
768
  name: "Sheet",
@@ -460,7 +776,19 @@ var COMPONENT_REGISTRY = {
460
776
  "Detail views"
461
777
  ],
462
778
  dependencies: ["@radix-ui/react-dialog"],
463
- radixPrimitive: "@radix-ui/react-dialog"
779
+ radixPrimitive: "@radix-ui/react-dialog",
780
+ props: {
781
+ open: { type: "boolean", description: "Controlled open state" },
782
+ onOpenChange: { type: "(open: boolean) => void", description: "Callback on open/close" }
783
+ },
784
+ subComponents: ["SheetTrigger", "SheetContent", "SheetHeader", "SheetTitle", "SheetDescription", "SheetClose"],
785
+ example: `<Sheet>
786
+ <SheetTrigger asChild><Button>Open</Button></SheetTrigger>
787
+ <SheetContent side="right">
788
+ <SheetHeader><SheetTitle>Settings</SheetTitle></SheetHeader>
789
+ <div className="p-4">Content here.</div>
790
+ </SheetContent>
791
+ </Sheet>`
464
792
  },
465
793
  tooltip: {
466
794
  name: "Tooltip",
@@ -474,7 +802,12 @@ var COMPONENT_REGISTRY = {
474
802
  "Keyboard shortcuts"
475
803
  ],
476
804
  dependencies: ["@radix-ui/react-tooltip"],
477
- radixPrimitive: "@radix-ui/react-tooltip"
805
+ radixPrimitive: "@radix-ui/react-tooltip",
806
+ subComponents: ["TooltipTrigger", "TooltipContent", "TooltipProvider"],
807
+ example: `<Tooltip>
808
+ <TooltipTrigger asChild><Button variant="ghost" size="icon"><Info /></Button></TooltipTrigger>
809
+ <TooltipContent><p>Helpful information</p></TooltipContent>
810
+ </Tooltip>`
478
811
  },
479
812
  // ============================================================================
480
813
  // FEEDBACK (5)
@@ -490,7 +823,15 @@ var COMPONENT_REGISTRY = {
490
823
  "Errors",
491
824
  "Success confirmations"
492
825
  ],
493
- dependencies: []
826
+ dependencies: [],
827
+ props: {
828
+ variant: { type: "'default' | 'destructive'", default: "'default'", description: "Visual variant" }
829
+ },
830
+ subComponents: ["AlertTitle", "AlertDescription"],
831
+ example: `<Alert variant="destructive">
832
+ <AlertTitle>Error</AlertTitle>
833
+ <AlertDescription>Your session has expired.</AlertDescription>
834
+ </Alert>`
494
835
  },
495
836
  progress: {
496
837
  name: "Progress",
@@ -504,7 +845,12 @@ var COMPONENT_REGISTRY = {
504
845
  "Multi-step forms"
505
846
  ],
506
847
  dependencies: ["@radix-ui/react-progress"],
507
- radixPrimitive: "@radix-ui/react-progress"
848
+ radixPrimitive: "@radix-ui/react-progress",
849
+ props: {
850
+ value: { type: "number", default: "0", description: "Progress value (0-100)" },
851
+ max: { type: "number", default: "100", description: "Maximum value" }
852
+ },
853
+ example: `<Progress value={60} />`
508
854
  },
509
855
  skeleton: {
510
856
  name: "Skeleton",
@@ -517,12 +863,22 @@ var COMPONENT_REGISTRY = {
517
863
  "Initial load",
518
864
  "Lazy loading"
519
865
  ],
520
- dependencies: []
866
+ dependencies: [],
867
+ props: {
868
+ variant: { type: "'default' | 'circular' | 'rectangular' | 'text'", default: "'default'", description: "Shape variant" },
869
+ width: { type: "string", default: "'100%'", description: "Width (CSS value)" },
870
+ height: { type: "string", default: "'20px'", description: "Height (CSS value)" }
871
+ },
872
+ example: `<div className="space-y-2">
873
+ <Skeleton className="h-12 w-12 rounded-full" />
874
+ <Skeleton className="h-4 w-[250px]" />
875
+ <Skeleton className="h-4 w-[200px]" />
876
+ </div>`
521
877
  },
522
878
  sonner: {
523
879
  name: "Sonner",
524
880
  category: "feedback",
525
- description: "Toast notification system with queuing and positioning",
881
+ description: "Toast notification system with queuing and positioning. Use Toaster component in layout, call toast() to trigger.",
526
882
  keywords: ["toast", "notification", "sonner", "message", "alert"],
527
883
  useCases: [
528
884
  "Success messages",
@@ -530,7 +886,14 @@ var COMPONENT_REGISTRY = {
530
886
  "Action feedback",
531
887
  "System messages"
532
888
  ],
533
- dependencies: ["sonner"]
889
+ dependencies: ["sonner"],
890
+ subComponents: ["Toaster"],
891
+ example: `// In layout: <Toaster />
892
+ // To trigger:
893
+ import { toast } from 'sonner'
894
+ toast.success('Saved successfully')
895
+ toast.error('Something went wrong')
896
+ toast('Default notification')`
534
897
  },
535
898
  toast: {
536
899
  name: "Toast",
@@ -544,7 +907,13 @@ var COMPONENT_REGISTRY = {
544
907
  "Confirmation messages"
545
908
  ],
546
909
  dependencies: ["@radix-ui/react-toast"],
547
- radixPrimitive: "@radix-ui/react-toast"
910
+ radixPrimitive: "@radix-ui/react-toast",
911
+ subComponents: ["ToastAction", "ToastClose", "ToastDescription", "ToastProvider", "ToastTitle", "ToastViewport"],
912
+ example: `// Prefer using Sonner (Toaster + toast()) for new projects.
913
+ // This is the Radix-based alternative.
914
+ import { useToast } from '@thesage/ui'
915
+ const { toast } = useToast()
916
+ toast({ title: 'Success', description: 'Item saved.' })`
548
917
  },
549
918
  // ============================================================================
550
919
  // DATA DISPLAY (6)
@@ -561,7 +930,12 @@ var COMPONENT_REGISTRY = {
561
930
  "Chat participants"
562
931
  ],
563
932
  dependencies: ["@radix-ui/react-avatar"],
564
- radixPrimitive: "@radix-ui/react-avatar"
933
+ radixPrimitive: "@radix-ui/react-avatar",
934
+ subComponents: ["AvatarImage", "AvatarFallback"],
935
+ example: `<Avatar>
936
+ <AvatarImage src="/avatar.jpg" alt="User" />
937
+ <AvatarFallback>JD</AvatarFallback>
938
+ </Avatar>`
565
939
  },
566
940
  badge: {
567
941
  name: "Badge",
@@ -574,7 +948,13 @@ var COMPONENT_REGISTRY = {
574
948
  "Categories",
575
949
  "Notification counts"
576
950
  ],
577
- dependencies: []
951
+ dependencies: [],
952
+ props: {
953
+ variant: { type: "'default' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' | 'error' | 'info'", default: "'default'", description: "Visual variant" },
954
+ size: { type: "'sm' | 'md' | 'lg'", default: "'md'", description: "Size variant" },
955
+ dot: { type: "boolean", default: "false", description: "Show animated indicator dot" }
956
+ },
957
+ example: `<Badge variant="success" dot>Active</Badge>`
578
958
  },
579
959
  calendar: {
580
960
  name: "Calendar",
@@ -587,7 +967,15 @@ var COMPONENT_REGISTRY = {
587
967
  "Booking systems",
588
968
  "Date ranges"
589
969
  ],
590
- dependencies: ["react-day-picker", "date-fns"]
970
+ dependencies: ["react-day-picker", "date-fns"],
971
+ props: {
972
+ mode: { type: "'single' | 'multiple' | 'range'", default: "'single'", description: "Selection mode" },
973
+ selected: { type: "Date | Date[] | DateRange", description: "Selected date(s)" },
974
+ onSelect: { type: "(date) => void", description: "Callback on date selection" },
975
+ showOutsideDays: { type: "boolean", default: "true", description: "Show days from adjacent months" },
976
+ disabled: { type: "Matcher | Matcher[]", description: "Dates to disable" }
977
+ },
978
+ example: `<Calendar mode="single" selected={date} onSelect={setDate} />`
591
979
  },
592
980
  card: {
593
981
  name: "Card",
@@ -600,7 +988,20 @@ var COMPONENT_REGISTRY = {
600
988
  "Information panels",
601
989
  "Dashboard widgets"
602
990
  ],
603
- dependencies: []
991
+ dependencies: [],
992
+ props: {
993
+ variant: { type: "'default' | 'glass' | 'outline'", default: "'default'", description: "Visual variant" },
994
+ hoverEffect: { type: "boolean", default: "false", description: "Enable hover lift and shadow" }
995
+ },
996
+ subComponents: ["CardHeader", "CardTitle", "CardDescription", "CardContent", "CardFooter"],
997
+ example: `<Card>
998
+ <CardHeader>
999
+ <CardTitle>Notifications</CardTitle>
1000
+ <CardDescription>You have 3 unread messages.</CardDescription>
1001
+ </CardHeader>
1002
+ <CardContent><p>Content here.</p></CardContent>
1003
+ <CardFooter><Button>View All</Button></CardFooter>
1004
+ </Card>`
604
1005
  },
605
1006
  "data-table": {
606
1007
  name: "DataTable",
@@ -613,7 +1014,17 @@ var COMPONENT_REGISTRY = {
613
1014
  "Reports",
614
1015
  "List management"
615
1016
  ],
616
- dependencies: ["@tanstack/react-table"]
1017
+ dependencies: ["@tanstack/react-table"],
1018
+ props: {
1019
+ columns: { type: "ColumnDef<TData, TValue>[]", description: "Column definitions from @tanstack/react-table", required: true },
1020
+ data: { type: "TData[]", description: "Array of row data", required: true }
1021
+ },
1022
+ example: `import { DataTable } from '@thesage/ui/tables'
1023
+ const columns = [
1024
+ { accessorKey: 'name', header: 'Name' },
1025
+ { accessorKey: 'email', header: 'Email' },
1026
+ ]
1027
+ <DataTable columns={columns} data={users} />`
617
1028
  },
618
1029
  table: {
619
1030
  name: "Table",
@@ -626,7 +1037,22 @@ var COMPONENT_REGISTRY = {
626
1037
  "Comparison tables",
627
1038
  "Pricing tables"
628
1039
  ],
629
- dependencies: []
1040
+ dependencies: [],
1041
+ subComponents: ["TableHeader", "TableBody", "TableFooter", "TableRow", "TableHead", "TableCell", "TableCaption"],
1042
+ example: `<Table>
1043
+ <TableHeader>
1044
+ <TableRow>
1045
+ <TableHead>Name</TableHead>
1046
+ <TableHead>Status</TableHead>
1047
+ </TableRow>
1048
+ </TableHeader>
1049
+ <TableBody>
1050
+ <TableRow>
1051
+ <TableCell>John</TableCell>
1052
+ <TableCell>Active</TableCell>
1053
+ </TableRow>
1054
+ </TableBody>
1055
+ </Table>`
630
1056
  },
631
1057
  heading: {
632
1058
  name: "Heading",
@@ -639,7 +1065,13 @@ var COMPONENT_REGISTRY = {
639
1065
  "Content hierarchy",
640
1066
  "Semantic HTML structure"
641
1067
  ],
642
- dependencies: []
1068
+ dependencies: [],
1069
+ props: {
1070
+ level: { type: "1 | 2 | 3 | 4 | 5 | 6", default: "2", description: "Heading level (renders h1-h6)" },
1071
+ as: { type: "'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'", description: "Override rendered HTML element" }
1072
+ },
1073
+ example: `<Heading level={1}>Page Title</Heading>
1074
+ <Heading level={2}>Section Title</Heading>`
643
1075
  },
644
1076
  text: {
645
1077
  name: "Text",
@@ -652,7 +1084,14 @@ var COMPONENT_REGISTRY = {
652
1084
  "Helper text",
653
1085
  "Labels and captions"
654
1086
  ],
655
- dependencies: []
1087
+ dependencies: [],
1088
+ props: {
1089
+ variant: { type: "'default' | 'secondary' | 'muted' | 'lead'", default: "'default'", description: "Text style variant" },
1090
+ as: { type: "'p' | 'span' | 'div'", default: "'p'", description: "HTML element to render" },
1091
+ size: { type: "'sm' | 'base' | 'lg'", default: "'base'", description: "Font size" }
1092
+ },
1093
+ example: `<Text variant="lead">Important introductory text.</Text>
1094
+ <Text variant="muted" size="sm">Helper text below an input.</Text>`
656
1095
  },
657
1096
  code: {
658
1097
  name: "Code",
@@ -665,7 +1104,17 @@ var COMPONENT_REGISTRY = {
665
1104
  "Technical content",
666
1105
  "Inline code references"
667
1106
  ],
668
- dependencies: []
1107
+ dependencies: [],
1108
+ props: {
1109
+ inline: { type: "boolean", default: "false", description: "Render as inline code (true) or block (false)" },
1110
+ showCopy: { type: "boolean", default: "true", description: "Show copy button for block code" }
1111
+ },
1112
+ example: `// Inline
1113
+ <Code inline>npm install @thesage/ui</Code>
1114
+
1115
+ // Block
1116
+ <Code>{\`const x = 1;
1117
+ const y = 2;\`}</Code>`
669
1118
  },
670
1119
  "collapsible-code-block": {
671
1120
  name: "CollapsibleCodeBlock",
@@ -678,7 +1127,20 @@ var COMPONENT_REGISTRY = {
678
1127
  "Tutorial code snippets",
679
1128
  "API examples"
680
1129
  ],
681
- dependencies: ["@thesage/tokens"]
1130
+ dependencies: ["@thesage/tokens"],
1131
+ props: {
1132
+ code: { type: "string", description: "Source code string", required: true },
1133
+ language: { type: "'tsx' | 'typescript' | 'javascript' | 'jsx' | 'css' | 'html' | 'json' | 'bash'", default: "'tsx'", description: "Language for syntax highlighting" },
1134
+ title: { type: "string", description: "Optional title above the code block" },
1135
+ maxLines: { type: "number", default: "10", description: "Lines to show before collapsing" },
1136
+ defaultExpanded: { type: "boolean", default: "false", description: "Start in expanded state" }
1137
+ },
1138
+ example: `<CollapsibleCodeBlock
1139
+ code="const Button = () => <button>Click</button>"
1140
+ language="tsx"
1141
+ title="Button.tsx"
1142
+ maxLines={5}
1143
+ />`
682
1144
  },
683
1145
  "description-list": {
684
1146
  name: "DescriptionList",
@@ -691,7 +1153,16 @@ var COMPONENT_REGISTRY = {
691
1153
  "Metadata display",
692
1154
  "Settings summaries"
693
1155
  ],
694
- dependencies: []
1156
+ dependencies: [],
1157
+ props: {
1158
+ items: { type: "{ label: string; value: ReactNode }[]", description: "Array of label-value pairs", required: true },
1159
+ layout: { type: "'row' | 'column'", default: "'row'", description: "Layout direction for label/value pairs" }
1160
+ },
1161
+ example: `<DescriptionList items={[
1162
+ { label: 'Name', value: 'John Doe' },
1163
+ { label: 'Email', value: 'john@example.com' },
1164
+ { label: 'Role', value: <Badge>Admin</Badge> },
1165
+ ]} />`
695
1166
  },
696
1167
  // ============================================================================
697
1168
  // LAYOUT (8)
@@ -708,7 +1179,18 @@ var COMPONENT_REGISTRY = {
708
1179
  "Information disclosure"
709
1180
  ],
710
1181
  dependencies: ["@radix-ui/react-accordion"],
711
- radixPrimitive: "@radix-ui/react-accordion"
1182
+ radixPrimitive: "@radix-ui/react-accordion",
1183
+ props: {
1184
+ type: { type: "'single' | 'multiple'", description: "Allow single or multiple open items", required: true },
1185
+ collapsible: { type: "boolean", default: "false", description: 'Allow closing all items (type="single" only)' }
1186
+ },
1187
+ subComponents: ["AccordionItem", "AccordionTrigger", "AccordionContent"],
1188
+ example: `<Accordion type="single" collapsible>
1189
+ <AccordionItem value="item-1">
1190
+ <AccordionTrigger>Is it accessible?</AccordionTrigger>
1191
+ <AccordionContent>Yes. It follows WAI-ARIA patterns.</AccordionContent>
1192
+ </AccordionItem>
1193
+ </Accordion>`
712
1194
  },
713
1195
  "aspect-ratio": {
714
1196
  name: "AspectRatio",
@@ -722,7 +1204,13 @@ var COMPONENT_REGISTRY = {
722
1204
  "Card images"
723
1205
  ],
724
1206
  dependencies: ["@radix-ui/react-aspect-ratio"],
725
- radixPrimitive: "@radix-ui/react-aspect-ratio"
1207
+ radixPrimitive: "@radix-ui/react-aspect-ratio",
1208
+ props: {
1209
+ ratio: { type: "number", default: "1", description: "Aspect ratio as a number (e.g. 16/9)" }
1210
+ },
1211
+ example: `<AspectRatio ratio={16 / 9}>
1212
+ <img src="/image.jpg" alt="Photo" className="rounded-md object-cover w-full h-full" />
1213
+ </AspectRatio>`
726
1214
  },
727
1215
  carousel: {
728
1216
  name: "Carousel",
@@ -735,7 +1223,23 @@ var COMPONENT_REGISTRY = {
735
1223
  "Content sliders",
736
1224
  "Testimonials"
737
1225
  ],
738
- dependencies: ["embla-carousel-react"]
1226
+ dependencies: ["embla-carousel-react"],
1227
+ props: {
1228
+ orientation: { type: "'horizontal' | 'vertical'", default: "'horizontal'", description: "Scroll direction" },
1229
+ opts: { type: "CarouselOptions", description: "Embla Carousel options (loop, align, etc.)" },
1230
+ plugins: { type: "CarouselPlugin", description: "Embla Carousel plugins (autoplay, etc.)" },
1231
+ setApi: { type: "(api: CarouselApi) => void", description: "Callback to get carousel API ref" }
1232
+ },
1233
+ subComponents: ["CarouselContent", "CarouselItem", "CarouselPrevious", "CarouselNext"],
1234
+ example: `<Carousel>
1235
+ <CarouselContent>
1236
+ <CarouselItem>Slide 1</CarouselItem>
1237
+ <CarouselItem>Slide 2</CarouselItem>
1238
+ <CarouselItem>Slide 3</CarouselItem>
1239
+ </CarouselContent>
1240
+ <CarouselPrevious />
1241
+ <CarouselNext />
1242
+ </Carousel>`
739
1243
  },
740
1244
  collapsible: {
741
1245
  name: "Collapsible",
@@ -749,7 +1253,19 @@ var COMPONENT_REGISTRY = {
749
1253
  "Details disclosure"
750
1254
  ],
751
1255
  dependencies: ["@radix-ui/react-collapsible"],
752
- radixPrimitive: "@radix-ui/react-collapsible"
1256
+ radixPrimitive: "@radix-ui/react-collapsible",
1257
+ props: {
1258
+ open: { type: "boolean", description: "Controlled open state" },
1259
+ onOpenChange: { type: "(open: boolean) => void", description: "Callback on open/close" },
1260
+ defaultOpen: { type: "boolean", default: "false", description: "Default open state" }
1261
+ },
1262
+ subComponents: ["CollapsibleTrigger", "CollapsibleContent"],
1263
+ example: `<Collapsible>
1264
+ <CollapsibleTrigger asChild><Button variant="ghost">Toggle</Button></CollapsibleTrigger>
1265
+ <CollapsibleContent>
1266
+ <p>Hidden content revealed on click.</p>
1267
+ </CollapsibleContent>
1268
+ </Collapsible>`
753
1269
  },
754
1270
  "date-picker": {
755
1271
  name: "DatePicker",
@@ -762,7 +1278,14 @@ var COMPONENT_REGISTRY = {
762
1278
  "Scheduling",
763
1279
  "Filters"
764
1280
  ],
765
- dependencies: ["react-day-picker", "date-fns", "@radix-ui/react-popover"]
1281
+ dependencies: ["react-day-picker", "date-fns", "@radix-ui/react-popover"],
1282
+ props: {
1283
+ date: { type: "Date", description: "Selected date" },
1284
+ onDateChange: { type: "(date: Date | undefined) => void", description: "Callback on date change" },
1285
+ placeholder: { type: "string", default: "'Pick a date'", description: "Placeholder text" },
1286
+ disabled: { type: "boolean", default: "false", description: "Disable the date picker" }
1287
+ },
1288
+ example: `<DatePicker date={date} onDateChange={setDate} placeholder="Select date" />`
766
1289
  },
767
1290
  resizable: {
768
1291
  name: "Resizable",
@@ -775,7 +1298,16 @@ var COMPONENT_REGISTRY = {
775
1298
  "Dashboard layouts",
776
1299
  "Adjustable sidebars"
777
1300
  ],
778
- dependencies: ["react-resizable-panels"]
1301
+ dependencies: ["react-resizable-panels"],
1302
+ props: {
1303
+ direction: { type: "'horizontal' | 'vertical'", default: "'horizontal'", description: "Panel layout direction" }
1304
+ },
1305
+ subComponents: ["ResizablePanelGroup", "ResizablePanel", "ResizableHandle"],
1306
+ example: `<ResizablePanelGroup direction="horizontal">
1307
+ <ResizablePanel defaultSize={50}>Left panel</ResizablePanel>
1308
+ <ResizableHandle />
1309
+ <ResizablePanel defaultSize={50}>Right panel</ResizablePanel>
1310
+ </ResizablePanelGroup>`
779
1311
  },
780
1312
  "scroll-area": {
781
1313
  name: "ScrollArea",
@@ -789,7 +1321,11 @@ var COMPONENT_REGISTRY = {
789
1321
  "Code displays"
790
1322
  ],
791
1323
  dependencies: ["@radix-ui/react-scroll-area"],
792
- radixPrimitive: "@radix-ui/react-scroll-area"
1324
+ radixPrimitive: "@radix-ui/react-scroll-area",
1325
+ subComponents: ["ScrollBar"],
1326
+ example: `<ScrollArea className="h-[200px] w-full rounded-md border p-4">
1327
+ <div>Long scrollable content here...</div>
1328
+ </ScrollArea>`
793
1329
  },
794
1330
  separator: {
795
1331
  name: "Separator",
@@ -803,7 +1339,11 @@ var COMPONENT_REGISTRY = {
803
1339
  "Visual hierarchy"
804
1340
  ],
805
1341
  dependencies: ["@radix-ui/react-separator"],
806
- radixPrimitive: "@radix-ui/react-separator"
1342
+ radixPrimitive: "@radix-ui/react-separator",
1343
+ props: {
1344
+ orientation: { type: "'horizontal' | 'vertical'", default: "'horizontal'", description: "Orientation" }
1345
+ },
1346
+ example: `<Separator orientation="horizontal" />`
807
1347
  },
808
1348
  grid: {
809
1349
  name: "Grid",
@@ -816,7 +1356,16 @@ var COMPONENT_REGISTRY = {
816
1356
  "Dashboard layouts",
817
1357
  "Responsive content grids"
818
1358
  ],
819
- dependencies: []
1359
+ dependencies: [],
1360
+ props: {
1361
+ columns: { type: "number | { sm?: number; md?: number; lg?: number }", default: "3", description: "Number of grid columns (responsive object supported)" },
1362
+ gap: { type: "number | string", default: "4", description: "Gap between grid items (Tailwind spacing scale)" }
1363
+ },
1364
+ example: `<Grid columns={{ sm: 1, md: 2, lg: 3 }} gap={4}>
1365
+ <Card>Item 1</Card>
1366
+ <Card>Item 2</Card>
1367
+ <Card>Item 3</Card>
1368
+ </Grid>`
820
1369
  },
821
1370
  container: {
822
1371
  name: "Container",
@@ -829,7 +1378,15 @@ var COMPONENT_REGISTRY = {
829
1378
  "Responsive widths",
830
1379
  "Content alignment"
831
1380
  ],
832
- dependencies: []
1381
+ dependencies: [],
1382
+ props: {
1383
+ size: { type: "'sm' | 'md' | 'lg' | 'xl' | 'full'", default: "'lg'", description: "Max-width variant" },
1384
+ padding: { type: "boolean", default: "true", description: "Apply horizontal padding" }
1385
+ },
1386
+ example: `<Container size="lg">
1387
+ <Heading level={1}>Page Title</Heading>
1388
+ <Text>Content within max-width container.</Text>
1389
+ </Container>`
833
1390
  },
834
1391
  stack: {
835
1392
  name: "Stack",
@@ -842,7 +1399,17 @@ var COMPONENT_REGISTRY = {
842
1399
  "Form layouts",
843
1400
  "Button groups"
844
1401
  ],
845
- dependencies: []
1402
+ dependencies: [],
1403
+ props: {
1404
+ direction: { type: "'vertical' | 'horizontal'", default: "'vertical'", description: "Stack direction" },
1405
+ gap: { type: "number | string", default: "4", description: "Gap between items (Tailwind spacing scale)" },
1406
+ align: { type: "'start' | 'center' | 'end' | 'stretch'", default: "'stretch'", description: "Cross-axis alignment" },
1407
+ justify: { type: "'start' | 'center' | 'end' | 'between'", description: "Main-axis alignment" }
1408
+ },
1409
+ example: `<Stack direction="horizontal" gap={2} align="center">
1410
+ <Button>Save</Button>
1411
+ <Button variant="outline">Cancel</Button>
1412
+ </Stack>`
846
1413
  },
847
1414
  sidebar: {
848
1415
  name: "Sidebar",
@@ -856,7 +1423,21 @@ var COMPONENT_REGISTRY = {
856
1423
  "Mobile menus"
857
1424
  ],
858
1425
  dependencies: ["@radix-ui/react-slot"],
859
- radixPrimitive: "@radix-ui/react-slot"
1426
+ radixPrimitive: "@radix-ui/react-slot",
1427
+ props: {
1428
+ isOpen: { type: "boolean", default: "true", description: "Whether sidebar is visible/expanded" }
1429
+ },
1430
+ subComponents: ["SidebarHeader", "SidebarContent", "SidebarFooter", "SidebarItem"],
1431
+ example: `<Sidebar>
1432
+ <SidebarHeader><h2>My App</h2></SidebarHeader>
1433
+ <SidebarContent>
1434
+ <SidebarItem icon={<Home />} isActive>Dashboard</SidebarItem>
1435
+ <SidebarItem icon={<Settings />}>Settings</SidebarItem>
1436
+ </SidebarContent>
1437
+ <SidebarFooter>
1438
+ <SidebarItem icon={<LogOut />}>Logout</SidebarItem>
1439
+ </SidebarFooter>
1440
+ </Sidebar>`
860
1441
  },
861
1442
  header: {
862
1443
  name: "Header",
@@ -869,7 +1450,20 @@ var COMPONENT_REGISTRY = {
869
1450
  "Sticky headers",
870
1451
  "Mobile-friendly navigation"
871
1452
  ],
872
- dependencies: ["lucide-react"]
1453
+ dependencies: ["lucide-react"],
1454
+ props: {
1455
+ logo: { type: "ReactNode", description: "Logo element for header" },
1456
+ links: { type: "{ label: string; href: string }[]", description: "Navigation links" },
1457
+ sticky: { type: "boolean", default: "true", description: "Stick to top on scroll" },
1458
+ transparent: { type: "boolean", default: "false", description: "Transparent background (for hero sections)" }
1459
+ },
1460
+ example: `<Header
1461
+ logo={<Brand />}
1462
+ links={[
1463
+ { label: 'Home', href: '/' },
1464
+ { label: 'About', href: '/about' },
1465
+ ]}
1466
+ />`
873
1467
  },
874
1468
  footer: {
875
1469
  name: "Footer",
@@ -882,12 +1476,21 @@ var COMPONENT_REGISTRY = {
882
1476
  "Contact information",
883
1477
  "Copyright notices"
884
1478
  ],
885
- dependencies: []
1479
+ dependencies: [],
1480
+ props: {
1481
+ columns: { type: "{ title: string; links: { label: string; href: string }[] }[]", description: "Footer navigation columns" },
1482
+ copyright: { type: "string", description: "Copyright text" },
1483
+ socialLinks: { type: "{ icon: ReactNode; href: string }[]", description: "Social media links" }
1484
+ },
1485
+ example: `<Footer
1486
+ columns={[{ title: 'Product', links: [{ label: 'Docs', href: '/docs' }] }]}
1487
+ copyright="\xA9 2026 My Company"
1488
+ />`
886
1489
  },
887
1490
  "customizer-panel": {
888
1491
  name: "CustomizerPanel",
889
1492
  category: "layout",
890
- description: "Floating panel for theme, mode, and motion customization",
1493
+ description: "Floating panel for theme, mode, and motion customization. Reads from ThemeProvider context.",
891
1494
  keywords: ["customizer", "theme", "settings", "preferences", "dark-mode"],
892
1495
  useCases: [
893
1496
  "Theme selection",
@@ -895,7 +1498,9 @@ var COMPONENT_REGISTRY = {
895
1498
  "Motion preferences",
896
1499
  "User experience customization"
897
1500
  ],
898
- dependencies: ["lucide-react", "@thesage/tokens"]
1501
+ dependencies: ["lucide-react", "@thesage/tokens"],
1502
+ example: `// Place in your layout. It reads theme state from ThemeProvider.
1503
+ <CustomizerPanel />`
899
1504
  },
900
1505
  "page-layout": {
901
1506
  name: "PageLayout",
@@ -908,7 +1513,19 @@ var COMPONENT_REGISTRY = {
908
1513
  "Documentation pages",
909
1514
  "Dashboard layouts"
910
1515
  ],
911
- dependencies: []
1516
+ dependencies: [],
1517
+ props: {
1518
+ header: { type: "ReactNode", description: "Header element" },
1519
+ footer: { type: "ReactNode", description: "Footer element" },
1520
+ sidebar: { type: "ReactNode", description: "Optional sidebar" },
1521
+ breadcrumbs: { type: "ReactNode", description: "Breadcrumb navigation" }
1522
+ },
1523
+ example: `<PageLayout
1524
+ header={<Header />}
1525
+ footer={<Footer />}
1526
+ >
1527
+ <main>Page content</main>
1528
+ </PageLayout>`
912
1529
  },
913
1530
  "page-template": {
914
1531
  name: "PageTemplate",
@@ -921,7 +1538,15 @@ var COMPONENT_REGISTRY = {
921
1538
  "Standard app pages",
922
1539
  "Content-focused layouts"
923
1540
  ],
924
- dependencies: []
1541
+ dependencies: [],
1542
+ props: {
1543
+ title: { type: "string", description: "Page title" },
1544
+ description: { type: "string", description: "Page description" },
1545
+ showCustomizer: { type: "boolean", default: "true", description: "Show customizer panel" }
1546
+ },
1547
+ example: `<PageTemplate title="Documentation" description="Learn the design system.">
1548
+ <div>Content here.</div>
1549
+ </PageTemplate>`
925
1550
  },
926
1551
  // ============================================================================
927
1552
  // ACTIONS - Additional (2 more)
@@ -937,7 +1562,13 @@ var COMPONENT_REGISTRY = {
937
1562
  "External references",
938
1563
  "Inline actions"
939
1564
  ],
940
- dependencies: []
1565
+ dependencies: [],
1566
+ props: {
1567
+ href: { type: "string", description: "Link URL", required: true },
1568
+ variant: { type: "'default' | 'inline'", default: "'default'", description: "Default for standalone links, inline for text links" },
1569
+ hoverEffect: { type: "boolean", default: "true", description: "Enable hover effect" }
1570
+ },
1571
+ example: `<Link href="/about" variant="inline">Learn More</Link>`
941
1572
  },
942
1573
  magnetic: {
943
1574
  name: "Magnetic",
@@ -950,7 +1581,14 @@ var COMPONENT_REGISTRY = {
950
1581
  "Playful interactions",
951
1582
  "Cursor attraction"
952
1583
  ],
953
- dependencies: ["framer-motion"]
1584
+ dependencies: ["framer-motion"],
1585
+ props: {
1586
+ children: { type: "ReactNode", description: "Element to apply magnetic effect to", required: true },
1587
+ strength: { type: "number", default: "0.5", description: "Magnetic pull strength (0-1)" }
1588
+ },
1589
+ example: `<Magnetic strength={0.5}>
1590
+ <Button>Hover me</Button>
1591
+ </Magnetic>`
954
1592
  },
955
1593
  // ============================================================================
956
1594
  // FORMS - Additional (7 more)
@@ -966,7 +1604,14 @@ var COMPONENT_REGISTRY = {
966
1604
  "Command palette trigger",
967
1605
  "Data filtering"
968
1606
  ],
969
- dependencies: ["lucide-react"]
1607
+ dependencies: ["lucide-react"],
1608
+ props: {
1609
+ value: { type: "string", description: "Controlled search value" },
1610
+ onChange: { type: "(value: string) => void", description: "Callback on value change" },
1611
+ placeholder: { type: "string", default: "'Search...'", description: "Placeholder text" },
1612
+ onClear: { type: "() => void", description: "Callback on clear button click" }
1613
+ },
1614
+ example: `<SearchBar value={query} onChange={setQuery} placeholder="Search components..." />`
970
1615
  },
971
1616
  "filter-button": {
972
1617
  name: "FilterButton",
@@ -979,12 +1624,18 @@ var COMPONENT_REGISTRY = {
979
1624
  "Content filtering",
980
1625
  "Quick filters"
981
1626
  ],
982
- dependencies: []
1627
+ dependencies: [],
1628
+ props: {
1629
+ active: { type: "boolean", default: "false", description: "Whether filter is active" },
1630
+ onClick: { type: "() => void", description: "Click handler" },
1631
+ children: { type: "ReactNode", description: "Filter label", required: true }
1632
+ },
1633
+ example: `<FilterButton active={category === 'all'} onClick={() => setCategory('all')}>All</FilterButton>`
983
1634
  },
984
1635
  "theme-switcher": {
985
1636
  name: "ThemeSwitcher",
986
1637
  category: "forms",
987
- description: "Multi-theme selector for switching between Studio, Terra, and Volt",
1638
+ description: "Multi-theme selector for switching between Studio, Terra, and Volt. Reads/writes to ThemeProvider context.",
988
1639
  keywords: ["theme", "switcher", "selector", "studio", "terra", "volt"],
989
1640
  useCases: [
990
1641
  "Theme selection",
@@ -992,12 +1643,14 @@ var COMPONENT_REGISTRY = {
992
1643
  "User preferences",
993
1644
  "Design switching"
994
1645
  ],
995
- dependencies: []
1646
+ dependencies: [],
1647
+ example: `// Reads from ThemeProvider context, no props needed.
1648
+ <ThemeSwitcher />`
996
1649
  },
997
1650
  "theme-toggle": {
998
1651
  name: "ThemeToggle",
999
1652
  category: "forms",
1000
- description: "Light/dark mode toggle with smooth transitions",
1653
+ description: "Light/dark mode toggle with smooth transitions. Reads/writes to ThemeProvider context.",
1001
1654
  keywords: ["theme", "toggle", "dark-mode", "light-mode", "mode"],
1002
1655
  useCases: [
1003
1656
  "Dark mode switch",
@@ -1005,7 +1658,9 @@ var COMPONENT_REGISTRY = {
1005
1658
  "Theme mode control",
1006
1659
  "Accessibility preference"
1007
1660
  ],
1008
- dependencies: ["lucide-react"]
1661
+ dependencies: ["lucide-react"],
1662
+ example: `// Reads from ThemeProvider context, no props needed.
1663
+ <ThemeToggle />`
1009
1664
  },
1010
1665
  "color-picker": {
1011
1666
  name: "ColorPicker",
@@ -1018,7 +1673,13 @@ var COMPONENT_REGISTRY = {
1018
1673
  "Design tools",
1019
1674
  "User preferences"
1020
1675
  ],
1021
- dependencies: []
1676
+ dependencies: [],
1677
+ props: {
1678
+ value: { type: "string", description: "Selected color (hex string)" },
1679
+ onChange: { type: "(color: string) => void", description: "Callback on color change" },
1680
+ presets: { type: "string[]", description: "Preset color swatches (hex values)" }
1681
+ },
1682
+ example: `<ColorPicker value={color} onChange={setColor} presets={['#ef4444', '#3b82f6', '#22c55e']} />`
1022
1683
  },
1023
1684
  "drag-drop": {
1024
1685
  name: "DragDrop",
@@ -1031,7 +1692,14 @@ var COMPONENT_REGISTRY = {
1031
1692
  "Document uploads",
1032
1693
  "Bulk imports"
1033
1694
  ],
1034
- dependencies: []
1695
+ dependencies: [],
1696
+ props: {
1697
+ onDrop: { type: "(files: File[]) => void", description: "Callback when files are dropped", required: true },
1698
+ accept: { type: "string", description: 'Accepted file types (e.g. "image/*")' },
1699
+ maxSize: { type: "number", description: "Max file size in bytes" },
1700
+ multiple: { type: "boolean", default: "true", description: "Allow multiple files" }
1701
+ },
1702
+ example: `<DragDrop onDrop={(files) => handleUpload(files)} accept="image/*" maxSize={5242880} />`
1035
1703
  },
1036
1704
  "text-field": {
1037
1705
  name: "TextField",
@@ -1044,7 +1712,14 @@ var COMPONENT_REGISTRY = {
1044
1712
  "Validated inputs",
1045
1713
  "Complete form controls"
1046
1714
  ],
1047
- dependencies: []
1715
+ dependencies: [],
1716
+ props: {
1717
+ label: { type: "string", description: "Field label text" },
1718
+ helperText: { type: "string", description: "Helper text below input" },
1719
+ error: { type: "string", description: "Error message (shows error state when set)" },
1720
+ required: { type: "boolean", default: "false", description: "Mark as required" }
1721
+ },
1722
+ example: `<TextField label="Email" helperText="We'll never share your email." error={errors.email} required />`
1048
1723
  },
1049
1724
  // ============================================================================
1050
1725
  // NAVIGATION - Additional (4 more)
@@ -1060,7 +1735,13 @@ var COMPONENT_REGISTRY = {
1060
1735
  "Header navigation",
1061
1736
  "Active page indicators"
1062
1737
  ],
1063
- dependencies: []
1738
+ dependencies: [],
1739
+ props: {
1740
+ href: { type: "string", description: "Link URL", required: true },
1741
+ isActive: { type: "boolean", default: "false", description: "Active state indicator" },
1742
+ variant: { type: "'default' | 'subtle'", default: "'default'", description: "Visual variant" }
1743
+ },
1744
+ example: `<NavLink href="/dashboard" isActive>Dashboard</NavLink>`
1064
1745
  },
1065
1746
  "secondary-nav": {
1066
1747
  name: "SecondaryNav",
@@ -1073,7 +1754,14 @@ var COMPONENT_REGISTRY = {
1073
1754
  "Tab-like navigation",
1074
1755
  "Category switching"
1075
1756
  ],
1076
- dependencies: []
1757
+ dependencies: [],
1758
+ props: {
1759
+ items: { type: "{ label: string; href: string; isActive?: boolean }[]", description: "Navigation items", required: true }
1760
+ },
1761
+ example: `<SecondaryNav items={[
1762
+ { label: 'Overview', href: '/overview', isActive: true },
1763
+ { label: 'Settings', href: '/settings' },
1764
+ ]} />`
1077
1765
  },
1078
1766
  "tertiary-nav": {
1079
1767
  name: "TertiaryNav",
@@ -1086,7 +1774,14 @@ var COMPONENT_REGISTRY = {
1086
1774
  "Multi-level content",
1087
1775
  "Nested categories"
1088
1776
  ],
1089
- dependencies: []
1777
+ dependencies: [],
1778
+ props: {
1779
+ items: { type: "{ label: string; href: string; isActive?: boolean }[]", description: "Navigation items", required: true }
1780
+ },
1781
+ example: `<TertiaryNav items={[
1782
+ { label: 'Props', href: '#props', isActive: true },
1783
+ { label: 'Examples', href: '#examples' },
1784
+ ]} />`
1090
1785
  },
1091
1786
  breadcrumbs: {
1092
1787
  name: "Breadcrumbs",
@@ -1099,7 +1794,16 @@ var COMPONENT_REGISTRY = {
1099
1794
  "Hierarchical navigation",
1100
1795
  "Back navigation"
1101
1796
  ],
1102
- dependencies: ["lucide-react"]
1797
+ dependencies: ["lucide-react"],
1798
+ props: {
1799
+ items: { type: "{ label: string; href?: string }[]", description: "Breadcrumb trail items (last item is current page)", required: true },
1800
+ showHome: { type: "boolean", default: "true", description: "Show home icon as first item" }
1801
+ },
1802
+ example: `<Breadcrumbs items={[
1803
+ { label: 'Home', href: '/' },
1804
+ { label: 'Components', href: '/components' },
1805
+ { label: 'Button' },
1806
+ ]} />`
1103
1807
  },
1104
1808
  // ============================================================================
1105
1809
  // OVERLAYS - Additional (2 more)
@@ -1116,7 +1820,19 @@ var COMPONENT_REGISTRY = {
1116
1820
  "Content overlays"
1117
1821
  ],
1118
1822
  dependencies: ["@radix-ui/react-dialog"],
1119
- radixPrimitive: "@radix-ui/react-dialog"
1823
+ radixPrimitive: "@radix-ui/react-dialog",
1824
+ props: {
1825
+ open: { type: "boolean", description: "Controlled open state" },
1826
+ onOpenChange: { type: "(open: boolean) => void", description: "Callback on open/close" },
1827
+ title: { type: "string", description: "Modal title" },
1828
+ description: { type: "string", description: "Modal description" }
1829
+ },
1830
+ example: `<Modal open={isOpen} onOpenChange={setIsOpen} title="Confirm" description="Are you sure?">
1831
+ <div className="flex gap-2 justify-end">
1832
+ <Button variant="outline" onClick={() => setIsOpen(false)}>Cancel</Button>
1833
+ <Button onClick={handleConfirm}>Confirm</Button>
1834
+ </div>
1835
+ </Modal>`
1120
1836
  },
1121
1837
  dropdown: {
1122
1838
  name: "Dropdown",
@@ -1130,7 +1846,12 @@ var COMPONENT_REGISTRY = {
1130
1846
  "Option lists"
1131
1847
  ],
1132
1848
  dependencies: ["@radix-ui/react-dropdown-menu"],
1133
- radixPrimitive: "@radix-ui/react-dropdown-menu"
1849
+ radixPrimitive: "@radix-ui/react-dropdown-menu",
1850
+ props: {
1851
+ open: { type: "boolean", description: "Controlled open state" },
1852
+ onOpenChange: { type: "(open: boolean) => void", description: "Callback on open/close" }
1853
+ },
1854
+ example: `// For most cases, use DropdownMenu directly. This is a simplified wrapper.`
1134
1855
  },
1135
1856
  // ============================================================================
1136
1857
  // FEEDBACK - Additional (2 more)
@@ -1146,7 +1867,13 @@ var COMPONENT_REGISTRY = {
1146
1867
  "Data fetching",
1147
1868
  "Async operations"
1148
1869
  ],
1149
- dependencies: []
1870
+ dependencies: [],
1871
+ props: {
1872
+ size: { type: "'xs' | 'sm' | 'md' | 'lg' | 'xl'", default: "'md'", description: "Spinner size" },
1873
+ variant: { type: "'primary' | 'secondary' | 'inherit'", default: "'primary'", description: "Color variant" }
1874
+ },
1875
+ example: `<Spinner size="md" />
1876
+ <Button disabled><Spinner size="xs" variant="inherit" /> Loading...</Button>`
1150
1877
  },
1151
1878
  "progress-bar": {
1152
1879
  name: "ProgressBar",
@@ -1159,7 +1886,14 @@ var COMPONENT_REGISTRY = {
1159
1886
  "Loading indicators",
1160
1887
  "Step completion"
1161
1888
  ],
1162
- dependencies: []
1889
+ dependencies: [],
1890
+ props: {
1891
+ value: { type: "number", default: "0", description: "Progress value (0-100)" },
1892
+ variant: { type: "'primary' | 'success' | 'warning' | 'error' | 'info'", default: "'primary'", description: "Color variant" },
1893
+ size: { type: "'sm' | 'md' | 'lg'", default: "'md'", description: "Bar height" },
1894
+ showLabel: { type: "boolean", default: "false", description: "Show percentage label" }
1895
+ },
1896
+ example: `<ProgressBar value={75} variant="success" showLabel />`
1163
1897
  },
1164
1898
  // ============================================================================
1165
1899
  // DATA DISPLAY - Additional (5 more)
@@ -1175,7 +1909,13 @@ var COMPONENT_REGISTRY = {
1175
1909
  "Footer branding",
1176
1910
  "App identity"
1177
1911
  ],
1178
- dependencies: []
1912
+ dependencies: [],
1913
+ props: {
1914
+ variant: { type: "'default' | 'mark'", default: "'default'", description: "Full logo or mark only" },
1915
+ size: { type: "'sm' | 'md' | 'lg'", default: "'md'", description: "Logo size" },
1916
+ href: { type: "string", description: "Optional link URL (wraps in anchor)" }
1917
+ },
1918
+ example: `<Brand size="md" href="/" />`
1179
1919
  },
1180
1920
  "aspect-image": {
1181
1921
  name: "AspectImage",
@@ -1188,7 +1928,15 @@ var COMPONENT_REGISTRY = {
1188
1928
  "Product images",
1189
1929
  "Thumbnails with captions"
1190
1930
  ],
1191
- dependencies: []
1931
+ dependencies: [],
1932
+ props: {
1933
+ src: { type: "string", description: "Image source URL", required: true },
1934
+ alt: { type: "string", description: "Alt text for accessibility", required: true },
1935
+ ratio: { type: "number", default: "16/9", description: "Aspect ratio" },
1936
+ rounded: { type: "'none' | 'sm' | 'md' | 'lg' | 'full'", default: "'md'", description: "Border radius" },
1937
+ caption: { type: "string", description: "Optional caption text below image" }
1938
+ },
1939
+ example: `<AspectImage src="/photo.jpg" alt="Team photo" ratio={4/3} caption="Our team" />`
1192
1940
  },
1193
1941
  "variable-weight-text": {
1194
1942
  name: "VariableWeightText",
@@ -1201,7 +1949,14 @@ var COMPONENT_REGISTRY = {
1201
1949
  "Attention grabbing",
1202
1950
  "Variable font showcase"
1203
1951
  ],
1204
- dependencies: ["framer-motion"]
1952
+ dependencies: ["framer-motion"],
1953
+ props: {
1954
+ children: { type: "string", description: "Text content", required: true },
1955
+ speed: { type: "number", default: "2", description: "Animation speed in seconds" },
1956
+ minWeight: { type: "number", default: "100", description: "Minimum font weight" },
1957
+ maxWeight: { type: "number", default: "900", description: "Maximum font weight" }
1958
+ },
1959
+ example: `<VariableWeightText speed={2} minWeight={200} maxWeight={800}>Design</VariableWeightText>`
1205
1960
  },
1206
1961
  typewriter: {
1207
1962
  name: "Typewriter",
@@ -1214,7 +1969,14 @@ var COMPONENT_REGISTRY = {
1214
1969
  "Dynamic headings",
1215
1970
  "Attention text"
1216
1971
  ],
1217
- dependencies: ["framer-motion"]
1972
+ dependencies: ["framer-motion"],
1973
+ props: {
1974
+ words: { type: "string[]", description: "Words to cycle through", required: true },
1975
+ speed: { type: "number", default: "100", description: "Typing speed in ms per character" },
1976
+ loop: { type: "boolean", default: "true", description: "Loop through words continuously" },
1977
+ cursor: { type: "boolean", default: "true", description: "Show blinking cursor" }
1978
+ },
1979
+ example: `<Typewriter words={['Developer', 'Designer', 'Creator']} speed={80} />`
1218
1980
  },
1219
1981
  "github-icon": {
1220
1982
  name: "GitHubIcon",
@@ -1227,7 +1989,11 @@ var COMPONENT_REGISTRY = {
1227
1989
  "Repository links",
1228
1990
  "Open source badges"
1229
1991
  ],
1230
- dependencies: []
1992
+ dependencies: [],
1993
+ props: {
1994
+ size: { type: "number", default: "24", description: "Icon size in pixels" }
1995
+ },
1996
+ example: `<a href="https://github.com/you"><GitHubIcon size={20} /></a>`
1231
1997
  },
1232
1998
  // ============================================================================
1233
1999
  // SPECIALTY - Backgrounds (3)
@@ -1243,7 +2009,15 @@ var COMPONENT_REGISTRY = {
1243
2009
  "Loading screens",
1244
2010
  "Sci-fi themes"
1245
2011
  ],
1246
- dependencies: ["framer-motion"]
2012
+ dependencies: ["framer-motion"],
2013
+ props: {
2014
+ speed: { type: "number", default: "1", description: "Warp speed multiplier" },
2015
+ density: { type: "number", default: "200", description: "Number of stars" },
2016
+ color: { type: "string", default: "'white'", description: "Star color" }
2017
+ },
2018
+ example: `<WarpBackground speed={1.5} density={300}>
2019
+ <div className="relative z-10">Content over stars</div>
2020
+ </WarpBackground>`
1247
2021
  },
1248
2022
  "faulty-terminal": {
1249
2023
  name: "FaultyTerminal",
@@ -1256,7 +2030,13 @@ var COMPONENT_REGISTRY = {
1256
2030
  "Error pages",
1257
2031
  "Terminal UIs"
1258
2032
  ],
1259
- dependencies: []
2033
+ dependencies: [],
2034
+ props: {
2035
+ children: { type: "ReactNode", description: "Content to render inside terminal" }
2036
+ },
2037
+ example: `<FaultyTerminal>
2038
+ <p>$ system initializing...</p>
2039
+ </FaultyTerminal>`
1260
2040
  },
1261
2041
  "orb-background": {
1262
2042
  name: "OrbBackground",
@@ -1269,7 +2049,14 @@ var COMPONENT_REGISTRY = {
1269
2049
  "Ambient backgrounds",
1270
2050
  "Modern aesthetics"
1271
2051
  ],
1272
- dependencies: ["framer-motion"]
2052
+ dependencies: ["framer-motion"],
2053
+ props: {
2054
+ color: { type: "string", description: "Primary orb color" },
2055
+ size: { type: "number", default: "400", description: "Orb diameter in pixels" }
2056
+ },
2057
+ example: `<OrbBackground color="var(--color-primary)" size={500}>
2058
+ <div className="relative z-10">Content</div>
2059
+ </OrbBackground>`
1273
2060
  },
1274
2061
  // ============================================================================
1275
2062
  // SPECIALTY - Cursor (2)
@@ -1277,7 +2064,7 @@ var COMPONENT_REGISTRY = {
1277
2064
  "splash-cursor": {
1278
2065
  name: "SplashCursor",
1279
2066
  category: "cursor",
1280
- description: "Custom cursor with splash/ripple effect on click",
2067
+ description: "Custom cursor with splash/ripple effect on click. WebGL-based fluid simulation.",
1281
2068
  keywords: ["cursor", "splash", "ripple", "click", "effect", "interactive"],
1282
2069
  useCases: [
1283
2070
  "Interactive experiences",
@@ -1285,7 +2072,9 @@ var COMPONENT_REGISTRY = {
1285
2072
  "Playful interfaces",
1286
2073
  "Click feedback"
1287
2074
  ],
1288
- dependencies: []
2075
+ dependencies: [],
2076
+ example: `// Place once in layout. Replaces default cursor globally.
2077
+ <SplashCursor />`
1289
2078
  },
1290
2079
  "target-cursor": {
1291
2080
  name: "TargetCursor",
@@ -1298,7 +2087,9 @@ var COMPONENT_REGISTRY = {
1298
2087
  "Interactive elements",
1299
2088
  "Custom pointers"
1300
2089
  ],
1301
- dependencies: []
2090
+ dependencies: [],
2091
+ example: `// Place once in layout. Replaces default cursor globally.
2092
+ <TargetCursor />`
1302
2093
  },
1303
2094
  // ============================================================================
1304
2095
  // SPECIALTY - Motion (1)
@@ -1314,7 +2105,17 @@ var COMPONENT_REGISTRY = {
1314
2105
  "Architecture diagrams",
1315
2106
  "Interactive connections"
1316
2107
  ],
1317
- dependencies: ["framer-motion"]
2108
+ dependencies: ["framer-motion"],
2109
+ props: {
2110
+ fromRef: { type: "RefObject<HTMLElement>", description: "Ref to source element", required: true },
2111
+ toRef: { type: "RefObject<HTMLElement>", description: "Ref to target element", required: true },
2112
+ duration: { type: "number", default: "3", description: "Animation duration in seconds" }
2113
+ },
2114
+ example: `const fromRef = useRef(null)
2115
+ const toRef = useRef(null)
2116
+ <div ref={fromRef}>Source</div>
2117
+ <div ref={toRef}>Target</div>
2118
+ <AnimatedBeam fromRef={fromRef} toRef={toRef} />`
1318
2119
  },
1319
2120
  // ============================================================================
1320
2121
  // SPECIALTY - Blocks (2)
@@ -1330,12 +2131,23 @@ var COMPONENT_REGISTRY = {
1330
2131
  "Marketing sections",
1331
2132
  "Feature highlights"
1332
2133
  ],
1333
- dependencies: []
2134
+ dependencies: [],
2135
+ props: {
2136
+ title: { type: "string", description: "Main heading text", required: true },
2137
+ subtitle: { type: "string", description: "Subtitle or tagline" },
2138
+ cta: { type: "ReactNode", description: "Call-to-action element (Button, etc.)" },
2139
+ background: { type: "ReactNode", description: "Optional background element (WarpBackground, OrbBackground, etc.)" }
2140
+ },
2141
+ example: `<Hero
2142
+ title="Build Something Beautiful"
2143
+ subtitle="A design system that brings joy."
2144
+ cta={<Button size="lg">Get Started</Button>}
2145
+ />`
1334
2146
  },
1335
2147
  "open-graph-card": {
1336
2148
  name: "OpenGraphCard",
1337
2149
  category: "blocks",
1338
- description: "Social media preview card for Open Graph metadata",
2150
+ description: "Social media preview card for Open Graph metadata. Use in opengraph-image.tsx.",
1339
2151
  keywords: ["open-graph", "social", "preview", "card", "meta", "share"],
1340
2152
  useCases: [
1341
2153
  "Social sharing previews",
@@ -1343,7 +2155,21 @@ var COMPONENT_REGISTRY = {
1343
2155
  "Meta card generation",
1344
2156
  "Marketing previews"
1345
2157
  ],
1346
- dependencies: []
2158
+ dependencies: [],
2159
+ props: {
2160
+ title: { type: "string", default: "'Sage Design Engine'", description: "Main title text" },
2161
+ description: { type: "string", description: "Subtitle text" },
2162
+ variant: { type: "'primary' | 'secondary' | 'accent' | 'sage' | 'emerald' | 'gradient'", default: "'sage'", description: "Visual style variant" },
2163
+ icon: { type: "ReactNode", description: "Custom logo or icon element" },
2164
+ gradient: { type: "{ type: string; angle: number; colors: string[] }", description: 'Custom gradient config (variant="gradient")' },
2165
+ primaryColor: { type: "string", description: "Override primary color (hex)" },
2166
+ secondaryColor: { type: "string", description: "Override secondary color (hex)" },
2167
+ accentColor: { type: "string", description: "Override accent color (hex)" }
2168
+ },
2169
+ example: `// In opengraph-image.tsx:
2170
+ export default function OGImage() {
2171
+ return <OpenGraphCard title="My Page" description="A great description" variant="primary" />
2172
+ }`
1347
2173
  }
1348
2174
  };
1349
2175
  function getComponentsByCategory(category) {
@@ -1493,6 +2319,47 @@ function formatComponentDetails(component) {
1493
2319
  ${component.description}
1494
2320
 
1495
2321
  `;
2322
+ const importParts = [component.name];
2323
+ if (component.subComponents) {
2324
+ importParts.push(...component.subComponents);
2325
+ }
2326
+ output += `## Import
2327
+ `;
2328
+ output += `\`\`\`typescript
2329
+ import { ${importParts.join(", ")} } from '@thesage/ui';
2330
+ \`\`\`
2331
+
2332
+ `;
2333
+ if (component.props && Object.keys(component.props).length > 0) {
2334
+ output += `## Props
2335
+
2336
+ `;
2337
+ output += `| Prop | Type | Default | Description |
2338
+ `;
2339
+ output += `|------|------|---------|-------------|
2340
+ `;
2341
+ Object.entries(component.props).forEach(([name, prop]) => {
2342
+ const required = prop.required ? " **(required)**" : "";
2343
+ const defaultVal = prop.default || "-";
2344
+ output += `| ${name} | \`${prop.type}\` | ${defaultVal} | ${prop.description}${required} |
2345
+ `;
2346
+ });
2347
+ output += "\n";
2348
+ }
2349
+ if (component.subComponents && component.subComponents.length > 0) {
2350
+ output += `## Sub-Components
2351
+ `;
2352
+ output += component.subComponents.join(", ") + "\n\n";
2353
+ }
2354
+ if (component.example) {
2355
+ output += `## Example
2356
+ `;
2357
+ output += `\`\`\`tsx
2358
+ ${component.example}
2359
+ \`\`\`
2360
+
2361
+ `;
2362
+ }
1496
2363
  output += `## Use Cases
1497
2364
  `;
1498
2365
  component.useCases.forEach((useCase) => {
@@ -1500,9 +2367,6 @@ ${component.description}
1500
2367
  `;
1501
2368
  });
1502
2369
  output += "\n";
1503
- output += `## Keywords
1504
- `;
1505
- output += component.keywords.join(", ") + "\n\n";
1506
2370
  if (component.dependencies.length > 0) {
1507
2371
  output += `## Dependencies
1508
2372
  `;
@@ -1519,16 +2383,12 @@ ${component.description}
1519
2383
 
1520
2384
  `;
1521
2385
  }
1522
- output += `## Import
1523
- `;
1524
- output += `\`\`\`typescript
1525
- import { ${component.name} } from '@thesage/ui';
1526
- \`\`\`
1527
-
1528
- `;
1529
2386
  output += `## Documentation
1530
2387
  `;
1531
- output += `View full documentation at: https://thesage.dev/#${component.category}/${component.name.toLowerCase().replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase()}
2388
+ output += `View full documentation at: https://thesage.dev/docs#${component.category}/${component.name.toLowerCase().replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase()}
2389
+ `;
2390
+ output += `
2391
+ Full API reference: https://thesage.dev/llms-full.txt
1532
2392
  `;
1533
2393
  return output;
1534
2394
  }