@fragments-sdk/ui 0.8.1 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +14 -2
  3. package/fragments.json +1 -1
  4. package/package.json +23 -2
  5. package/src/assets/fragments-logo.tsx +37 -0
  6. package/src/assets/fragments_logo.svg +1 -0
  7. package/src/assets/fragments_logo_text.svg +1 -0
  8. package/src/blocks/AccountSettings.block.ts +1 -1
  9. package/src/blocks/ActivityFeed.block.ts +7 -7
  10. package/src/blocks/ChatInterface.block.ts +36 -80
  11. package/src/blocks/DashboardLayout.block.ts +85 -66
  12. package/src/blocks/DashboardPage.block.ts +298 -0
  13. package/src/blocks/EmptyState.block.ts +6 -4
  14. package/src/blocks/FeatureGrid.block.ts +1 -1
  15. package/src/blocks/LoginForm.block.ts +21 -26
  16. package/src/blocks/PricingComparison.block.ts +1 -1
  17. package/src/blocks/SettingsPanel.block.ts +4 -4
  18. package/src/blocks/ShoppingCart.block.ts +2 -2
  19. package/src/components/Accordion/Accordion.fragment.tsx +67 -1
  20. package/src/components/Alert/Alert.fragment.tsx +69 -1
  21. package/src/components/Alert/Alert.module.scss +7 -3
  22. package/src/components/AppShell/AppShell.fragment.tsx +326 -87
  23. package/src/components/Avatar/Avatar.fragment.tsx +35 -2
  24. package/src/components/Badge/Badge.fragment.tsx +47 -9
  25. package/src/components/Badge/Badge.module.scss +1 -0
  26. package/src/components/Breadcrumbs/Breadcrumbs.fragment.tsx +1 -1
  27. package/src/components/Breadcrumbs/Breadcrumbs.module.scss +3 -0
  28. package/src/components/Button/Button.fragment.tsx +1 -1
  29. package/src/components/Checkbox/Checkbox.fragment.tsx +4 -4
  30. package/src/components/Checkbox/Checkbox.module.scss +7 -7
  31. package/src/components/Checkbox/index.tsx +6 -1
  32. package/src/components/Chip/Chip.fragment.tsx +1 -1
  33. package/src/components/CodeBlock/CodeBlock.fragment.tsx +10 -2
  34. package/src/components/CodeBlock/CodeBlock.module.scss +48 -11
  35. package/src/components/CodeBlock/CodeBlock.test.tsx +51 -1
  36. package/src/components/CodeBlock/index.tsx +221 -3
  37. package/src/components/ColorPicker/ColorPicker.fragment.tsx +1 -1
  38. package/src/components/ColorPicker/ColorPicker.module.scss +8 -7
  39. package/src/components/Combobox/Combobox.fragment.tsx +1 -1
  40. package/src/components/Combobox/Combobox.module.scss +1 -3
  41. package/src/components/Field/index.tsx +1 -1
  42. package/src/components/Form/Form.fragment.tsx +4 -4
  43. package/src/components/Input/Input.fragment.tsx +1 -1
  44. package/src/components/Input/Input.test.tsx +35 -0
  45. package/src/components/Input/index.tsx +47 -2
  46. package/src/components/Menu/Menu.module.scss +2 -0
  47. package/src/components/Message/Message.module.scss +3 -3
  48. package/src/components/Popover/Popover.fragment.tsx +1 -1
  49. package/src/components/Popover/Popover.module.scss +1 -3
  50. package/src/components/Prompt/Prompt.module.scss +6 -19
  51. package/src/components/Prompt/Prompt.test.tsx +8 -0
  52. package/src/components/Prompt/index.tsx +12 -1
  53. package/src/components/RadioGroup/RadioGroup.fragment.tsx +4 -3
  54. package/src/components/RadioGroup/RadioGroup.module.scss +9 -9
  55. package/src/components/RadioGroup/index.tsx +5 -1
  56. package/src/components/Sidebar/Sidebar.module.scss +9 -2
  57. package/src/components/Sidebar/Sidebar.test.tsx +6 -0
  58. package/src/components/Sidebar/index.tsx +4 -1
  59. package/src/components/Slider/Slider.fragment.tsx +2 -2
  60. package/src/components/Slider/Slider.module.scss +2 -0
  61. package/src/components/Switch/index.ts +1 -0
  62. package/src/components/Table/Table.fragment.tsx +1 -1
  63. package/src/components/Theme/Theme.fragment.tsx +16 -0
  64. package/src/components/Theme/ThemeToggle.module.scss +4 -3
  65. package/src/components/Toast/Toast.fragment.tsx +1 -0
  66. package/src/components/Toast/Toast.module.scss +9 -4
  67. package/src/components/Toggle/Toggle.fragment.tsx +32 -32
  68. package/src/components/Toggle/Toggle.module.scss +33 -26
  69. package/src/components/Toggle/Toggle.test.tsx +10 -10
  70. package/src/components/Toggle/index.tsx +23 -15
  71. package/src/components/ToggleGroup/ToggleGroup.fragment.tsx +34 -2
  72. package/src/index.ts +9 -1
  73. package/src/tokens/_derive.scss +32 -8
  74. package/src/tokens/_mixins.scss +14 -0
  75. package/src/tokens/_variables.scss +12 -6
  76. package/src/blocks/AIChat.block.ts +0 -266
  77. package/src/blocks/AppShell.block.ts +0 -175
  78. package/src/blocks/CTABanner.block.ts +0 -24
  79. package/src/blocks/CardGrid.block.ts +0 -22
  80. package/src/blocks/CodeExamples.block.ts +0 -66
  81. package/src/blocks/ConfirmDialog.block.ts +0 -19
  82. package/src/blocks/ConversationWithHistory.block.ts +0 -45
  83. package/src/blocks/DashboardNav.block.ts +0 -183
  84. package/src/blocks/ForgotPassword.block.ts +0 -26
  85. package/src/blocks/FormLayout.block.ts +0 -31
  86. package/src/blocks/InsetDashboardLayout.block.ts +0 -79
  87. package/src/blocks/MetricDashboard.block.ts +0 -38
  88. package/src/blocks/NewsletterSignup.block.ts +0 -26
  89. package/src/blocks/NotificationList.block.ts +0 -39
  90. package/src/blocks/NotificationPreferences.block.ts +0 -40
  91. package/src/blocks/OrderSummary.block.ts +0 -52
  92. package/src/blocks/ProfileEditForm.block.ts +0 -51
  93. package/src/blocks/SearchResults.block.ts +0 -39
  94. package/src/blocks/SettingsPage.block.ts +0 -58
  95. package/src/blocks/StreamingMessage.block.ts +0 -24
  96. package/src/blocks/TestimonialCard.block.ts +0 -27
  97. package/src/blocks/UserProfileCard.block.ts +0 -29
  98. package/src/recipes/AIChat.recipe.ts +0 -266
  99. package/src/recipes/AppShell.recipe.ts +0 -175
  100. package/src/recipes/CardGrid.recipe.ts +0 -22
  101. package/src/recipes/ChatInterface.recipe.ts +0 -87
  102. package/src/recipes/CodeExamples.recipe.ts +0 -66
  103. package/src/recipes/ConfirmDialog.recipe.ts +0 -19
  104. package/src/recipes/DashboardLayout.recipe.ts +0 -73
  105. package/src/recipes/DashboardNav.recipe.ts +0 -183
  106. package/src/recipes/FormLayout.recipe.ts +0 -31
  107. package/src/recipes/LoginForm.recipe.ts +0 -33
  108. package/src/recipes/SettingsPage.recipe.ts +0 -58
