@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,182 @@
|
|
|
1
|
+
# Spinner
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
Spinner - Loading indicator with animated rotation A circular loading spinner built on the Lucide React Loader2 icon with smooth rotation animation. Provides visual feedback to users during asynchronous operations such as data fetching, form submissions, or content loading. The spinner is highly customizable through CSS classes and supports all standard SVG props for size, color, and styling.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { Spinner } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<Spinner
|
|
13
|
+
className="value"
|
|
14
|
+
color="value"
|
|
15
|
+
size={value}
|
|
16
|
+
strokeWidth={value}
|
|
17
|
+
"aria-label"="value"
|
|
18
|
+
role="value"
|
|
19
|
+
"aria-hidden"={value}
|
|
20
|
+
"aria-describedby"="value"
|
|
21
|
+
"aria-live"={value}
|
|
22
|
+
"aria-busy"={true}
|
|
23
|
+
style={value}
|
|
24
|
+
/>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Component Props
|
|
28
|
+
|
|
29
|
+
### className
|
|
30
|
+
- **Type**: `string`
|
|
31
|
+
- **Required**: No
|
|
32
|
+
- **Description**: No description available
|
|
33
|
+
|
|
34
|
+
### color
|
|
35
|
+
- **Type**: `string`
|
|
36
|
+
- **Required**: No
|
|
37
|
+
- **Description**: No description available
|
|
38
|
+
|
|
39
|
+
### size
|
|
40
|
+
- **Type**: `number | string`
|
|
41
|
+
- **Required**: No
|
|
42
|
+
- **Description**: No description available
|
|
43
|
+
|
|
44
|
+
### strokeWidth
|
|
45
|
+
- **Type**: `number | string`
|
|
46
|
+
- **Required**: No
|
|
47
|
+
- **Description**: No description available
|
|
48
|
+
|
|
49
|
+
### "aria-label"
|
|
50
|
+
- **Type**: `string`
|
|
51
|
+
- **Required**: No
|
|
52
|
+
- **Description**: No description available
|
|
53
|
+
|
|
54
|
+
### role
|
|
55
|
+
- **Type**: `string`
|
|
56
|
+
- **Required**: No
|
|
57
|
+
- **Description**: No description available
|
|
58
|
+
|
|
59
|
+
### "aria-hidden"
|
|
60
|
+
- **Type**: `boolean | "false" | "true"`
|
|
61
|
+
- **Required**: No
|
|
62
|
+
- **Description**: No description available
|
|
63
|
+
|
|
64
|
+
### "aria-describedby"
|
|
65
|
+
- **Type**: `string`
|
|
66
|
+
- **Required**: No
|
|
67
|
+
- **Description**: No description available
|
|
68
|
+
|
|
69
|
+
### "aria-live"
|
|
70
|
+
- **Type**: `"off" | "polite" | "assertive"`
|
|
71
|
+
- **Required**: No
|
|
72
|
+
- **Description**: No description available
|
|
73
|
+
|
|
74
|
+
### "aria-busy"
|
|
75
|
+
- **Type**: `boolean`
|
|
76
|
+
- **Required**: No
|
|
77
|
+
- **Description**: No description available
|
|
78
|
+
|
|
79
|
+
### style
|
|
80
|
+
- **Type**: `React.CSSProperties`
|
|
81
|
+
- **Required**: No
|
|
82
|
+
- **Description**: No description available
|
|
83
|
+
|
|
84
|
+
## Examples
|
|
85
|
+
|
|
86
|
+
### Example 1
|
|
87
|
+
```tsx
|
|
88
|
+
// Basic loading spinner with default size (16px)
|
|
89
|
+
<Spinner />
|
|
90
|
+
// Custom size using Tailwind size utilities
|
|
91
|
+
<Spinner className="size-6" />
|
|
92
|
+
<Spinner className="size-8" />
|
|
93
|
+
<Spinner className="size-12" />
|
|
94
|
+
// Custom color using text color classes
|
|
95
|
+
<Spinner className="text-primary" />
|
|
96
|
+
<Spinner className="text-destructive" />
|
|
97
|
+
<Spinner className="text-muted-foreground" />
|
|
98
|
+
```
|
|
99
|
+
### Example 2
|
|
100
|
+
```tsx
|
|
101
|
+
// In loading buttons
|
|
102
|
+
import { Button } from "./button";
|
|
103
|
+
<Button disabled>
|
|
104
|
+
<Spinner className="mr-2 size-4" />
|
|
105
|
+
Loading...
|
|
106
|
+
</Button>
|
|
107
|
+
<Button variant="outline" disabled>
|
|
108
|
+
<Spinner className="mr-2 size-4" />
|
|
109
|
+
Processing
|
|
110
|
+
</Button>
|
|
111
|
+
// Icon-only loading button
|
|
112
|
+
<Button size="icon" disabled aria-label="Loading">
|
|
113
|
+
<Spinner className="size-4" />
|
|
114
|
+
</Button>
|
|
115
|
+
```
|
|
116
|
+
### Example 3
|
|
117
|
+
```tsx
|
|
118
|
+
// Full-page loading state
|
|
119
|
+
<div className="flex min-h-screen items-center justify-center">
|
|
120
|
+
<div className="text-center space-y-4">
|
|
121
|
+
<Spinner className="size-12 mx-auto" />
|
|
122
|
+
<p className="text-muted-foreground">Loading your dashboard...</p>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
// Card loading state
|
|
126
|
+
<div className="border rounded-lg p-8 flex flex-col items-center gap-3">
|
|
127
|
+
<Spinner className="size-8" />
|
|
128
|
+
<p className="text-sm text-muted-foreground">Fetching data...</p>
|
|
129
|
+
</div>
|
|
130
|
+
// Inline loading with text
|
|
131
|
+
<p className="flex items-center gap-2 text-sm">
|
|
132
|
+
<Spinner className="size-4" />
|
|
133
|
+
Syncing your data...
|
|
134
|
+
</p>
|
|
135
|
+
```
|
|
136
|
+
### Example 4
|
|
137
|
+
```tsx
|
|
138
|
+
// Custom animation speed
|
|
139
|
+
// Slow rotation
|
|
140
|
+
<Spinner className="animate-[spin_2s_linear_infinite]" />
|
|
141
|
+
// Fast rotation
|
|
142
|
+
<Spinner className="animate-[spin_0.5s_linear_infinite]" />
|
|
143
|
+
// Custom size and color combination
|
|
144
|
+
<Spinner
|
|
145
|
+
className="size-6 text-blue-500"
|
|
146
|
+
strokeWidth={3}
|
|
147
|
+
/>
|
|
148
|
+
// With background overlay
|
|
149
|
+
<div className="relative">
|
|
150
|
+
<div className="absolute inset-0 bg-background/50 backdrop-blur-sm flex items-center justify-center rounded-lg">
|
|
151
|
+
<Spinner className="size-8" />
|
|
152
|
+
</div>
|
|
153
|
+
<div>Your content here</div>
|
|
154
|
+
</div>
|
|
155
|
+
```
|
|
156
|
+
### Example 5
|
|
157
|
+
```tsx
|
|
158
|
+
// Conditional rendering with loading state
|
|
159
|
+
function DataDisplay() {
|
|
160
|
+
const [isLoading, setIsLoading] = React.useState(true);
|
|
161
|
+
return (
|
|
162
|
+
<div className="space-y-4">
|
|
163
|
+
{isLoading ? (
|
|
164
|
+
<div className="flex justify-center p-8">
|
|
165
|
+
<Spinner className="size-6" />
|
|
166
|
+
</div>
|
|
167
|
+
) : (
|
|
168
|
+
<div>Loaded content here</div>
|
|
169
|
+
)}
|
|
170
|
+
</div>
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
// With aria-live region for screen reader announcements
|
|
174
|
+
<div aria-live="polite" aria-atomic="true">
|
|
175
|
+
{isLoading && (
|
|
176
|
+
<div className="flex items-center gap-2">
|
|
177
|
+
<Spinner className="size-4" />
|
|
178
|
+
<span>Loading content, please wait...</span>
|
|
179
|
+
</div>
|
|
180
|
+
)}
|
|
181
|
+
</div>
|
|
182
|
+
```
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Stack
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
Stack - A flexible layout component for consistent spacing between elements Stack is a fundamental layout primitive that arranges child elements in either vertical or horizontal direction with consistent spacing. Built on flexbox principles, it provides a clean, declarative API for common layout patterns without requiring custom CSS or complex flex configurations. **Core Features:** - Consistent spacing using Tailwind's design system - Flexible direction control (vertical/horizontal) - Zero-config flexbox layouts with predictable behavior - Composable with other UI components and layout utilities - Full accessibility support with semantic HTML structure - TypeScript-first with comprehensive prop validation **Common Use Cases:** - Form layouts with consistent field spacing - Button groups and action bars - Content sections with uniform gaps - Navigation lists and menu structures - Card layouts and dashboard grids - Page sections and content hierarchy - Responsive component layouts **Design System Integration:** Stack integrates seamlessly with design systems by providing consistent spacing that aligns with Tailwind's spacing scale. This ensures visual harmony across your application and reduces the need for custom spacing utilities in most common layout scenarios.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { Stack } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<Stack
|
|
13
|
+
spacing={value}
|
|
14
|
+
direction={value}
|
|
15
|
+
/>
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Component Props
|
|
19
|
+
|
|
20
|
+
### spacing
|
|
21
|
+
- **Type**: `StackSpacing`
|
|
22
|
+
- **Required**: No
|
|
23
|
+
- **Description**: No description available
|
|
24
|
+
|
|
25
|
+
### direction
|
|
26
|
+
- **Type**: `StackDirection`
|
|
27
|
+
- **Required**: No
|
|
28
|
+
- **Description**: No description available
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# SubsectionTitle
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
SubsectionTitle - Tertiary subsection heading component Subsection headings for further content division. Uses text-xl (20px) for subtle distinction from SectionTitle. Defaults to h3 element.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { SubsectionTitle } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<SubsectionTitle
|
|
13
|
+
as={value}
|
|
14
|
+
className="value"
|
|
15
|
+
>
|
|
16
|
+
{/* Your content here */}
|
|
17
|
+
</SubsectionTitle>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Component Props
|
|
21
|
+
|
|
22
|
+
### as
|
|
23
|
+
- **Type**: `React.ElementType`
|
|
24
|
+
- **Required**: No
|
|
25
|
+
- **Description**: HTML element to render
|
|
26
|
+
|
|
27
|
+
### className
|
|
28
|
+
- **Type**: `string`
|
|
29
|
+
- **Required**: No
|
|
30
|
+
- **Description**: Additional Tailwind classes
|
|
31
|
+
|
|
32
|
+
### children
|
|
33
|
+
- **Type**: `React.ReactNode`
|
|
34
|
+
- **Required**: No
|
|
35
|
+
- **Description**: Content to render
|
|
36
|
+
|
|
37
|
+
## Examples
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
// Default usage
|
|
41
|
+
<SubsectionTitle>Configuration Options</SubsectionTitle>
|
|
42
|
+
// With custom styling
|
|
43
|
+
<SubsectionTitle className="text-muted-foreground">
|
|
44
|
+
Optional Settings
|
|
45
|
+
</SubsectionTitle>
|
|
46
|
+
```
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Switch
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
Switch - Binary toggle control for on/off states A versatile toggle switch component built on Radix UI Switch primitive that provides an accessible way to toggle between on/off states. Commonly used for settings, preferences, and feature toggles that have immediate effects. Built with Radix UI Switch primitive and styled with Tailwind CSS to ensure consistent visual appearance across light and dark themes. The component automatically handles state management, accessibility, keyboard navigation, and form integration.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { Switch } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<Switch
|
|
13
|
+
checked={true}
|
|
14
|
+
defaultChecked={true}
|
|
15
|
+
onCheckedChange={handleCheckedChange}
|
|
16
|
+
disabled={true}
|
|
17
|
+
required={true}
|
|
18
|
+
name="value"
|
|
19
|
+
value="value"
|
|
20
|
+
id="value"
|
|
21
|
+
asChild={true}
|
|
22
|
+
className="value"
|
|
23
|
+
/>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Component Props
|
|
27
|
+
|
|
28
|
+
### checked
|
|
29
|
+
- **Type**: `boolean`
|
|
30
|
+
- **Required**: No
|
|
31
|
+
- **Description**: No description available
|
|
32
|
+
|
|
33
|
+
### defaultChecked
|
|
34
|
+
- **Type**: `boolean`
|
|
35
|
+
- **Required**: No
|
|
36
|
+
- **Description**: No description available
|
|
37
|
+
|
|
38
|
+
### onCheckedChange
|
|
39
|
+
- **Type**: `(checked: boolean) => void`
|
|
40
|
+
- **Required**: No
|
|
41
|
+
- **Description**: No description available
|
|
42
|
+
|
|
43
|
+
### disabled
|
|
44
|
+
- **Type**: `boolean`
|
|
45
|
+
- **Required**: No
|
|
46
|
+
- **Description**: No description available
|
|
47
|
+
|
|
48
|
+
### required
|
|
49
|
+
- **Type**: `boolean`
|
|
50
|
+
- **Required**: No
|
|
51
|
+
- **Description**: No description available
|
|
52
|
+
|
|
53
|
+
### name
|
|
54
|
+
- **Type**: `string`
|
|
55
|
+
- **Required**: No
|
|
56
|
+
- **Description**: No description available
|
|
57
|
+
|
|
58
|
+
### value
|
|
59
|
+
- **Type**: `string`
|
|
60
|
+
- **Required**: No
|
|
61
|
+
- **Description**: No description available
|
|
62
|
+
|
|
63
|
+
### id
|
|
64
|
+
- **Type**: `string`
|
|
65
|
+
- **Required**: No
|
|
66
|
+
- **Description**: No description available
|
|
67
|
+
|
|
68
|
+
### asChild
|
|
69
|
+
- **Type**: `boolean`
|
|
70
|
+
- **Required**: No
|
|
71
|
+
- **Description**: No description available
|
|
72
|
+
|
|
73
|
+
### className
|
|
74
|
+
- **Type**: `string`
|
|
75
|
+
- **Required**: No
|
|
76
|
+
- **Description**: No description available
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# TableBody
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
TableBody - Container for table data rows Main content area of the table containing all data rows. Applies border styling where the last row has no bottom border. Contains TableRow components with TableCell elements.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { TableBody } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<TableBody
|
|
13
|
+
className="value"
|
|
14
|
+
>
|
|
15
|
+
{/* Your content here */}
|
|
16
|
+
</TableBody>
|
|
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
|
+
```tsx
|
|
34
|
+
<TableBody>
|
|
35
|
+
<TableRow>
|
|
36
|
+
<TableCell>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# TableCaption
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
TableCaption - Table caption for describing table content and context Provides a description, title, or additional context for the table. Displayed with muted styling and proper spacing. Essential for accessibility as screen readers announce the caption to provide table context.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { TableCaption } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<TableCaption
|
|
13
|
+
className="value"
|
|
14
|
+
>
|
|
15
|
+
{/* Your content here */}
|
|
16
|
+
</TableCaption>
|
|
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
|
+
```tsx
|
|
34
|
+
<Table>
|
|
35
|
+
<TableCaption>Recent casts from your network</TableCaption>
|
|
36
|
+
<TableHeader>...</TableHeader>
|
|
37
|
+
<TableBody>...</TableBody>
|
|
38
|
+
</Table>
|
|
39
|
+
// Caption with additional context
|
|
40
|
+
<Table>
|
|
41
|
+
<TableCaption>
|
|
42
|
+
Channel analytics for the last 30 days.
|
|
43
|
+
Data updated every hour.
|
|
44
|
+
</TableCaption>
|
|
45
|
+
<TableHeader>...</TableHeader>
|
|
46
|
+
<TableBody>...</TableBody>
|
|
47
|
+
</Table>
|
|
48
|
+
```
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# TableCell
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
TableCell - Table data cell component for content display Used for data cells within table rows with consistent padding and alignment. Supports custom styling, truncation, and special handling for interactive elements like checkboxes and buttons.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { TableCell } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<TableCell
|
|
13
|
+
className="value"
|
|
14
|
+
colSpan={0}
|
|
15
|
+
rowSpan={0}
|
|
16
|
+
headers="value"
|
|
17
|
+
>
|
|
18
|
+
{/* Your content here */}
|
|
19
|
+
</TableCell>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Component Props
|
|
23
|
+
|
|
24
|
+
### className
|
|
25
|
+
- **Type**: `string`
|
|
26
|
+
- **Required**: No
|
|
27
|
+
- **Description**: No description available
|
|
28
|
+
|
|
29
|
+
### children
|
|
30
|
+
- **Type**: `React.ReactNode`
|
|
31
|
+
- **Required**: No
|
|
32
|
+
- **Description**: No description available
|
|
33
|
+
|
|
34
|
+
### colSpan
|
|
35
|
+
- **Type**: `number`
|
|
36
|
+
- **Required**: No
|
|
37
|
+
- **Description**: No description available
|
|
38
|
+
|
|
39
|
+
### rowSpan
|
|
40
|
+
- **Type**: `number`
|
|
41
|
+
- **Required**: No
|
|
42
|
+
- **Description**: No description available
|
|
43
|
+
|
|
44
|
+
### headers
|
|
45
|
+
- **Type**: `string`
|
|
46
|
+
- **Required**: No
|
|
47
|
+
- **Description**: No description available
|
|
48
|
+
|
|
49
|
+
## Examples
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
// Basic data cells
|
|
53
|
+
<TableCell>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# TableFooter
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
TableFooter - Container for table footer rows Used for summary rows, totals, or additional table information. Styled with a muted background and top border to distinguish from data rows. Typically contains aggregated data or table-wide information.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { TableFooter } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<TableFooter
|
|
13
|
+
className="value"
|
|
14
|
+
>
|
|
15
|
+
{/* Your content here */}
|
|
16
|
+
</TableFooter>
|
|
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
|
+
```tsx
|
|
34
|
+
<TableFooter>
|
|
35
|
+
<TableRow>
|
|
36
|
+
<TableCell>Total Users</TableCell>
|
|
37
|
+
<TableCell>15,767</TableCell>
|
|
38
|
+
<TableCell className="text-right">+9.25%</TableCell>
|
|
39
|
+
</TableRow>
|
|
40
|
+
</TableFooter>
|
|
41
|
+
```
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# TableHead
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
TableHead - Table header cell component for column definitions Used for column headers with medium font weight and proper text alignment. Includes special styling for checkbox columns and interactive elements. Essential for screen reader navigation and table accessibility.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { TableHead } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<TableHead
|
|
13
|
+
className="value"
|
|
14
|
+
scope={value}
|
|
15
|
+
colSpan={0}
|
|
16
|
+
rowSpan={0}
|
|
17
|
+
"aria-sort"={value}
|
|
18
|
+
>
|
|
19
|
+
{/* Your content here */}
|
|
20
|
+
</TableHead>
|
|
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
|
+
### scope
|
|
36
|
+
- **Type**: `"col" | "row" | "colgroup" | "rowgroup"`
|
|
37
|
+
- **Required**: No
|
|
38
|
+
- **Description**: No description available
|
|
39
|
+
|
|
40
|
+
### colSpan
|
|
41
|
+
- **Type**: `number`
|
|
42
|
+
- **Required**: No
|
|
43
|
+
- **Description**: No description available
|
|
44
|
+
|
|
45
|
+
### rowSpan
|
|
46
|
+
- **Type**: `number`
|
|
47
|
+
- **Required**: No
|
|
48
|
+
- **Description**: No description available
|
|
49
|
+
|
|
50
|
+
### "aria-sort"
|
|
51
|
+
- **Type**: `"ascending" | "descending" | "none" | "other"`
|
|
52
|
+
- **Required**: No
|
|
53
|
+
- **Description**: No description available
|
|
54
|
+
|
|
55
|
+
## Examples
|
|
56
|
+
|
|
57
|
+
```tsx
|
|
58
|
+
// Text headers
|
|
59
|
+
<TableHead>Username</TableHead>
|
|
60
|
+
<TableHead className="text-right">Followers</TableHead>
|
|
61
|
+
// Checkbox header
|
|
62
|
+
<TableHead className="w-[50px]">
|
|
63
|
+
<Checkbox />
|
|
64
|
+
</TableHead>
|
|
65
|
+
// Sortable header
|
|
66
|
+
<TableHead>
|
|
67
|
+
<Button variant="ghost">FID ↕</Button>
|
|
68
|
+
</TableHead>
|
|
69
|
+
```
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# TableHeader
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
TableHeader - Container for table header rows Groups header rows and applies consistent styling with bottom borders. Contains TableRow components with TableHead cells for column definitions. Essential for accessibility and proper table structure.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { TableHeader } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<TableHeader
|
|
13
|
+
className="value"
|
|
14
|
+
>
|
|
15
|
+
{/* Your content here */}
|
|
16
|
+
</TableHeader>
|
|
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
|
+
```tsx
|
|
34
|
+
<TableHeader>
|
|
35
|
+
<TableRow>
|
|
36
|
+
<TableHead>Username</TableHead>
|
|
37
|
+
<TableHead>FID</TableHead>
|
|
38
|
+
<TableHead className="text-right">Actions</TableHead>
|
|
39
|
+
</TableRow>
|
|
40
|
+
</TableHeader>
|
|
41
|
+
```
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# TableRow
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
TableRow - A table row component with interactive states Represents a single row in the table with hover effects and selection support. Supports data-state attributes for visual feedback and proper border styling. Essential building block for all table content areas.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { TableRow } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<TableRow
|
|
13
|
+
className="value"
|
|
14
|
+
"data-state"={value}
|
|
15
|
+
>
|
|
16
|
+
{/* Your content here */}
|
|
17
|
+
</TableRow>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Component Props
|
|
21
|
+
|
|
22
|
+
### className
|
|
23
|
+
- **Type**: `string`
|
|
24
|
+
- **Required**: No
|
|
25
|
+
- **Description**: No description available
|
|
26
|
+
|
|
27
|
+
### children
|
|
28
|
+
- **Type**: `React.ReactNode`
|
|
29
|
+
- **Required**: No
|
|
30
|
+
- **Description**: No description available
|
|
31
|
+
|
|
32
|
+
### "data-state"
|
|
33
|
+
- **Type**: `"selected" | "unselected"`
|
|
34
|
+
- **Required**: No
|
|
35
|
+
- **Description**: No description available
|
|
36
|
+
|
|
37
|
+
## Examples
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
// Basic row
|
|
41
|
+
<TableRow>
|
|
42
|
+
<TableCell>
|