@iblai/mcp 1.0.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 (62) hide show
  1. package/README.md +199 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +130 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/resources/data-layer.d.ts +8 -0
  7. package/dist/resources/data-layer.d.ts.map +1 -0
  8. package/dist/resources/data-layer.js +181 -0
  9. package/dist/resources/data-layer.js.map +1 -0
  10. package/dist/resources/guides-layout.d.ts +8 -0
  11. package/dist/resources/guides-layout.d.ts.map +1 -0
  12. package/dist/resources/guides-layout.js +235 -0
  13. package/dist/resources/guides-layout.js.map +1 -0
  14. package/dist/resources/guides-rbac.d.ts +8 -0
  15. package/dist/resources/guides-rbac.d.ts.map +1 -0
  16. package/dist/resources/guides-rbac.js +231 -0
  17. package/dist/resources/guides-rbac.js.map +1 -0
  18. package/dist/resources/guides-theme.d.ts +8 -0
  19. package/dist/resources/guides-theme.d.ts.map +1 -0
  20. package/dist/resources/guides-theme.js +183 -0
  21. package/dist/resources/guides-theme.js.map +1 -0
  22. package/dist/resources/index.d.ts +17 -0
  23. package/dist/resources/index.d.ts.map +1 -0
  24. package/dist/resources/index.js +18 -0
  25. package/dist/resources/index.js.map +1 -0
  26. package/dist/resources/packages-overview.d.ts +8 -0
  27. package/dist/resources/packages-overview.d.ts.map +1 -0
  28. package/dist/resources/packages-overview.js +53 -0
  29. package/dist/resources/packages-overview.js.map +1 -0
  30. package/dist/resources/web-containers.d.ts +8 -0
  31. package/dist/resources/web-containers.d.ts.map +1 -0
  32. package/dist/resources/web-containers.js +122 -0
  33. package/dist/resources/web-containers.js.map +1 -0
  34. package/dist/resources/web-utils.d.ts +8 -0
  35. package/dist/resources/web-utils.d.ts.map +1 -0
  36. package/dist/resources/web-utils.js +210 -0
  37. package/dist/resources/web-utils.js.map +1 -0
  38. package/dist/tools/api-query-info.d.ts +16 -0
  39. package/dist/tools/api-query-info.d.ts.map +1 -0
  40. package/dist/tools/api-query-info.js +2398 -0
  41. package/dist/tools/api-query-info.js.map +1 -0
  42. package/dist/tools/component-info.d.ts +16 -0
  43. package/dist/tools/component-info.d.ts.map +1 -0
  44. package/dist/tools/component-info.js +1323 -0
  45. package/dist/tools/component-info.js.map +1 -0
  46. package/dist/tools/hook-info.d.ts +16 -0
  47. package/dist/tools/hook-info.d.ts.map +1 -0
  48. package/dist/tools/hook-info.js +1988 -0
  49. package/dist/tools/hook-info.js.map +1 -0
  50. package/dist/tools/index.d.ts +68 -0
  51. package/dist/tools/index.d.ts.map +1 -0
  52. package/dist/tools/index.js +14 -0
  53. package/dist/tools/index.js.map +1 -0
  54. package/dist/tools/page-template.d.ts +28 -0
  55. package/dist/tools/page-template.d.ts.map +1 -0
  56. package/dist/tools/page-template.js +198 -0
  57. package/dist/tools/page-template.js.map +1 -0
  58. package/dist/tools/provider-setup.d.ts +24 -0
  59. package/dist/tools/provider-setup.d.ts.map +1 -0
  60. package/dist/tools/provider-setup.js +213 -0
  61. package/dist/tools/provider-setup.js.map +1 -0
  62. package/package.json +28 -0