@@ -1,38 +0,0 @@
1
- import { defineBlock } from '@fragments/core';
2
-
3
- export default defineBlock({
4
- name: 'Metric Dashboard',
5
- description: 'Grid of metrics with progress bars and change indicators',
6
- category: 'dashboard',
7
- components: ['Grid', 'Card', 'Stack', 'Text', 'Badge', 'Progress'],
8
- tags: ['metrics', 'dashboard', 'kpi', 'progress', 'grid'],
9
- code: `
10
- const metrics = [
11
- { label: 'Active Users', value: '2,847', change: '+12%', progress: 75 },
12
- { label: 'Revenue', value: '$48,352', change: '+8%', progress: 68 },
13
- { label: 'Orders', value: '1,423', change: '+23%', progress: 82 },
14
- { label: 'Conversion', value: '3.24%', change: '-2%', progress: 45 },
15
- ];
16
-
17
- <Grid columns={{ base: 1, md: 2 }} gap="lg">
18
- {metrics.map((metric) => (
19
- <Card key={metric.label}>
20
- <Card.Body>
21
- <Stack gap="md">
22
- <Stack direction="row" justify="between" align="start">
23
- <Stack gap="xs">
24
- <Text size="sm" color="tertiary">{metric.label}</Text>
25
- <Text size="xl" weight="semibold">{metric.value}</Text>
26
- </Stack>
27
- <Badge variant={metric.change.startsWith('+') ? 'success' : 'error'}>
28
- {metric.change}
29
- </Badge>
30
- </Stack>
31
- <Progress value={metric.progress} />
32
- </Stack>
33
- </Card.Body>
34
- </Card>
35
- ))}
36
- </Grid>
37
- `.trim(),
38
- });
@@ -1,26 +0,0 @@
1
- import { defineBlock } from '@fragments/core';
2
-
3
- export default defineBlock({
4
- name: 'Newsletter Signup',
5
- description: 'Compact email signup with inline button',
6
- category: 'marketing',
7
- components: ['Card', 'Stack', 'Text', 'Input', 'Button'],
8
- tags: ['newsletter', 'signup', 'email', 'marketing'],
9
- code: `
10
- <Card variant="outlined">
11
- <Card.Body>
12
- <Stack gap="md">
13
- <Stack gap="xs">
14
- <Text size="lg" weight="semibold">Stay Updated</Text>
15
- <Text color="tertiary">Get the latest news and updates delivered to your inbox.</Text>
16
- </Stack>
17
- <Stack direction={{ base: 'column', sm: 'row' }} gap="sm">
18
- <Input type="email" placeholder="Enter your email" style={{ flex: 1 }} />
19
- <Button variant="primary">Subscribe</Button>
20
- </Stack>
21
- <Text size="sm" color="tertiary">No spam, unsubscribe anytime.</Text>
22
- </Stack>
23
- </Card.Body>
24
- </Card>
25
- `.trim(),
26
- });
@@ -1,39 +0,0 @@
1
- import { defineBlock } from '@fragments/core';
2
-
3
- export default defineBlock({
4
- name: 'Notification List',
5
- description: 'Notification feed with avatars and timestamps',
6
- category: 'dashboard',
7
- components: ['Card', 'Stack', 'Text', 'Avatar', 'Badge'],
8
- tags: ['notifications', 'feed', 'list', 'dashboard'],
9
- code: `
10
- const notifications = [
11
- { message: 'John commented on your post', time: '2 minutes ago', initials: 'JD' },
12
- { message: 'Sarah liked your photo', time: '1 hour ago', initials: 'SL' },
13
- { message: 'New follower: Mike Smith', time: '3 hours ago', initials: 'MS' },
14
- { message: 'Your order has shipped', time: 'Yesterday', initials: '📦' },
15
- ];
16
-
17
- <Card>
18
- <Card.Header>
19
- <Stack direction="row" justify="between" align="center">
20
- <Card.Title>Notifications</Card.Title>
21
- <Badge>3 new</Badge>
22
- </Stack>
23
- </Card.Header>
24
- <Card.Body>
25
- <Stack gap="md">
26
- {notifications.map((notif, index) => (
27
- <Stack key={index} direction="row" gap="md" align="start">
28
- <Avatar size="sm" initials={notif.initials} />
29
- <Stack gap="xs">
30
- <Text>{notif.message}</Text>
31
- <Text size="sm" color="tertiary">{notif.time}</Text>
32
- </Stack>
33
- </Stack>
34
- ))}
35
- </Stack>
36
- </Card.Body>
37
- </Card>
38
- `.trim(),
39
- });
@@ -1,40 +0,0 @@
1
- import { defineBlock } from '@fragments/core';
2
-
3
- export default defineBlock({
4
- name: 'Notification Preferences',
5
- description: 'Checkbox list for notification settings with descriptions',
6
- category: 'settings',
7
- components: ['Card', 'Stack', 'Text', 'Checkbox', 'Button'],
8
- tags: ['notifications', 'preferences', 'settings', 'checkboxes'],
9
- code: `
10
- const preferences = [
11
- { label: 'New messages', description: 'When someone sends you a direct message' },
12
- { label: 'Project updates', description: 'When there are updates to projects you follow' },
13
- { label: 'Mentions', description: 'When someone mentions you in a comment' },
14
- { label: 'Weekly digest', description: 'A summary of activity from the past week' },
15
- ];
16
-
17
- <Card>
18
- <Card.Header>
19
- <Card.Title>Notification Preferences</Card.Title>
20
- <Card.Description>Choose what you want to be notified about</Card.Description>
21
- </Card.Header>
22
- <Card.Body>
23
- <Stack gap="md">
24
- {preferences.map((pref) => (
25
- <Stack key={pref.label} direction="row" gap="md" align="start">
26
- <Checkbox id={pref.label} defaultChecked />
27
- <Stack gap="xs">
28
- <Text as="label" htmlFor={pref.label} weight="medium">{pref.label}</Text>
29
- <Text size="sm" color="tertiary">{pref.description}</Text>
30
- </Stack>
31
- </Stack>
32
- ))}
33
- </Stack>
34
- </Card.Body>
35
- <Card.Footer>
36
- <Button variant="primary">Save Preferences</Button>
37
- </Card.Footer>
38
- </Card>
39
- `.trim(),
40
- });
@@ -1,52 +0,0 @@
1
- import { defineBlock } from '@fragments/core';
2
-
3
- export default defineBlock({
4
- name: 'Order Summary',
5
- description: 'Order details with subtotal, shipping, tax, total and shipping address',
6
- category: 'ecommerce',
7
- components: ['Card', 'Stack', 'Text', 'Separator', 'Button'],
8
- tags: ['order', 'summary', 'ecommerce', 'receipt'],
9
- code: `
10
- <Card>
11
- <Card.Header>
12
- <Card.Title>Order Summary</Card.Title>
13
- <Card.Description>Order #12345</Card.Description>
14
- </Card.Header>
15
- <Card.Body>
16
- <Stack gap="md">
17
- <Stack gap="sm">
18
- <Stack direction="row" justify="between">
19
- <Text color="tertiary">Subtotal</Text>
20
- <Text>$498.00</Text>
21
- </Stack>
22
- <Stack direction="row" justify="between">
23
- <Text color="tertiary">Shipping</Text>
24
- <Text>$9.99</Text>
25
- </Stack>
26
- <Stack direction="row" justify="between">
27
- <Text color="tertiary">Tax</Text>
28
- <Text>$44.82</Text>
29
- </Stack>
30
- </Stack>
31
- <Separator />
32
- <Stack direction="row" justify="between">
33
- <Text weight="semibold">Total</Text>
34
- <Text size="lg" weight="semibold">$552.81</Text>
35
- </Stack>
36
- <Separator />
37
- <Stack gap="xs">
38
- <Text size="sm" weight="semibold">Shipping Address</Text>
39
- <Text size="sm" color="tertiary">John Doe</Text>
40
- <Text size="sm" color="tertiary">123 Main St, San Francisco, CA 94102</Text>
41
- </Stack>
42
- </Stack>
43
- </Card.Body>
44
- <Card.Footer>
45
- <Stack gap="sm" style={{ width: '100%' }}>
46
- <Button variant="primary" fullWidth>Confirm Order</Button>
47
- <Button variant="ghost" fullWidth>Continue Shopping</Button>
48
- </Stack>
49
- </Card.Footer>
50
- </Card>
51
- `.trim(),
52
- });
@@ -1,51 +0,0 @@
1
- import { defineBlock } from '@fragments/core';
2
-
3
- export default defineBlock({
4
- name: 'Profile Edit Form',
5
- description: 'User profile editor with avatar, name, email and bio fields',
6
- category: 'settings',
7
- components: ['Card', 'Stack', 'Avatar', 'Button', 'Text', 'Input', 'Textarea', 'Separator'],
8
- tags: ['profile', 'edit', 'form', 'settings', 'avatar'],
9
- code: `
10
- <Card variant="elevated">
11
- <Card.Header>
12
- <Card.Title>Edit Profile</Card.Title>
13
- <Card.Description>Update your personal information</Card.Description>
14
- </Card.Header>
15
- <Card.Body>
16
- <Stack gap="lg">
17
- <Stack direction="row" gap="md" align="center">
18
- <Avatar size="xl" initials="JD" />
19
- <Stack gap="xs">
20
- <Button variant="secondary" size="sm">Change Photo</Button>
21
- <Text size="sm" color="tertiary">JPG, PNG or GIF. Max 2MB.</Text>
22
- </Stack>
23
- </Stack>
24
-
25
- <Separator />
26
-
27
- <Stack gap="md">
28
- <Stack direction={{ base: 'column', sm: 'row' }} gap="md">
29
- <Input label="First Name" defaultValue="Jane" style={{ flex: 1 }} />
30
- <Input label="Last Name" defaultValue="Doe" style={{ flex: 1 }} />
31
- </Stack>
32
- <Input label="Email" type="email" defaultValue="jane@example.com" />
33
- <Textarea
34
- label="Bio"
35
- placeholder="Tell us about yourself..."
36
- defaultValue="Product designer passionate about creating intuitive user experiences."
37
- rows={3}
38
- />
39
- </Stack>
40
-
41
- <Separator />
42
-
43
- <Stack direction="row" gap="sm" justify="end">
44
- <Button variant="secondary">Cancel</Button>
45
- <Button variant="primary">Save Changes</Button>
46
- </Stack>
47
- </Stack>
48
- </Card.Body>
49
- </Card>
50
- `.trim(),
51
- });
@@ -1,39 +0,0 @@
1
- import { defineBlock } from '@fragments/core';
2
-
3
- export default defineBlock({
4
- name: 'Search Results',
5
- description: 'List of search results with categories and badges',
6
- category: 'dashboard',
7
- components: ['Card', 'Stack', 'Text', 'Badge', 'Button'],
8
- tags: ['search', 'results', 'list', 'dashboard'],
9
- code: `
10
- const results = [
11
- { title: 'Getting Started Guide', category: 'Documentation', description: 'Learn how to set up and configure your project...' },
12
- { title: 'Button Component', category: 'Components', description: 'A versatile button component with multiple variants...' },
13
- { title: 'Theming System', category: 'Guides', description: 'Customize colors, typography, and spacing...' },
14
- ];
15
-
16
- <Card>
17
- <Card.Header>
18
- <Stack direction="row" justify="between" align="center">
19
- <Card.Title>Search Results</Card.Title>
20
- <Badge>3 results</Badge>
21
- </Stack>
22
- </Card.Header>
23
- <Card.Body>
24
- <Stack gap="md">
25
- {results.map((result, index) => (
26
- <Stack key={index} gap="sm" style={{ paddingBottom: index < results.length - 1 ? 'var(--fui-space-4)' : 0, borderBottom: index < results.length - 1 ? '1px solid var(--fui-border-default)' : 'none' }}>
27
- <Stack direction="row" gap="sm" align="center">
28
- <Text weight="semibold">{result.title}</Text>
29
- <Badge variant="outline">{result.category}</Badge>
30
- </Stack>
31
- <Text size="sm" color="tertiary">{result.description}</Text>
32
- <Button variant="ghost" size="sm">View details</Button>
33
- </Stack>
34
- ))}
35
- </Stack>
36
- </Card.Body>
37
- </Card>
38
- `.trim(),
39
- });
@@ -1,58 +0,0 @@
1
- import { defineBlock } from '@fragments/core';
2
-
3
- export default defineBlock({
4
- name: 'Settings Page',
5
- description: 'Settings page with labeled sections using cards, toggles, and a save action',
6
- category: 'forms',
7
- components: ['Grid', 'Card', 'Toggle', 'Input', 'Select', 'Separator', 'Button'],
8
- tags: ['settings', 'preferences', 'form', 'toggle', 'layout'],
9
- code: `
10
- <Grid columns={1} gap="lg">
11
- <Card>
12
- <Card.Header>
13
- <Card.Title>Profile</Card.Title>
14
- <Card.Description>Your public profile information</Card.Description>
15
- </Card.Header>
16
- <Card.Body>
17
- <Grid columns={2} gap="md">
18
- <Input label="Display Name" defaultValue={user.name} />
19
- <Input label="Email" type="email" defaultValue={user.email} />
20
- <Grid.Item colSpan="full">
21
- <Input label="Website" type="url" defaultValue={user.website} />
22
- </Grid.Item>
23
- </Grid>
24
- </Card.Body>
25
- </Card>
26
-
27
- <Card>
28
- <Card.Header>
29
- <Card.Title>Notifications</Card.Title>
30
- <Card.Description>Choose what you get notified about</Card.Description>
31
- </Card.Header>
32
- <Card.Body>
33
- <Grid columns={1} gap="sm">
34
- <Toggle label="Email notifications" checked={prefs.emailNotifs} onChange={onToggle('emailNotifs')} />
35
- <Toggle label="Push notifications" checked={prefs.pushNotifs} onChange={onToggle('pushNotifs')} />
36
- <Toggle label="Weekly digest" checked={prefs.digest} onChange={onToggle('digest')} />
37
- </Grid>
38
- </Card.Body>
39
- </Card>
40
-
41
- <Card>
42
- <Card.Header>
43
- <Card.Title>Appearance</Card.Title>
44
- </Card.Header>
45
- <Card.Body>
46
- <Select label="Theme" value={prefs.theme} onChange={onThemeChange}>
47
- <Select.Item value="light">Light</Select.Item>
48
- <Select.Item value="dark">Dark</Select.Item>
49
- <Select.Item value="system">System</Select.Item>
50
- </Select>
51
- </Card.Body>
52
- </Card>
53
-
54
- <Separator />
55
- <Button variant="primary" type="submit">Save Changes</Button>
56
- </Grid>
57
- `.trim(),
58
- });
@@ -1,24 +0,0 @@
1
- import { defineBlock } from '@fragments/core';
2
-
3
- export default defineBlock({
4
- name: 'Streaming Message',
5
- description: 'AI message with streaming cursor animation showing real-time response',
6
- category: 'ai',
7
- components: ['Stack', 'Message'],
8
- tags: ['streaming', 'message', 'ai', 'cursor', 'real-time'],
9
- code: `
10
- <Stack gap="md" style={{ maxWidth: '600px' }}>
11
- <Message role="user">
12
- <Message.Content>
13
- Write a haiku about programming
14
- </Message.Content>
15
- </Message>
16
- <Message role="assistant" status="streaming">
17
- <Message.Content>
18
- Lines of code compile,
19
- Bugs emerge from the shadows
20
- </Message.Content>
21
- </Message>
22
- </Stack>
23
- `.trim(),
24
- });
@@ -1,27 +0,0 @@
1
- import { defineBlock } from '@fragments/core';
2
-
3
- export default defineBlock({
4
- name: 'Testimonial Card',
5
- description: 'Customer quote with avatar and attribution',
6
- category: 'marketing',
7
- components: ['Card', 'Stack', 'Text', 'Avatar'],
8
- tags: ['testimonial', 'quote', 'review', 'marketing'],
9
- code: `
10
- <Card>
11
- <Card.Body>
12
- <Stack gap="md">
13
- <Text color="secondary" style={{ fontStyle: 'italic' }}>
14
- "This component library has completely transformed how we build UIs. The design is clean, the API is intuitive, and the documentation is excellent."
15
- </Text>
16
- <Stack direction="row" gap="md" align="center">
17
- <Avatar initials="SK" />
18
- <Stack gap="xs">
19
- <Text weight="semibold">Sarah Kim</Text>
20
- <Text size="sm" color="tertiary">Engineering Lead at TechCorp</Text>
21
- </Stack>
22
- </Stack>
23
- </Stack>
24
- </Card.Body>
25
- </Card>
26
- `.trim(),
27
- });
@@ -1,29 +0,0 @@
1
- import { defineBlock } from '@fragments/core';
2
-
3
- export default defineBlock({
4
- name: 'User Profile Card',
5
- description: 'Card displaying user info with avatar, role and actions',
6
- category: 'dashboard',
7
- components: ['Card', 'Stack', 'Text', 'Avatar', 'Badge', 'Button'],
8
- tags: ['profile', 'user', 'card', 'avatar', 'dashboard'],
9
- code: `
10
- <Card>
11
- <Card.Body>
12
- <Stack align="center" gap="md">
13
- <Avatar size="xl" initials="JD" />
14
- <Stack align="center" gap="xs">
15
- <Text size="lg" weight="semibold">Jane Doe</Text>
16
- <Text color="tertiary">Product Designer</Text>
17
- <Badge variant="success">Pro Member</Badge>
18
- </Stack>
19
- </Stack>
20
- </Card.Body>
21
- <Card.Footer>
22
- <Stack direction="row" gap="sm" justify="center">
23
- <Button variant="secondary" size="sm">Message</Button>
24
- <Button variant="primary" size="sm">Follow</Button>
25
- </Stack>
26
- </Card.Footer>
27
- </Card>
28
- `.trim(),
29
- });