@neynar/ui 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.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 +55 -0
- package/.llm/body-text-large.llm.md +49 -0
- package/.llm/body-text-small.llm.md +49 -0
- package/.llm/body-text.llm.md +52 -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/caption.llm.md +48 -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 +45 -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/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/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/overline.llm.md +51 -0
- package/.llm/page-title.llm.md +52 -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 +2984 -0
- package/.llm/section-title.llm.md +48 -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/spinner.llm.md +182 -0
- package/.llm/stack.llm.md +28 -0
- package/.llm/subsection-title.llm.md +46 -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/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/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/stories/typography.stories.d.ts +8 -108
- package/dist/components/ui/stories/typography.stories.d.ts.map +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/components/ui/typography.d.ts +211 -474
- package/dist/components/ui/typography.d.ts.map +1 -1
- package/dist/index.js +5160 -9875
- 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/stories/typography.stories.tsx +261 -1512
- package/src/components/ui/theme-toggle.tsx +1 -3
- package/src/components/ui/theme.tsx +6 -1
- package/src/components/ui/typography.tsx +416 -1136
- package/src/styles/globals.css +57 -106
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Table
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
Table - A responsive data table component for displaying structured information Built on semantic HTML table elements with responsive scrolling and proper accessibility. Follows shadcn/ui patterns for data presentation and can be enhanced with TanStack Table for sorting, filtering, and pagination. Perfect for dashboards, data management, and structured content display.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { Table } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<Table
|
|
13
|
+
className="value"
|
|
14
|
+
summary="value"
|
|
15
|
+
"aria-label"="value"
|
|
16
|
+
"aria-describedby"="value"
|
|
17
|
+
role="value"
|
|
18
|
+
>
|
|
19
|
+
{/* Your content here */}
|
|
20
|
+
</Table>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Component Props
|
|
24
|
+
|
|
25
|
+
### className
|
|
26
|
+
- **Type**: `string`
|
|
27
|
+
- **Required**: No
|
|
28
|
+
- **Description**: No description available
|
|
29
|
+
|
|
30
|
+
### children
|
|
31
|
+
- **Type**: `React.ReactNode`
|
|
32
|
+
- **Required**: No
|
|
33
|
+
- **Description**: No description available
|
|
34
|
+
|
|
35
|
+
### summary
|
|
36
|
+
- **Type**: `string`
|
|
37
|
+
- **Required**: No
|
|
38
|
+
- **Description**: No description available
|
|
39
|
+
|
|
40
|
+
### "aria-label"
|
|
41
|
+
- **Type**: `string`
|
|
42
|
+
- **Required**: No
|
|
43
|
+
- **Description**: No description available
|
|
44
|
+
|
|
45
|
+
### "aria-describedby"
|
|
46
|
+
- **Type**: `string`
|
|
47
|
+
- **Required**: No
|
|
48
|
+
- **Description**: No description available
|
|
49
|
+
|
|
50
|
+
### role
|
|
51
|
+
- **Type**: `string`
|
|
52
|
+
- **Required**: No
|
|
53
|
+
- **Description**: No description available
|
|
54
|
+
|
|
55
|
+
## Examples
|
|
56
|
+
|
|
57
|
+
### Example 1
|
|
58
|
+
```tsx
|
|
59
|
+
// Basic table with Farcaster user data
|
|
60
|
+
<Table>
|
|
61
|
+
<TableCaption>Recent casts from your network</TableCaption>
|
|
62
|
+
<TableHeader>
|
|
63
|
+
<TableRow>
|
|
64
|
+
<TableHead>User</TableHead>
|
|
65
|
+
<TableHead>Channel</TableHead>
|
|
66
|
+
<TableHead>Content</TableHead>
|
|
67
|
+
<TableHead className="text-right">Reactions</TableHead>
|
|
68
|
+
</TableRow>
|
|
69
|
+
</TableHeader>
|
|
70
|
+
<TableBody>
|
|
71
|
+
<TableRow>
|
|
72
|
+
<TableCell className="font-medium">
|
|
73
|
+
### Example 2
|
|
74
|
+
```tsx
|
|
75
|
+
// Table with selection and actions
|
|
76
|
+
<Table>
|
|
77
|
+
<TableHeader>
|
|
78
|
+
<TableRow>
|
|
79
|
+
<TableHead className="w-[50px]">
|
|
80
|
+
<Checkbox />
|
|
81
|
+
</TableHead>
|
|
82
|
+
<TableHead>User</TableHead>
|
|
83
|
+
<TableHead>FID</TableHead>
|
|
84
|
+
<TableHead className="text-right">Actions</TableHead>
|
|
85
|
+
</TableRow>
|
|
86
|
+
</TableHeader>
|
|
87
|
+
<TableBody>
|
|
88
|
+
<TableRow data-state="selected">
|
|
89
|
+
<TableCell><Checkbox checked /></TableCell>
|
|
90
|
+
<TableCell>
|
|
91
|
+
### Example 3
|
|
92
|
+
```tsx
|
|
93
|
+
// Table with footer totals
|
|
94
|
+
<Table>
|
|
95
|
+
<TableBody>
|
|
96
|
+
<TableRow>
|
|
97
|
+
<TableCell>/farcaster</TableCell>
|
|
98
|
+
<TableCell className="text-right">5,234</TableCell>
|
|
99
|
+
</TableRow>
|
|
100
|
+
</TableBody>
|
|
101
|
+
<TableFooter>
|
|
102
|
+
<TableRow>
|
|
103
|
+
<TableCell>Total</TableCell>
|
|
104
|
+
<TableCell className="text-right">15,767</TableCell>
|
|
105
|
+
</TableRow>
|
|
106
|
+
</TableFooter>
|
|
107
|
+
</Table>
|
|
108
|
+
```
|
|
109
|
+
### Example 4
|
|
110
|
+
```tsx
|
|
111
|
+
// Table with custom attributes for data integration
|
|
112
|
+
<Table role="table" aria-label="User analytics dashboard">
|
|
113
|
+
<TableCaption>Showing 1-10 of 50 users</TableCaption>
|
|
114
|
+
<TableHeader>
|
|
115
|
+
<TableRow>
|
|
116
|
+
<TableHead scope="col">User</TableHead>
|
|
117
|
+
<TableHead scope="col">FID</TableHead>
|
|
118
|
+
<TableHead scope="col" className="text-right">Casts</TableHead>
|
|
119
|
+
</TableRow>
|
|
120
|
+
</TableHeader>
|
|
121
|
+
<TableBody>
|
|
122
|
+
<TableRow data-user-id="3">
|
|
123
|
+
<TableCell>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# TabsContent
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
Content panel that displays when its associated tab trigger is active. Each content panel is linked to a specific trigger via the `value` prop. Only one content panel is visible at a time, creating a clean tabbed interface. The component handles enter/exit animations and proper focus management when tabs change.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { TabsContent } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<TabsContent
|
|
13
|
+
value="value"
|
|
14
|
+
forceMount={true}
|
|
15
|
+
className="value"
|
|
16
|
+
asChild={true}
|
|
17
|
+
>
|
|
18
|
+
{/* Your content here */}
|
|
19
|
+
</TabsContent>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Component Props
|
|
23
|
+
|
|
24
|
+
### value
|
|
25
|
+
- **Type**: `string`
|
|
26
|
+
- **Required**: Yes
|
|
27
|
+
- **Description**: No description available
|
|
28
|
+
|
|
29
|
+
### forceMount
|
|
30
|
+
- **Type**: `boolean`
|
|
31
|
+
- **Required**: No
|
|
32
|
+
- **Description**: No description available
|
|
33
|
+
|
|
34
|
+
### className
|
|
35
|
+
- **Type**: `string`
|
|
36
|
+
- **Required**: No
|
|
37
|
+
- **Description**: No description available
|
|
38
|
+
|
|
39
|
+
### children
|
|
40
|
+
- **Type**: `React.ReactNode`
|
|
41
|
+
- **Required**: No
|
|
42
|
+
- **Description**: No description available
|
|
43
|
+
|
|
44
|
+
### asChild
|
|
45
|
+
- **Type**: `boolean`
|
|
46
|
+
- **Required**: No
|
|
47
|
+
- **Description**: No description available
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# TabsList
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
Container component that groups all tab trigger buttons together. Provides consistent styling and layout for tab triggers with a unified background and proper spacing. The list maintains the tab order and handles focus management within the tabbed interface.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { TabsList } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<TabsList
|
|
13
|
+
loop={true}
|
|
14
|
+
className="value"
|
|
15
|
+
asChild={true}
|
|
16
|
+
>
|
|
17
|
+
{/* Your content here */}
|
|
18
|
+
</TabsList>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Component Props
|
|
22
|
+
|
|
23
|
+
### loop
|
|
24
|
+
- **Type**: `boolean`
|
|
25
|
+
- **Required**: No
|
|
26
|
+
- **Description**: No description available
|
|
27
|
+
|
|
28
|
+
### className
|
|
29
|
+
- **Type**: `string`
|
|
30
|
+
- **Required**: No
|
|
31
|
+
- **Description**: No description available
|
|
32
|
+
|
|
33
|
+
### children
|
|
34
|
+
- **Type**: `React.ReactNode`
|
|
35
|
+
- **Required**: No
|
|
36
|
+
- **Description**: No description available
|
|
37
|
+
|
|
38
|
+
### asChild
|
|
39
|
+
- **Type**: `boolean`
|
|
40
|
+
- **Required**: No
|
|
41
|
+
- **Description**: No description available
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# TabsTrigger
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
Individual clickable button that activates its associated tab content. Each trigger is associated with a specific tab panel via the `value` prop. The component automatically handles active states, focus management, and accessibility attributes. Supports icons, text, and custom content.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { TabsTrigger } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<TabsTrigger
|
|
13
|
+
value="value"
|
|
14
|
+
disabled={true}
|
|
15
|
+
className="value"
|
|
16
|
+
asChild={true}
|
|
17
|
+
>
|
|
18
|
+
{/* Your content here */}
|
|
19
|
+
</TabsTrigger>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Component Props
|
|
23
|
+
|
|
24
|
+
### value
|
|
25
|
+
- **Type**: `string`
|
|
26
|
+
- **Required**: Yes
|
|
27
|
+
- **Description**: No description available
|
|
28
|
+
|
|
29
|
+
### disabled
|
|
30
|
+
- **Type**: `boolean`
|
|
31
|
+
- **Required**: No
|
|
32
|
+
- **Description**: No description available
|
|
33
|
+
|
|
34
|
+
### className
|
|
35
|
+
- **Type**: `string`
|
|
36
|
+
- **Required**: No
|
|
37
|
+
- **Description**: No description available
|
|
38
|
+
|
|
39
|
+
### children
|
|
40
|
+
- **Type**: `React.ReactNode`
|
|
41
|
+
- **Required**: No
|
|
42
|
+
- **Description**: No description available
|
|
43
|
+
|
|
44
|
+
### asChild
|
|
45
|
+
- **Type**: `boolean`
|
|
46
|
+
- **Required**: No
|
|
47
|
+
- **Description**: No description available
|
package/.llm/tabs.llm.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Tabs
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
A tabbed interface component for organizing content into multiple sections. Tabs provide an intuitive way to organize and display content in separate panels, with only one panel visible at a time. Built on Radix UI's robust accessibility foundation with full keyboard navigation, focus management, and screen reader support. The component supports both controlled and uncontrolled usage patterns, allowing for flexible integration in various application contexts. Each tab consists of a trigger (button) that activates its corresponding content panel.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { Tabs } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<Tabs
|
|
13
|
+
defaultValue="value"
|
|
14
|
+
value="value"
|
|
15
|
+
onValueChange={handleValueChange}
|
|
16
|
+
orientation={value}
|
|
17
|
+
dir={value}
|
|
18
|
+
activationMode={value}
|
|
19
|
+
className="value"
|
|
20
|
+
asChild={true}
|
|
21
|
+
>
|
|
22
|
+
{/* Your content here */}
|
|
23
|
+
</Tabs>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Component Props
|
|
27
|
+
|
|
28
|
+
### defaultValue
|
|
29
|
+
- **Type**: `string`
|
|
30
|
+
- **Required**: No
|
|
31
|
+
- **Description**: No description available
|
|
32
|
+
|
|
33
|
+
### value
|
|
34
|
+
- **Type**: `string`
|
|
35
|
+
- **Required**: No
|
|
36
|
+
- **Description**: No description available
|
|
37
|
+
|
|
38
|
+
### onValueChange
|
|
39
|
+
- **Type**: `(value: string) => void`
|
|
40
|
+
- **Required**: No
|
|
41
|
+
- **Description**: No description available
|
|
42
|
+
|
|
43
|
+
### orientation
|
|
44
|
+
- **Type**: `"horizontal" | "vertical"`
|
|
45
|
+
- **Required**: No
|
|
46
|
+
- **Description**: No description available
|
|
47
|
+
|
|
48
|
+
### dir
|
|
49
|
+
- **Type**: `"ltr" | "rtl"`
|
|
50
|
+
- **Required**: No
|
|
51
|
+
- **Description**: No description available
|
|
52
|
+
|
|
53
|
+
### activationMode
|
|
54
|
+
- **Type**: `"automatic" | "manual"`
|
|
55
|
+
- **Required**: No
|
|
56
|
+
- **Description**: No description available
|
|
57
|
+
|
|
58
|
+
### className
|
|
59
|
+
- **Type**: `string`
|
|
60
|
+
- **Required**: No
|
|
61
|
+
- **Description**: No description available
|
|
62
|
+
|
|
63
|
+
### children
|
|
64
|
+
- **Type**: `React.ReactNode`
|
|
65
|
+
- **Required**: No
|
|
66
|
+
- **Description**: No description available
|
|
67
|
+
|
|
68
|
+
### asChild
|
|
69
|
+
- **Type**: `boolean`
|
|
70
|
+
- **Required**: No
|
|
71
|
+
- **Description**: No description available
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
# TextField
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
TextField - Complete form field with label, input, and descriptive text A comprehensive form field component that combines Input and Label components with additional helper text and error handling capabilities. Automatically manages accessibility attributes, ID generation, and ARIA relationships to ensure forms are usable by all users including those using assistive technologies. Built on top of the Input and Label primitives, TextField provides a complete form field solution with consistent styling, proper semantic markup, and enhanced UX features. Supports all HTML input types while adding form validation states, descriptive text, and automatic accessibility compliance.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { TextField } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<TextField
|
|
13
|
+
label="value"
|
|
14
|
+
helperText="value"
|
|
15
|
+
error="value"
|
|
16
|
+
required={true}
|
|
17
|
+
id="value"
|
|
18
|
+
type={value}
|
|
19
|
+
placeholder="value"
|
|
20
|
+
value={value}
|
|
21
|
+
defaultValue={value}
|
|
22
|
+
disabled={true}
|
|
23
|
+
readOnly={true}
|
|
24
|
+
name="value"
|
|
25
|
+
autoComplete="value"
|
|
26
|
+
autoFocus={true}
|
|
27
|
+
maxLength={0}
|
|
28
|
+
minLength={0}
|
|
29
|
+
pattern="value"
|
|
30
|
+
min={value}
|
|
31
|
+
max={value}
|
|
32
|
+
step={value}
|
|
33
|
+
onChange={handleChange}
|
|
34
|
+
onFocus={handleFocus}
|
|
35
|
+
onBlur={handleBlur}
|
|
36
|
+
onKeyDown={handleKeyDown}
|
|
37
|
+
onKeyUp={handleKeyUp}
|
|
38
|
+
className="value"
|
|
39
|
+
/>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Component Props
|
|
43
|
+
|
|
44
|
+
### label
|
|
45
|
+
- **Type**: `string`
|
|
46
|
+
- **Required**: No
|
|
47
|
+
- **Description**: No description available
|
|
48
|
+
|
|
49
|
+
### helperText
|
|
50
|
+
- **Type**: `string`
|
|
51
|
+
- **Required**: No
|
|
52
|
+
- **Description**: No description available
|
|
53
|
+
|
|
54
|
+
### error
|
|
55
|
+
- **Type**: `string`
|
|
56
|
+
- **Required**: No
|
|
57
|
+
- **Description**: No description available
|
|
58
|
+
|
|
59
|
+
### required
|
|
60
|
+
- **Type**: `boolean`
|
|
61
|
+
- **Required**: No
|
|
62
|
+
- **Description**: No description available
|
|
63
|
+
|
|
64
|
+
### id
|
|
65
|
+
- **Type**: `string`
|
|
66
|
+
- **Required**: No
|
|
67
|
+
- **Description**: No description available
|
|
68
|
+
|
|
69
|
+
### type
|
|
70
|
+
- **Type**: `React.HTMLInputTypeAttribute`
|
|
71
|
+
- **Required**: No
|
|
72
|
+
- **Description**: No description available
|
|
73
|
+
|
|
74
|
+
### placeholder
|
|
75
|
+
- **Type**: `string`
|
|
76
|
+
- **Required**: No
|
|
77
|
+
- **Description**: No description available
|
|
78
|
+
|
|
79
|
+
### value
|
|
80
|
+
- **Type**: `string | ReadonlyArray<string> | number`
|
|
81
|
+
- **Required**: No
|
|
82
|
+
- **Description**: No description available
|
|
83
|
+
|
|
84
|
+
### defaultValue
|
|
85
|
+
- **Type**: `string | ReadonlyArray<string> | number`
|
|
86
|
+
- **Required**: No
|
|
87
|
+
- **Description**: No description available
|
|
88
|
+
|
|
89
|
+
### disabled
|
|
90
|
+
- **Type**: `boolean`
|
|
91
|
+
- **Required**: No
|
|
92
|
+
- **Description**: No description available
|
|
93
|
+
|
|
94
|
+
### readOnly
|
|
95
|
+
- **Type**: `boolean`
|
|
96
|
+
- **Required**: No
|
|
97
|
+
- **Description**: No description available
|
|
98
|
+
|
|
99
|
+
### name
|
|
100
|
+
- **Type**: `string`
|
|
101
|
+
- **Required**: No
|
|
102
|
+
- **Description**: No description available
|
|
103
|
+
|
|
104
|
+
### autoComplete
|
|
105
|
+
- **Type**: `string`
|
|
106
|
+
- **Required**: No
|
|
107
|
+
- **Description**: No description available
|
|
108
|
+
|
|
109
|
+
### autoFocus
|
|
110
|
+
- **Type**: `boolean`
|
|
111
|
+
- **Required**: No
|
|
112
|
+
- **Description**: No description available
|
|
113
|
+
|
|
114
|
+
### maxLength
|
|
115
|
+
- **Type**: `number`
|
|
116
|
+
- **Required**: No
|
|
117
|
+
- **Description**: No description available
|
|
118
|
+
|
|
119
|
+
### minLength
|
|
120
|
+
- **Type**: `number`
|
|
121
|
+
- **Required**: No
|
|
122
|
+
- **Description**: No description available
|
|
123
|
+
|
|
124
|
+
### pattern
|
|
125
|
+
- **Type**: `string`
|
|
126
|
+
- **Required**: No
|
|
127
|
+
- **Description**: No description available
|
|
128
|
+
|
|
129
|
+
### min
|
|
130
|
+
- **Type**: `string | number`
|
|
131
|
+
- **Required**: No
|
|
132
|
+
- **Description**: No description available
|
|
133
|
+
|
|
134
|
+
### max
|
|
135
|
+
- **Type**: `string | number`
|
|
136
|
+
- **Required**: No
|
|
137
|
+
- **Description**: No description available
|
|
138
|
+
|
|
139
|
+
### step
|
|
140
|
+
- **Type**: `string | number`
|
|
141
|
+
- **Required**: No
|
|
142
|
+
- **Description**: No description available
|
|
143
|
+
|
|
144
|
+
### onChange
|
|
145
|
+
- **Type**: `(event: React.ChangeEvent<HTMLInputElement>) => void`
|
|
146
|
+
- **Required**: No
|
|
147
|
+
- **Description**: No description available
|
|
148
|
+
|
|
149
|
+
### onFocus
|
|
150
|
+
- **Type**: `(event: React.FocusEvent<HTMLInputElement>) => void`
|
|
151
|
+
- **Required**: No
|
|
152
|
+
- **Description**: No description available
|
|
153
|
+
|
|
154
|
+
### onBlur
|
|
155
|
+
- **Type**: `(event: React.FocusEvent<HTMLInputElement>) => void`
|
|
156
|
+
- **Required**: No
|
|
157
|
+
- **Description**: No description available
|
|
158
|
+
|
|
159
|
+
### onKeyDown
|
|
160
|
+
- **Type**: `(event: React.KeyboardEvent<HTMLInputElement>) => void`
|
|
161
|
+
- **Required**: No
|
|
162
|
+
- **Description**: No description available
|
|
163
|
+
|
|
164
|
+
### onKeyUp
|
|
165
|
+
- **Type**: `(event: React.KeyboardEvent<HTMLInputElement>) => void`
|
|
166
|
+
- **Required**: No
|
|
167
|
+
- **Description**: No description available
|
|
168
|
+
|
|
169
|
+
### className
|
|
170
|
+
- **Type**: `string`
|
|
171
|
+
- **Required**: No
|
|
172
|
+
- **Description**: No description available
|
|
173
|
+
|
|
174
|
+
## Examples
|
|
175
|
+
|
|
176
|
+
### Example 1
|
|
177
|
+
```tsx
|
|
178
|
+
// Basic text input with label
|
|
179
|
+
<TextField
|
|
180
|
+
label="Email Address"
|
|
181
|
+
type="email"
|
|
182
|
+
placeholder="Enter your email"
|
|
183
|
+
name="email"
|
|
184
|
+
/>
|
|
185
|
+
```
|
|
186
|
+
### Example 2
|
|
187
|
+
```tsx
|
|
188
|
+
// Required field with helper text
|
|
189
|
+
<TextField
|
|
190
|
+
label="Username"
|
|
191
|
+
placeholder="
|
|
192
|
+
### Example 3
|
|
193
|
+
```tsx
|
|
194
|
+
// Password field with validation error
|
|
195
|
+
<TextField
|
|
196
|
+
label="Password"
|
|
197
|
+
type="password"
|
|
198
|
+
required
|
|
199
|
+
error="Password must be at least 8 characters long"
|
|
200
|
+
value={password}
|
|
201
|
+
onChange={(e) => setPassword(e.target.value)}
|
|
202
|
+
minLength={8}
|
|
203
|
+
autoComplete="new-password"
|
|
204
|
+
/>
|
|
205
|
+
```
|
|
206
|
+
### Example 4
|
|
207
|
+
```tsx
|
|
208
|
+
// Controlled component with real-time validation
|
|
209
|
+
const [email, setEmail] = useState("");
|
|
210
|
+
const [error, setError] = useState("");
|
|
211
|
+
const validateEmail = (value: string) => {
|
|
212
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
213
|
+
if (!emailRegex.test(value)) {
|
|
214
|
+
setError("Please enter a valid email address");
|
|
215
|
+
} else {
|
|
216
|
+
setError("");
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
<TextField
|
|
220
|
+
label="Email"
|
|
221
|
+
type="email"
|
|
222
|
+
value={email}
|
|
223
|
+
onChange={(e) => {
|
|
224
|
+
setEmail(e.target.value);
|
|
225
|
+
validateEmail(e.target.value);
|
|
226
|
+
}}
|
|
227
|
+
onBlur={(e) => validateEmail(e.target.value)}
|
|
228
|
+
error={error}
|
|
229
|
+
required
|
|
230
|
+
autoComplete="email"
|
|
231
|
+
/>
|
|
232
|
+
```
|
|
233
|
+
### Example 5
|
|
234
|
+
```tsx
|
|
235
|
+
// Number input with constraints
|
|
236
|
+
<TextField
|
|
237
|
+
label="Age"
|
|
238
|
+
type="number"
|
|
239
|
+
min={0}
|
|
240
|
+
max={120}
|
|
241
|
+
step={1}
|
|
242
|
+
helperText="Enter your age in years"
|
|
243
|
+
placeholder="25"
|
|
244
|
+
/>
|
|
245
|
+
```
|
|
246
|
+
### Example 6
|
|
247
|
+
```tsx
|
|
248
|
+
// Search input with custom styling
|
|
249
|
+
<TextField
|
|
250
|
+
label="Search"
|
|
251
|
+
type="search"
|
|
252
|
+
placeholder="Search products..."
|
|
253
|
+
className="max-w-md"
|
|
254
|
+
onKeyDown={(e) => {
|
|
255
|
+
if (e.key === 'Enter') {
|
|
256
|
+
handleSearch(e.currentTarget.value);
|
|
257
|
+
}
|
|
258
|
+
}}
|
|
259
|
+
/>
|
|
260
|
+
```
|
|
261
|
+
### Example 7
|
|
262
|
+
```tsx
|
|
263
|
+
// Form integration with React Hook Form
|
|
264
|
+
const { register, formState: { errors } } = useForm();
|
|
265
|
+
<form onSubmit={handleSubmit(onSubmit)}>
|
|
266
|
+
<TextField
|
|
267
|
+
label="Full Name"
|
|
268
|
+
{...register("fullName", { required: "Full name is required" })}
|
|
269
|
+
error={errors.fullName?.message}
|
|
270
|
+
helperText="Enter your first and last name"
|
|
271
|
+
/>
|
|
272
|
+
<TextField
|
|
273
|
+
label="Phone Number"
|
|
274
|
+
type="tel"
|
|
275
|
+
{...register("phone", {
|
|
276
|
+
pattern: {
|
|
277
|
+
value: /^[\+]?[1-9][\d]{0,15}$/,
|
|
278
|
+
message: "Please enter a valid phone number"
|
|
279
|
+
}
|
|
280
|
+
})}
|
|
281
|
+
error={errors.phone?.message}
|
|
282
|
+
autoComplete="tel"
|
|
283
|
+
/>
|
|
284
|
+
</form>
|
|
285
|
+
```
|
|
286
|
+
### Example 8
|
|
287
|
+
```tsx
|
|
288
|
+
// File input with custom validation
|
|
289
|
+
<TextField
|
|
290
|
+
label="Profile Picture"
|
|
291
|
+
type="file"
|
|
292
|
+
accept="image/*"
|
|
293
|
+
helperText="Upload a PNG, JPG or GIF (max 5MB)"
|
|
294
|
+
onChange={(e) => {
|
|
295
|
+
const file = e.target.files?.[0];
|
|
296
|
+
if (file && file.size > 5 * 1024 * 1024) {
|
|
297
|
+
setError("File size must be less than 5MB");
|
|
298
|
+
} else {
|
|
299
|
+
setError("");
|
|
300
|
+
handleFileUpload(file);
|
|
301
|
+
}
|
|
302
|
+
}}
|
|
303
|
+
error={fileError}
|
|
304
|
+
/>
|
|
305
|
+
```
|
|
306
|
+
### Example 9
|
|
307
|
+
```tsx
|
|
308
|
+
// Date input with range constraints
|
|
309
|
+
<TextField
|
|
310
|
+
label="Birth Date"
|
|
311
|
+
type="date"
|
|
312
|
+
min="1900-01-01"
|
|
313
|
+
max={new Date().toISOString().split('T')[0]}
|
|
314
|
+
helperText="You must be 18 or older to register"
|
|
315
|
+
required
|
|
316
|
+
/>
|
|
317
|
+
```
|
|
318
|
+
### Example 10
|
|
319
|
+
```tsx
|
|
320
|
+
// Disabled field with explanation
|
|
321
|
+
<TextField
|
|
322
|
+
label="Account ID"
|
|
323
|
+
value="ACC-12345"
|
|
324
|
+
disabled
|
|
325
|
+
helperText="This value is automatically generated and cannot be changed"
|
|
326
|
+
/>
|
|
327
|
+
```
|