ui-lab-registry 0.3.1 → 0.3.2
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/dist/component-dependencies.d.ts +0 -11
- package/dist/component-dependencies.d.ts.map +1 -1
- package/dist/component-dependencies.js +4 -4
- package/dist/component-dependencies.js.map +1 -1
- package/dist/components/Color/examples/03-format-switching.d.ts +0 -4
- package/dist/components/Color/examples/03-format-switching.d.ts.map +1 -1
- package/dist/components/Color/examples/03-format-switching.js +2 -2
- package/dist/components/Color/examples/03-format-switching.js.map +1 -1
- package/dist/components/Color/examples.json +0 -5
- package/dist/components/Command/examples/01-basic-command.js +1 -1
- package/dist/components/Command/examples/01-basic-command.js.map +1 -1
- package/dist/components/Command/examples.json +1 -1
- package/dist/components/Command/index.js +3 -3
- package/dist/components/Command/index.js.map +1 -1
- package/dist/components/Divider/examples/02-pattern-variants.js +1 -1
- package/dist/components/Divider/examples.json +1 -1
- package/dist/components/Grid/examples/01-basic-grid.js +1 -1
- package/dist/components/Grid/examples/01-basic-grid.js.map +1 -1
- package/dist/components/Grid/examples.json +1 -1
- package/dist/components/Grid/index.js +2 -2
- package/dist/components/Grid/index.js.map +1 -1
- package/dist/components/Input/examples/02-validation.js +1 -1
- package/dist/components/Input/examples/02-validation.js.map +1 -1
- package/dist/components/Input/examples.json +1 -1
- package/dist/components/Path/examples.json +0 -5
- package/dist/components/Radio/index.js +1 -1
- package/dist/components/Select/examples/02-searchable-select.js +1 -1
- package/dist/components/Select/examples/02-searchable-select.js.map +1 -1
- package/dist/components/Select/examples.json +1 -1
- package/dist/components/Tabs/examples/01-basic-tabs.js +2 -2
- package/dist/components/Tabs/examples/01-basic-tabs.js.map +1 -1
- package/dist/components/Tabs/examples/02-vertical-tabs.js +2 -2
- package/dist/components/Tabs/examples/02-vertical-tabs.js.map +1 -1
- package/dist/components/Tabs/examples.json +2 -2
- package/dist/components/Tabs/index.js +11 -11
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/elements/AI/AIChatInput/index.js +1 -1
- package/dist/elements/AI/AIChatInput/variations/02-with-suggestions/index.js +1 -1
- package/dist/elements/AI/AIChatInput/variations/02-with-suggestions/layout/PromptInputWithSuggestions.js +1 -1
- package/dist/elements/AI/AIChatInput/variations.json +2 -2
- package/dist/elements/AI/ChainOfThought/index.js +1 -1
- package/dist/elements/AI/Chat/index.js +1 -1
- package/dist/elements/AI/Chat/variations/02-with-actions/index.js +1 -1
- package/dist/elements/AI/Chat/variations.json +1 -1
- package/dist/elements/Documentation/CopyPage/index.js +1 -1
- package/dist/elements/Documentation/NextArticle/index.js +1 -1
- package/dist/elements/Documentation/NextArticle/variations/01-basic/layout/NextArticleCard.js +1 -1
- package/dist/elements/Documentation/NextArticle/variations/02-with-icon/layout/NextArticleWithIconCard.js +1 -1
- package/dist/elements/Documentation/NextArticle/variations.json +2 -2
- package/dist/elements/Documentation/TOC/index.js +1 -1
- package/dist/generated-data.d.ts.map +1 -1
- package/dist/generated-data.js +213 -947
- package/dist/generated-data.js.map +1 -1
- package/dist/generated-styles.d.ts.map +1 -1
- package/dist/generated-styles.js +171 -63
- package/dist/generated-styles.js.map +1 -1
- package/dist/generated-styles.json +171 -63
- package/dist/patterns/data/data-table-row/metadata.json +3 -3
- package/dist/patterns/data/data-table-row/variations/expandable/index.js +1 -1
- package/dist/patterns/data/data-table-row/variations/main/index.js +1 -1
- package/dist/patterns/data/data-table-row/variations/selectable/index.js +1 -1
- package/dist/patterns/data/progress-metric/metadata.json +3 -3
- package/dist/patterns/data/progress-metric/variations/colored/index.js +1 -1
- package/dist/patterns/data/progress-metric/variations/main/index.js +1 -1
- package/dist/patterns/data/progress-metric/variations/stacked/index.js +1 -1
- package/dist/patterns/form/labeled-field/metadata.json +4 -4
- package/dist/patterns/form/labeled-field/variations/main/index.js +1 -1
- package/dist/patterns/form/labeled-field/variations/with-error/index.js +1 -1
- package/dist/patterns/form/labeled-field/variations/with-hint/index.js +1 -1
- package/dist/patterns/form/select-row/metadata.json +2 -2
- package/dist/patterns/form/select-row/variations/main/index.js +1 -1
- package/dist/patterns/form/select-row/variations/with-icon/index.js +1 -1
- package/dist/patterns/form/toggle-setting-row/metadata.json +2 -2
- package/dist/patterns/form/toggle-setting-row/variations/destructive/index.js +1 -1
- package/dist/patterns/form/toggle-setting-row/variations/main/index.js +1 -1
- package/dist/patterns/interaction/icon-action-bar/variations/compact/index.js +1 -1
- package/dist/patterns/layout/media-object/metadata.json +1 -1
- package/dist/patterns/layout/media-object/variations/sm/index.js +1 -1
- package/dist/patterns/layout/split-row/metadata.json +3 -3
- package/dist/patterns/layout/split-row/variations/actions/index.js +1 -1
- package/dist/patterns/layout/split-row/variations/main/index.js +1 -1
- package/dist/patterns/layout/split-row/variations/meta/index.js +1 -1
- package/dist/patterns/layout/stat-block/metadata.json +3 -3
- package/dist/patterns/layout/stat-block/variations/compact/index.js +1 -1
- package/dist/patterns/layout/stat-block/variations/main/index.js +1 -1
- package/dist/patterns/layout/stat-block/variations/with-icon/index.js +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +17 -27
- package/dist/registry.js.map +1 -1
- package/dist/sections/CTA/variations/02-split/index.js +1 -1
- package/dist/sections/CTA/variations.json +1 -1
- package/dist/sections/Pricing/variations/01-cards/index.js +1 -1
- package/dist/sections/Pricing/variations/02-comparison/index.js +1 -1
- package/dist/sections/Pricing/variations.json +2 -2
- package/dist/sections/categories.d.ts +0 -11
- package/dist/sections/categories.d.ts.map +1 -1
- package/dist/sections/categories.js +2 -2
- package/dist/sections/categories.js.map +1 -1
- package/dist/starters/NextJS/index.js +1 -1
- package/dist/types.d.ts +0 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/load-component-examples.d.ts +3 -2
- package/dist/utils/load-component-examples.d.ts.map +1 -1
- package/package.json +2 -6
- package/src/component-dependencies.ts +4 -4
- package/src/components/Anchor/metadata.json +1 -1
- package/src/components/Banner/metadata.json +1 -1
- package/src/components/Code/metadata.json +1 -1
- package/src/components/Color/examples/03-format-switching.tsx +3 -3
- package/src/components/Color/examples.json +0 -5
- package/src/components/Command/examples/01-basic-command.tsx +1 -1
- package/src/components/Command/examples.json +1 -1
- package/src/components/Command/index.tsx +3 -3
- package/src/components/Date/metadata.json +1 -1
- package/src/components/Divider/examples/02-pattern-variants.tsx +3 -3
- package/src/components/Divider/examples.json +1 -1
- package/src/components/Flex/metadata.json +1 -1
- package/src/components/Gallery/metadata.json +1 -1
- package/src/components/Grid/examples/01-basic-grid.tsx +1 -1
- package/src/components/Grid/examples.json +1 -1
- package/src/components/Grid/index.tsx +2 -2
- package/src/components/Group/metadata.json +1 -1
- package/src/components/Input/examples/02-validation.tsx +2 -2
- package/src/components/Input/examples.json +1 -1
- package/src/components/List/metadata.json +1 -1
- package/src/components/Page/metadata.json +1 -1
- package/src/components/Panel/metadata.json +1 -1
- package/src/components/Path/examples.json +0 -5
- package/src/components/Radio/index.tsx +1 -1
- package/src/components/Select/examples/02-searchable-select.tsx +1 -1
- package/src/components/Select/examples.json +1 -1
- package/src/components/Tabs/examples/01-basic-tabs.tsx +12 -12
- package/src/components/Tabs/examples/02-vertical-tabs.tsx +19 -19
- package/src/components/Tabs/examples.json +2 -2
- package/src/components/Tabs/index.tsx +45 -45
- package/src/elements/AI/AIChatInput/index.tsx +2 -2
- package/src/elements/AI/AIChatInput/variations/02-with-suggestions/index.tsx +1 -1
- package/src/elements/AI/AIChatInput/variations/02-with-suggestions/layout/PromptInputWithSuggestions.tsx +1 -1
- package/src/elements/AI/AIChatInput/variations.json +2 -2
- package/src/elements/AI/ChainOfThought/index.tsx +1 -1
- package/src/elements/AI/Chat/index.tsx +4 -4
- package/src/elements/AI/Chat/variations/02-with-actions/index.tsx +3 -3
- package/src/elements/AI/Chat/variations.json +1 -1
- package/src/elements/Documentation/CopyPage/index.tsx +1 -1
- package/src/elements/Documentation/NextArticle/index.tsx +1 -1
- package/src/elements/Documentation/NextArticle/variations/01-basic/layout/NextArticleCard.tsx +1 -1
- package/src/elements/Documentation/NextArticle/variations/02-with-icon/layout/NextArticleWithIconCard.tsx +1 -1
- package/src/elements/Documentation/NextArticle/variations.json +2 -2
- package/src/elements/Documentation/TOC/index.tsx +4 -4
- package/src/generated-data.ts +213 -947
- package/src/generated-styles.ts +171 -63
- package/src/patterns/data/data-table-row/metadata.json +4 -4
- package/src/patterns/data/data-table-row/variations/expandable/index.tsx +3 -3
- package/src/patterns/data/data-table-row/variations/main/index.tsx +2 -2
- package/src/patterns/data/data-table-row/variations/selectable/index.tsx +2 -2
- package/src/patterns/data/progress-metric/metadata.json +4 -4
- package/src/patterns/data/progress-metric/variations/colored/index.tsx +2 -2
- package/src/patterns/data/progress-metric/variations/main/index.tsx +2 -2
- package/src/patterns/data/progress-metric/variations/stacked/index.tsx +2 -2
- package/src/patterns/form/labeled-field/metadata.json +5 -5
- package/src/patterns/form/labeled-field/variations/main/index.tsx +1 -1
- package/src/patterns/form/labeled-field/variations/with-error/index.tsx +1 -1
- package/src/patterns/form/labeled-field/variations/with-hint/index.tsx +1 -1
- package/src/patterns/form/select-row/metadata.json +3 -3
- package/src/patterns/form/select-row/variations/main/index.tsx +1 -1
- package/src/patterns/form/select-row/variations/with-icon/index.tsx +1 -1
- package/src/patterns/form/toggle-setting-row/metadata.json +3 -3
- package/src/patterns/form/toggle-setting-row/variations/destructive/index.tsx +1 -1
- package/src/patterns/form/toggle-setting-row/variations/main/index.tsx +1 -1
- package/src/patterns/interaction/icon-action-bar/variations/compact/index.tsx +1 -1
- package/src/patterns/layout/media-object/metadata.json +2 -2
- package/src/patterns/layout/media-object/variations/sm/index.tsx +2 -2
- package/src/patterns/layout/split-row/metadata.json +4 -4
- package/src/patterns/layout/split-row/variations/actions/index.tsx +1 -1
- package/src/patterns/layout/split-row/variations/main/index.tsx +2 -2
- package/src/patterns/layout/split-row/variations/meta/index.tsx +3 -3
- package/src/patterns/layout/stat-block/metadata.json +4 -4
- package/src/patterns/layout/stat-block/variations/compact/index.tsx +1 -1
- package/src/patterns/layout/stat-block/variations/main/index.tsx +1 -1
- package/src/patterns/layout/stat-block/variations/with-icon/index.tsx +1 -1
- package/src/registry.ts +17 -27
- package/src/sections/CTA/variations/02-split/index.tsx +1 -1
- package/src/sections/CTA/variations.json +1 -1
- package/src/sections/Pricing/variations/01-cards/index.tsx +1 -1
- package/src/sections/Pricing/variations/02-comparison/index.tsx +1 -1
- package/src/sections/Pricing/variations.json +2 -2
- package/src/sections/categories.ts +2 -2
- package/src/starters/NextJS/index.tsx +2 -2
- package/src/types.ts +1 -1
- package/src/utils/load-component-examples.ts +2 -2
- package/src/components/Path/examples/01-basic-breadcrumbs.tsx +0 -17
- package/src/providers/Theme/examples/01-provider-setup.tsx +0 -37
- package/src/providers/Theme/examples/02-toggle-component.tsx +0 -52
- package/src/providers/Theme/examples/03-advanced-patterns.tsx +0 -138
- package/src/providers/Theme/examples/index.ts +0 -3
- package/src/src/generated-styles.ts +0 -1359
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { Tabs,
|
|
2
|
+
import { Tabs, Card } from 'ui-lab-components';
|
|
3
3
|
import { User, Settings, Bell, Shield } from 'lucide-react';
|
|
4
4
|
|
|
5
5
|
export const metadata = {
|
|
@@ -13,27 +13,27 @@ export default function Example() {
|
|
|
13
13
|
<Card className="w-full max-w-2xl">
|
|
14
14
|
<Tabs defaultValue="profile" className="flex flex-row">
|
|
15
15
|
{/* Vertical tab list - styled as sidebar */}
|
|
16
|
-
<
|
|
16
|
+
<Tabs.List
|
|
17
17
|
aria-label="Settings sections"
|
|
18
18
|
className="flex-col items-stretch justify-start h-auto w-48 border-r border-background-700 rounded-none bg-transparent p-2"
|
|
19
19
|
>
|
|
20
|
-
<
|
|
20
|
+
<Tabs.Trigger value="profile" icon={<User className="w-4 h-4" />} className="justify-start">
|
|
21
21
|
Profile
|
|
22
|
-
</
|
|
23
|
-
<
|
|
22
|
+
</Tabs.Trigger>
|
|
23
|
+
<Tabs.Trigger value="notifications" icon={<Bell className="w-4 h-4" />} className="justify-start">
|
|
24
24
|
Notifications
|
|
25
|
-
</
|
|
26
|
-
<
|
|
25
|
+
</Tabs.Trigger>
|
|
26
|
+
<Tabs.Trigger value="security" icon={<Shield className="w-4 h-4" />} className="justify-start">
|
|
27
27
|
Security
|
|
28
|
-
</
|
|
29
|
-
<
|
|
28
|
+
</Tabs.Trigger>
|
|
29
|
+
<Tabs.Trigger value="preferences" icon={<Settings className="w-4 h-4" />} className="justify-start">
|
|
30
30
|
Preferences
|
|
31
|
-
</
|
|
32
|
-
</
|
|
31
|
+
</Tabs.Trigger>
|
|
32
|
+
</Tabs.List>
|
|
33
33
|
|
|
34
34
|
{/* Content panels */}
|
|
35
35
|
<div className="flex-1 p-6">
|
|
36
|
-
<
|
|
36
|
+
<Tabs.Content value="profile" className="mt-0">
|
|
37
37
|
<h3 className="text-lg font-semibold text-foreground-100 mb-2">Profile Settings</h3>
|
|
38
38
|
<p className="text-foreground-400 text-sm mb-4">
|
|
39
39
|
Manage your personal information and how others see you on the platform.
|
|
@@ -43,9 +43,9 @@ export default function Example() {
|
|
|
43
43
|
<div className="h-10 w-full bg-background-800 rounded border border-background-700" />
|
|
44
44
|
<div className="h-10 w-2/3 bg-background-800 rounded border border-background-700" />
|
|
45
45
|
</div>
|
|
46
|
-
</
|
|
46
|
+
</Tabs.Content>
|
|
47
47
|
|
|
48
|
-
<
|
|
48
|
+
<Tabs.Content value="notifications" className="mt-0">
|
|
49
49
|
<h3 className="text-lg font-semibold text-foreground-100 mb-2">Notification Preferences</h3>
|
|
50
50
|
<p className="text-foreground-400 text-sm mb-4">
|
|
51
51
|
Control how and when you receive alerts and updates.
|
|
@@ -64,9 +64,9 @@ export default function Example() {
|
|
|
64
64
|
<div className="h-4 w-28 bg-background-800 rounded" />
|
|
65
65
|
</div>
|
|
66
66
|
</div>
|
|
67
|
-
</
|
|
67
|
+
</Tabs.Content>
|
|
68
68
|
|
|
69
|
-
<
|
|
69
|
+
<Tabs.Content value="security" className="mt-0">
|
|
70
70
|
<h3 className="text-lg font-semibold text-foreground-100 mb-2">Security Settings</h3>
|
|
71
71
|
<p className="text-foreground-400 text-sm mb-4">
|
|
72
72
|
Protect your account with passwords, two-factor authentication, and more.
|
|
@@ -81,9 +81,9 @@ export default function Example() {
|
|
|
81
81
|
<div className="h-3 w-40 bg-background-700/50 rounded" />
|
|
82
82
|
</div>
|
|
83
83
|
</div>
|
|
84
|
-
</
|
|
84
|
+
</Tabs.Content>
|
|
85
85
|
|
|
86
|
-
<
|
|
86
|
+
<Tabs.Content value="preferences" className="mt-0">
|
|
87
87
|
<h3 className="text-lg font-semibold text-foreground-100 mb-2">General Preferences</h3>
|
|
88
88
|
<p className="text-foreground-400 text-sm mb-4">
|
|
89
89
|
Customize your experience with theme, language, and display options.
|
|
@@ -94,7 +94,7 @@ export default function Example() {
|
|
|
94
94
|
<div className="h-20 bg-background-800 rounded border border-background-700" />
|
|
95
95
|
<div className="h-20 bg-background-800 rounded border border-background-700" />
|
|
96
96
|
</div>
|
|
97
|
-
</
|
|
97
|
+
</Tabs.Content>
|
|
98
98
|
</div>
|
|
99
99
|
</Tabs>
|
|
100
100
|
</Card>
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"01-basic-tabs": {
|
|
3
3
|
"title": "Basic Tabs",
|
|
4
4
|
"description": "A simple tabbed interface with content switching. Use this to organize related content into separate views.",
|
|
5
|
-
"code": "import React from 'react';\nimport { Tabs
|
|
5
|
+
"code": "import React from 'react';\nimport { Tabs } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Tabs defaultValue=\"overview\">\n <Tabs.List aria-label=\"Content sections\">\n <Tabs.Trigger value=\"overview\">Overview</Tabs.Trigger>\n <Tabs.Trigger value=\"details\">Details</Tabs.Trigger>\n <Tabs.Trigger value=\"settings\">Settings</Tabs.Trigger>\n </Tabs.List>\n <Tabs.Content value=\"overview\">\n <p>Overview content goes here.</p>\n </Tabs.Content>\n <Tabs.Content value=\"details\">\n <p>Details content goes here.</p>\n </Tabs.Content>\n <Tabs.Content value=\"settings\">\n <p>Settings content goes here.</p>\n </Tabs.Content>\n </Tabs>\n );\n}"
|
|
6
6
|
},
|
|
7
7
|
"02-vertical-tabs": {
|
|
8
8
|
"title": "Vertical Tabs (Sidebar)",
|
|
9
9
|
"description": "A vertical tab layout ideal for settings pages or sidebar navigation. Tabs are stacked vertically with content panels beside them.",
|
|
10
|
-
"code": "import React from 'react';\nimport { Tabs,
|
|
10
|
+
"code": "import React from 'react';\nimport { Tabs, Card } from 'ui-lab-components';\nimport { User, Settings, Bell, Shield } from 'lucide-react';\n\nexport default function Example() {\n return (\n <div className=\"flex items-center justify-center bg-background-950 p-4 min-h-[400px]\">\n <Card className=\"w-full max-w-2xl\">\n <Tabs defaultValue=\"profile\" className=\"flex flex-row\">\n {/* Vertical tab list - styled as sidebar */}\n <Tabs.List\n aria-label=\"Settings sections\"\n className=\"flex-col items-stretch justify-start h-auto w-48 border-r border-background-700 rounded-none bg-transparent p-2\"\n >\n <Tabs.Trigger value=\"profile\" icon={<User className=\"w-4 h-4\" />} className=\"justify-start\">\n Profile\n </Tabs.Trigger>\n <Tabs.Trigger value=\"notifications\" icon={<Bell className=\"w-4 h-4\" />} className=\"justify-start\">\n Notifications\n </Tabs.Trigger>\n <Tabs.Trigger value=\"security\" icon={<Shield className=\"w-4 h-4\" />} className=\"justify-start\">\n Security\n </Tabs.Trigger>\n <Tabs.Trigger value=\"preferences\" icon={<Settings className=\"w-4 h-4\" />} className=\"justify-start\">\n Preferences\n </Tabs.Trigger>\n </Tabs.List>\n\n {/* Content panels */}\n <div className=\"flex-1 p-6\">\n <Tabs.Content value=\"profile\" className=\"mt-0\">\n <h3 className=\"text-lg font-semibold text-foreground-100 mb-2\">Profile Settings</h3>\n <p className=\"text-foreground-400 text-sm mb-4\">\n Manage your personal information and how others see you on the platform.\n </p>\n <div className=\"space-y-3\">\n <div className=\"h-10 w-full bg-background-800 rounded border border-background-700\" />\n <div className=\"h-10 w-full bg-background-800 rounded border border-background-700\" />\n <div className=\"h-10 w-2/3 bg-background-800 rounded border border-background-700\" />\n </div>\n </Tabs.Content>\n\n <Tabs.Content value=\"notifications\" className=\"mt-0\">\n <h3 className=\"text-lg font-semibold text-foreground-100 mb-2\">Notification Preferences</h3>\n <p className=\"text-foreground-400 text-sm mb-4\">\n Control how and when you receive alerts and updates.\n </p>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"h-5 w-5 bg-accent-500 rounded\" />\n <div className=\"h-4 w-32 bg-background-800 rounded\" />\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"h-5 w-5 bg-background-700 rounded\" />\n <div className=\"h-4 w-40 bg-background-800 rounded\" />\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"h-5 w-5 bg-accent-500 rounded\" />\n <div className=\"h-4 w-28 bg-background-800 rounded\" />\n </div>\n </div>\n </Tabs.Content>\n\n <Tabs.Content value=\"security\" className=\"mt-0\">\n <h3 className=\"text-lg font-semibold text-foreground-100 mb-2\">Security Settings</h3>\n <p className=\"text-foreground-400 text-sm mb-4\">\n Protect your account with passwords, two-factor authentication, and more.\n </p>\n <div className=\"space-y-3\">\n <div className=\"p-3 bg-background-800 rounded border border-background-700\">\n <div className=\"h-4 w-24 bg-background-700 rounded mb-2\" />\n <div className=\"h-3 w-48 bg-background-700/50 rounded\" />\n </div>\n <div className=\"p-3 bg-background-800 rounded border border-background-700\">\n <div className=\"h-4 w-32 bg-background-700 rounded mb-2\" />\n <div className=\"h-3 w-40 bg-background-700/50 rounded\" />\n </div>\n </div>\n </Tabs.Content>\n\n <Tabs.Content value=\"preferences\" className=\"mt-0\">\n <h3 className=\"text-lg font-semibold text-foreground-100 mb-2\">General Preferences</h3>\n <p className=\"text-foreground-400 text-sm mb-4\">\n Customize your experience with theme, language, and display options.\n </p>\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"h-20 bg-background-800 rounded border border-background-700\" />\n <div className=\"h-20 bg-background-800 rounded border border-background-700\" />\n <div className=\"h-20 bg-background-800 rounded border border-background-700\" />\n <div className=\"h-20 bg-background-800 rounded border border-background-700\" />\n </div>\n </Tabs.Content>\n </div>\n </Tabs>\n </Card>\n </div>\n );\n}"
|
|
11
11
|
}
|
|
12
12
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { Tabs
|
|
2
|
+
import { Tabs } from 'ui-lab-components';
|
|
3
3
|
import { ControlDef, ComponentDetail } from '@/types';
|
|
4
4
|
import Example1, { metadata as metadata1 } from './examples/01-basic-tabs.js';
|
|
5
5
|
import Example2, { metadata as metadata2 } from './examples/02-vertical-tabs.js';
|
|
@@ -37,12 +37,12 @@ const tabsBasicCode = `import { Tabs } from "ui-lab-components";
|
|
|
37
37
|
export function Example() {
|
|
38
38
|
return (
|
|
39
39
|
<Tabs defaultValue="tab1">
|
|
40
|
-
<
|
|
41
|
-
<
|
|
42
|
-
<
|
|
43
|
-
</
|
|
44
|
-
<
|
|
45
|
-
<
|
|
40
|
+
<Tabs.List>
|
|
41
|
+
<Tabs.Trigger value="tab1">Tab 1</Tabs.Trigger>
|
|
42
|
+
<Tabs.Trigger value="tab2">Tab 2</Tabs.Trigger>
|
|
43
|
+
</Tabs.List>
|
|
44
|
+
<Tabs.Content value="tab1">Content 1</Tabs.Content>
|
|
45
|
+
<Tabs.Content value="tab2">Content 2</Tabs.Content>
|
|
46
46
|
</Tabs>
|
|
47
47
|
);
|
|
48
48
|
}`;
|
|
@@ -70,39 +70,39 @@ export const tabsDetail: ComponentDetail = {
|
|
|
70
70
|
code: tabsBasicCode,
|
|
71
71
|
preview: (
|
|
72
72
|
<Tabs defaultValue="tab1">
|
|
73
|
-
<
|
|
74
|
-
<
|
|
75
|
-
<
|
|
76
|
-
<
|
|
77
|
-
</
|
|
78
|
-
<
|
|
73
|
+
<Tabs.List>
|
|
74
|
+
<Tabs.Trigger value="tab1">Tab 1</Tabs.Trigger>
|
|
75
|
+
<Tabs.Trigger value="tab2">Tab 2</Tabs.Trigger>
|
|
76
|
+
<Tabs.Trigger value="tab3">Tab 3</Tabs.Trigger>
|
|
77
|
+
</Tabs.List>
|
|
78
|
+
<Tabs.Content value="tab1">
|
|
79
79
|
<p className="text-foreground-300">Content for Tab 1</p>
|
|
80
|
-
</
|
|
81
|
-
<
|
|
80
|
+
</Tabs.Content>
|
|
81
|
+
<Tabs.Content value="tab2">
|
|
82
82
|
<p className="text-foreground-300">Content for Tab 2</p>
|
|
83
|
-
</
|
|
84
|
-
<
|
|
83
|
+
</Tabs.Content>
|
|
84
|
+
<Tabs.Content value="tab3">
|
|
85
85
|
<p className="text-foreground-300">Content for Tab 3</p>
|
|
86
|
-
</
|
|
86
|
+
</Tabs.Content>
|
|
87
87
|
</Tabs>
|
|
88
88
|
),
|
|
89
89
|
controls: tabsControls,
|
|
90
90
|
renderPreview: (props: any) => (
|
|
91
91
|
<Tabs defaultValue="tab1" variant={props.variant}>
|
|
92
|
-
<
|
|
93
|
-
<
|
|
94
|
-
<
|
|
95
|
-
<
|
|
96
|
-
</
|
|
97
|
-
<
|
|
92
|
+
<Tabs.List>
|
|
93
|
+
<Tabs.Trigger value="tab1">Tab 1</Tabs.Trigger>
|
|
94
|
+
<Tabs.Trigger value="tab2" disabled={props.disabled}>Tab 2</Tabs.Trigger>
|
|
95
|
+
<Tabs.Trigger value="tab3">Tab 3</Tabs.Trigger>
|
|
96
|
+
</Tabs.List>
|
|
97
|
+
<Tabs.Content value="tab1">
|
|
98
98
|
<p className="text-foreground-300">Content for Tab 1</p>
|
|
99
|
-
</
|
|
100
|
-
<
|
|
99
|
+
</Tabs.Content>
|
|
100
|
+
<Tabs.Content value="tab2">
|
|
101
101
|
<p className="text-foreground-300">Content for Tab 2</p>
|
|
102
|
-
</
|
|
103
|
-
<
|
|
102
|
+
</Tabs.Content>
|
|
103
|
+
<Tabs.Content value="tab3">
|
|
104
104
|
<p className="text-foreground-300">Content for Tab 3</p>
|
|
105
|
-
</
|
|
105
|
+
</Tabs.Content>
|
|
106
106
|
</Tabs>
|
|
107
107
|
),
|
|
108
108
|
},
|
|
@@ -117,16 +117,16 @@ export const tabsDetail: ComponentDetail = {
|
|
|
117
117
|
code: tabsBasicCode,
|
|
118
118
|
preview: (
|
|
119
119
|
<Tabs defaultValue="tab1">
|
|
120
|
-
<
|
|
121
|
-
<
|
|
122
|
-
<
|
|
123
|
-
</
|
|
124
|
-
<
|
|
120
|
+
<Tabs.List>
|
|
121
|
+
<Tabs.Trigger value="tab1">Tab 1</Tabs.Trigger>
|
|
122
|
+
<Tabs.Trigger value="tab2">Tab 2</Tabs.Trigger>
|
|
123
|
+
</Tabs.List>
|
|
124
|
+
<Tabs.Content value="tab1">
|
|
125
125
|
<p className="text-foreground-300">Content 1</p>
|
|
126
|
-
</
|
|
127
|
-
<
|
|
126
|
+
</Tabs.Content>
|
|
127
|
+
<Tabs.Content value="tab2">
|
|
128
128
|
<p className="text-foreground-300">Content 2</p>
|
|
129
|
-
</
|
|
129
|
+
</Tabs.Content>
|
|
130
130
|
</Tabs>
|
|
131
131
|
),
|
|
132
132
|
},
|
|
@@ -137,16 +137,16 @@ export const tabsDetail: ComponentDetail = {
|
|
|
137
137
|
code: `<Tabs variant="underline">...</Tabs>`,
|
|
138
138
|
preview: (
|
|
139
139
|
<Tabs defaultValue="tab1" variant="underline">
|
|
140
|
-
<
|
|
141
|
-
<
|
|
142
|
-
<
|
|
143
|
-
</
|
|
144
|
-
<
|
|
140
|
+
<Tabs.List>
|
|
141
|
+
<Tabs.Trigger value="tab1">Tab 1</Tabs.Trigger>
|
|
142
|
+
<Tabs.Trigger value="tab2">Tab 2</Tabs.Trigger>
|
|
143
|
+
</Tabs.List>
|
|
144
|
+
<Tabs.Content value="tab1" className="mt-6">
|
|
145
145
|
<p className="text-foreground-300">Content 1</p>
|
|
146
|
-
</
|
|
147
|
-
<
|
|
146
|
+
</Tabs.Content>
|
|
147
|
+
<Tabs.Content value="tab2" className="mt-6">
|
|
148
148
|
<p className="text-foreground-300">Content 2</p>
|
|
149
|
-
</
|
|
149
|
+
</Tabs.Content>
|
|
150
150
|
</Tabs>
|
|
151
151
|
),
|
|
152
152
|
},
|
|
@@ -32,10 +32,10 @@ export function getPreview(): React.ReactNode {
|
|
|
32
32
|
<input
|
|
33
33
|
type="text"
|
|
34
34
|
placeholder="Ask AI..."
|
|
35
|
-
className="flex-1 bg-background-800 border border-background-700 rounded px-2 py-1 text-
|
|
35
|
+
className="flex-1 bg-background-800 border border-background-700 rounded px-2 py-1 text-sm text-foreground-400 placeholder-foreground-400"
|
|
36
36
|
readOnly
|
|
37
37
|
/>
|
|
38
|
-
<button className="px-2 py-1 bg-accent-500 text-foreground-50 rounded text-
|
|
38
|
+
<button className="px-2 py-1 bg-accent-500 text-foreground-50 rounded text-sm font-medium hover:bg-accent-600">
|
|
39
39
|
→
|
|
40
40
|
</button>
|
|
41
41
|
</div>
|
|
@@ -56,7 +56,7 @@ export function AIChatInputWithSuggestions() {
|
|
|
56
56
|
|
|
57
57
|
{selectedSuggestion && (
|
|
58
58
|
<div className="p-4 bg-background-800 border border-accent-500/30 rounded-md">
|
|
59
|
-
<p className="text-
|
|
59
|
+
<p className="text-sm text-foreground-400 mb-1">Using suggestion:</p>
|
|
60
60
|
<p className="text-foreground-50">{selectedSuggestion}</p>
|
|
61
61
|
</div>
|
|
62
62
|
)}
|
|
@@ -54,7 +54,7 @@ export function PromptInputWithSuggestions({
|
|
|
54
54
|
>
|
|
55
55
|
Send
|
|
56
56
|
</button>
|
|
57
|
-
<button className="px-2 py-1 text-foreground-400 hover:text-foreground-200 text-
|
|
57
|
+
<button className="px-2 py-1 text-foreground-400 hover:text-foreground-200 text-sm rounded border border-background-700 hover:border-background-600 transition-colors">
|
|
58
58
|
⌘K
|
|
59
59
|
</button>
|
|
60
60
|
</div>
|
|
@@ -28,13 +28,13 @@
|
|
|
28
28
|
{
|
|
29
29
|
"filename": "index.tsx",
|
|
30
30
|
"language": "typescript",
|
|
31
|
-
"code": "\"use client\"\nimport React, { useState } from 'react';\nimport { PromptInputWithSuggestions } from './layout/PromptInputWithSuggestions.js';\n\nexport function AIChatInputWithSuggestions() {\n const [prompt, setPrompt] = useState('');\n const [selectedSuggestion, setSelectedSuggestion] = useState<string | null>(null);\n\n const suggestions = [\n 'Explain this concept in simple terms',\n 'Write a code example',\n 'What are the best practices?',\n 'How do I debug this?',\n ];\n\n const handleSubmit = (value: string) => {\n console.log('Prompt submitted:', value);\n setPrompt('');\n setSelectedSuggestion(null);\n };\n\n const handleSuggestionClick = (suggestion: string) => {\n setSelectedSuggestion(suggestion);\n setPrompt(suggestion);\n };\n\n return (\n <div className=\"min-h-screen bg-background-950 p-8\">\n <div className=\"max-w-2xl mx-auto\">\n <h1 className=\"text-3xl font-bold text-foreground-50 mb-8\">Chat with AI</h1>\n\n <div className=\"space-y-6\">\n {prompt.length === 0 && (\n <div>\n <p className=\"text-sm text-foreground-400 mb-3\">Quick suggestions:</p>\n <div className=\"grid grid-cols-2 gap-2\">\n {suggestions.map((suggestion) => (\n <button\n key={suggestion}\n onClick={() => handleSuggestionClick(suggestion)}\n className=\"text-left px-3 py-2 bg-background-800 border border-background-700 rounded hover:border-accent-500 hover:bg-background-700/80 transition-colors text-sm text-foreground-300 hover:text-foreground-200\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n </div>\n )}\n\n <PromptInputWithSuggestions\n value={prompt}\n onChange={setPrompt}\n onSubmit={handleSubmit}\n placeholder=\"Enter your prompt or use a suggestion...\"\n />\n\n {selectedSuggestion && (\n <div className=\"p-4 bg-background-800 border border-accent-500/30 rounded-md\">\n <p className=\"text-
|
|
31
|
+
"code": "\"use client\"\nimport React, { useState } from 'react';\nimport { PromptInputWithSuggestions } from './layout/PromptInputWithSuggestions.js';\n\nexport function AIChatInputWithSuggestions() {\n const [prompt, setPrompt] = useState('');\n const [selectedSuggestion, setSelectedSuggestion] = useState<string | null>(null);\n\n const suggestions = [\n 'Explain this concept in simple terms',\n 'Write a code example',\n 'What are the best practices?',\n 'How do I debug this?',\n ];\n\n const handleSubmit = (value: string) => {\n console.log('Prompt submitted:', value);\n setPrompt('');\n setSelectedSuggestion(null);\n };\n\n const handleSuggestionClick = (suggestion: string) => {\n setSelectedSuggestion(suggestion);\n setPrompt(suggestion);\n };\n\n return (\n <div className=\"min-h-screen bg-background-950 p-8\">\n <div className=\"max-w-2xl mx-auto\">\n <h1 className=\"text-3xl font-bold text-foreground-50 mb-8\">Chat with AI</h1>\n\n <div className=\"space-y-6\">\n {prompt.length === 0 && (\n <div>\n <p className=\"text-sm text-foreground-400 mb-3\">Quick suggestions:</p>\n <div className=\"grid grid-cols-2 gap-2\">\n {suggestions.map((suggestion) => (\n <button\n key={suggestion}\n onClick={() => handleSuggestionClick(suggestion)}\n className=\"text-left px-3 py-2 bg-background-800 border border-background-700 rounded hover:border-accent-500 hover:bg-background-700/80 transition-colors text-sm text-foreground-300 hover:text-foreground-200\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n </div>\n )}\n\n <PromptInputWithSuggestions\n value={prompt}\n onChange={setPrompt}\n onSubmit={handleSubmit}\n placeholder=\"Enter your prompt or use a suggestion...\"\n />\n\n {selectedSuggestion && (\n <div className=\"p-4 bg-background-800 border border-accent-500/30 rounded-md\">\n <p className=\"text-sm text-foreground-400 mb-1\">Using suggestion:</p>\n <p className=\"text-foreground-50\">{selectedSuggestion}</p>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n",
|
|
32
32
|
"isEntryPoint": true
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
"filename": "PromptInputWithSuggestions.tsx",
|
|
36
36
|
"language": "typescript",
|
|
37
|
-
"code": "import React, { useRef, useEffect } from 'react';\n\ninterface PromptInputWithSuggestionsProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit: (value: string) => void;\n placeholder?: string;\n}\n\nexport function PromptInputWithSuggestions({\n value,\n onChange,\n onSubmit,\n placeholder = 'Ask AI...',\n}: PromptInputWithSuggestionsProps) {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n textareaRef.current.style.height = `${Math.min(textareaRef.current.scrollHeight, 150)}px`;\n }\n }, [value]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (value.trim()) {\n onSubmit(value);\n }\n }\n };\n\n return (\n <div className=\"flex gap-3 p-4 bg-background-800 border border-background-700 rounded-md\">\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n className=\"flex-1 bg-transparent border-0 text-foreground-50 placeholder-foreground-400 focus:outline-none resize-none\"\n rows={1}\n />\n <div className=\"flex flex-col gap-2\">\n <button\n onClick={() => {\n if (value.trim()) {\n onSubmit(value);\n }\n }}\n disabled={!value.trim()}\n className=\"px-4 py-2 bg-accent-500 text-foreground-50 rounded font-medium hover:bg-accent-600 transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex-shrink-0 text-sm\"\n >\n Send\n </button>\n <button className=\"px-2 py-1 text-foreground-400 hover:text-foreground-200 text-
|
|
37
|
+
"code": "import React, { useRef, useEffect } from 'react';\n\ninterface PromptInputWithSuggestionsProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit: (value: string) => void;\n placeholder?: string;\n}\n\nexport function PromptInputWithSuggestions({\n value,\n onChange,\n onSubmit,\n placeholder = 'Ask AI...',\n}: PromptInputWithSuggestionsProps) {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n textareaRef.current.style.height = `${Math.min(textareaRef.current.scrollHeight, 150)}px`;\n }\n }, [value]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (value.trim()) {\n onSubmit(value);\n }\n }\n };\n\n return (\n <div className=\"flex gap-3 p-4 bg-background-800 border border-background-700 rounded-md\">\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n className=\"flex-1 bg-transparent border-0 text-foreground-50 placeholder-foreground-400 focus:outline-none resize-none\"\n rows={1}\n />\n <div className=\"flex flex-col gap-2\">\n <button\n onClick={() => {\n if (value.trim()) {\n onSubmit(value);\n }\n }}\n disabled={!value.trim()}\n className=\"px-4 py-2 bg-accent-500 text-foreground-50 rounded font-medium hover:bg-accent-600 transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex-shrink-0 text-sm\"\n >\n Send\n </button>\n <button className=\"px-2 py-1 text-foreground-400 hover:text-foreground-200 text-sm rounded border border-background-700 hover:border-background-600 transition-colors\">\n ⌘K\n </button>\n </div>\n </div>\n );\n}\n",
|
|
38
38
|
"isEntryPoint": false
|
|
39
39
|
}
|
|
40
40
|
]
|
|
@@ -29,7 +29,7 @@ const elementMetadata: ElementMetadata = {
|
|
|
29
29
|
export function getPreview(): React.ReactNode {
|
|
30
30
|
return (
|
|
31
31
|
<div className="flex flex-col gap-2 w-full h-full p-3 bg-background-900 rounded-sm border border-background-700">
|
|
32
|
-
<div className="space-y-2 text-
|
|
32
|
+
<div className="space-y-2 text-sm">
|
|
33
33
|
<div className="flex items-start gap-2">
|
|
34
34
|
<span className="text-accent-500 font-bold">1.</span>
|
|
35
35
|
<div className="text-foreground-400">Analyzing the problem</div>
|
|
@@ -31,23 +31,23 @@ export function getPreview(): React.ReactNode {
|
|
|
31
31
|
<div className="flex flex-col h-full w-full bg-background-900 rounded-sm border border-background-700 overflow-hidden">
|
|
32
32
|
<div className="flex-1 overflow-y-auto space-y-3 p-3">
|
|
33
33
|
<div className="flex justify-start">
|
|
34
|
-
<div className="bg-background-700 rounded px-3 py-2 max-w-xs text-
|
|
34
|
+
<div className="bg-background-700 rounded px-3 py-2 max-w-xs text-sm text-foreground-400">
|
|
35
35
|
Hello, how can I help?
|
|
36
36
|
</div>
|
|
37
37
|
</div>
|
|
38
38
|
<div className="flex justify-end">
|
|
39
|
-
<div className="bg-accent-500 rounded px-3 py-2 max-w-xs text-
|
|
39
|
+
<div className="bg-accent-500 rounded px-3 py-2 max-w-xs text-sm text-foreground-50">
|
|
40
40
|
I need some assistance
|
|
41
41
|
</div>
|
|
42
42
|
</div>
|
|
43
43
|
<div className="flex justify-start">
|
|
44
|
-
<div className="bg-background-700 rounded px-3 py-2 max-w-xs text-
|
|
44
|
+
<div className="bg-background-700 rounded px-3 py-2 max-w-xs text-sm text-foreground-400">
|
|
45
45
|
I'm here to help!
|
|
46
46
|
</div>
|
|
47
47
|
</div>
|
|
48
48
|
</div>
|
|
49
49
|
<div className="border-t border-background-700 p-2 bg-background-800">
|
|
50
|
-
<div className="h-6 bg-background-700 rounded text-
|
|
50
|
+
<div className="h-6 bg-background-700 rounded text-sm flex items-center px-2 text-foreground-400">
|
|
51
51
|
Type a message...
|
|
52
52
|
</div>
|
|
53
53
|
</div>
|
|
@@ -57,19 +57,19 @@ export function ChatWithActions() {
|
|
|
57
57
|
<div className="flex gap-2 mb-3 flex-wrap">
|
|
58
58
|
<button
|
|
59
59
|
onClick={() => handleAction('Copy code')}
|
|
60
|
-
className="px-2 py-1 bg-background-700 hover:bg-background-600 text-foreground-400 hover:text-foreground-300 rounded text-
|
|
60
|
+
className="px-2 py-1 bg-background-700 hover:bg-background-600 text-foreground-400 hover:text-foreground-300 rounded text-sm transition-colors"
|
|
61
61
|
>
|
|
62
62
|
📋 Copy
|
|
63
63
|
</button>
|
|
64
64
|
<button
|
|
65
65
|
onClick={() => handleAction('Explain')}
|
|
66
|
-
className="px-2 py-1 bg-background-700 hover:bg-background-600 text-foreground-400 hover:text-foreground-300 rounded text-
|
|
66
|
+
className="px-2 py-1 bg-background-700 hover:bg-background-600 text-foreground-400 hover:text-foreground-300 rounded text-sm transition-colors"
|
|
67
67
|
>
|
|
68
68
|
💡 Explain
|
|
69
69
|
</button>
|
|
70
70
|
<button
|
|
71
71
|
onClick={() => handleAction('Refactor')}
|
|
72
|
-
className="px-2 py-1 bg-background-700 hover:bg-background-600 text-foreground-400 hover:text-foreground-300 rounded text-
|
|
72
|
+
className="px-2 py-1 bg-background-700 hover:bg-background-600 text-foreground-400 hover:text-foreground-300 rounded text-sm transition-colors"
|
|
73
73
|
>
|
|
74
74
|
✨ Refactor
|
|
75
75
|
</button>
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
{
|
|
41
41
|
"filename": "index.tsx",
|
|
42
42
|
"language": "typescript",
|
|
43
|
-
"code": "\"use client\"\nimport React, { useState } from 'react';\nimport { ChatContainerWithActions } from './layout/ChatContainerWithActions.js';\nimport { ChatMessage } from './layout/ChatMessage.js';\nimport { ChatInputWithActions } from './layout/ChatInputWithActions.js';\n\ninterface Message {\n id: string;\n content: string;\n sender: 'ai' | 'user';\n}\n\nexport function ChatWithActions() {\n const [messages, setMessages] = useState<Message[]>([\n { id: '1', content: 'Hello! I can help you with questions or tasks.', sender: 'ai' },\n { id: '2', content: 'Can you help me with debugging?', sender: 'user' },\n { id: '3', content: 'Absolutely! I can help you debug your code. What issue are you facing?', sender: 'ai' },\n ]);\n\n const handleSendMessage = (content: string) => {\n const userMessage = {\n id: String(messages.length + 1),\n content,\n sender: 'user' as const,\n };\n setMessages([...messages, userMessage]);\n\n setTimeout(() => {\n const aiMessage = {\n id: String(messages.length + 2),\n content: 'I can help with that. Let me analyze your code.',\n sender: 'ai' as const,\n };\n setMessages((prev) => [...prev, aiMessage]);\n }, 500);\n };\n\n const handleAction = (action: string) => {\n const actionMessage = {\n id: String(messages.length + 1),\n content: `[Action: ${action}]`,\n sender: 'user' as const,\n };\n setMessages([...messages, actionMessage]);\n };\n\n return (\n <div className=\"min-h-screen bg-background-950 p-8\">\n <div className=\"max-w-2xl mx-auto h-96\">\n <ChatContainerWithActions>\n <div className=\"flex-1 overflow-y-auto space-y-4 p-4\">\n {messages.map((message) => (\n <ChatMessage key={message.id} message={message.content} sender={message.sender} />\n ))}\n </div>\n <div className=\"border-t border-background-700 p-4 bg-background-700/50\">\n <div className=\"flex gap-2 mb-3 flex-wrap\">\n <button\n onClick={() => handleAction('Copy code')}\n className=\"px-2 py-1 bg-background-700 hover:bg-background-600 text-foreground-400 hover:text-foreground-300 rounded text-
|
|
43
|
+
"code": "\"use client\"\nimport React, { useState } from 'react';\nimport { ChatContainerWithActions } from './layout/ChatContainerWithActions.js';\nimport { ChatMessage } from './layout/ChatMessage.js';\nimport { ChatInputWithActions } from './layout/ChatInputWithActions.js';\n\ninterface Message {\n id: string;\n content: string;\n sender: 'ai' | 'user';\n}\n\nexport function ChatWithActions() {\n const [messages, setMessages] = useState<Message[]>([\n { id: '1', content: 'Hello! I can help you with questions or tasks.', sender: 'ai' },\n { id: '2', content: 'Can you help me with debugging?', sender: 'user' },\n { id: '3', content: 'Absolutely! I can help you debug your code. What issue are you facing?', sender: 'ai' },\n ]);\n\n const handleSendMessage = (content: string) => {\n const userMessage = {\n id: String(messages.length + 1),\n content,\n sender: 'user' as const,\n };\n setMessages([...messages, userMessage]);\n\n setTimeout(() => {\n const aiMessage = {\n id: String(messages.length + 2),\n content: 'I can help with that. Let me analyze your code.',\n sender: 'ai' as const,\n };\n setMessages((prev) => [...prev, aiMessage]);\n }, 500);\n };\n\n const handleAction = (action: string) => {\n const actionMessage = {\n id: String(messages.length + 1),\n content: `[Action: ${action}]`,\n sender: 'user' as const,\n };\n setMessages([...messages, actionMessage]);\n };\n\n return (\n <div className=\"min-h-screen bg-background-950 p-8\">\n <div className=\"max-w-2xl mx-auto h-96\">\n <ChatContainerWithActions>\n <div className=\"flex-1 overflow-y-auto space-y-4 p-4\">\n {messages.map((message) => (\n <ChatMessage key={message.id} message={message.content} sender={message.sender} />\n ))}\n </div>\n <div className=\"border-t border-background-700 p-4 bg-background-700/50\">\n <div className=\"flex gap-2 mb-3 flex-wrap\">\n <button\n onClick={() => handleAction('Copy code')}\n className=\"px-2 py-1 bg-background-700 hover:bg-background-600 text-foreground-400 hover:text-foreground-300 rounded text-sm transition-colors\"\n >\n 📋 Copy\n </button>\n <button\n onClick={() => handleAction('Explain')}\n className=\"px-2 py-1 bg-background-700 hover:bg-background-600 text-foreground-400 hover:text-foreground-300 rounded text-sm transition-colors\"\n >\n 💡 Explain\n </button>\n <button\n onClick={() => handleAction('Refactor')}\n className=\"px-2 py-1 bg-background-700 hover:bg-background-600 text-foreground-400 hover:text-foreground-300 rounded text-sm transition-colors\"\n >\n ✨ Refactor\n </button>\n </div>\n <ChatInputWithActions onSendMessage={handleSendMessage} />\n </div>\n </ChatContainerWithActions>\n </div>\n </div>\n );\n}\n",
|
|
44
44
|
"isEntryPoint": true
|
|
45
45
|
},
|
|
46
46
|
{
|
|
@@ -29,7 +29,7 @@ const elementMetadata: ElementMetadata = {
|
|
|
29
29
|
export function getPreview(): React.ReactNode {
|
|
30
30
|
return (
|
|
31
31
|
<div className="flex items-center justify-center w-full h-full p-3 bg-background-900 rounded-sm border border-background-700">
|
|
32
|
-
<button className="px-3 py-2 bg-accent-500 text-foreground-50 text-
|
|
32
|
+
<button className="px-3 py-2 bg-accent-500 text-foreground-50 text-sm font-medium rounded hover:bg-accent-600 transition-colors flex items-center gap-2">
|
|
33
33
|
<span>📋</span>
|
|
34
34
|
Copy
|
|
35
35
|
</button>
|
|
@@ -30,7 +30,7 @@ export function getPreview(): React.ReactNode {
|
|
|
30
30
|
return (
|
|
31
31
|
<div className="flex items-center justify-between w-full h-full p-4 bg-background-900 rounded-sm border border-background-700 cursor-pointer hover:bg-background-800 transition-colors">
|
|
32
32
|
<div className="flex-1">
|
|
33
|
-
<div className="text-
|
|
33
|
+
<div className="text-sm text-foreground-400 mb-1">Next Article</div>
|
|
34
34
|
<div className="text-sm font-medium text-foreground-200">Advanced Setup Guide</div>
|
|
35
35
|
</div>
|
|
36
36
|
<div className="text-foreground-400">→</div>
|
package/src/elements/Documentation/NextArticle/variations/01-basic/layout/NextArticleCard.tsx
CHANGED
|
@@ -12,7 +12,7 @@ export function NextArticleCard({ title, description, href }: NextArticleCardPro
|
|
|
12
12
|
>
|
|
13
13
|
<div className="flex items-center justify-between">
|
|
14
14
|
<div className="flex-1">
|
|
15
|
-
<div className="text-
|
|
15
|
+
<div className="text-sm text-foreground-400 mb-1">Next Article</div>
|
|
16
16
|
<h3 className="text-lg font-semibold text-foreground-50 mb-2 group-hover:text-accent-400 transition-colors">
|
|
17
17
|
{title}
|
|
18
18
|
</h3>
|
|
@@ -20,7 +20,7 @@ export function NextArticleWithIconCard({
|
|
|
20
20
|
>
|
|
21
21
|
<div className="text-3xl flex-shrink-0 mt-1">{icon}</div>
|
|
22
22
|
<div className="flex-1 min-w-0">
|
|
23
|
-
<div className="text-
|
|
23
|
+
<div className="text-sm text-accent-400 font-medium mb-1">{category}</div>
|
|
24
24
|
<h3 className="text-lg font-semibold text-foreground-50 mb-1 group-hover:text-accent-400 transition-colors">
|
|
25
25
|
{title}
|
|
26
26
|
</h3>
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
{
|
|
15
15
|
"filename": "NextArticleCard.tsx",
|
|
16
16
|
"language": "typescript",
|
|
17
|
-
"code": "interface NextArticleCardProps {\n title: string;\n description: string;\n href: string;\n}\n\nexport function NextArticleCard({ title, description, href }: NextArticleCardProps) {\n return (\n <a\n href={href}\n className=\"block bg-background-700 border border-background-600 rounded-md p-4 hover:border-accent-500 hover:bg-background-700/80 transition-colors group\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex-1\">\n <div className=\"text-
|
|
17
|
+
"code": "interface NextArticleCardProps {\n title: string;\n description: string;\n href: string;\n}\n\nexport function NextArticleCard({ title, description, href }: NextArticleCardProps) {\n return (\n <a\n href={href}\n className=\"block bg-background-700 border border-background-600 rounded-md p-4 hover:border-accent-500 hover:bg-background-700/80 transition-colors group\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex-1\">\n <div className=\"text-sm text-foreground-400 mb-1\">Next Article</div>\n <h3 className=\"text-lg font-semibold text-foreground-50 mb-2 group-hover:text-accent-400 transition-colors\">\n {title}\n </h3>\n <p className=\"text-sm text-foreground-400\">{description}</p>\n </div>\n <div className=\"ml-4 text-xl text-foreground-400 group-hover:text-accent-400 transition-colors flex-shrink-0\">\n →\n </div>\n </div>\n </a>\n );\n}\n",
|
|
18
18
|
"isEntryPoint": false
|
|
19
19
|
}
|
|
20
20
|
]
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
{
|
|
35
35
|
"filename": "NextArticleWithIconCard.tsx",
|
|
36
36
|
"language": "typescript",
|
|
37
|
-
"code": "interface NextArticleWithIconCardProps {\n icon: string;\n title: string;\n description: string;\n category: string;\n href: string;\n}\n\nexport function NextArticleWithIconCard({\n icon,\n title,\n description,\n category,\n href,\n}: NextArticleWithIconCardProps) {\n return (\n <a\n href={href}\n className=\"flex items-start gap-4 p-4 bg-background-700 border border-background-600 rounded-md hover:border-accent-500 hover:bg-background-700/80 transition-colors group\"\n >\n <div className=\"text-3xl flex-shrink-0 mt-1\">{icon}</div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-
|
|
37
|
+
"code": "interface NextArticleWithIconCardProps {\n icon: string;\n title: string;\n description: string;\n category: string;\n href: string;\n}\n\nexport function NextArticleWithIconCard({\n icon,\n title,\n description,\n category,\n href,\n}: NextArticleWithIconCardProps) {\n return (\n <a\n href={href}\n className=\"flex items-start gap-4 p-4 bg-background-700 border border-background-600 rounded-md hover:border-accent-500 hover:bg-background-700/80 transition-colors group\"\n >\n <div className=\"text-3xl flex-shrink-0 mt-1\">{icon}</div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm text-accent-400 font-medium mb-1\">{category}</div>\n <h3 className=\"text-lg font-semibold text-foreground-50 mb-1 group-hover:text-accent-400 transition-colors\">\n {title}\n </h3>\n <p className=\"text-sm text-foreground-400\">{description}</p>\n </div>\n <div className=\"text-foreground-400 group-hover:text-accent-400 transition-colors flex-shrink-0 text-lg\">\n →\n </div>\n </a>\n );\n}\n",
|
|
38
38
|
"isEntryPoint": false
|
|
39
39
|
}
|
|
40
40
|
]
|
|
@@ -29,14 +29,14 @@ const elementMetadata: ElementMetadata = {
|
|
|
29
29
|
export function getPreview(): React.ReactNode {
|
|
30
30
|
return (
|
|
31
31
|
<div className="flex flex-col gap-2 w-full h-full p-3 bg-background-900 rounded-sm border border-background-700">
|
|
32
|
-
<div className="space-y-2 text-
|
|
32
|
+
<div className="space-y-2 text-sm">
|
|
33
33
|
<div className="font-semibold text-foreground-200 mb-2">Contents</div>
|
|
34
34
|
<div className="text-foreground-400">• Introduction</div>
|
|
35
|
-
<div className="ml-3 text-foreground-400 text-
|
|
36
|
-
<div className="ml-3 text-foreground-400 text-
|
|
35
|
+
<div className="ml-3 text-foreground-400 text-sm">◦ Overview</div>
|
|
36
|
+
<div className="ml-3 text-foreground-400 text-sm">◦ Getting Started</div>
|
|
37
37
|
<div className="text-foreground-400">• Installation</div>
|
|
38
38
|
<div className="text-foreground-400">• Usage</div>
|
|
39
|
-
<div className="ml-3 text-foreground-400 text-
|
|
39
|
+
<div className="ml-3 text-foreground-400 text-sm">◦ Basic</div>
|
|
40
40
|
</div>
|
|
41
41
|
</div>
|
|
42
42
|
);
|