@neynar/ui 0.3.0 → 0.3.1
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/.llm/a.llm.md +131 -0
- package/.llm/accordion-content.llm.md +67 -0
- package/.llm/accordion-item.llm.md +61 -0
- package/.llm/accordion-trigger.llm.md +69 -0
- package/.llm/accordion.llm.md +88 -0
- package/.llm/alert-description.llm.md +78 -0
- package/.llm/alert-dialog-action.llm.md +51 -0
- package/.llm/alert-dialog-cancel.llm.md +48 -0
- package/.llm/alert-dialog-content.llm.md +88 -0
- package/.llm/alert-dialog-description.llm.md +53 -0
- package/.llm/alert-dialog-footer.llm.md +41 -0
- package/.llm/alert-dialog-header.llm.md +39 -0
- package/.llm/alert-dialog-overlay.llm.md +44 -0
- package/.llm/alert-dialog-portal.llm.md +41 -0
- package/.llm/alert-dialog-title.llm.md +46 -0
- package/.llm/alert-dialog-trigger.llm.md +40 -0
- package/.llm/alert-dialog.llm.md +80 -0
- package/.llm/alert-title.llm.md +48 -0
- package/.llm/alert.llm.md +92 -0
- package/.llm/aspect-ratio.llm.md +41 -0
- package/.llm/avatar-fallback.llm.md +41 -0
- package/.llm/avatar-image.llm.md +48 -0
- package/.llm/avatar.llm.md +35 -0
- package/.llm/badge.llm.md +117 -0
- package/.llm/blockquote.llm.md +117 -0
- package/.llm/breadcrumb-ellipsis.llm.md +73 -0
- package/.llm/breadcrumb-item.llm.md +53 -0
- package/.llm/breadcrumb-link.llm.md +84 -0
- package/.llm/breadcrumb-list.llm.md +54 -0
- package/.llm/breadcrumb-page.llm.md +52 -0
- package/.llm/breadcrumb-separator.llm.md +60 -0
- package/.llm/breadcrumb.llm.md +110 -0
- package/.llm/button-group-separator.llm.md +53 -0
- package/.llm/button-group-text.llm.md +56 -0
- package/.llm/button-group.llm.md +81 -0
- package/.llm/button.llm.md +281 -0
- package/.llm/calendar-day-button.llm.md +57 -0
- package/.llm/calendar.llm.md +340 -0
- package/.llm/card-action.llm.md +64 -0
- package/.llm/card-content.llm.md +48 -0
- package/.llm/card-description.llm.md +46 -0
- package/.llm/card-footer.llm.md +56 -0
- package/.llm/card-header.llm.md +53 -0
- package/.llm/card-title.llm.md +43 -0
- package/.llm/card.llm.md +100 -0
- package/.llm/carousel-content.llm.md +77 -0
- package/.llm/carousel-item.llm.md +96 -0
- package/.llm/carousel-next.llm.md +95 -0
- package/.llm/carousel-previous.llm.md +95 -0
- package/.llm/carousel.llm.md +211 -0
- package/.llm/chart-config.llm.md +71 -0
- package/.llm/chart-container.llm.md +148 -0
- package/.llm/chart-legend-content.llm.md +85 -0
- package/.llm/chart-legend.llm.md +144 -0
- package/.llm/chart-style.llm.md +28 -0
- package/.llm/chart-tooltip-content.llm.md +149 -0
- package/.llm/chart-tooltip.llm.md +184 -0
- package/.llm/checkbox.llm.md +100 -0
- package/.llm/cn.llm.md +46 -0
- package/.llm/code.llm.md +103 -0
- package/.llm/collapsible-content.llm.md +109 -0
- package/.llm/collapsible-trigger.llm.md +75 -0
- package/.llm/collapsible.llm.md +109 -0
- package/.llm/combobox-option.llm.md +53 -0
- package/.llm/combobox.llm.md +208 -0
- package/.llm/command-dialog.llm.md +112 -0
- package/.llm/command-empty.llm.md +63 -0
- package/.llm/command-group.llm.md +83 -0
- package/.llm/command-input.llm.md +82 -0
- package/.llm/command-item.llm.md +97 -0
- package/.llm/command-list.llm.md +53 -0
- package/.llm/command-loading.llm.md +48 -0
- package/.llm/command-separator.llm.md +44 -0
- package/.llm/command-shortcut.llm.md +63 -0
- package/.llm/command.llm.md +147 -0
- package/.llm/container.llm.md +236 -0
- package/.llm/context-menu-checkbox-item.llm.md +97 -0
- package/.llm/context-menu-content.llm.md +91 -0
- package/.llm/context-menu-group.llm.md +61 -0
- package/.llm/context-menu-item.llm.md +94 -0
- package/.llm/context-menu-label.llm.md +60 -0
- package/.llm/context-menu-portal.llm.md +49 -0
- package/.llm/context-menu-radio-group.llm.md +66 -0
- package/.llm/context-menu-radio-item.llm.md +76 -0
- package/.llm/context-menu-separator.llm.md +51 -0
- package/.llm/context-menu-shortcut.llm.md +57 -0
- package/.llm/context-menu-sub-content.llm.md +90 -0
- package/.llm/context-menu-sub-trigger.llm.md +73 -0
- package/.llm/context-menu-sub.llm.md +61 -0
- package/.llm/context-menu-trigger.llm.md +53 -0
- package/.llm/context-menu.llm.md +103 -0
- package/.llm/date-picker.llm.md +90 -0
- package/.llm/dialog-close.llm.md +61 -0
- package/.llm/dialog-content.llm.md +128 -0
- package/.llm/dialog-description.llm.md +44 -0
- package/.llm/dialog-footer.llm.md +38 -0
- package/.llm/dialog-header.llm.md +40 -0
- package/.llm/dialog-overlay.llm.md +57 -0
- package/.llm/dialog-portal.llm.md +47 -0
- package/.llm/dialog-title.llm.md +41 -0
- package/.llm/dialog-trigger.llm.md +51 -0
- package/.llm/dialog.llm.md +113 -0
- package/.llm/drawer-close.llm.md +53 -0
- package/.llm/drawer-content.llm.md +58 -0
- package/.llm/drawer-description.llm.md +54 -0
- package/.llm/drawer-footer.llm.md +67 -0
- package/.llm/drawer-header.llm.md +60 -0
- package/.llm/drawer-overlay.llm.md +40 -0
- package/.llm/drawer-portal.llm.md +42 -0
- package/.llm/drawer-title.llm.md +51 -0
- package/.llm/drawer-trigger.llm.md +44 -0
- package/.llm/drawer.llm.md +194 -0
- package/.llm/dropdown-menu-checkbox-item.llm.md +111 -0
- package/.llm/dropdown-menu-content.llm.md +109 -0
- package/.llm/dropdown-menu-group.llm.md +38 -0
- package/.llm/dropdown-menu-item.llm.md +94 -0
- package/.llm/dropdown-menu-label.llm.md +66 -0
- package/.llm/dropdown-menu-portal.llm.md +32 -0
- package/.llm/dropdown-menu-radio-group.llm.md +73 -0
- package/.llm/dropdown-menu-radio-item.llm.md +92 -0
- package/.llm/dropdown-menu-separator.llm.md +55 -0
- package/.llm/dropdown-menu-shortcut.llm.md +74 -0
- package/.llm/dropdown-menu-sub-content.llm.md +80 -0
- package/.llm/dropdown-menu-sub-trigger.llm.md +84 -0
- package/.llm/dropdown-menu-sub.llm.md +74 -0
- package/.llm/dropdown-menu-trigger.llm.md +48 -0
- package/.llm/dropdown-menu.llm.md +120 -0
- package/.llm/empty-content.llm.md +103 -0
- package/.llm/empty-description.llm.md +70 -0
- package/.llm/empty-header.llm.md +64 -0
- package/.llm/empty-media.llm.md +81 -0
- package/.llm/empty-state.llm.md +174 -0
- package/.llm/empty-title.llm.md +54 -0
- package/.llm/empty.llm.md +158 -0
- package/.llm/field-content.llm.md +28 -0
- package/.llm/field-description.llm.md +28 -0
- package/.llm/field-error.llm.md +41 -0
- package/.llm/field-group.llm.md +84 -0
- package/.llm/field-label.llm.md +28 -0
- package/.llm/field-legend.llm.md +77 -0
- package/.llm/field-separator.llm.md +35 -0
- package/.llm/field-set.llm.md +80 -0
- package/.llm/field-title.llm.md +28 -0
- package/.llm/field.llm.md +35 -0
- package/.llm/h1.llm.md +108 -0
- package/.llm/h2.llm.md +108 -0
- package/.llm/h3.llm.md +106 -0
- package/.llm/h4.llm.md +104 -0
- package/.llm/h5.llm.md +105 -0
- package/.llm/h6.llm.md +105 -0
- package/.llm/hover-card-content.llm.md +167 -0
- package/.llm/hover-card-trigger.llm.md +65 -0
- package/.llm/hover-card.llm.md +121 -0
- package/.llm/input-group-addon.llm.md +91 -0
- package/.llm/input-group-button.llm.md +120 -0
- package/.llm/input-group-input.llm.md +145 -0
- package/.llm/input-group-text.llm.md +75 -0
- package/.llm/input-group-textarea.llm.md +157 -0
- package/.llm/input-group.llm.md +108 -0
- package/.llm/input.llm.md +319 -0
- package/.llm/item-actions.llm.md +77 -0
- package/.llm/item-content.llm.md +73 -0
- package/.llm/item-description.llm.md +61 -0
- package/.llm/item-footer.llm.md +68 -0
- package/.llm/item-group.llm.md +73 -0
- package/.llm/item-header.llm.md +66 -0
- package/.llm/item-media.llm.md +75 -0
- package/.llm/item-separator.llm.md +80 -0
- package/.llm/item-title.llm.md +59 -0
- package/.llm/item.llm.md +115 -0
- package/.llm/kbd-group.llm.md +71 -0
- package/.llm/kbd.llm.md +71 -0
- package/.llm/label.llm.md +145 -0
- package/.llm/lead.llm.md +114 -0
- package/.llm/menubar-checkbox-item.llm.md +66 -0
- package/.llm/menubar-content.llm.md +128 -0
- package/.llm/menubar-group.llm.md +40 -0
- package/.llm/menubar-item.llm.md +62 -0
- package/.llm/menubar-label.llm.md +40 -0
- package/.llm/menubar-menu.llm.md +32 -0
- package/.llm/menubar-portal.llm.md +38 -0
- package/.llm/menubar-radio-group.llm.md +39 -0
- package/.llm/menubar-radio-item.llm.md +59 -0
- package/.llm/menubar-separator.llm.md +35 -0
- package/.llm/menubar-shortcut.llm.md +37 -0
- package/.llm/menubar-sub-content.llm.md +127 -0
- package/.llm/menubar-sub-trigger.llm.md +51 -0
- package/.llm/menubar-sub.llm.md +53 -0
- package/.llm/menubar-trigger.llm.md +37 -0
- package/.llm/menubar.llm.md +115 -0
- package/.llm/navigation-menu-content.llm.md +116 -0
- package/.llm/navigation-menu-indicator.llm.md +68 -0
- package/.llm/navigation-menu-item.llm.md +62 -0
- package/.llm/navigation-menu-link.llm.md +109 -0
- package/.llm/navigation-menu-list.llm.md +52 -0
- package/.llm/navigation-menu-trigger-style.llm.md +22 -0
- package/.llm/navigation-menu-trigger.llm.md +57 -0
- package/.llm/navigation-menu-viewport.llm.md +51 -0
- package/.llm/navigation-menu.llm.md +184 -0
- package/.llm/p.llm.md +110 -0
- package/.llm/pagination-content.llm.md +60 -0
- package/.llm/pagination-ellipsis.llm.md +107 -0
- package/.llm/pagination-item.llm.md +59 -0
- package/.llm/pagination-link.llm.md +150 -0
- package/.llm/pagination-next.llm.md +115 -0
- package/.llm/pagination-previous.llm.md +115 -0
- package/.llm/pagination.llm.md +190 -0
- package/.llm/popover-anchor.llm.md +53 -0
- package/.llm/popover-content.llm.md +109 -0
- package/.llm/popover-trigger.llm.md +54 -0
- package/.llm/popover.llm.md +116 -0
- package/.llm/progress.llm.md +76 -0
- package/.llm/radio-group-indicator.llm.md +28 -0
- package/.llm/radio-group-item.llm.md +40 -0
- package/.llm/radio-group.llm.md +76 -0
- package/.llm/resizable-handle.llm.md +156 -0
- package/.llm/resizable-panel-group.llm.md +149 -0
- package/.llm/resizable-panel.llm.md +157 -0
- package/.llm/scroll-area-corner.llm.md +41 -0
- package/.llm/scroll-area-thumb.llm.md +39 -0
- package/.llm/scroll-area-viewport.llm.md +60 -0
- package/.llm/scroll-area.llm.md +125 -0
- package/.llm/scroll-bar.llm.md +78 -0
- package/.llm/sdk-items-registry.json +3022 -0
- package/.llm/select-content.llm.md +139 -0
- package/.llm/select-group.llm.md +60 -0
- package/.llm/select-item.llm.md +75 -0
- package/.llm/select-label.llm.md +62 -0
- package/.llm/select-scroll-down-button.llm.md +45 -0
- package/.llm/select-scroll-up-button.llm.md +45 -0
- package/.llm/select-separator.llm.md +59 -0
- package/.llm/select-trigger.llm.md +66 -0
- package/.llm/select-value.llm.md +67 -0
- package/.llm/select.llm.md +159 -0
- package/.llm/separator.llm.md +129 -0
- package/.llm/sheet-close.llm.md +49 -0
- package/.llm/sheet-content.llm.md +115 -0
- package/.llm/sheet-description.llm.md +62 -0
- package/.llm/sheet-footer.llm.md +64 -0
- package/.llm/sheet-header.llm.md +52 -0
- package/.llm/sheet-title.llm.md +53 -0
- package/.llm/sheet-trigger.llm.md +46 -0
- package/.llm/sheet.llm.md +126 -0
- package/.llm/sidebar-content.llm.md +63 -0
- package/.llm/sidebar-footer.llm.md +50 -0
- package/.llm/sidebar-group-action.llm.md +60 -0
- package/.llm/sidebar-group-content.llm.md +64 -0
- package/.llm/sidebar-group-label.llm.md +53 -0
- package/.llm/sidebar-group.llm.md +56 -0
- package/.llm/sidebar-header.llm.md +67 -0
- package/.llm/sidebar-input.llm.md +50 -0
- package/.llm/sidebar-inset.llm.md +52 -0
- package/.llm/sidebar-menu-action.llm.md +84 -0
- package/.llm/sidebar-menu-badge.llm.md +60 -0
- package/.llm/sidebar-menu-button.llm.md +103 -0
- package/.llm/sidebar-menu-item.llm.md +75 -0
- package/.llm/sidebar-menu-skeleton.llm.md +76 -0
- package/.llm/sidebar-menu-sub-button.llm.md +85 -0
- package/.llm/sidebar-menu-sub-item.llm.md +54 -0
- package/.llm/sidebar-menu-sub.llm.md +74 -0
- package/.llm/sidebar-menu.llm.md +65 -0
- package/.llm/sidebar-provider.llm.md +79 -0
- package/.llm/sidebar-rail.llm.md +34 -0
- package/.llm/sidebar-separator.llm.md +57 -0
- package/.llm/sidebar-trigger.llm.md +49 -0
- package/.llm/sidebar.llm.md +129 -0
- package/.llm/skeleton.llm.md +134 -0
- package/.llm/slider.llm.md +173 -0
- package/.llm/small.llm.md +110 -0
- package/.llm/span.llm.md +118 -0
- package/.llm/spinner.llm.md +182 -0
- package/.llm/stack.llm.md +28 -0
- package/.llm/strong.llm.md +110 -0
- package/.llm/switch.llm.md +76 -0
- package/.llm/table-body.llm.md +36 -0
- package/.llm/table-caption.llm.md +48 -0
- package/.llm/table-cell.llm.md +53 -0
- package/.llm/table-footer.llm.md +41 -0
- package/.llm/table-head.llm.md +69 -0
- package/.llm/table-header.llm.md +41 -0
- package/.llm/table-row.llm.md +42 -0
- package/.llm/table.llm.md +123 -0
- package/.llm/tabs-content.llm.md +47 -0
- package/.llm/tabs-list.llm.md +41 -0
- package/.llm/tabs-trigger.llm.md +47 -0
- package/.llm/tabs.llm.md +71 -0
- package/.llm/text-field.llm.md +327 -0
- package/.llm/textarea.llm.md +311 -0
- package/.llm/theme-preference.llm.md +25 -0
- package/.llm/theme-toggle.llm.md +57 -0
- package/.llm/theme.llm.md +14 -0
- package/.llm/toast.llm.md +32 -0
- package/.llm/toaster.llm.md +193 -0
- package/.llm/toggle-group-item.llm.md +59 -0
- package/.llm/toggle-group.llm.md +101 -0
- package/.llm/toggle.llm.md +40 -0
- package/.llm/tooltip-content.llm.md +185 -0
- package/.llm/tooltip-provider.llm.md +68 -0
- package/.llm/tooltip-trigger.llm.md +70 -0
- package/.llm/tooltip.llm.md +129 -0
- package/.llm/typography.llm.md +161 -0
- package/.llm/use-carousel.llm.md +55 -0
- package/.llm/use-command-state.llm.md +32 -0
- package/.llm/use-is-mobile.llm.md +73 -0
- package/.llm/use-sidebar.llm.md +61 -0
- package/dist/components/ui/scroll-area.d.ts +5 -5
- package/dist/components/ui/scroll-area.d.ts.map +1 -1
- package/dist/components/ui/stack.d.ts.map +1 -1
- package/dist/components/ui/stories/scroll-area.stories.d.ts +1 -1
- package/dist/components/ui/theme-toggle.d.ts +0 -3
- package/dist/components/ui/theme-toggle.d.ts.map +1 -1
- package/dist/components/ui/theme.d.ts.map +1 -1
- package/dist/index.js +4972 -9636
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/components/ui/stack.tsx +3 -1
- package/src/components/ui/theme-toggle.tsx +1 -3
- package/src/components/ui/theme.tsx +6 -1
- package/src/styles/globals.css +57 -85
package/.llm/card.llm.md
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Card
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
Card - A flexible container component for grouping related content Cards are surfaces that display content and actions on a single topic. They should be easy to scan for relevant and actionable information. Cards support composition through multiple sub-components and can be customized with various layouts and styling patterns. Based on the shadcn/ui Card component, this implementation provides: - Flexible composition through sub-components - Semantic HTML structure for accessibility - Consistent spacing and visual hierarchy - Support for interactive elements and actions
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { Card } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<Card
|
|
13
|
+
className="value"
|
|
14
|
+
>
|
|
15
|
+
{/* Your content here */}
|
|
16
|
+
</Card>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Component Props
|
|
20
|
+
|
|
21
|
+
### className
|
|
22
|
+
- **Type**: `string`
|
|
23
|
+
- **Required**: No
|
|
24
|
+
- **Description**: No description available
|
|
25
|
+
|
|
26
|
+
### children
|
|
27
|
+
- **Type**: `React.ReactNode`
|
|
28
|
+
- **Required**: No
|
|
29
|
+
- **Description**: No description available
|
|
30
|
+
|
|
31
|
+
## Examples
|
|
32
|
+
|
|
33
|
+
### Example 1
|
|
34
|
+
```tsx
|
|
35
|
+
// Basic card with header and content
|
|
36
|
+
<Card>
|
|
37
|
+
<CardHeader>
|
|
38
|
+
<CardTitle>Card Title</CardTitle>
|
|
39
|
+
<CardDescription>Card description goes here</CardDescription>
|
|
40
|
+
</CardHeader>
|
|
41
|
+
<CardContent>
|
|
42
|
+
<p>Card content goes here</p>
|
|
43
|
+
</CardContent>
|
|
44
|
+
</Card>
|
|
45
|
+
```
|
|
46
|
+
### Example 2
|
|
47
|
+
```tsx
|
|
48
|
+
// Card with action button in header
|
|
49
|
+
<Card>
|
|
50
|
+
<CardHeader>
|
|
51
|
+
<CardTitle>Settings</CardTitle>
|
|
52
|
+
<CardAction>
|
|
53
|
+
<Button variant="ghost" size="icon">
|
|
54
|
+
<Settings />
|
|
55
|
+
</Button>
|
|
56
|
+
</CardAction>
|
|
57
|
+
</CardHeader>
|
|
58
|
+
<CardContent>
|
|
59
|
+
<p>Manage your settings</p>
|
|
60
|
+
</CardContent>
|
|
61
|
+
<CardFooter>
|
|
62
|
+
<Button>Save Changes</Button>
|
|
63
|
+
</CardFooter>
|
|
64
|
+
</Card>
|
|
65
|
+
```
|
|
66
|
+
### Example 3
|
|
67
|
+
```tsx
|
|
68
|
+
// Minimal card with only content
|
|
69
|
+
<Card>
|
|
70
|
+
<CardContent>
|
|
71
|
+
<p>Simple card content without header or footer</p>
|
|
72
|
+
</CardContent>
|
|
73
|
+
</Card>
|
|
74
|
+
```
|
|
75
|
+
### Example 4
|
|
76
|
+
```tsx
|
|
77
|
+
// Product card with custom styling
|
|
78
|
+
<Card className="w-80 hover:shadow-lg transition-shadow">
|
|
79
|
+
<CardHeader>
|
|
80
|
+
<div className="aspect-video bg-muted rounded-lg mb-4" />
|
|
81
|
+
<CardTitle>Product Name</CardTitle>
|
|
82
|
+
<CardDescription>Product description</CardDescription>
|
|
83
|
+
<CardAction>
|
|
84
|
+
<Badge variant="secondary">New</Badge>
|
|
85
|
+
</CardAction>
|
|
86
|
+
</CardHeader>
|
|
87
|
+
<CardContent>
|
|
88
|
+
<div className="flex items-center justify-between">
|
|
89
|
+
<span className="text-2xl font-bold">$299</span>
|
|
90
|
+
<span className="text-sm text-muted-foreground line-through">$399</span>
|
|
91
|
+
</div>
|
|
92
|
+
</CardContent>
|
|
93
|
+
<CardFooter className="gap-2">
|
|
94
|
+
<Button className="flex-1">Add to Cart</Button>
|
|
95
|
+
<Button size="icon" variant="outline">
|
|
96
|
+
<Heart className="size-4" />
|
|
97
|
+
</Button>
|
|
98
|
+
</CardFooter>
|
|
99
|
+
</Card>
|
|
100
|
+
```
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# CarouselContent
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
Container component for carousel items that handles the scrolling viewport Wraps all carousel items and manages the scrollable area. This component must be a direct child of Carousel and handles orientation-specific layouts, overflow behavior, and slide spacing. The outer div provides overflow clipping while the inner div contains the flex layout for slides.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { CarouselContent } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<CarouselContent
|
|
13
|
+
className="value"
|
|
14
|
+
>
|
|
15
|
+
{/* Your content here */}
|
|
16
|
+
</CarouselContent>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Component Props
|
|
20
|
+
|
|
21
|
+
### className
|
|
22
|
+
- **Type**: `string`
|
|
23
|
+
- **Required**: No
|
|
24
|
+
- **Description**: No description available
|
|
25
|
+
|
|
26
|
+
### children
|
|
27
|
+
- **Type**: `React.ReactNode`
|
|
28
|
+
- **Required**: No
|
|
29
|
+
- **Description**: No description available
|
|
30
|
+
|
|
31
|
+
## Examples
|
|
32
|
+
|
|
33
|
+
### Example 1
|
|
34
|
+
```tsx
|
|
35
|
+
// Basic usage
|
|
36
|
+
<CarouselContent>
|
|
37
|
+
<CarouselItem>Slide 1</CarouselItem>
|
|
38
|
+
<CarouselItem>Slide 2</CarouselItem>
|
|
39
|
+
<CarouselItem>Slide 3</CarouselItem>
|
|
40
|
+
</CarouselContent>
|
|
41
|
+
```
|
|
42
|
+
### Example 2
|
|
43
|
+
```tsx
|
|
44
|
+
// Multi-item carousel with responsive spacing
|
|
45
|
+
<CarouselContent className="-ml-2 md:-ml-4">
|
|
46
|
+
<CarouselItem className="pl-2 md:pl-4 md:basis-1/2 lg:basis-1/3">
|
|
47
|
+
<Card>Product 1</Card>
|
|
48
|
+
</CarouselItem>
|
|
49
|
+
<CarouselItem className="pl-2 md:pl-4 md:basis-1/2 lg:basis-1/3">
|
|
50
|
+
<Card>Product 2</Card>
|
|
51
|
+
</CarouselItem>
|
|
52
|
+
</CarouselContent>
|
|
53
|
+
```
|
|
54
|
+
### Example 3
|
|
55
|
+
```tsx
|
|
56
|
+
// Vertical orientation with custom height
|
|
57
|
+
<CarouselContent className="-mt-4 h-[300px]">
|
|
58
|
+
<CarouselItem className="pt-4 basis-1/2">
|
|
59
|
+
<div className="h-full bg-muted rounded-lg">Slide 1</div>
|
|
60
|
+
</CarouselItem>
|
|
61
|
+
<CarouselItem className="pt-4 basis-1/2">
|
|
62
|
+
<div className="h-full bg-muted rounded-lg">Slide 2</div>
|
|
63
|
+
</CarouselItem>
|
|
64
|
+
</CarouselContent>
|
|
65
|
+
```
|
|
66
|
+
### Example 4
|
|
67
|
+
```tsx
|
|
68
|
+
// Custom slide spacing with CSS variables
|
|
69
|
+
<CarouselContent
|
|
70
|
+
className="-ml-4"
|
|
71
|
+
style={{ '--slide-spacing': '1rem' } as React.CSSProperties}
|
|
72
|
+
>
|
|
73
|
+
<CarouselItem className="pl-4">
|
|
74
|
+
Content with custom spacing
|
|
75
|
+
</CarouselItem>
|
|
76
|
+
</CarouselContent>
|
|
77
|
+
```
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# CarouselItem
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
Individual slide/item component within the carousel Represents a single slide in the carousel that can contain any content. Automatically handles sizing, spacing, and orientation-specific layouts based on the parent carousel configuration. Each slide is a flex item with configurable basis for responsive layouts.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { CarouselItem } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<CarouselItem
|
|
13
|
+
className="value"
|
|
14
|
+
>
|
|
15
|
+
{/* Your content here */}
|
|
16
|
+
</CarouselItem>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Component Props
|
|
20
|
+
|
|
21
|
+
### className
|
|
22
|
+
- **Type**: `string`
|
|
23
|
+
- **Required**: No
|
|
24
|
+
- **Description**: No description available
|
|
25
|
+
|
|
26
|
+
### children
|
|
27
|
+
- **Type**: `React.ReactNode`
|
|
28
|
+
- **Required**: No
|
|
29
|
+
- **Description**: No description available
|
|
30
|
+
|
|
31
|
+
## Examples
|
|
32
|
+
|
|
33
|
+
### Example 1
|
|
34
|
+
```tsx
|
|
35
|
+
// Basic slide with content
|
|
36
|
+
<CarouselItem>
|
|
37
|
+
<div className="p-6 bg-muted rounded-lg">
|
|
38
|
+
<h3 className="text-lg font-semibold">Slide Title</h3>
|
|
39
|
+
<p className="text-muted-foreground">Slide description</p>
|
|
40
|
+
</div>
|
|
41
|
+
</CarouselItem>
|
|
42
|
+
```
|
|
43
|
+
### Example 2
|
|
44
|
+
```tsx
|
|
45
|
+
// Card-based slide with structured content
|
|
46
|
+
<CarouselItem>
|
|
47
|
+
<Card className="h-full">
|
|
48
|
+
<CardHeader>
|
|
49
|
+
<CardTitle>Product Name</CardTitle>
|
|
50
|
+
<CardDescription>Product category</CardDescription>
|
|
51
|
+
</CardHeader>
|
|
52
|
+
<CardContent>
|
|
53
|
+
<img src="product.jpg" alt="Product" className="w-full aspect-square object-cover" />
|
|
54
|
+
<p className="mt-2 text-2xl font-bold">$99.99</p>
|
|
55
|
+
</CardContent>
|
|
56
|
+
<CardFooter>
|
|
57
|
+
<Button className="w-full">Add to Cart</Button>
|
|
58
|
+
</CardFooter>
|
|
59
|
+
</Card>
|
|
60
|
+
</CarouselItem>
|
|
61
|
+
```
|
|
62
|
+
### Example 3
|
|
63
|
+
```tsx
|
|
64
|
+
// Responsive multi-item carousel
|
|
65
|
+
<CarouselItem className="pl-4 basis-full sm:basis-1/2 lg:basis-1/3">
|
|
66
|
+
<div className="aspect-square bg-gradient-to-br from-blue-400 to-purple-600 rounded-lg p-6 text-white">
|
|
67
|
+
<h4 className="font-semibold">Feature {index + 1}</h4>
|
|
68
|
+
<p className="text-sm opacity-90">Description text</p>
|
|
69
|
+
</div>
|
|
70
|
+
</CarouselItem>
|
|
71
|
+
```
|
|
72
|
+
### Example 4
|
|
73
|
+
```tsx
|
|
74
|
+
// Auto-sized slides for variable content
|
|
75
|
+
<CarouselItem className="basis-auto">
|
|
76
|
+
<Badge variant="secondary" className="text-nowrap px-4 py-2">
|
|
77
|
+
{tag.label}
|
|
78
|
+
</Badge>
|
|
79
|
+
</CarouselItem>
|
|
80
|
+
```
|
|
81
|
+
### Example 5
|
|
82
|
+
```tsx
|
|
83
|
+
// Image gallery slide with aspect ratio
|
|
84
|
+
<CarouselItem className="basis-4/5">
|
|
85
|
+
<div className="relative aspect-video bg-muted rounded-lg overflow-hidden">
|
|
86
|
+
<img
|
|
87
|
+
src={image.src}
|
|
88
|
+
alt={image.alt}
|
|
89
|
+
className="object-cover w-full h-full"
|
|
90
|
+
/>
|
|
91
|
+
<div className="absolute inset-0 bg-black/20 flex items-end p-4">
|
|
92
|
+
<h5 className="text-white font-medium">{image.title}</h5>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</CarouselItem>
|
|
96
|
+
```
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# CarouselNext
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
Navigation button to go to the next carousel slide Renders a next navigation button that automatically handles disabled states when at the end of the carousel (unless loop is enabled). Supports both horizontal and vertical orientations with appropriate positioning and icon rotation. Integrates with the carousel context to provide seamless navigation.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { CarouselNext } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<CarouselNext
|
|
13
|
+
className="value"
|
|
14
|
+
variant={value}
|
|
15
|
+
size={value}
|
|
16
|
+
/>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Component Props
|
|
20
|
+
|
|
21
|
+
### className
|
|
22
|
+
- **Type**: `string`
|
|
23
|
+
- **Required**: No
|
|
24
|
+
- **Description**: No description available
|
|
25
|
+
|
|
26
|
+
### variant
|
|
27
|
+
- **Type**: `| "default"
|
|
28
|
+
| "destructive"
|
|
29
|
+
| "outline"
|
|
30
|
+
| "secondary"
|
|
31
|
+
| "ghost"
|
|
32
|
+
| "link"`
|
|
33
|
+
- **Required**: No
|
|
34
|
+
- **Description**: No description available
|
|
35
|
+
|
|
36
|
+
### size
|
|
37
|
+
- **Type**: `"default" | "sm" | "lg" | "icon"`
|
|
38
|
+
- **Required**: No
|
|
39
|
+
- **Description**: No description available
|
|
40
|
+
|
|
41
|
+
## Examples
|
|
42
|
+
|
|
43
|
+
### Example 1
|
|
44
|
+
```tsx
|
|
45
|
+
// Basic usage with default styling
|
|
46
|
+
<Carousel>
|
|
47
|
+
<CarouselContent>
|
|
48
|
+
<CarouselItem>Slide 1</CarouselItem>
|
|
49
|
+
<CarouselItem>Slide 2</CarouselItem>
|
|
50
|
+
</CarouselContent>
|
|
51
|
+
<CarouselPrevious />
|
|
52
|
+
<CarouselNext />
|
|
53
|
+
</Carousel>
|
|
54
|
+
```
|
|
55
|
+
### Example 2
|
|
56
|
+
```tsx
|
|
57
|
+
// Custom positioned button
|
|
58
|
+
<CarouselNext
|
|
59
|
+
className="-right-8 bg-background shadow-md hover:shadow-lg"
|
|
60
|
+
variant="ghost"
|
|
61
|
+
size="sm"
|
|
62
|
+
/>
|
|
63
|
+
```
|
|
64
|
+
### Example 3
|
|
65
|
+
```tsx
|
|
66
|
+
// Vertical carousel with rotated icons
|
|
67
|
+
<Carousel orientation="vertical" className="h-[400px]">
|
|
68
|
+
<CarouselContent>...</CarouselContent>
|
|
69
|
+
<CarouselPrevious className="-top-8" />
|
|
70
|
+
<CarouselNext className="-bottom-8" />
|
|
71
|
+
</Carousel>
|
|
72
|
+
```
|
|
73
|
+
### Example 4
|
|
74
|
+
```tsx
|
|
75
|
+
// Inside carousel bounds positioning
|
|
76
|
+
<div className="relative">
|
|
77
|
+
<Carousel>
|
|
78
|
+
<CarouselContent>...</CarouselContent>
|
|
79
|
+
<CarouselPrevious className="absolute left-4 top-1/2 -translate-y-1/2 z-10" />
|
|
80
|
+
<CarouselNext className="absolute right-4 top-1/2 -translate-y-1/2 z-10" />
|
|
81
|
+
</Carousel>
|
|
82
|
+
</div>
|
|
83
|
+
```
|
|
84
|
+
### Example 5
|
|
85
|
+
```tsx
|
|
86
|
+
// Custom button content and accessibility
|
|
87
|
+
<CarouselNext
|
|
88
|
+
variant="secondary"
|
|
89
|
+
className="w-auto px-4"
|
|
90
|
+
aria-label="Go to next product"
|
|
91
|
+
>
|
|
92
|
+
Next
|
|
93
|
+
<ArrowRight className="w-4 h-4 ml-2" />
|
|
94
|
+
</CarouselNext>
|
|
95
|
+
```
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# CarouselPrevious
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
Navigation button to go to the previous carousel slide Renders a previous navigation button that automatically handles disabled states when at the beginning of the carousel (unless loop is enabled). Supports both horizontal and vertical orientations with appropriate positioning and icon rotation. Integrates with the carousel context to provide seamless navigation.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { CarouselPrevious } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<CarouselPrevious
|
|
13
|
+
className="value"
|
|
14
|
+
variant={value}
|
|
15
|
+
size={value}
|
|
16
|
+
/>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Component Props
|
|
20
|
+
|
|
21
|
+
### className
|
|
22
|
+
- **Type**: `string`
|
|
23
|
+
- **Required**: No
|
|
24
|
+
- **Description**: No description available
|
|
25
|
+
|
|
26
|
+
### variant
|
|
27
|
+
- **Type**: `| "default"
|
|
28
|
+
| "destructive"
|
|
29
|
+
| "outline"
|
|
30
|
+
| "secondary"
|
|
31
|
+
| "ghost"
|
|
32
|
+
| "link"`
|
|
33
|
+
- **Required**: No
|
|
34
|
+
- **Description**: No description available
|
|
35
|
+
|
|
36
|
+
### size
|
|
37
|
+
- **Type**: `"default" | "sm" | "lg" | "icon"`
|
|
38
|
+
- **Required**: No
|
|
39
|
+
- **Description**: No description available
|
|
40
|
+
|
|
41
|
+
## Examples
|
|
42
|
+
|
|
43
|
+
### Example 1
|
|
44
|
+
```tsx
|
|
45
|
+
// Basic usage with default styling
|
|
46
|
+
<Carousel>
|
|
47
|
+
<CarouselContent>
|
|
48
|
+
<CarouselItem>Slide 1</CarouselItem>
|
|
49
|
+
<CarouselItem>Slide 2</CarouselItem>
|
|
50
|
+
</CarouselContent>
|
|
51
|
+
<CarouselPrevious />
|
|
52
|
+
<CarouselNext />
|
|
53
|
+
</Carousel>
|
|
54
|
+
```
|
|
55
|
+
### Example 2
|
|
56
|
+
```tsx
|
|
57
|
+
// Custom positioned button
|
|
58
|
+
<CarouselPrevious
|
|
59
|
+
className="-left-8 bg-background shadow-md hover:shadow-lg"
|
|
60
|
+
variant="ghost"
|
|
61
|
+
size="sm"
|
|
62
|
+
/>
|
|
63
|
+
```
|
|
64
|
+
### Example 3
|
|
65
|
+
```tsx
|
|
66
|
+
// Vertical carousel with rotated icons
|
|
67
|
+
<Carousel orientation="vertical" className="h-[400px]">
|
|
68
|
+
<CarouselContent>...</CarouselContent>
|
|
69
|
+
<CarouselPrevious className="-top-8" />
|
|
70
|
+
<CarouselNext className="-bottom-8" />
|
|
71
|
+
</Carousel>
|
|
72
|
+
```
|
|
73
|
+
### Example 4
|
|
74
|
+
```tsx
|
|
75
|
+
// Inside carousel bounds positioning
|
|
76
|
+
<div className="relative">
|
|
77
|
+
<Carousel>
|
|
78
|
+
<CarouselContent>...</CarouselContent>
|
|
79
|
+
<CarouselPrevious className="absolute left-4 top-1/2 -translate-y-1/2 z-10" />
|
|
80
|
+
<CarouselNext className="absolute right-4 top-1/2 -translate-y-1/2 z-10" />
|
|
81
|
+
</Carousel>
|
|
82
|
+
</div>
|
|
83
|
+
```
|
|
84
|
+
### Example 5
|
|
85
|
+
```tsx
|
|
86
|
+
// Custom button content and accessibility
|
|
87
|
+
<CarouselPrevious
|
|
88
|
+
variant="secondary"
|
|
89
|
+
className="w-auto px-4"
|
|
90
|
+
aria-label="Go to previous product"
|
|
91
|
+
>
|
|
92
|
+
<ArrowLeft className="w-4 h-4 mr-2" />
|
|
93
|
+
Previous
|
|
94
|
+
</CarouselPrevious>
|
|
95
|
+
```
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Carousel
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
A responsive carousel/slider component for content presentation The Carousel component provides a touch-friendly, keyboard-accessible way to browse through multiple items. Built on Embla Carousel, it supports various configurations including autoplay, loop, drag scrolling, infinite scroll, momentum scrolling, and both horizontal and vertical orientations. Features include responsive breakpoints, plugin system, smooth animations, focus management, RTL support, and extensive customization options.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { Carousel } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<Carousel
|
|
13
|
+
opts={value}
|
|
14
|
+
plugins={value}
|
|
15
|
+
orientation={value}
|
|
16
|
+
setApi={() => {}}
|
|
17
|
+
className="value"
|
|
18
|
+
>
|
|
19
|
+
{/* Your content here */}
|
|
20
|
+
</Carousel>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Component Props
|
|
24
|
+
|
|
25
|
+
### opts
|
|
26
|
+
- **Type**: `CarouselOptions`
|
|
27
|
+
- **Required**: No
|
|
28
|
+
- **Description**: No description available
|
|
29
|
+
|
|
30
|
+
### plugins
|
|
31
|
+
- **Type**: `CarouselPlugin`
|
|
32
|
+
- **Required**: No
|
|
33
|
+
- **Description**: No description available
|
|
34
|
+
|
|
35
|
+
### orientation
|
|
36
|
+
- **Type**: `"horizontal" | "vertical"`
|
|
37
|
+
- **Required**: No
|
|
38
|
+
- **Description**: No description available
|
|
39
|
+
|
|
40
|
+
### setApi
|
|
41
|
+
- **Type**: `(api: CarouselApi) => void`
|
|
42
|
+
- **Required**: No
|
|
43
|
+
- **Description**: No description available
|
|
44
|
+
|
|
45
|
+
### className
|
|
46
|
+
- **Type**: `string`
|
|
47
|
+
- **Required**: No
|
|
48
|
+
- **Description**: No description available
|
|
49
|
+
|
|
50
|
+
### children
|
|
51
|
+
- **Type**: `React.ReactNode`
|
|
52
|
+
- **Required**: No
|
|
53
|
+
- **Description**: No description available
|
|
54
|
+
|
|
55
|
+
## Examples
|
|
56
|
+
|
|
57
|
+
### Example 1
|
|
58
|
+
```tsx
|
|
59
|
+
// Basic image carousel
|
|
60
|
+
<Carousel className="w-full max-w-xs">
|
|
61
|
+
<CarouselContent>
|
|
62
|
+
{images.map((src, index) => (
|
|
63
|
+
<CarouselItem key={index}>
|
|
64
|
+
<img src={src} alt={`Slide ${index + 1}`} className="w-full" />
|
|
65
|
+
</CarouselItem>
|
|
66
|
+
))}
|
|
67
|
+
</CarouselContent>
|
|
68
|
+
<CarouselPrevious />
|
|
69
|
+
<CarouselNext />
|
|
70
|
+
</Carousel>
|
|
71
|
+
```
|
|
72
|
+
### Example 2
|
|
73
|
+
```tsx
|
|
74
|
+
// Multi-item responsive carousel with custom spacing
|
|
75
|
+
<Carousel
|
|
76
|
+
opts={{
|
|
77
|
+
align: "start",
|
|
78
|
+
loop: true,
|
|
79
|
+
slidesToScroll: "auto",
|
|
80
|
+
breakpoints: {
|
|
81
|
+
"(min-width: 768px)": { slidesToScroll: 2 }
|
|
82
|
+
}
|
|
83
|
+
}}
|
|
84
|
+
className="w-full"
|
|
85
|
+
>
|
|
86
|
+
<CarouselContent className="-ml-2 md:-ml-4">
|
|
87
|
+
{products.map((product, index) => (
|
|
88
|
+
<CarouselItem key={index} className="pl-2 md:pl-4 md:basis-1/2 lg:basis-1/3">
|
|
89
|
+
<Card>
|
|
90
|
+
<CardContent className="p-4">
|
|
91
|
+
<h3>{product.name}</h3>
|
|
92
|
+
<p>{product.price}</p>
|
|
93
|
+
</CardContent>
|
|
94
|
+
</Card>
|
|
95
|
+
</CarouselItem>
|
|
96
|
+
))}
|
|
97
|
+
</CarouselContent>
|
|
98
|
+
<CarouselPrevious />
|
|
99
|
+
<CarouselNext />
|
|
100
|
+
</Carousel>
|
|
101
|
+
```
|
|
102
|
+
### Example 3
|
|
103
|
+
```tsx
|
|
104
|
+
// Vertical carousel with autoplay plugin
|
|
105
|
+
import Autoplay from "embla-carousel-autoplay";
|
|
106
|
+
<Carousel
|
|
107
|
+
orientation="vertical"
|
|
108
|
+
opts={{ loop: true, align: "center" }}
|
|
109
|
+
plugins={[Autoplay({ delay: 3000, stopOnInteraction: true, stopOnMouseEnter: true })]}
|
|
110
|
+
className="h-[400px]"
|
|
111
|
+
>
|
|
112
|
+
<CarouselContent className="h-full">
|
|
113
|
+
{testimonials.map((testimonial, index) => (
|
|
114
|
+
<CarouselItem key={index} className="basis-1/2">
|
|
115
|
+
<div className="p-6">
|
|
116
|
+
<blockquote>{testimonial.quote}</blockquote>
|
|
117
|
+
<cite>{testimonial.author}</cite>
|
|
118
|
+
</div>
|
|
119
|
+
</CarouselItem>
|
|
120
|
+
))}
|
|
121
|
+
</CarouselContent>
|
|
122
|
+
</Carousel>
|
|
123
|
+
```
|
|
124
|
+
### Example 4
|
|
125
|
+
```tsx
|
|
126
|
+
// Controlled carousel with custom indicators and API access
|
|
127
|
+
import { useState, useEffect } from "react";
|
|
128
|
+
function ControlledCarousel() {
|
|
129
|
+
const [api, setApi] = useState<CarouselApi>();
|
|
130
|
+
const [current, setCurrent] = useState(0);
|
|
131
|
+
const [count, setCount] = useState(0);
|
|
132
|
+
useEffect(() => {
|
|
133
|
+
if (!api) return;
|
|
134
|
+
setCount(api.scrollSnapList().length);
|
|
135
|
+
setCurrent(api.selectedScrollSnap() + 1);
|
|
136
|
+
api.on('select', () => {
|
|
137
|
+
setCurrent(api.selectedScrollSnap() + 1);
|
|
138
|
+
});
|
|
139
|
+
}, [api]);
|
|
140
|
+
return (
|
|
141
|
+
<div className="space-y-4">
|
|
142
|
+
<Carousel setApi={setApi} opts={{ loop: true }}>
|
|
143
|
+
<CarouselContent>
|
|
144
|
+
{slides.map((slide, index) => (
|
|
145
|
+
<CarouselItem key={index}>{slide.content}</CarouselItem>
|
|
146
|
+
))}
|
|
147
|
+
</CarouselContent>
|
|
148
|
+
<CarouselPrevious />
|
|
149
|
+
<CarouselNext />
|
|
150
|
+
</Carousel>
|
|
151
|
+
// Custom indicators
|
|
152
|
+
<div className="flex justify-center gap-2">
|
|
153
|
+
{Array.from({ length: count }).map((_, i) => (
|
|
154
|
+
<button
|
|
155
|
+
key={i}
|
|
156
|
+
className={cn(
|
|
157
|
+
"w-2 h-2 rounded-full transition-colors",
|
|
158
|
+
current === i + 1 ? "bg-primary" : "bg-muted"
|
|
159
|
+
)}
|
|
160
|
+
onClick={() => api?.scrollTo(i)}
|
|
161
|
+
/>
|
|
162
|
+
))}
|
|
163
|
+
</div>
|
|
164
|
+
<div className="text-center text-sm text-muted-foreground">
|
|
165
|
+
Slide {current} of {count}
|
|
166
|
+
</div>
|
|
167
|
+
</div>
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
### Example 5
|
|
172
|
+
```tsx
|
|
173
|
+
// Momentum scrolling carousel with drag-free mode
|
|
174
|
+
<Carousel
|
|
175
|
+
opts={{
|
|
176
|
+
dragFree: true,
|
|
177
|
+
containScroll: false,
|
|
178
|
+
skipSnaps: true
|
|
179
|
+
}}
|
|
180
|
+
className="w-full"
|
|
181
|
+
>
|
|
182
|
+
<CarouselContent>
|
|
183
|
+
{items.map((item, index) => (
|
|
184
|
+
<CarouselItem key={index} className="basis-auto">
|
|
185
|
+
<div className="w-32 h-32 bg-muted rounded-lg" />
|
|
186
|
+
</CarouselItem>
|
|
187
|
+
))}
|
|
188
|
+
</CarouselContent>
|
|
189
|
+
</Carousel>
|
|
190
|
+
```
|
|
191
|
+
### Example 6
|
|
192
|
+
```tsx
|
|
193
|
+
// Breakpoint-responsive carousel that disables on larger screens
|
|
194
|
+
<Carousel
|
|
195
|
+
opts={{
|
|
196
|
+
active: true,
|
|
197
|
+
breakpoints: {
|
|
198
|
+
"(min-width: 768px)": { active: false }
|
|
199
|
+
}
|
|
200
|
+
}}
|
|
201
|
+
className="md:hidden"
|
|
202
|
+
>
|
|
203
|
+
<CarouselContent>
|
|
204
|
+
{mobileItems.map((item, index) => (
|
|
205
|
+
<CarouselItem key={index}>{item}</CarouselItem>
|
|
206
|
+
))}
|
|
207
|
+
</CarouselContent>
|
|
208
|
+
<CarouselPrevious />
|
|
209
|
+
<CarouselNext />
|
|
210
|
+
</Carousel>
|
|
211
|
+
```
|