@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.
- package/README.md +199 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +130 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/data-layer.d.ts +8 -0
- package/dist/resources/data-layer.d.ts.map +1 -0
- package/dist/resources/data-layer.js +181 -0
- package/dist/resources/data-layer.js.map +1 -0
- package/dist/resources/guides-layout.d.ts +8 -0
- package/dist/resources/guides-layout.d.ts.map +1 -0
- package/dist/resources/guides-layout.js +235 -0
- package/dist/resources/guides-layout.js.map +1 -0
- package/dist/resources/guides-rbac.d.ts +8 -0
- package/dist/resources/guides-rbac.d.ts.map +1 -0
- package/dist/resources/guides-rbac.js +231 -0
- package/dist/resources/guides-rbac.js.map +1 -0
- package/dist/resources/guides-theme.d.ts +8 -0
- package/dist/resources/guides-theme.d.ts.map +1 -0
- package/dist/resources/guides-theme.js +183 -0
- package/dist/resources/guides-theme.js.map +1 -0
- package/dist/resources/index.d.ts +17 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +18 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/packages-overview.d.ts +8 -0
- package/dist/resources/packages-overview.d.ts.map +1 -0
- package/dist/resources/packages-overview.js +53 -0
- package/dist/resources/packages-overview.js.map +1 -0
- package/dist/resources/web-containers.d.ts +8 -0
- package/dist/resources/web-containers.d.ts.map +1 -0
- package/dist/resources/web-containers.js +122 -0
- package/dist/resources/web-containers.js.map +1 -0
- package/dist/resources/web-utils.d.ts +8 -0
- package/dist/resources/web-utils.d.ts.map +1 -0
- package/dist/resources/web-utils.js +210 -0
- package/dist/resources/web-utils.js.map +1 -0
- package/dist/tools/api-query-info.d.ts +16 -0
- package/dist/tools/api-query-info.d.ts.map +1 -0
- package/dist/tools/api-query-info.js +2398 -0
- package/dist/tools/api-query-info.js.map +1 -0
- package/dist/tools/component-info.d.ts +16 -0
- package/dist/tools/component-info.d.ts.map +1 -0
- package/dist/tools/component-info.js +1323 -0
- package/dist/tools/component-info.js.map +1 -0
- package/dist/tools/hook-info.d.ts +16 -0
- package/dist/tools/hook-info.d.ts.map +1 -0
- package/dist/tools/hook-info.js +1988 -0
- package/dist/tools/hook-info.js.map +1 -0
- package/dist/tools/index.d.ts +68 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +14 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/page-template.d.ts +28 -0
- package/dist/tools/page-template.d.ts.map +1 -0
- package/dist/tools/page-template.js +198 -0
- package/dist/tools/page-template.js.map +1 -0
- package/dist/tools/provider-setup.d.ts +24 -0
- package/dist/tools/provider-setup.d.ts.map +1 -0
- package/dist/tools/provider-setup.js +213 -0
- package/dist/tools/provider-setup.js.map +1 -0
- 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
|