@@ -0,0 +1,1323 @@
1
+ export const componentInfoTool = {
2
+ name: 'get_component_info',
3
+ description: 'Get detailed information about a specific UI component from web-containers',
4
+ inputSchema: {
5
+ type: 'object',
6
+ properties: {
7
+ componentName: {
8
+ type: 'string',
9
+ description: 'Name of the component (e.g., Button, Card, Dialog, Profile, NotificationDropdown)',
10
+ },
11
+ },
12
+ required: ['componentName'],
13
+ },
14
+ };
15
+ const components = {
16
+ // ============================================================================
17
+ // UI PRIMITIVES (Radix UI-based)
18
+ // ============================================================================
19
+ Button: `# Button Component
20
+
21
+ \`\`\`typescript
22
+ import { Button } from '@iblai/web-containers';
23
+
24
+ interface ButtonProps {
25
+ variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';
26
+ size?: 'default' | 'sm' | 'lg' | 'icon';
27
+ asChild?: boolean;
28
+ disabled?: boolean;
29
+ className?: string;
30
+ onClick?: () => void;
31
+ children: React.ReactNode;
32
+ }
33
+
34
+ // Examples
35
+ <Button>Click me</Button>
36
+ <Button variant="destructive">Delete</Button>
37
+ <Button variant="outline" size="sm">Small Outline</Button>
38
+ <Button size="icon"><Icon /></Button>
39
+ <Button asChild><a href="/page">Link Button</a></Button>
40
+
41
+ // With loading state
42
+ <Button disabled={isLoading}>
43
+ {isLoading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
44
+ Submit
45
+ </Button>
46
+ \`\`\`
47
+
48
+ **File Location**: \`packages/web-containers/src/components/ui/button.tsx\``,
49
+ Card: `# Card Component
50
+
51
+ \`\`\`typescript
52
+ import {
53
+ Card,
54
+ CardHeader,
55
+ CardTitle,
56
+ CardDescription,
57
+ CardContent,
58
+ CardFooter
59
+ } from '@iblai/web-containers';
60
+
61
+ <Card>
62
+ <CardHeader>
63
+ <CardTitle>Card Title</CardTitle>
64
+ <CardDescription>Card description text</CardDescription>
65
+ </CardHeader>
66
+ <CardContent>
67
+ <p>Main content goes here</p>
68
+ </CardContent>
69
+ <CardFooter>
70
+ <Button>Action</Button>
71
+ </CardFooter>
72
+ </Card>
73
+
74
+ // With custom styling
75
+ <Card className="w-[350px]">
76
+ <CardHeader className="pb-2">
77
+ <CardTitle className="text-lg">Compact Card</CardTitle>
78
+ </CardHeader>
79
+ <CardContent>Content</CardContent>
80
+ </Card>
81
+ \`\`\`
82
+
83
+ **File Location**: \`packages/web-containers/src/components/ui/card.tsx\``,
84
+ Dialog: `# Dialog Component
85
+
86
+ \`\`\`typescript
87
+ import {
88
+ Dialog,
89
+ DialogTrigger,
90
+ DialogPortal,
91
+ DialogClose,
92
+ DialogContent,
93
+ DialogHeader,
94
+ DialogFooter,
95
+ DialogTitle,
96
+ DialogDescription,
97
+ } from '@iblai/web-containers';
98
+
99
+ // Controlled dialog
100
+ <Dialog open={open} onOpenChange={setOpen}>
101
+ <DialogTrigger asChild>
102
+ <Button>Open Dialog</Button>
103
+ </DialogTrigger>
104
+ <DialogContent>
105
+ <DialogHeader>
106
+ <DialogTitle>Dialog Title</DialogTitle>
107
+ <DialogDescription>
108
+ Description of what this dialog does.
109
+ </DialogDescription>
110
+ </DialogHeader>
111
+ <div className="py-4">
112
+ {/* Dialog content */}
113
+ </div>
114
+ <DialogFooter>
115
+ <DialogClose asChild>
116
+ <Button variant="outline">Cancel</Button>
117
+ </DialogClose>
118
+ <Button onClick={handleSubmit}>Submit</Button>
119
+ </DialogFooter>
120
+ </DialogContent>
121
+ </Dialog>
122
+
123
+ // Uncontrolled dialog
124
+ <Dialog>
125
+ <DialogTrigger>Open</DialogTrigger>
126
+ <DialogContent>
127
+ <DialogHeader>
128
+ <DialogTitle>Title</DialogTitle>
129
+ </DialogHeader>
130
+ Content here
131
+ </DialogContent>
132
+ </Dialog>
133
+ \`\`\`
134
+
135
+ **File Location**: \`packages/web-containers/src/components/ui/dialog.tsx\``,
136
+ Input: `# Input Component
137
+
138
+ \`\`\`typescript
139
+ import { Input } from '@iblai/web-containers';
140
+ import { Label } from '@iblai/web-containers';
141
+
142
+ // Basic usage
143
+ <Input
144
+ type="text"
145
+ placeholder="Enter text..."
146
+ value={value}
147
+ onChange={(e) => setValue(e.target.value)}
148
+ />
149
+
150
+ // With label
151
+ <div className="space-y-2">
152
+ <Label htmlFor="email">Email</Label>
153
+ <Input
154
+ id="email"
155
+ type="email"
156
+ placeholder="name@example.com"
157
+ />
158
+ </div>
159
+
160
+ // Different types
161
+ <Input type="password" placeholder="Password" />
162
+ <Input type="number" placeholder="0" />
163
+ <Input type="search" placeholder="Search..." />
164
+ <Input type="file" />
165
+
166
+ // States
167
+ <Input disabled placeholder="Disabled input" />
168
+ <Input className="border-red-500" placeholder="Error state" />
169
+ \`\`\`
170
+
171
+ **File Location**: \`packages/web-containers/src/components/ui/input.tsx\``,
172
+ Label: `# Label Component
173
+
174
+ \`\`\`typescript
175
+ import { Label } from '@iblai/web-containers';
176
+
177
+ <Label htmlFor="email">Email Address</Label>
178
+
179
+ // With required indicator
180
+ <Label htmlFor="name">
181
+ Name <span className="text-red-500">*</span>
182
+ </Label>
183
+
184
+ // Disabled state
185
+ <Label htmlFor="disabled" className="text-muted-foreground">
186
+ Disabled Field
187
+ </Label>
188
+ \`\`\`
189
+
190
+ **File Location**: \`packages/web-containers/src/components/ui/label.tsx\``,
191
+ Textarea: `# Textarea Component
192
+
193
+ \`\`\`typescript
194
+ import { Textarea } from '@iblai/web-containers';
195
+
196
+ <Textarea
197
+ placeholder="Type your message here..."
198
+ value={value}
199
+ onChange={(e) => setValue(e.target.value)}
200
+ />
201
+
202
+ // With rows
203
+ <Textarea rows={5} placeholder="Longer text area" />
204
+
205
+ // Disabled
206
+ <Textarea disabled placeholder="Cannot edit" />
207
+ \`\`\`
208
+
209
+ **File Location**: \`packages/web-containers/src/components/ui/textarea.tsx\``,
210
+ Select: `# Select Component
211
+
212
+ \`\`\`typescript
213
+ import {
214
+ Select,
215
+ SelectGroup,
216
+ SelectValue,
217
+ SelectTrigger,
218
+ SelectContent,
219
+ SelectLabel,
220
+ SelectItem,
221
+ SelectSeparator,
222
+ SelectScrollUpButton,
223
+ SelectScrollDownButton,
224
+ } from '@iblai/web-containers';
225
+
226
+ // Basic usage
227
+ <Select value={value} onValueChange={setValue}>
228
+ <SelectTrigger className="w-[200px]">
229
+ <SelectValue placeholder="Select option" />
230
+ </SelectTrigger>
231
+ <SelectContent>
232
+ <SelectItem value="option1">Option 1</SelectItem>
233
+ <SelectItem value="option2">Option 2</SelectItem>
234
+ <SelectItem value="option3">Option 3</SelectItem>
235
+ </SelectContent>
236
+ </Select>
237
+
238
+ // With groups
239
+ <Select>
240
+ <SelectTrigger>
241
+ <SelectValue placeholder="Select..." />
242
+ </SelectTrigger>
243
+ <SelectContent>
244
+ <SelectGroup>
245
+ <SelectLabel>Fruits</SelectLabel>
246
+ <SelectItem value="apple">Apple</SelectItem>
247
+ <SelectItem value="banana">Banana</SelectItem>
248
+ </SelectGroup>
249
+ <SelectSeparator />
250
+ <SelectGroup>
251
+ <SelectLabel>Vegetables</SelectLabel>
252
+ <SelectItem value="carrot">Carrot</SelectItem>
253
+ </SelectGroup>
254
+ </SelectContent>
255
+ </Select>
256
+
257
+ // Disabled state
258
+ <Select disabled>
259
+ <SelectTrigger>
260
+ <SelectValue placeholder="Disabled" />
261
+ </SelectTrigger>
262
+ </Select>
263
+ \`\`\`
264
+
265
+ **File Location**: \`packages/web-containers/src/components/ui/select.tsx\``,
266
+ Checkbox: `# Checkbox Component
267
+
268
+ \`\`\`typescript
269
+ import { Checkbox } from '@iblai/web-containers';
270
+ import { Label } from '@iblai/web-containers';
271
+
272
+ // Basic usage
273
+ <div className="flex items-center space-x-2">
274
+ <Checkbox
275
+ id="terms"
276
+ checked={checked}
277
+ onCheckedChange={setChecked}
278
+ />
279
+ <Label htmlFor="terms">Accept terms and conditions</Label>
280
+ </div>
281
+
282
+ // Disabled
283
+ <Checkbox disabled />
284
+
285
+ // Indeterminate state
286
+ <Checkbox checked="indeterminate" />
287
+ \`\`\`
288
+
289
+ **File Location**: \`packages/web-containers/src/components/ui/checkbox.tsx\``,
290
+ RadioGroup: `# RadioGroup Component
291
+
292
+ \`\`\`typescript
293
+ import { RadioGroup, RadioGroupItem } from '@iblai/web-containers';
294
+ import { Label } from '@iblai/web-containers';
295
+
296
+ <RadioGroup value={value} onValueChange={setValue}>
297
+ <div className="flex items-center space-x-2">
298
+ <RadioGroupItem value="option1" id="r1" />
299
+ <Label htmlFor="r1">Option 1</Label>
300
+ </div>
301
+ <div className="flex items-center space-x-2">
302
+ <RadioGroupItem value="option2" id="r2" />
303
+ <Label htmlFor="r2">Option 2</Label>
304
+ </div>
305
+ <div className="flex items-center space-x-2">
306
+ <RadioGroupItem value="option3" id="r3" />
307
+ <Label htmlFor="r3">Option 3</Label>
308
+ </div>
309
+ </RadioGroup>
310
+ \`\`\`
311
+
312
+ **File Location**: \`packages/web-containers/src/components/ui/radio-group.tsx\``,
313
+ Switch: `# Switch Component
314
+
315
+ \`\`\`typescript
316
+ import { Switch } from '@iblai/web-containers';
317
+ import { Label } from '@iblai/web-containers';
318
+
319
+ <div className="flex items-center space-x-2">
320
+ <Switch
321
+ id="airplane-mode"
322
+ checked={enabled}
323
+ onCheckedChange={setEnabled}
324
+ />
325
+ <Label htmlFor="airplane-mode">Airplane Mode</Label>
326
+ </div>
327
+
328
+ // Disabled
329
+ <Switch disabled />
330
+
331
+ // With different sizes via className
332
+ <Switch className="scale-75" />
333
+ \`\`\`
334
+
335
+ **File Location**: \`packages/web-containers/src/components/ui/switch.tsx\``,
336
+ Tabs: `# Tabs Component
337
+
338
+ \`\`\`typescript
339
+ import {
340
+ Tabs,
341
+ TabsList,
342
+ TabsTrigger,
343
+ TabsContent,
344
+ } from '@iblai/web-containers';
345
+
346
+ // Controlled
347
+ <Tabs value={tab} onValueChange={setTab}>
348
+ <TabsList>
349
+ <TabsTrigger value="tab1">Tab 1</TabsTrigger>
350
+ <TabsTrigger value="tab2">Tab 2</TabsTrigger>
351
+ <TabsTrigger value="tab3">Tab 3</TabsTrigger>
352
+ </TabsList>
353
+ <TabsContent value="tab1">Content for Tab 1</TabsContent>
354
+ <TabsContent value="tab2">Content for Tab 2</TabsContent>
355
+ <TabsContent value="tab3">Content for Tab 3</TabsContent>
356
+ </Tabs>
357
+
358
+ // Uncontrolled with default
359
+ <Tabs defaultValue="tab1" className="w-full">
360
+ <TabsList className="grid w-full grid-cols-3">
361
+ <TabsTrigger value="tab1">Account</TabsTrigger>
362
+ <TabsTrigger value="tab2">Password</TabsTrigger>
363
+ <TabsTrigger value="tab3">Settings</TabsTrigger>
364
+ </TabsList>
365
+ <TabsContent value="tab1">...</TabsContent>
366
+ <TabsContent value="tab2">...</TabsContent>
367
+ <TabsContent value="tab3">...</TabsContent>
368
+ </Tabs>
369
+ \`\`\`
370
+
371
+ **File Location**: \`packages/web-containers/src/components/ui/tabs.tsx\``,
372
+ Avatar: `# Avatar Component
373
+
374
+ \`\`\`typescript
375
+ import { Avatar, AvatarImage, AvatarFallback, AvatarImageBordered } from '@iblai/web-containers';
376
+
377
+ // Basic usage
378
+ <Avatar>
379
+ <AvatarImage src={user.avatar} alt={user.name} />
380
+ <AvatarFallback>{user.initials}</AvatarFallback>
381
+ </Avatar>
382
+
383
+ // With custom size
384
+ <Avatar className="h-12 w-12">
385
+ <AvatarImage src={user.avatar} />
386
+ <AvatarFallback>JD</AvatarFallback>
387
+ </Avatar>
388
+
389
+ // Bordered variant
390
+ <Avatar>
391
+ <AvatarImageBordered src={user.avatar} alt={user.name} />
392
+ <AvatarFallback>AB</AvatarFallback>
393
+ </Avatar>
394
+
395
+ // Multiple avatars (avatar group)
396
+ <div className="flex -space-x-4">
397
+ <Avatar className="border-2 border-background">
398
+ <AvatarImage src="/user1.jpg" />
399
+ <AvatarFallback>U1</AvatarFallback>
400
+ </Avatar>
401
+ <Avatar className="border-2 border-background">
402
+ <AvatarImage src="/user2.jpg" />
403
+ <AvatarFallback>U2</AvatarFallback>
404
+ </Avatar>
405
+ </div>
406
+ \`\`\`
407
+
408
+ **File Location**: \`packages/web-containers/src/components/ui/avatar.tsx\``,
409
+ Badge: `# Badge Component
410
+
411
+ \`\`\`typescript
412
+ import { Badge, badgeVariants } from '@iblai/web-containers';
413
+
414
+ // Variants
415
+ <Badge>Default</Badge>
416
+ <Badge variant="secondary">Secondary</Badge>
417
+ <Badge variant="destructive">Destructive</Badge>
418
+ <Badge variant="outline">Outline</Badge>
419
+
420
+ // As link
421
+ <Badge className={badgeVariants({ variant: "outline" })} asChild>
422
+ <a href="/link">Link Badge</a>
423
+ </Badge>
424
+
425
+ // Custom colors
426
+ <Badge className="bg-green-500">Success</Badge>
427
+ <Badge className="bg-yellow-500">Warning</Badge>
428
+ \`\`\`
429
+
430
+ **File Location**: \`packages/web-containers/src/components/ui/badge.tsx\``,
431
+ Tooltip: `# Tooltip Component
432
+
433
+ \`\`\`typescript
434
+ import {
435
+ Tooltip,
436
+ TooltipContent,
437
+ TooltipProvider,
438
+ TooltipTrigger,
439
+ } from '@iblai/web-containers';
440
+
441
+ // Wrap your app or component tree with TooltipProvider
442
+ <TooltipProvider>
443
+ <Tooltip>
444
+ <TooltipTrigger asChild>
445
+ <Button variant="outline">Hover me</Button>
446
+ </TooltipTrigger>
447
+ <TooltipContent>
448
+ <p>Tooltip content here</p>
449
+ </TooltipContent>
450
+ </Tooltip>
451
+ </TooltipProvider>
452
+
453
+ // With delay
454
+ <TooltipProvider delayDuration={300}>
455
+ <Tooltip>
456
+ <TooltipTrigger>Delayed</TooltipTrigger>
457
+ <TooltipContent>Shows after 300ms</TooltipContent>
458
+ </Tooltip>
459
+ </TooltipProvider>
460
+
461
+ // Positioning
462
+ <Tooltip>
463
+ <TooltipTrigger>Trigger</TooltipTrigger>
464
+ <TooltipContent side="right" align="start">
465
+ Right aligned tooltip
466
+ </TooltipContent>
467
+ </Tooltip>
468
+ \`\`\`
469
+
470
+ **File Location**: \`packages/web-containers/src/components/ui/tooltip.tsx\``,
471
+ Popover: `# Popover Component
472
+
473
+ \`\`\`typescript
474
+ import {
475
+ Popover,
476
+ PopoverTrigger,
477
+ PopoverContent,
478
+ } from '@iblai/web-containers';
479
+
480
+ <Popover>
481
+ <PopoverTrigger asChild>
482
+ <Button variant="outline">Open Popover</Button>
483
+ </PopoverTrigger>
484
+ <PopoverContent className="w-80">
485
+ <div className="grid gap-4">
486
+ <div className="space-y-2">
487
+ <h4 className="font-medium">Dimensions</h4>
488
+ <p className="text-sm text-muted-foreground">
489
+ Set the dimensions for the layer.
490
+ </p>
491
+ </div>
492
+ <div className="grid gap-2">
493
+ <Input placeholder="Width" />
494
+ <Input placeholder="Height" />
495
+ </div>
496
+ </div>
497
+ </PopoverContent>
498
+ </Popover>
499
+
500
+ // With positioning
501
+ <Popover>
502
+ <PopoverTrigger>Click</PopoverTrigger>
503
+ <PopoverContent side="right" align="start">
504
+ Content
505
+ </PopoverContent>
506
+ </Popover>
507
+ \`\`\`
508
+
509
+ **File Location**: \`packages/web-containers/src/components/ui/popover.tsx\``,
510
+ DropdownMenu: `# DropdownMenu Component
511
+
512
+ \`\`\`typescript
513
+ import {
514
+ DropdownMenu,
515
+ DropdownMenuTrigger,
516
+ DropdownMenuContent,
517
+ DropdownMenuItem,
518
+ DropdownMenuCheckboxItem,
519
+ DropdownMenuRadioItem,
520
+ DropdownMenuLabel,
521
+ DropdownMenuSeparator,
522
+ DropdownMenuShortcut,
523
+ DropdownMenuGroup,
524
+ DropdownMenuSub,
525
+ DropdownMenuSubContent,
526
+ DropdownMenuSubTrigger,
527
+ DropdownMenuRadioGroup,
528
+ } from '@iblai/web-containers';
529
+
530
+ <DropdownMenu>
531
+ <DropdownMenuTrigger asChild>
532
+ <Button variant="outline">Open Menu</Button>
533
+ </DropdownMenuTrigger>
534
+ <DropdownMenuContent className="w-56">
535
+ <DropdownMenuLabel>My Account</DropdownMenuLabel>
536
+ <DropdownMenuSeparator />
537
+ <DropdownMenuGroup>
538
+ <DropdownMenuItem>
539
+ Profile
540
+ <DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
541
+ </DropdownMenuItem>
542
+ <DropdownMenuItem>Settings</DropdownMenuItem>
543
+ </DropdownMenuGroup>
544
+ <DropdownMenuSeparator />
545
+ <DropdownMenuSub>
546
+ <DropdownMenuSubTrigger>Invite users</DropdownMenuSubTrigger>
547
+ <DropdownMenuSubContent>
548
+ <DropdownMenuItem>Email</DropdownMenuItem>
549
+ <DropdownMenuItem>Message</DropdownMenuItem>
550
+ </DropdownMenuSubContent>
551
+ </DropdownMenuSub>
552
+ <DropdownMenuSeparator />
553
+ <DropdownMenuItem className="text-red-600">
554
+ Log out
555
+ </DropdownMenuItem>
556
+ </DropdownMenuContent>
557
+ </DropdownMenu>
558
+ \`\`\`
559
+
560
+ **File Location**: \`packages/web-containers/src/components/ui/dropdown-menu.tsx\``,
561
+ Table: `# Table Component
562
+
563
+ \`\`\`typescript
564
+ import {
565
+ Table,
566
+ TableHeader,
567
+ TableBody,
568
+ TableFooter,
569
+ TableHead,
570
+ TableRow,
571
+ TableCell,
572
+ TableCaption,
573
+ } from '@iblai/web-containers';
574
+
575
+ <Table>
576
+ <TableCaption>A list of your recent invoices.</TableCaption>
577
+ <TableHeader>
578
+ <TableRow>
579
+ <TableHead className="w-[100px]">Invoice</TableHead>
580
+ <TableHead>Status</TableHead>
581
+ <TableHead>Method</TableHead>
582
+ <TableHead className="text-right">Amount</TableHead>
583
+ </TableRow>
584
+ </TableHeader>
585
+ <TableBody>
586
+ {invoices.map((invoice) => (
587
+ <TableRow key={invoice.id}>
588
+ <TableCell className="font-medium">{invoice.id}</TableCell>
589
+ <TableCell>{invoice.status}</TableCell>
590
+ <TableCell>{invoice.method}</TableCell>
591
+ <TableCell className="text-right">{invoice.amount}</TableCell>
592
+ </TableRow>
593
+ ))}
594
+ </TableBody>
595
+ <TableFooter>
596
+ <TableRow>
597
+ <TableCell colSpan={3}>Total</TableCell>
598
+ <TableCell className="text-right">$2,500.00</TableCell>
599
+ </TableRow>
600
+ </TableFooter>
601
+ </Table>
602
+ \`\`\`
603
+
604
+ **File Location**: \`packages/web-containers/src/components/ui/table.tsx\``,
605
+ Skeleton: `# Skeleton Component
606
+
607
+ \`\`\`typescript
608
+ import { Skeleton } from '@iblai/web-containers';
609
+
610
+ // Loading card
611
+ <div className="space-y-3">
612
+ <Skeleton className="h-[125px] w-[250px] rounded-xl" />
613
+ <div className="space-y-2">
614
+ <Skeleton className="h-4 w-[250px]" />
615
+ <Skeleton className="h-4 w-[200px]" />
616
+ </div>
617
+ </div>
618
+
619
+ // Loading text
620
+ <div className="space-y-2">
621
+ <Skeleton className="h-4 w-full" />
622
+ <Skeleton className="h-4 w-3/4" />
623
+ </div>
624
+
625
+ // Loading avatar
626
+ <div className="flex items-center space-x-4">
627
+ <Skeleton className="h-12 w-12 rounded-full" />
628
+ <div className="space-y-2">
629
+ <Skeleton className="h-4 w-[200px]" />
630
+ <Skeleton className="h-4 w-[150px]" />
631
+ </div>
632
+ </div>
633
+ \`\`\`
634
+
635
+ **File Location**: \`packages/web-containers/src/components/ui/skeleton.tsx\``,
636
+ Separator: `# Separator Component
637
+
638
+ \`\`\`typescript
639
+ import { Separator } from '@iblai/web-containers';
640
+
641
+ // Horizontal (default)
642
+ <div>
643
+ <p>Above</p>
644
+ <Separator className="my-4" />
645
+ <p>Below</p>
646
+ </div>
647
+
648
+ // Vertical
649
+ <div className="flex h-5 items-center space-x-4">
650
+ <span>Item 1</span>
651
+ <Separator orientation="vertical" />
652
+ <span>Item 2</span>
653
+ <Separator orientation="vertical" />
654
+ <span>Item 3</span>
655
+ </div>
656
+ \`\`\`
657
+
658
+ **File Location**: \`packages/web-containers/src/components/ui/separator.tsx\``,
659
+ Calendar: `# Calendar Component
660
+
661
+ \`\`\`typescript
662
+ import { Calendar, CalendarDayButton } from '@iblai/web-containers';
663
+
664
+ // Single date selection
665
+ <Calendar
666
+ mode="single"
667
+ selected={date}
668
+ onSelect={setDate}
669
+ className="rounded-md border"
670
+ />
671
+
672
+ // Date range
673
+ <Calendar
674
+ mode="range"
675
+ selected={dateRange}
676
+ onSelect={setDateRange}
677
+ />
678
+
679
+ // Multiple dates
680
+ <Calendar
681
+ mode="multiple"
682
+ selected={dates}
683
+ onSelect={setDates}
684
+ />
685
+
686
+ // With disabled dates
687
+ <Calendar
688
+ mode="single"
689
+ selected={date}
690
+ onSelect={setDate}
691
+ disabled={(date) => date < new Date()}
692
+ />
693
+ \`\`\`
694
+
695
+ **File Location**: \`packages/web-containers/src/components/ui/calendar.tsx\``,
696
+ Pagination: `# Pagination Component
697
+
698
+ \`\`\`typescript
699
+ import {
700
+ Pagination,
701
+ PaginationContent,
702
+ PaginationItem,
703
+ PaginationLink,
704
+ PaginationNext,
705
+ PaginationPrevious,
706
+ PaginationEllipsis,
707
+ } from '@iblai/web-containers';
708
+
709
+ <Pagination>
710
+ <PaginationContent>
711
+ <PaginationItem>
712
+ <PaginationPrevious href="#" />
713
+ </PaginationItem>
714
+ <PaginationItem>
715
+ <PaginationLink href="#">1</PaginationLink>
716
+ </PaginationItem>
717
+ <PaginationItem>
718
+ <PaginationLink href="#" isActive>2</PaginationLink>
719
+ </PaginationItem>
720
+ <PaginationItem>
721
+ <PaginationLink href="#">3</PaginationLink>
722
+ </PaginationItem>
723
+ <PaginationItem>
724
+ <PaginationEllipsis />
725
+ </PaginationItem>
726
+ <PaginationItem>
727
+ <PaginationNext href="#" />
728
+ </PaginationItem>
729
+ </PaginationContent>
730
+ </Pagination>
731
+ \`\`\`
732
+
733
+ **File Location**: \`packages/web-containers/src/components/ui/pagination.tsx\``,
734
+ Toggle: `# Toggle Component
735
+
736
+ \`\`\`typescript
737
+ import { Toggle, toggleVariants } from '@iblai/web-containers';
738
+ import { Bold, Italic, Underline } from 'lucide-react';
739
+
740
+ // Basic toggle
741
+ <Toggle aria-label="Toggle bold">
742
+ <Bold className="h-4 w-4" />
743
+ </Toggle>
744
+
745
+ // With variants
746
+ <Toggle variant="outline" aria-label="Toggle">
747
+ Toggle
748
+ </Toggle>
749
+
750
+ // Controlled
751
+ <Toggle pressed={bold} onPressedChange={setBold}>
752
+ <Bold className="h-4 w-4" />
753
+ </Toggle>
754
+
755
+ // Toggle group (using multiple toggles)
756
+ <div className="flex gap-1">
757
+ <Toggle><Bold className="h-4 w-4" /></Toggle>
758
+ <Toggle><Italic className="h-4 w-4" /></Toggle>
759
+ <Toggle><Underline className="h-4 w-4" /></Toggle>
760
+ </div>
761
+ \`\`\`
762
+
763
+ **File Location**: \`packages/web-containers/src/components/ui/toggle.tsx\``,
764
+ Toast: `# Toast / Toaster Component
765
+
766
+ \`\`\`typescript
767
+ import { Toaster, toast } from '@iblai/web-containers';
768
+ // OR using sonner directly
769
+ import { Toaster } from '@iblai/web-containers';
770
+ import { toast } from 'sonner';
771
+
772
+ // Add Toaster to your layout
773
+ <Toaster />
774
+
775
+ // Usage
776
+ toast('Event has been created');
777
+ toast.success('Successfully saved!');
778
+ toast.error('Something went wrong');
779
+ toast.warning('Warning message');
780
+ toast.info('Information');
781
+
782
+ // With description
783
+ toast('Event created', {
784
+ description: 'Your event has been scheduled.',
785
+ });
786
+
787
+ // With action
788
+ toast('Event created', {
789
+ action: {
790
+ label: 'Undo',
791
+ onClick: () => console.log('Undo'),
792
+ },
793
+ });
794
+
795
+ // Promise toast
796
+ toast.promise(saveData(), {
797
+ loading: 'Saving...',
798
+ success: 'Data saved!',
799
+ error: 'Could not save.',
800
+ });
801
+ \`\`\`
802
+
803
+ **File Location**: \`packages/web-containers/src/components/ui/sonner.tsx\``,
804
+ Chart: `# Chart Components (Recharts wrapper)
805
+
806
+ \`\`\`typescript
807
+ import {
808
+ ChartConfig,
809
+ ChartContainer,
810
+ ChartTooltip,
811
+ ChartTooltipContent,
812
+ ChartLegend,
813
+ ChartLegendContent,
814
+ } from '@iblai/web-containers';
815
+ import { Bar, BarChart, XAxis, YAxis } from 'recharts';
816
+
817
+ const chartConfig: ChartConfig = {
818
+ desktop: { label: 'Desktop', color: '#2563eb' },
819
+ mobile: { label: 'Mobile', color: '#60a5fa' },
820
+ };
821
+
822
+ <ChartContainer config={chartConfig} className="h-[300px]">
823
+ <BarChart data={data}>
824
+ <XAxis dataKey="month" />
825
+ <YAxis />
826
+ <ChartTooltip content={<ChartTooltipContent />} />
827
+ <ChartLegend content={<ChartLegendContent />} />
828
+ <Bar dataKey="desktop" fill="var(--color-desktop)" />
829
+ <Bar dataKey="mobile" fill="var(--color-mobile)" />
830
+ </BarChart>
831
+ </ChartContainer>
832
+ \`\`\`
833
+
834
+ **File Location**: \`packages/web-containers/src/components/ui/chart.tsx\``,
835
+ // ============================================================================
836
+ // FEATURE COMPONENTS
837
+ // ============================================================================
838
+ Profile: `# Profile Component
839
+
840
+ Complete user profile management with multiple tabs.
841
+
842
+ \`\`\`typescript
843
+ import { Profile } from '@iblai/web-containers';
844
+
845
+ <Profile
846
+ username={username}
847
+ tenantKey={tenantKey}
848
+ tabs={['basic', 'social', 'education', 'experience', 'resume', 'security', 'advanced']}
849
+ onSave={handleSave}
850
+ />
851
+ \`\`\`
852
+
853
+ **Available Tabs**:
854
+ - \`basic\`: Name, title, about, profile image
855
+ - \`social\`: Social media links (LinkedIn, Twitter, etc.)
856
+ - \`education\`: Education history with institutions
857
+ - \`experience\`: Work experience with companies
858
+ - \`resume\`: Resume/CV upload
859
+ - \`security\`: Password change
860
+ - \`advanced\`: Custom domain, SMTP, API settings
861
+
862
+ **Related Components**:
863
+ - \`InviteUserDialog\` - Dialog to invite users
864
+ - \`InvitedUsersDialog\` - View invited users
865
+ - \`LocalLLMTab\` - Local LLM settings (Tauri desktop only)
866
+ - \`IntegrationsTab\` - API integrations
867
+ - \`UsersTab\`, \`CoursesTab\`, \`ProgramsTab\` - Invite management
868
+
869
+ **File Location**: \`packages/web-containers/src/components/profile/index.tsx\``,
870
+ InviteUserDialog: `# InviteUserDialog Component
871
+
872
+ Dialog for inviting new users to the platform.
873
+
874
+ \`\`\`typescript
875
+ import { InviteUserDialog } from '@iblai/web-containers';
876
+
877
+ <InviteUserDialog
878
+ open={open}
879
+ onOpenChange={setOpen}
880
+ tenantKey={tenantKey}
881
+ onSuccess={() => {
882
+ toast.success('User invited successfully');
883
+ refetch();
884
+ }}
885
+ />
886
+ \`\`\`
887
+
888
+ **File Location**: \`packages/web-containers/src/components/profile/invite-user.tsx\``,
889
+ LocalLLMTab: `# LocalLLMTab Component
890
+
891
+ Settings for local LLM (Ollama) in Tauri desktop app.
892
+
893
+ \`\`\`typescript
894
+ import { LocalLLMTab, isLocalLLMEnabled, setLocalLLMEnabled } from '@iblai/web-containers';
895
+
896
+ <LocalLLMTab
897
+ isAvailable={isTauriApp}
898
+ state={downloadState}
899
+ ollamaStatus={ollamaStatus}
900
+ onStartDownload={handleDownload}
901
+ onCancelDownload={handleCancel}
902
+ onInstallOllama={handleInstall}
903
+ onCheckStatus={checkStatus}
904
+ onResetState={resetState}
905
+ />
906
+
907
+ // Check if local LLM is enabled
908
+ const enabled = isLocalLLMEnabled();
909
+
910
+ // Enable/disable
911
+ setLocalLLMEnabled(true);
912
+ \`\`\`
913
+
914
+ **File Location**: \`packages/web-containers/src/components/profile/local-llm/local-llm-tab.tsx\``,
915
+ NotificationDropdown: `# NotificationDropdown Component
916
+
917
+ Notification bell dropdown with unread count.
918
+
919
+ \`\`\`typescript
920
+ import { NotificationDropdown } from '@iblai/web-containers';
921
+
922
+ <NotificationDropdown
923
+ org={tenantKey}
924
+ userId={username}
925
+ isAdmin={isAdmin}
926
+ onViewNotifications={() => router.push('/notifications')}
927
+ />
928
+ \`\`\`
929
+
930
+ **Props**:
931
+ - \`org\`: Tenant/organization key
932
+ - \`userId\`: Current user's username
933
+ - \`isAdmin\`: Whether user is admin (shows admin features)
934
+ - \`onViewNotifications\`: Callback when "View All" is clicked
935
+
936
+ **Related Components**:
937
+ - \`NotificationDisplay\` - Individual notification item
938
+ - \`SendNotificationDialog\` - Send notifications (admin)
939
+ - \`AlertsTab\` - Manage notification alerts
940
+ - \`EditAlertDialog\` - Edit alert settings
941
+
942
+ **File Location**: \`packages/web-containers/src/components/notifications/index.ts\``,
943
+ SendNotificationDialog: `# SendNotificationDialog Component
944
+
945
+ Dialog for admins to send notifications to users.
946
+
947
+ \`\`\`typescript
948
+ import { SendNotificationDialog } from '@iblai/web-containers';
949
+
950
+ <SendNotificationDialog
951
+ open={open}
952
+ onOpenChange={setOpen}
953
+ tenantKey={tenantKey}
954
+ onSuccess={() => toast.success('Notification sent')}
955
+ />
956
+ \`\`\`
957
+
958
+ **File Location**: \`packages/web-containers/src/components/notifications/send-notification-dialog.tsx\``,
959
+ AlertsTab: `# AlertsTab Component
960
+
961
+ Manage notification alert configurations.
962
+
963
+ \`\`\`typescript
964
+ import { AlertsTab } from '@iblai/web-containers';
965
+
966
+ <AlertsTab tenantKey={tenantKey} />
967
+ \`\`\`
968
+
969
+ **File Location**: \`packages/web-containers/src/components/notifications/alerts-tab.tsx\``,
970
+ AnalyticsLayout: `# Analytics Components
971
+
972
+ Complete analytics dashboard with charts and filters.
973
+
974
+ \`\`\`typescript
975
+ import {
976
+ AnalyticsLayout,
977
+ AnalyticsOverview,
978
+ AnalyticsUsersStats,
979
+ AnalyticsTopicsStats,
980
+ AnalyticsFinancialStats,
981
+ AnalyticsTranscriptsStats,
982
+ AnalyticsReports,
983
+ ChartFiltersProvider,
984
+ useChartFilters,
985
+ AnalyticsSettingsProvider,
986
+ useAnalyticsSettings,
987
+ StatCard,
988
+ ChartCardWrapper,
989
+ EmptyStats,
990
+ TimeFilter,
991
+ CustomDateRangePicker,
992
+ AccessTimeHeatmap,
993
+ GroupsFilterDropdown,
994
+ } from '@iblai/web-containers';
995
+
996
+ // Usage
997
+ <ChartFiltersProvider>
998
+ <AnalyticsSettingsProvider>
999
+ <AnalyticsLayout>
1000
+ <AnalyticsOverview />
1001
+ </AnalyticsLayout>
1002
+ </AnalyticsSettingsProvider>
1003
+ </ChartFiltersProvider>
1004
+
1005
+ // Using hooks for custom analytics
1006
+ const { filters, setFilters, dateRange, setDateRange } = useChartFilters();
1007
+ const { settings, updateSettings } = useAnalyticsSettings();
1008
+ \`\`\`
1009
+
1010
+ **Analytics Hooks**:
1011
+ - \`useOverview()\` - Overview data
1012
+ - \`useUsers()\` - User statistics
1013
+ - \`useTopics()\` - Topic statistics
1014
+ - \`useFinancial()\` - Financial data
1015
+ - \`useTranscripts()\` - Transcript data
1016
+ - \`useReports()\` - Reports data
1017
+
1018
+ **File Location**: \`packages/web-containers/src/components/analytics/index.ts\``,
1019
+ LoginButton: `# LoginButton Component
1020
+
1021
+ Button that redirects to Auth SPA for login.
1022
+
1023
+ \`\`\`typescript
1024
+ import { LoginButton } from '@iblai/web-containers';
1025
+
1026
+ <LoginButton
1027
+ authUrl="https://auth.example.com"
1028
+ appName="mentor"
1029
+ platformKey={tenantKey}
1030
+ label="Sign In"
1031
+ variant="default"
1032
+ />
1033
+ \`\`\`
1034
+
1035
+ **Props**:
1036
+ - \`authUrl\`: Auth SPA base URL
1037
+ - \`appName\`: App identifier for redirect
1038
+ - \`platformKey\`: Tenant key
1039
+ - \`label\`: Button text (default: "Login")
1040
+ - \`variant\`: Button variant
1041
+
1042
+ **File Location**: \`packages/web-containers/src/components/auth-buttons/login-button.tsx\``,
1043
+ SignupButton: `# SignupButton Component
1044
+
1045
+ Button that redirects to tenant join/signup flow.
1046
+
1047
+ \`\`\`typescript
1048
+ import { SignupButton } from '@iblai/web-containers';
1049
+
1050
+ <SignupButton
1051
+ authUrl="https://auth.example.com"
1052
+ tenantKey={tenantKey}
1053
+ label="Create Account"
1054
+ variant="outline"
1055
+ />
1056
+ \`\`\`
1057
+
1058
+ **Props**:
1059
+ - \`authUrl\`: Auth SPA base URL
1060
+ - \`tenantKey\`: Tenant to join
1061
+ - \`label\`: Button text (default: "Sign Up")
1062
+ - \`variant\`: Button variant
1063
+
1064
+ **File Location**: \`packages/web-containers/src/components/auth-buttons/signup-button.tsx\``,
1065
+ Markdown: `# Markdown Component
1066
+
1067
+ Render markdown content with custom styling.
1068
+
1069
+ \`\`\`typescript
1070
+ import { Markdown, markdownComponents, CopyButtonIcon } from '@iblai/web-containers';
1071
+
1072
+ <Markdown content={markdownString} />
1073
+
1074
+ // With custom components
1075
+ <Markdown
1076
+ content={content}
1077
+ components={{
1078
+ ...markdownComponents,
1079
+ // Override specific elements
1080
+ h1: ({ children }) => <h1 className="custom-h1">{children}</h1>,
1081
+ }}
1082
+ />
1083
+ \`\`\`
1084
+
1085
+ **File Location**: \`packages/web-containers/src/components/markdown/index.tsx\``,
1086
+ RichTextEditor: `# RichTextEditor Component
1087
+
1088
+ TipTap-based rich text editor.
1089
+
1090
+ \`\`\`typescript
1091
+ import { RichTextEditor } from '@iblai/web-containers';
1092
+
1093
+ <RichTextEditor
1094
+ content={content}
1095
+ onChange={setContent}
1096
+ placeholder="Start typing..."
1097
+ />
1098
+ \`\`\`
1099
+
1100
+ **File Location**: \`packages/web-containers/src/components/rich-text-editor.tsx\``,
1101
+ SearchableMultiSelect: `# SearchableMultiSelect Component
1102
+
1103
+ Searchable dropdown with multiple selection.
1104
+
1105
+ \`\`\`typescript
1106
+ import { SearchableMultiSelect } from '@iblai/web-containers';
1107
+
1108
+ <SearchableMultiSelect
1109
+ options={[
1110
+ { value: '1', label: 'Option 1' },
1111
+ { value: '2', label: 'Option 2' },
1112
+ ]}
1113
+ selected={selectedValues}
1114
+ onChange={setSelectedValues}
1115
+ placeholder="Select options..."
1116
+ searchPlaceholder="Search..."
1117
+ />
1118
+ \`\`\`
1119
+
1120
+ **File Location**: \`packages/web-containers/src/components/searchable-multiselect.tsx\``,
1121
+ TenantSwitcher: `# TenantSwitcher Component
1122
+
1123
+ Dropdown to switch between tenants/organizations.
1124
+
1125
+ \`\`\`typescript
1126
+ import { TenantSwitcher } from '@iblai/web-containers';
1127
+
1128
+ <TenantSwitcher
1129
+ currentTenant={currentTenant}
1130
+ tenants={userTenants}
1131
+ onSwitch={handleTenantSwitch}
1132
+ />
1133
+ \`\`\`
1134
+
1135
+ **File Location**: \`packages/web-containers/src/components/tenant-switch/index.tsx\``,
1136
+ TopBanner: `# TopBanner Component
1137
+
1138
+ Sticky banner at the top of the page.
1139
+
1140
+ \`\`\`typescript
1141
+ import { TopBanner, TopBannerProps } from '@iblai/web-containers';
1142
+
1143
+ <TopBanner
1144
+ message="Your trial expires in 7 days"
1145
+ type="warning"
1146
+ action={{
1147
+ label: "Upgrade",
1148
+ onClick: handleUpgrade,
1149
+ }}
1150
+ onDismiss={handleDismiss}
1151
+ />
1152
+ \`\`\`
1153
+
1154
+ **File Location**: \`packages/web-containers/src/components/top-banner/index.tsx\``,
1155
+ Loader: `# Loader Component
1156
+
1157
+ Spinning loader with gradient animation.
1158
+
1159
+ \`\`\`typescript
1160
+ import { Loader } from '@iblai/web-containers';
1161
+
1162
+ <Loader />
1163
+
1164
+ // Custom size
1165
+ <Loader className="h-8 w-8" />
1166
+ \`\`\`
1167
+
1168
+ **File Location**: \`packages/web-containers/src/components/loader.tsx\``,
1169
+ Spinner: `# Spinner Component
1170
+
1171
+ Alternative spinner component.
1172
+
1173
+ \`\`\`typescript
1174
+ import { Spinner } from '@iblai/web-containers';
1175
+
1176
+ <Spinner />
1177
+ <Spinner size="sm" />
1178
+ <Spinner size="lg" />
1179
+ \`\`\`
1180
+
1181
+ **File Location**: \`packages/web-containers/src/components/spinner/index.tsx\``,
1182
+ TimeTrackingProvider: `# TimeTrackingProvider Component
1183
+
1184
+ Context provider for time tracking functionality.
1185
+
1186
+ \`\`\`typescript
1187
+ import { TimeTrackingProvider } from '@iblai/web-containers';
1188
+
1189
+ <TimeTrackingProvider
1190
+ intervalSeconds={30}
1191
+ enabled={true}
1192
+ onTimeUpdate={(url, timeSpent) => {
1193
+ // Send to analytics
1194
+ }}
1195
+ >
1196
+ {children}
1197
+ </TimeTrackingProvider>
1198
+ \`\`\`
1199
+
1200
+ **File Location**: \`packages/web-containers/src/components/time-tracking-provider.tsx\``,
1201
+ UserProfileDropdown: `# UserProfileDropdown Component
1202
+
1203
+ User menu dropdown with profile and logout options.
1204
+
1205
+ \`\`\`typescript
1206
+ import { UserProfileDropdown } from '@iblai/web-containers';
1207
+
1208
+ <UserProfileDropdown
1209
+ user={userData}
1210
+ onProfileClick={() => router.push('/profile')}
1211
+ onLogout={handleLogout}
1212
+ />
1213
+ \`\`\`
1214
+
1215
+ **File Location**: \`packages/web-containers/src/components/user-profile-dropdown/index.tsx\``,
1216
+ AdvancedPagination: `# AdvancedPagination Component
1217
+
1218
+ Enhanced pagination with page size selector.
1219
+
1220
+ \`\`\`typescript
1221
+ import { AdvancedPagination } from '@iblai/web-containers';
1222
+
1223
+ <AdvancedPagination
1224
+ currentPage={page}
1225
+ totalPages={totalPages}
1226
+ pageSize={pageSize}
1227
+ onPageChange={setPage}
1228
+ onPageSizeChange={setPageSize}
1229
+ />
1230
+ \`\`\`
1231
+
1232
+ **File Location**: \`packages/web-containers/src/components/advance-pagination.tsx\``,
1233
+ ContentViewWrapper: `# ContentViewWrapper Component
1234
+
1235
+ Container wrapper for page content.
1236
+
1237
+ \`\`\`typescript
1238
+ import { ContentViewWrapper } from '@iblai/web-containers';
1239
+
1240
+ <ContentViewWrapper>
1241
+ {children}
1242
+ </ContentViewWrapper>
1243
+ \`\`\`
1244
+
1245
+ **File Location**: \`packages/web-containers/src/components/content-view-wrapper.tsx\``,
1246
+ Version: `# Version Component
1247
+
1248
+ Display app version information.
1249
+
1250
+ \`\`\`typescript
1251
+ import { Version } from '@iblai/web-containers';
1252
+
1253
+ <Version />
1254
+ \`\`\`
1255
+
1256
+ **File Location**: \`packages/web-containers/src/components/version.tsx\``,
1257
+ SsoLogin: `# SsoLogin Component
1258
+
1259
+ SSO callback handler for authentication.
1260
+
1261
+ \`\`\`typescript
1262
+ import { SsoLogin } from '@iblai/web-containers';
1263
+
1264
+ // In your sso-login page
1265
+ export default function SsoLoginPage() {
1266
+ return <SsoLogin onSuccess={handleSuccess} onError={handleError} />;
1267
+ }
1268
+ \`\`\`
1269
+
1270
+ **File Location**: \`packages/web-containers/src/components/sso-login.tsx\``,
1271
+ ErrorPage: `# ErrorPage Component
1272
+
1273
+ Full-page error display.
1274
+
1275
+ \`\`\`typescript
1276
+ import { ErrorPage } from '@iblai/web-containers/next';
1277
+
1278
+ <ErrorPage
1279
+ statusCode={404}
1280
+ title="Page Not Found"
1281
+ description="The page you're looking for doesn't exist."
1282
+ />
1283
+ \`\`\`
1284
+
1285
+ **File Location**: \`packages/web-containers/src/components/error/error-page.tsx\``,
1286
+ ClientErrorPage: `# ClientErrorPage Component
1287
+
1288
+ Client-side error boundary page.
1289
+
1290
+ \`\`\`typescript
1291
+ // app/error.tsx
1292
+ 'use client';
1293
+
1294
+ import { ClientErrorPage } from '@iblai/web-containers/next';
1295
+
1296
+ export default function Error({
1297
+ error,
1298
+ reset,
1299
+ }: {
1300
+ error: Error & { digest?: string };
1301
+ reset: () => void;
1302
+ }) {
1303
+ return <ClientErrorPage error={error} reset={reset} />;
1304
+ }
1305
+ \`\`\`
1306
+
1307
+ **File Location**: \`packages/web-containers/src/components/error/client-error-page.tsx\``,
1308
+ };
1309
+ export function getComponentInfo(componentName) {
1310
+ const info = components[componentName];
1311
+ if (!info) {
1312
+ const allComponents = Object.keys(components).sort();
1313
+ return `Component "${componentName}" not found.
1314
+
1315
+ **Available UI Primitives (${allComponents.filter((c) => ['Button', 'Card', 'Dialog', 'Input', 'Label', 'Textarea', 'Select', 'Checkbox', 'RadioGroup', 'Switch', 'Tabs', 'Avatar', 'Badge', 'Tooltip', 'Popover', 'DropdownMenu', 'Table', 'Skeleton', 'Separator', 'Calendar', 'Pagination', 'Toggle', 'Toast', 'Chart'].includes(c)).length}):**
1316
+ Button, Card, Dialog, Input, Label, Textarea, Select, Checkbox, RadioGroup, Switch, Tabs, Avatar, Badge, Tooltip, Popover, DropdownMenu, Table, Skeleton, Separator, Calendar, Pagination, Toggle, Toast, Chart
1317
+
1318
+ **Available Feature Components (${allComponents.filter((c) => !['Button', 'Card', 'Dialog', 'Input', 'Label', 'Textarea', 'Select', 'Checkbox', 'RadioGroup', 'Switch', 'Tabs', 'Avatar', 'Badge', 'Tooltip', 'Popover', 'DropdownMenu', 'Table', 'Skeleton', 'Separator', 'Calendar', 'Pagination', 'Toggle', 'Toast', 'Chart'].includes(c)).length}):**
1319
+ Profile, InviteUserDialog, LocalLLMTab, NotificationDropdown, SendNotificationDialog, AlertsTab, AnalyticsLayout, LoginButton, SignupButton, Markdown, RichTextEditor, SearchableMultiSelect, TenantSwitcher, TopBanner, Loader, Spinner, TimeTrackingProvider, UserProfileDropdown, AdvancedPagination, ContentViewWrapper, Version, SsoLogin, ErrorPage, ClientErrorPage`;
1320
+ }
1321
+ return info;
1322
+ }
1323
+ //# sourceMappingURL=component-info.js.map