@neynar/ui 1.0.1 → 1.0.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.
- package/context7.json +17 -0
- package/llm/components/accordion.llm.md +205 -0
- package/llm/components/alert-dialog.llm.md +289 -0
- package/llm/components/alert.llm.md +310 -0
- package/llm/components/aspect-ratio.llm.md +110 -0
- package/llm/components/avatar.llm.md +282 -0
- package/llm/components/badge.llm.md +185 -0
- package/llm/components/blockquote.llm.md +86 -0
- package/llm/components/breadcrumb.llm.md +245 -0
- package/llm/components/button-group.llm.md +248 -0
- package/llm/components/button.llm.md +247 -0
- package/llm/components/calendar.llm.md +252 -0
- package/llm/components/card.llm.md +356 -0
- package/llm/components/carousel.llm.md +281 -0
- package/llm/components/chart.llm.md +278 -0
- package/llm/components/checkbox.llm.md +234 -0
- package/llm/components/code.llm.md +75 -0
- package/llm/components/collapsible.llm.md +271 -0
- package/llm/components/color-mode.llm.md +196 -0
- package/llm/components/combobox.llm.md +346 -0
- package/llm/components/command.llm.md +353 -0
- package/llm/components/context-menu.llm.md +368 -0
- package/llm/components/dialog.llm.md +283 -0
- package/llm/components/drawer.llm.md +326 -0
- package/llm/components/dropdown-menu.llm.md +404 -0
- package/llm/components/empty.llm.md +282 -0
- package/llm/components/field.llm.md +303 -0
- package/llm/components/first-light.llm.md +129 -0
- package/llm/components/hover-card.llm.md +278 -0
- package/llm/components/input-group.llm.md +334 -0
- package/llm/components/input-otp.llm.md +270 -0
- package/llm/components/input.llm.md +197 -0
- package/llm/components/item.llm.md +347 -0
- package/llm/components/kbd.llm.md +221 -0
- package/llm/components/label.llm.md +219 -0
- package/llm/components/menubar.llm.md +378 -0
- package/llm/components/navigation-menu.llm.md +320 -0
- package/llm/components/pagination.llm.md +337 -0
- package/llm/components/popover.llm.md +278 -0
- package/llm/components/progress.llm.md +259 -0
- package/llm/components/radio-group.llm.md +269 -0
- package/llm/components/resizable.llm.md +222 -0
- package/llm/components/scroll-area.llm.md +290 -0
- package/llm/components/select.llm.md +338 -0
- package/llm/components/separator.llm.md +129 -0
- package/llm/components/sheet.llm.md +275 -0
- package/llm/components/sidebar.llm.md +528 -0
- package/llm/components/skeleton.llm.md +140 -0
- package/llm/components/slider.llm.md +213 -0
- package/llm/components/sonner.llm.md +299 -0
- package/llm/components/spinner.llm.md +187 -0
- package/llm/components/switch.llm.md +258 -0
- package/llm/components/table.llm.md +334 -0
- package/llm/components/tabs.llm.md +245 -0
- package/llm/components/text.llm.md +108 -0
- package/llm/components/textarea.llm.md +236 -0
- package/llm/components/title.llm.md +88 -0
- package/llm/components/toggle-group.llm.md +228 -0
- package/llm/components/toggle.llm.md +235 -0
- package/llm/components/tooltip.llm.md +191 -0
- package/llm/contributing.llm.md +273 -0
- package/llm/hooks.llm.md +91 -0
- package/llm/index.llm.md +178 -0
- package/llm/theming.llm.md +381 -0
- package/llm/utilities.llm.md +97 -0
- package/llms-full.txt +15995 -0
- package/llms.txt +182 -0
- package/package.json +5 -1
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
# Contributing to @neynar/ui (LLM Guide)
|
|
2
|
+
|
|
3
|
+
Technical reference for AI assistants modifying this package.
|
|
4
|
+
|
|
5
|
+
## Critical Rules
|
|
6
|
+
|
|
7
|
+
1. **Never export defaults** - Named exports only
|
|
8
|
+
2. **Always add `data-slot`** - Root element of every component
|
|
9
|
+
3. **Use `type` not `interface`** - For prop definitions
|
|
10
|
+
4. **`"use client"` only when needed** - Only for components using React hooks
|
|
11
|
+
5. **Run type-check** - `yarn type-check` must pass before committing
|
|
12
|
+
|
|
13
|
+
## File Locations
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
src/
|
|
17
|
+
├── components/
|
|
18
|
+
│ ├── ui/ # Base UI components
|
|
19
|
+
│ │ ├── button.tsx
|
|
20
|
+
│ │ └── stories/ # Storybook stories
|
|
21
|
+
│ │ └── button.stories.tsx
|
|
22
|
+
│ └── neynar/ # Neynar-specific components
|
|
23
|
+
│ ├── typography/
|
|
24
|
+
│ ├── color-mode/
|
|
25
|
+
│ └── first-light/
|
|
26
|
+
├── hooks/ # Custom hooks
|
|
27
|
+
├── lib/ # Utilities (cn, variants)
|
|
28
|
+
└── styles/ # CSS and themes
|
|
29
|
+
└── themes/
|
|
30
|
+
|
|
31
|
+
llm/ # LLM documentation
|
|
32
|
+
├── components/ # Per-component docs
|
|
33
|
+
├── index.llm.md # Package overview
|
|
34
|
+
├── hooks.llm.md
|
|
35
|
+
├── utilities.llm.md
|
|
36
|
+
└── theming.llm.md
|
|
37
|
+
|
|
38
|
+
package.json # Exports map (auto-generated)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Component Template
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
// Add "use client" ONLY if component uses hooks
|
|
45
|
+
import { Primitive } from "@base-ui/react/primitive"
|
|
46
|
+
import { cva, type VariantProps } from "class-variance-authority"
|
|
47
|
+
import { cn } from "@/lib/utils"
|
|
48
|
+
|
|
49
|
+
const componentVariants = cva("base-classes", {
|
|
50
|
+
variants: {
|
|
51
|
+
variant: {
|
|
52
|
+
default: "...",
|
|
53
|
+
secondary: "...",
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
defaultVariants: {
|
|
57
|
+
variant: "default",
|
|
58
|
+
},
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
type ComponentProps = Primitive.Props & VariantProps<typeof componentVariants>
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Brief description.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```tsx
|
|
68
|
+
* <Component>Content</Component>
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
function Component({ className, variant, ...props }: ComponentProps) {
|
|
72
|
+
return (
|
|
73
|
+
<Primitive
|
|
74
|
+
data-slot="component"
|
|
75
|
+
className={cn(componentVariants({ variant, className }))}
|
|
76
|
+
{...props}
|
|
77
|
+
/>
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export { Component, componentVariants, type ComponentProps }
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Story Template
|
|
85
|
+
|
|
86
|
+
```tsx
|
|
87
|
+
import type { Meta, StoryObj } from "@storybook/react"
|
|
88
|
+
import { Component } from "../component"
|
|
89
|
+
|
|
90
|
+
const meta: Meta<typeof Component> = {
|
|
91
|
+
title: "UI/Component",
|
|
92
|
+
component: Component,
|
|
93
|
+
tags: ["autodocs"],
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export default meta
|
|
97
|
+
type Story = StoryObj<typeof Component>
|
|
98
|
+
|
|
99
|
+
export const Default: Story = {
|
|
100
|
+
args: { children: "Example" },
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export const Variants: Story = {
|
|
104
|
+
render: () => (
|
|
105
|
+
<div className="flex gap-4">
|
|
106
|
+
<Component variant="default">Default</Component>
|
|
107
|
+
<Component variant="secondary">Secondary</Component>
|
|
108
|
+
</div>
|
|
109
|
+
),
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## LLM Documentation Template
|
|
114
|
+
|
|
115
|
+
```markdown
|
|
116
|
+
# ComponentName
|
|
117
|
+
|
|
118
|
+
One sentence description.
|
|
119
|
+
|
|
120
|
+
## Import
|
|
121
|
+
|
|
122
|
+
\`\`\`tsx
|
|
123
|
+
import { Component } from "@neynar/ui/component"
|
|
124
|
+
\`\`\`
|
|
125
|
+
|
|
126
|
+
## Usage
|
|
127
|
+
|
|
128
|
+
\`\`\`tsx
|
|
129
|
+
<Component>Content</Component>
|
|
130
|
+
\`\`\`
|
|
131
|
+
|
|
132
|
+
## Props
|
|
133
|
+
|
|
134
|
+
| Prop | Type | Default | Description |
|
|
135
|
+
|------|------|---------|-------------|
|
|
136
|
+
| variant | "default" \| "secondary" | "default" | Visual style |
|
|
137
|
+
|
|
138
|
+
## Examples
|
|
139
|
+
|
|
140
|
+
### With variant
|
|
141
|
+
\`\`\`tsx
|
|
142
|
+
<Component variant="secondary">Secondary</Component>
|
|
143
|
+
\`\`\`
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## data-slot Convention
|
|
147
|
+
|
|
148
|
+
Every component root element MUST have `data-slot`:
|
|
149
|
+
|
|
150
|
+
```tsx
|
|
151
|
+
// Single component
|
|
152
|
+
<Button data-slot="button" />
|
|
153
|
+
|
|
154
|
+
// Compound component
|
|
155
|
+
<Dialog data-slot="dialog">
|
|
156
|
+
<DialogTrigger data-slot="dialog-trigger" />
|
|
157
|
+
<DialogContent data-slot="dialog-content">
|
|
158
|
+
<DialogHeader data-slot="dialog-header" />
|
|
159
|
+
<DialogTitle data-slot="dialog-title" />
|
|
160
|
+
<DialogDescription data-slot="dialog-description" />
|
|
161
|
+
<DialogFooter data-slot="dialog-footer" />
|
|
162
|
+
</DialogContent>
|
|
163
|
+
</Dialog>
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## "use client" Rules
|
|
167
|
+
|
|
168
|
+
**ADD** when component:
|
|
169
|
+
- Uses `useState`, `useEffect`, `useRef`, `useContext`
|
|
170
|
+
- Uses custom hooks (`useColorMode`, `useMobile`)
|
|
171
|
+
- Has event handlers that need client hydration
|
|
172
|
+
|
|
173
|
+
**OMIT** when component:
|
|
174
|
+
- Is a pure wrapper around Base UI primitive
|
|
175
|
+
- Only passes props through
|
|
176
|
+
- Has no React hooks
|
|
177
|
+
|
|
178
|
+
Current components with `"use client"`:
|
|
179
|
+
- avatar, calendar, carousel, chart, collapsible
|
|
180
|
+
- combobox, command, dialog, drawer, field
|
|
181
|
+
- hover-card, input-otp, label, progress, resizable
|
|
182
|
+
- select, sidebar, slider, switch, tabs
|
|
183
|
+
- toggle-group, tooltip
|
|
184
|
+
- color-mode/*, first-light/*
|
|
185
|
+
|
|
186
|
+
## Semantic Color Tokens
|
|
187
|
+
|
|
188
|
+
```css
|
|
189
|
+
/* Backgrounds */
|
|
190
|
+
bg-background, bg-card, bg-popover, bg-muted, bg-accent
|
|
191
|
+
|
|
192
|
+
/* Foregrounds */
|
|
193
|
+
text-foreground, text-muted-foreground, text-card-foreground
|
|
194
|
+
|
|
195
|
+
/* Status */
|
|
196
|
+
bg-primary, text-primary-foreground
|
|
197
|
+
bg-secondary, text-secondary-foreground
|
|
198
|
+
bg-destructive, text-destructive
|
|
199
|
+
bg-success, text-success
|
|
200
|
+
bg-warning, text-warning
|
|
201
|
+
bg-info, text-info
|
|
202
|
+
|
|
203
|
+
/* Borders */
|
|
204
|
+
border-border, border-input, border-ring
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Package.json Exports
|
|
208
|
+
|
|
209
|
+
Exports are auto-generated by `scripts/generate-exports.ts` during build.
|
|
210
|
+
|
|
211
|
+
Each component gets an entry:
|
|
212
|
+
```json
|
|
213
|
+
{
|
|
214
|
+
"./button": {
|
|
215
|
+
"types": "./dist/components/ui/button.d.ts",
|
|
216
|
+
"import": "./dist/components/ui/button.js"
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Validation Commands
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
# Must pass before commit
|
|
225
|
+
yarn type-check # TypeScript
|
|
226
|
+
yarn lint # ESLint
|
|
227
|
+
yarn build # Build check
|
|
228
|
+
|
|
229
|
+
# Development
|
|
230
|
+
yarn storybook # Visual testing
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## Common Patterns
|
|
234
|
+
|
|
235
|
+
### Polymorphism with `render` prop
|
|
236
|
+
```tsx
|
|
237
|
+
<Button render={<a href="/link" />}>Link Button</Button>
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Compound Components
|
|
241
|
+
```tsx
|
|
242
|
+
<Dialog>
|
|
243
|
+
<DialogTrigger>Open</DialogTrigger>
|
|
244
|
+
<DialogContent>
|
|
245
|
+
<DialogTitle>Title</DialogTitle>
|
|
246
|
+
<DialogDescription>Description</DialogDescription>
|
|
247
|
+
</DialogContent>
|
|
248
|
+
</Dialog>
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Forwarding refs (handled by Base UI)
|
|
252
|
+
```tsx
|
|
253
|
+
// Base UI handles ref forwarding automatically
|
|
254
|
+
// No need for forwardRef wrapper
|
|
255
|
+
function Component(props: ComponentProps) {
|
|
256
|
+
return <Primitive {...props} />
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### Icon sizing
|
|
261
|
+
```tsx
|
|
262
|
+
// Icons auto-size via [&_svg:not([class*='size-'])]:size-4
|
|
263
|
+
<Button>
|
|
264
|
+
<PlusIcon /> {/* Inherits size-4 */}
|
|
265
|
+
Add Item
|
|
266
|
+
</Button>
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## Debugging Tips
|
|
270
|
+
|
|
271
|
+
- Check `data-slot` attributes in DevTools for component boundaries
|
|
272
|
+
- Use `?path=/story/ui-button--default` in Storybook URL
|
|
273
|
+
- Run `yarn type-check 2>&1 | head -20` for focused error output
|
package/llm/hooks.llm.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Hooks
|
|
2
|
+
|
|
3
|
+
React hooks provided by @neynar/ui.
|
|
4
|
+
|
|
5
|
+
## useIsMobile
|
|
6
|
+
|
|
7
|
+
Detects mobile viewport using `matchMedia`. Returns reactive boolean.
|
|
8
|
+
|
|
9
|
+
### Import
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { useIsMobile } from "@neynar/ui/use-mobile"
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### Returns
|
|
16
|
+
|
|
17
|
+
| Type | Description |
|
|
18
|
+
|------|-------------|
|
|
19
|
+
| `boolean` | `true` when viewport < 768px, `false` otherwise |
|
|
20
|
+
|
|
21
|
+
### Behavior
|
|
22
|
+
|
|
23
|
+
- Returns `false` during SSR (hydration-safe)
|
|
24
|
+
- Updates reactively on viewport resize
|
|
25
|
+
- Uses `matchMedia` for performance (no resize listener spam)
|
|
26
|
+
- Breakpoint: 768px (CSS `md:` equivalent)
|
|
27
|
+
|
|
28
|
+
### Example: Responsive Navigation
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
import { useIsMobile } from "@neynar/ui/use-mobile"
|
|
32
|
+
|
|
33
|
+
function ResponsiveNav() {
|
|
34
|
+
const isMobile = useIsMobile()
|
|
35
|
+
return isMobile ? <MobileNav /> : <DesktopNav />
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Example: Responsive Modal
|
|
40
|
+
|
|
41
|
+
Use Sheet for mobile, Dialog for desktop:
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import { useIsMobile } from "@neynar/ui/use-mobile"
|
|
45
|
+
import { Sheet, SheetContent } from "@neynar/ui/sheet"
|
|
46
|
+
import { Dialog, DialogContent } from "@neynar/ui/dialog"
|
|
47
|
+
|
|
48
|
+
function ResponsiveModal({ open, onOpenChange, children }) {
|
|
49
|
+
const isMobile = useIsMobile()
|
|
50
|
+
|
|
51
|
+
if (isMobile) {
|
|
52
|
+
return (
|
|
53
|
+
<Sheet open={open} onOpenChange={onOpenChange}>
|
|
54
|
+
<SheetContent side="bottom">{children}</SheetContent>
|
|
55
|
+
</Sheet>
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
<Dialog open={open} onOpenChange={onOpenChange}>
|
|
61
|
+
<DialogContent>{children}</DialogContent>
|
|
62
|
+
</Dialog>
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Example: Conditional Rendering
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
import { useIsMobile } from "@neynar/ui/use-mobile"
|
|
71
|
+
|
|
72
|
+
function Dashboard() {
|
|
73
|
+
const isMobile = useIsMobile()
|
|
74
|
+
|
|
75
|
+
return (
|
|
76
|
+
<div className="flex">
|
|
77
|
+
{!isMobile && <Sidebar />}
|
|
78
|
+
<main className="flex-1">
|
|
79
|
+
<Content />
|
|
80
|
+
</main>
|
|
81
|
+
{isMobile && <MobileBottomNav />}
|
|
82
|
+
</div>
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Related
|
|
88
|
+
|
|
89
|
+
- [Sheet](./components/sheet.llm.md) - Often used with mobile detection for bottom sheets
|
|
90
|
+
- [Drawer](./components/drawer.llm.md) - Mobile-first bottom sheet component
|
|
91
|
+
- [Sidebar](./components/sidebar.llm.md) - Responsive sidebar that can use mobile detection
|
package/llm/index.llm.md
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# @neynar/ui
|
|
2
|
+
|
|
3
|
+
> React component library built on Base UI primitives + Tailwind CSS v4. 53 production-ready components with per-component imports, SSR-safe dark mode, and two visual themes.
|
|
4
|
+
|
|
5
|
+
## For AI Agents
|
|
6
|
+
|
|
7
|
+
**How to use this documentation:**
|
|
8
|
+
|
|
9
|
+
1. **Start here** for quick reference and component discovery
|
|
10
|
+
2. **Load specific component docs** from `./components/{name}.llm.md` when working with that component
|
|
11
|
+
3. **Load theming.llm.md** when dealing with themes, colors, or dark mode
|
|
12
|
+
4. **Each doc is self-contained** with imports, props, examples, and accessibility info
|
|
13
|
+
|
|
14
|
+
**Key patterns to remember:**
|
|
15
|
+
- Import path: `import { X } from "@neynar/ui/x"` (lowercase, kebab-case)
|
|
16
|
+
- All components have `data-slot` attributes for CSS targeting
|
|
17
|
+
- Compound components export multiple parts from same path
|
|
18
|
+
- `render` prop (not `asChild`) for polymorphism
|
|
19
|
+
|
|
20
|
+
## Quick Start
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import { Button } from "@neynar/ui/button";
|
|
24
|
+
import { Card, CardHeader, CardContent } from "@neynar/ui/card";
|
|
25
|
+
import "@neynar/ui/themes/purple-dawn";
|
|
26
|
+
|
|
27
|
+
export function App() {
|
|
28
|
+
return (
|
|
29
|
+
<Card>
|
|
30
|
+
<CardHeader>Welcome</CardHeader>
|
|
31
|
+
<CardContent>
|
|
32
|
+
<Button>Get Started</Button>
|
|
33
|
+
</CardContent>
|
|
34
|
+
</Card>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Import Pattern
|
|
40
|
+
|
|
41
|
+
Each component has its own entry point:
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import { Button } from "@neynar/ui/button";
|
|
45
|
+
import { Dialog, DialogTrigger, DialogContent } from "@neynar/ui/dialog";
|
|
46
|
+
import { Input } from "@neynar/ui/input";
|
|
47
|
+
import { cn } from "@neynar/ui/utils";
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Themes
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
// Purple Dawn - elegant translucent surfaces (default)
|
|
54
|
+
import "@neynar/ui/themes/purple-dawn";
|
|
55
|
+
|
|
56
|
+
// First Light - hand-drawn wireframe aesthetic
|
|
57
|
+
import "@neynar/ui/themes/first-light";
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Color Mode
|
|
61
|
+
|
|
62
|
+
SSR-safe dark mode with automatic system detection:
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
import { ColorModeInitializer, ColorModeToggle } from "@neynar/ui/color-mode";
|
|
66
|
+
|
|
67
|
+
// In layout.tsx <head>
|
|
68
|
+
<ColorModeInitializer />
|
|
69
|
+
|
|
70
|
+
// Anywhere for user control
|
|
71
|
+
<ColorModeToggle />
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Component Index
|
|
75
|
+
|
|
76
|
+
### Core Inputs
|
|
77
|
+
| Component | Import Path | Description |
|
|
78
|
+
|-----------|-------------|-------------|
|
|
79
|
+
| Button | `@neynar/ui/button` | 9 variants, 8 sizes |
|
|
80
|
+
| Checkbox | `@neynar/ui/checkbox` | Boolean toggle |
|
|
81
|
+
| Input | `@neynar/ui/input` | Text input |
|
|
82
|
+
| RadioGroup | `@neynar/ui/radio-group` | Single selection |
|
|
83
|
+
| Select | `@neynar/ui/select` | Dropdown selection |
|
|
84
|
+
| Slider | `@neynar/ui/slider` | Range input |
|
|
85
|
+
| Switch | `@neynar/ui/switch` | Toggle switch |
|
|
86
|
+
| Textarea | `@neynar/ui/textarea` | Multi-line text |
|
|
87
|
+
| Toggle | `@neynar/ui/toggle` | Pressable toggle |
|
|
88
|
+
| ToggleGroup | `@neynar/ui/toggle-group` | Multiple toggles |
|
|
89
|
+
| Combobox | `@neynar/ui/combobox` | Searchable select |
|
|
90
|
+
|
|
91
|
+
### Form & Field
|
|
92
|
+
| Component | Import Path | Description |
|
|
93
|
+
|-----------|-------------|-------------|
|
|
94
|
+
| ButtonGroup | `@neynar/ui/button-group` | Connected buttons |
|
|
95
|
+
| Calendar | `@neynar/ui/calendar` | Date picker |
|
|
96
|
+
| Field | `@neynar/ui/field` | Form field wrapper |
|
|
97
|
+
| InputGroup | `@neynar/ui/input-group` | Input with addons |
|
|
98
|
+
| InputOTP | `@neynar/ui/input-otp` | One-time password |
|
|
99
|
+
| Label | `@neynar/ui/label` | Form labels |
|
|
100
|
+
|
|
101
|
+
### Layout & Structure
|
|
102
|
+
| Component | Import Path | Description |
|
|
103
|
+
|-----------|-------------|-------------|
|
|
104
|
+
| Accordion | `@neynar/ui/accordion` | Expandable sections |
|
|
105
|
+
| AspectRatio | `@neynar/ui/aspect-ratio` | Maintain ratio |
|
|
106
|
+
| Card | `@neynar/ui/card` | Content container |
|
|
107
|
+
| Collapsible | `@neynar/ui/collapsible` | Show/hide content |
|
|
108
|
+
| Resizable | `@neynar/ui/resizable` | Resizable panels |
|
|
109
|
+
| ScrollArea | `@neynar/ui/scroll-area` | Custom scrollbars |
|
|
110
|
+
| Separator | `@neynar/ui/separator` | Visual divider |
|
|
111
|
+
| Table | `@neynar/ui/table` | Data tables |
|
|
112
|
+
|
|
113
|
+
### Navigation & Menus
|
|
114
|
+
| Component | Import Path | Description |
|
|
115
|
+
|-----------|-------------|-------------|
|
|
116
|
+
| Breadcrumb | `@neynar/ui/breadcrumb` | Path indicator |
|
|
117
|
+
| ContextMenu | `@neynar/ui/context-menu` | Right-click menu |
|
|
118
|
+
| DropdownMenu | `@neynar/ui/dropdown-menu` | Trigger dropdown |
|
|
119
|
+
| Menubar | `@neynar/ui/menubar` | Horizontal menu |
|
|
120
|
+
| NavigationMenu | `@neynar/ui/navigation-menu` | Site navigation |
|
|
121
|
+
| Pagination | `@neynar/ui/pagination` | Page navigation |
|
|
122
|
+
| Sidebar | `@neynar/ui/sidebar` | Collapsible nav |
|
|
123
|
+
| Tabs | `@neynar/ui/tabs` | Tabbed content |
|
|
124
|
+
|
|
125
|
+
### Overlays & Dialogs
|
|
126
|
+
| Component | Import Path | Description |
|
|
127
|
+
|-----------|-------------|-------------|
|
|
128
|
+
| AlertDialog | `@neynar/ui/alert-dialog` | Confirmation |
|
|
129
|
+
| Dialog | `@neynar/ui/dialog` | Modal dialog |
|
|
130
|
+
| Drawer | `@neynar/ui/drawer` | Bottom drawer |
|
|
131
|
+
| HoverCard | `@neynar/ui/hover-card` | Rich hover preview |
|
|
132
|
+
| Popover | `@neynar/ui/popover` | Floating content |
|
|
133
|
+
| Sheet | `@neynar/ui/sheet` | Side panel |
|
|
134
|
+
| Tooltip | `@neynar/ui/tooltip` | Hover info |
|
|
135
|
+
|
|
136
|
+
### Feedback & Status
|
|
137
|
+
| Component | Import Path | Description |
|
|
138
|
+
|-----------|-------------|-------------|
|
|
139
|
+
| Alert | `@neynar/ui/alert` | Contextual messages |
|
|
140
|
+
| Badge | `@neynar/ui/badge` | Status indicators |
|
|
141
|
+
| Empty | `@neynar/ui/empty` | Empty state |
|
|
142
|
+
| Progress | `@neynar/ui/progress` | Progress bars |
|
|
143
|
+
| Skeleton | `@neynar/ui/skeleton` | Loading placeholders |
|
|
144
|
+
| Sonner | `@neynar/ui/sonner` | Toast notifications |
|
|
145
|
+
| Spinner | `@neynar/ui/spinner` | Loading spinner |
|
|
146
|
+
|
|
147
|
+
### Advanced
|
|
148
|
+
| Component | Import Path | Description |
|
|
149
|
+
|-----------|-------------|-------------|
|
|
150
|
+
| Avatar | `@neynar/ui/avatar` | User avatars |
|
|
151
|
+
| Carousel | `@neynar/ui/carousel` | Content slider |
|
|
152
|
+
| Chart | `@neynar/ui/chart` | Recharts wrapper |
|
|
153
|
+
| Command | `@neynar/ui/command` | Command palette |
|
|
154
|
+
| Kbd | `@neynar/ui/kbd` | Keyboard shortcuts |
|
|
155
|
+
| Item | `@neynar/ui/item` | List items |
|
|
156
|
+
|
|
157
|
+
### Typography
|
|
158
|
+
| Component | Import Path | Description |
|
|
159
|
+
|-----------|-------------|-------------|
|
|
160
|
+
| Title | `@neynar/ui/typography` | Headings (h1-h6) |
|
|
161
|
+
| Text | `@neynar/ui/typography` | Paragraph text |
|
|
162
|
+
| Code | `@neynar/ui/typography` | Inline code |
|
|
163
|
+
| Blockquote | `@neynar/ui/typography` | Quote blocks |
|
|
164
|
+
|
|
165
|
+
### Theme Utilities
|
|
166
|
+
| Component | Import Path | Description |
|
|
167
|
+
|-----------|-------------|-------------|
|
|
168
|
+
| ColorModeInitializer | `@neynar/ui/color-mode` | FOUC prevention script |
|
|
169
|
+
| ColorModeToggle | `@neynar/ui/color-mode` | Mode switcher dropdown |
|
|
170
|
+
| useColorMode | `@neynar/ui/color-mode` | Programmatic control hook |
|
|
171
|
+
| FirstLightFilters | `@neynar/ui/first-light` | SVG wobble filters |
|
|
172
|
+
|
|
173
|
+
## Additional Documentation
|
|
174
|
+
|
|
175
|
+
- [Theming](./theming.llm.md) - Themes, color mode, CSS variables, customization
|
|
176
|
+
- [Hooks](./hooks.llm.md) - useIsMobile responsive hook
|
|
177
|
+
- [Utilities](./utilities.llm.md) - cn() class merging utility
|
|
178
|
+
- [Contributing](./contributing.llm.md) - Component patterns, data-slot, templates
|