@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,167 @@
|
|
|
1
|
+
# HoverCardContent
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
HoverCardContent - Floating content container with intelligent positioning and animations The content area that appears when the trigger is hovered. Features built-in animations, intelligent positioning to avoid viewport boundaries, and customizable alignment options. Automatically portaled to prevent z-index and overflow issues, with smooth fade and scale transitions that respect user motion preferences. The content supports rich layouts including text, images, buttons, and complex components. Positioning is automatically calculated based on available space, with collision detection to ensure the content remains visible within the viewport.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { HoverCardContent } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<HoverCardContent
|
|
13
|
+
side={value}
|
|
14
|
+
sideOffset={0}
|
|
15
|
+
align={value}
|
|
16
|
+
alignOffset={0}
|
|
17
|
+
avoidCollisions={true}
|
|
18
|
+
collisionBoundary={value}
|
|
19
|
+
collisionPadding={value}
|
|
20
|
+
sticky={value}
|
|
21
|
+
hideWhenDetached={true}
|
|
22
|
+
forceMount={value}
|
|
23
|
+
asChild={true}
|
|
24
|
+
className="value"
|
|
25
|
+
>
|
|
26
|
+
{/* Your content here */}
|
|
27
|
+
</HoverCardContent>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Component Props
|
|
31
|
+
|
|
32
|
+
### side
|
|
33
|
+
- **Type**: `"top" | "right" | "bottom" | "left"`
|
|
34
|
+
- **Required**: No
|
|
35
|
+
- **Description**: No description available
|
|
36
|
+
|
|
37
|
+
### sideOffset
|
|
38
|
+
- **Type**: `number`
|
|
39
|
+
- **Required**: No
|
|
40
|
+
- **Description**: No description available
|
|
41
|
+
|
|
42
|
+
### align
|
|
43
|
+
- **Type**: `"start" | "center" | "end"`
|
|
44
|
+
- **Required**: No
|
|
45
|
+
- **Description**: No description available
|
|
46
|
+
|
|
47
|
+
### alignOffset
|
|
48
|
+
- **Type**: `number`
|
|
49
|
+
- **Required**: No
|
|
50
|
+
- **Description**: No description available
|
|
51
|
+
|
|
52
|
+
### avoidCollisions
|
|
53
|
+
- **Type**: `boolean`
|
|
54
|
+
- **Required**: No
|
|
55
|
+
- **Description**: No description available
|
|
56
|
+
|
|
57
|
+
### collisionBoundary
|
|
58
|
+
- **Type**: `Element | null | Array<Element | null>`
|
|
59
|
+
- **Required**: No
|
|
60
|
+
- **Description**: No description available
|
|
61
|
+
|
|
62
|
+
### collisionPadding
|
|
63
|
+
- **Type**: `| number
|
|
64
|
+
| Partial<Record<"top" | "right" | "bottom" | "left", number>>`
|
|
65
|
+
- **Required**: No
|
|
66
|
+
- **Description**: No description available
|
|
67
|
+
|
|
68
|
+
### sticky
|
|
69
|
+
- **Type**: `"partial" | "always"`
|
|
70
|
+
- **Required**: No
|
|
71
|
+
- **Description**: No description available
|
|
72
|
+
|
|
73
|
+
### hideWhenDetached
|
|
74
|
+
- **Type**: `boolean`
|
|
75
|
+
- **Required**: No
|
|
76
|
+
- **Description**: No description available
|
|
77
|
+
|
|
78
|
+
### forceMount
|
|
79
|
+
- **Type**: `true`
|
|
80
|
+
- **Required**: No
|
|
81
|
+
- **Description**: No description available
|
|
82
|
+
|
|
83
|
+
### asChild
|
|
84
|
+
- **Type**: `boolean`
|
|
85
|
+
- **Required**: No
|
|
86
|
+
- **Description**: No description available
|
|
87
|
+
|
|
88
|
+
### className
|
|
89
|
+
- **Type**: `string`
|
|
90
|
+
- **Required**: No
|
|
91
|
+
- **Description**: No description available
|
|
92
|
+
|
|
93
|
+
### children
|
|
94
|
+
- **Type**: `React.ReactNode`
|
|
95
|
+
- **Required**: No
|
|
96
|
+
- **Description**: No description available
|
|
97
|
+
|
|
98
|
+
## Examples
|
|
99
|
+
|
|
100
|
+
### Example 1
|
|
101
|
+
```tsx
|
|
102
|
+
// Simple text content
|
|
103
|
+
<HoverCardContent>
|
|
104
|
+
<p>This is a simple hover card with text content.</p>
|
|
105
|
+
</HoverCardContent>
|
|
106
|
+
```
|
|
107
|
+
### Example 2
|
|
108
|
+
```tsx
|
|
109
|
+
// Positioned above the trigger with custom alignment
|
|
110
|
+
<HoverCardContent side="top" align="start" sideOffset={8}>
|
|
111
|
+
<div className="text-sm">
|
|
112
|
+
Content appears above the trigger, aligned to the start edge
|
|
113
|
+
</div>
|
|
114
|
+
</HoverCardContent>
|
|
115
|
+
```
|
|
116
|
+
### Example 3
|
|
117
|
+
```tsx
|
|
118
|
+
// Rich content with custom width and complex layout
|
|
119
|
+
<HoverCardContent className="w-80">
|
|
120
|
+
<div className="space-y-3">
|
|
121
|
+
<div className="flex items-center gap-3">
|
|
122
|
+
<Avatar className="h-12 w-12">
|
|
123
|
+
<AvatarImage src="/avatar.jpg" />
|
|
124
|
+
<AvatarFallback>JD</AvatarFallback>
|
|
125
|
+
</Avatar>
|
|
126
|
+
<div>
|
|
127
|
+
<h4 className="font-semibold">John Doe</h4>
|
|
128
|
+
<p className="text-sm text-muted-foreground">Software Engineer</p>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
<Separator />
|
|
132
|
+
<div className="grid grid-cols-2 gap-4 text-sm">
|
|
133
|
+
<div>
|
|
134
|
+
<p className="font-medium">Repositories</p>
|
|
135
|
+
<p className="text-muted-foreground">42</p>
|
|
136
|
+
</div>
|
|
137
|
+
<div>
|
|
138
|
+
<p className="font-medium">Followers</p>
|
|
139
|
+
<p className="text-muted-foreground">1.2k</p>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
</HoverCardContent>
|
|
144
|
+
```
|
|
145
|
+
### Example 4
|
|
146
|
+
```tsx
|
|
147
|
+
// Interactive content with buttons
|
|
148
|
+
<HoverCardContent>
|
|
149
|
+
<div className="space-y-3">
|
|
150
|
+
<h4 className="font-semibold">Quick Actions</h4>
|
|
151
|
+
<div className="flex flex-col gap-2">
|
|
152
|
+
<Button size="sm" variant="ghost" className="justify-start">
|
|
153
|
+
<EditIcon className="mr-2 h-4 w-4" />
|
|
154
|
+
Edit Details
|
|
155
|
+
</Button>
|
|
156
|
+
<Button size="sm" variant="ghost" className="justify-start">
|
|
157
|
+
<ShareIcon className="mr-2 h-4 w-4" />
|
|
158
|
+
Share Profile
|
|
159
|
+
</Button>
|
|
160
|
+
<Button size="sm" variant="ghost" className="justify-start">
|
|
161
|
+
<SettingsIcon className="mr-2 h-4 w-4" />
|
|
162
|
+
Settings
|
|
163
|
+
</Button>
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
</HoverCardContent>
|
|
167
|
+
```
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# HoverCardTrigger
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
HoverCardTrigger - Interactive element that activates the hover card on mouse hover The trigger component that users hover over to reveal the hover card content. Can wrap any element or render as its child using the asChild prop. Automatically manages hover detection and integrates with the parent HoverCard's timing configuration. When using asChild, the trigger merges its props with the immediate child element, allowing for seamless integration with buttons, links, or any other interactive elements.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { HoverCardTrigger } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<HoverCardTrigger
|
|
13
|
+
asChild={true}
|
|
14
|
+
className="value"
|
|
15
|
+
>
|
|
16
|
+
{/* Your content here */}
|
|
17
|
+
</HoverCardTrigger>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Component Props
|
|
21
|
+
|
|
22
|
+
### asChild
|
|
23
|
+
- **Type**: `boolean`
|
|
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
|
+
### className
|
|
33
|
+
- **Type**: `string`
|
|
34
|
+
- **Required**: No
|
|
35
|
+
- **Description**: No description available
|
|
36
|
+
|
|
37
|
+
## Examples
|
|
38
|
+
|
|
39
|
+
### Example 1
|
|
40
|
+
```tsx
|
|
41
|
+
// Basic trigger with text
|
|
42
|
+
<HoverCardTrigger>
|
|
43
|
+
<span className="text-blue-600 cursor-pointer">Hover for details</span>
|
|
44
|
+
</HoverCardTrigger>
|
|
45
|
+
```
|
|
46
|
+
### Example 2
|
|
47
|
+
```tsx
|
|
48
|
+
// Using asChild with a button
|
|
49
|
+
<HoverCardTrigger asChild>
|
|
50
|
+
<Button variant="outline">User Profile</Button>
|
|
51
|
+
</HoverCardTrigger>
|
|
52
|
+
```
|
|
53
|
+
### Example 3
|
|
54
|
+
```tsx
|
|
55
|
+
// With a link element
|
|
56
|
+
<HoverCardTrigger asChild>
|
|
57
|
+
<a href="/profile/john" className="font-medium hover:underline">
|
|
58
|
+
### Example 4
|
|
59
|
+
```tsx
|
|
60
|
+
// Complex trigger with icon
|
|
61
|
+
<HoverCardTrigger className="inline-flex items-center gap-2">
|
|
62
|
+
<UserIcon className="h-4 w-4" />
|
|
63
|
+
<span>View Profile</span>
|
|
64
|
+
</HoverCardTrigger>
|
|
65
|
+
```
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# HoverCard
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
HoverCard - Preview content that appears on hover for rich contextual information A floating card component that reveals rich content when users hover over a trigger element. Designed specifically for sighted users to preview content available behind links without requiring navigation. Built on Radix UI primitives with smooth animations and intelligent positioning to avoid viewport boundaries. Perfect for user profiles, repository information, link previews, tooltips with complex content, and any contextual details that enhance the user experience without interrupting their current workflow.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { HoverCard } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<HoverCard
|
|
13
|
+
defaultOpen={true}
|
|
14
|
+
open={true}
|
|
15
|
+
onValueChange={handleValueChange}
|
|
16
|
+
openDelay={0}
|
|
17
|
+
closeDelay={0}
|
|
18
|
+
>
|
|
19
|
+
{/* Your content here */}
|
|
20
|
+
</HoverCard>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Component Props
|
|
24
|
+
|
|
25
|
+
### defaultOpen
|
|
26
|
+
- **Type**: `boolean`
|
|
27
|
+
- **Required**: No
|
|
28
|
+
- **Description**: No description available
|
|
29
|
+
|
|
30
|
+
### open
|
|
31
|
+
- **Type**: `boolean`
|
|
32
|
+
- **Required**: No
|
|
33
|
+
- **Description**: No description available
|
|
34
|
+
|
|
35
|
+
### onValueChange
|
|
36
|
+
- **Type**: `(open: boolean) => void`
|
|
37
|
+
- **Required**: No
|
|
38
|
+
- **Description**: No description available
|
|
39
|
+
|
|
40
|
+
### openDelay
|
|
41
|
+
- **Type**: `number`
|
|
42
|
+
- **Required**: No
|
|
43
|
+
- **Description**: No description available
|
|
44
|
+
|
|
45
|
+
### closeDelay
|
|
46
|
+
- **Type**: `number`
|
|
47
|
+
- **Required**: No
|
|
48
|
+
- **Description**: No description available
|
|
49
|
+
|
|
50
|
+
### children
|
|
51
|
+
- **Type**: `React.ReactNode`
|
|
52
|
+
- **Required**: No
|
|
53
|
+
- **Description**: No description available
|
|
54
|
+
|
|
55
|
+
## Examples
|
|
56
|
+
|
|
57
|
+
### Example 1
|
|
58
|
+
```tsx
|
|
59
|
+
// Basic user profile hover card
|
|
60
|
+
<HoverCard>
|
|
61
|
+
<HoverCardTrigger asChild>
|
|
62
|
+
<Button variant="link">
|
|
63
|
+
### Example 2
|
|
64
|
+
```tsx
|
|
65
|
+
// With custom positioning and delays
|
|
66
|
+
<HoverCard openDelay={500} closeDelay={200}>
|
|
67
|
+
<HoverCardTrigger asChild>
|
|
68
|
+
<Button>Hover me</Button>
|
|
69
|
+
</HoverCardTrigger>
|
|
70
|
+
<HoverCardContent side="top" align="start">
|
|
71
|
+
Content appears above with custom alignment
|
|
72
|
+
</HoverCardContent>
|
|
73
|
+
</HoverCard>
|
|
74
|
+
```
|
|
75
|
+
### Example 3
|
|
76
|
+
```tsx
|
|
77
|
+
// Interactive hover card with buttons
|
|
78
|
+
<HoverCard>
|
|
79
|
+
<HoverCardTrigger asChild>
|
|
80
|
+
<Button variant="ghost">Quick Actions</Button>
|
|
81
|
+
</HoverCardTrigger>
|
|
82
|
+
<HoverCardContent>
|
|
83
|
+
<div className="space-y-2">
|
|
84
|
+
<h4 className="font-semibold">Available Actions</h4>
|
|
85
|
+
<div className="flex flex-col gap-1">
|
|
86
|
+
<Button size="sm" variant="ghost">Edit Profile</Button>
|
|
87
|
+
<Button size="sm" variant="ghost">View Analytics</Button>
|
|
88
|
+
<Button size="sm" variant="ghost">Manage Settings</Button>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
</HoverCardContent>
|
|
92
|
+
</HoverCard>
|
|
93
|
+
```
|
|
94
|
+
### Example 4
|
|
95
|
+
```tsx
|
|
96
|
+
// Link preview with rich content
|
|
97
|
+
<HoverCard openDelay={300}>
|
|
98
|
+
<HoverCardTrigger asChild>
|
|
99
|
+
<a href="/article/123" className="text-blue-600 hover:underline">
|
|
100
|
+
Advanced React Patterns
|
|
101
|
+
</a>
|
|
102
|
+
</HoverCardTrigger>
|
|
103
|
+
<HoverCardContent className="w-96">
|
|
104
|
+
<div className="space-y-3">
|
|
105
|
+
<img src="/article-thumbnail.jpg" className="rounded w-full h-32 object-cover" />
|
|
106
|
+
<div>
|
|
107
|
+
<h4 className="font-semibold">Advanced React Patterns</h4>
|
|
108
|
+
<p className="text-sm text-muted-foreground">
|
|
109
|
+
Learn modern React patterns including render props, compound components,
|
|
110
|
+
and advanced hook compositions for scalable applications.
|
|
111
|
+
</p>
|
|
112
|
+
<div className="flex items-center gap-2 mt-2 text-xs text-muted-foreground">
|
|
113
|
+
<span>12 min read</span>
|
|
114
|
+
<span>•</span>
|
|
115
|
+
<span>Published Mar 15, 2024</span>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
</HoverCardContent>
|
|
120
|
+
</HoverCard>
|
|
121
|
+
```
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# InputGroupAddon
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
InputGroupAddon - Container for icons, buttons, text, or labels within an InputGroup A flexible addon container that can be positioned at any edge of the input (left, right, top, or bottom). Automatically adjusts layout and spacing based on alignment. Clicking the addon area focuses the associated input for improved usability. Supports icons, static text, buttons, keyboard shortcuts (Kbd), and custom content.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { InputGroupAddon } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<InputGroupAddon
|
|
13
|
+
align={value}
|
|
14
|
+
className="value"
|
|
15
|
+
>
|
|
16
|
+
{/* Your content here */}
|
|
17
|
+
</InputGroupAddon>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Component Props
|
|
21
|
+
|
|
22
|
+
### align
|
|
23
|
+
- **Type**: `"inline-start" | "inline-end" | "block-start" | "block-end"`
|
|
24
|
+
- **Required**: No
|
|
25
|
+
- **Description**: No description available
|
|
26
|
+
|
|
27
|
+
### className
|
|
28
|
+
- **Type**: `string`
|
|
29
|
+
- **Required**: No
|
|
30
|
+
- **Description**: No description available
|
|
31
|
+
|
|
32
|
+
### children
|
|
33
|
+
- **Type**: `React.ReactNode`
|
|
34
|
+
- **Required**: No
|
|
35
|
+
- **Description**: No description available
|
|
36
|
+
|
|
37
|
+
## Examples
|
|
38
|
+
|
|
39
|
+
### Example 1
|
|
40
|
+
```tsx
|
|
41
|
+
// Icon addon on the left (inline-start)
|
|
42
|
+
<InputGroup>
|
|
43
|
+
<InputGroupAddon align="inline-start">
|
|
44
|
+
<Search className="size-4" />
|
|
45
|
+
</InputGroupAddon>
|
|
46
|
+
<InputGroupInput placeholder="Search..." />
|
|
47
|
+
</InputGroup>
|
|
48
|
+
```
|
|
49
|
+
### Example 2
|
|
50
|
+
```tsx
|
|
51
|
+
// Text suffix on the right (inline-end)
|
|
52
|
+
<InputGroup>
|
|
53
|
+
<InputGroupInput placeholder="Enter amount" />
|
|
54
|
+
<InputGroupAddon align="inline-end">
|
|
55
|
+
<InputGroupText>USD</InputGroupText>
|
|
56
|
+
</InputGroupAddon>
|
|
57
|
+
</InputGroup>
|
|
58
|
+
```
|
|
59
|
+
### Example 3
|
|
60
|
+
```tsx
|
|
61
|
+
// Button addon for action
|
|
62
|
+
<InputGroup>
|
|
63
|
+
<InputGroupInput placeholder="Enter coupon code" />
|
|
64
|
+
<InputGroupAddon align="inline-end">
|
|
65
|
+
<InputGroupButton size="sm">Apply</InputGroupButton>
|
|
66
|
+
</InputGroupAddon>
|
|
67
|
+
</InputGroup>
|
|
68
|
+
```
|
|
69
|
+
### Example 4
|
|
70
|
+
```tsx
|
|
71
|
+
// Keyboard shortcut indicator
|
|
72
|
+
<InputGroup>
|
|
73
|
+
<InputGroupInput placeholder="Quick search" />
|
|
74
|
+
<InputGroupAddon align="inline-end">
|
|
75
|
+
<Kbd>⌘K</Kbd>
|
|
76
|
+
</InputGroupAddon>
|
|
77
|
+
</InputGroup>
|
|
78
|
+
```
|
|
79
|
+
### Example 5
|
|
80
|
+
```tsx
|
|
81
|
+
// Block addon with multiple elements (top position)
|
|
82
|
+
<InputGroup>
|
|
83
|
+
<InputGroupAddon align="block-start">
|
|
84
|
+
<InputGroupText>Message</InputGroupText>
|
|
85
|
+
<InputGroupButton size="icon-xs">
|
|
86
|
+
<X className="size-4" />
|
|
87
|
+
</InputGroupButton>
|
|
88
|
+
</InputGroupAddon>
|
|
89
|
+
<InputGroupTextarea placeholder="Type your message..." />
|
|
90
|
+
</InputGroup>
|
|
91
|
+
```
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# InputGroupButton
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
InputGroupButton - Action button within an InputGroupAddon A specialized button component optimized for use within input group addons. Styled with reduced shadows and compact sizing to integrate seamlessly with the input group container. Supports text buttons, icon buttons, and combination buttons with various size options. Uses ghost variant by default for subtle integration with the input group.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { InputGroupButton } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<InputGroupButton
|
|
13
|
+
size={value}
|
|
14
|
+
variant={value}
|
|
15
|
+
type={value}
|
|
16
|
+
className="value"
|
|
17
|
+
onClick={handleClick}
|
|
18
|
+
disabled={true}
|
|
19
|
+
>
|
|
20
|
+
{/* Your content here */}
|
|
21
|
+
</InputGroupButton>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Component Props
|
|
25
|
+
|
|
26
|
+
### size
|
|
27
|
+
- **Type**: `"xs" | "sm" | "icon-xs" | "icon-sm"`
|
|
28
|
+
- **Required**: No
|
|
29
|
+
- **Description**: No description available
|
|
30
|
+
|
|
31
|
+
### variant
|
|
32
|
+
- **Type**: `"default" | "destructive" | "outline" | "secondary" | "ghost" | "link"`
|
|
33
|
+
- **Required**: No
|
|
34
|
+
- **Description**: No description available
|
|
35
|
+
|
|
36
|
+
### type
|
|
37
|
+
- **Type**: `"button" | "submit" | "reset"`
|
|
38
|
+
- **Required**: No
|
|
39
|
+
- **Description**: No description available
|
|
40
|
+
|
|
41
|
+
### className
|
|
42
|
+
- **Type**: `string`
|
|
43
|
+
- **Required**: No
|
|
44
|
+
- **Description**: No description available
|
|
45
|
+
|
|
46
|
+
### children
|
|
47
|
+
- **Type**: `React.ReactNode`
|
|
48
|
+
- **Required**: No
|
|
49
|
+
- **Description**: No description available
|
|
50
|
+
|
|
51
|
+
### onClick
|
|
52
|
+
- **Type**: `React.MouseEventHandler<HTMLButtonElement>`
|
|
53
|
+
- **Required**: No
|
|
54
|
+
- **Description**: No description available
|
|
55
|
+
|
|
56
|
+
### disabled
|
|
57
|
+
- **Type**: `boolean`
|
|
58
|
+
- **Required**: No
|
|
59
|
+
- **Description**: No description available
|
|
60
|
+
|
|
61
|
+
## Examples
|
|
62
|
+
|
|
63
|
+
### Example 1
|
|
64
|
+
```tsx
|
|
65
|
+
// Text button for action
|
|
66
|
+
<InputGroup>
|
|
67
|
+
<InputGroupInput placeholder="Enter coupon code" />
|
|
68
|
+
<InputGroupAddon align="inline-end">
|
|
69
|
+
<InputGroupButton size="sm">Apply</InputGroupButton>
|
|
70
|
+
</InputGroupAddon>
|
|
71
|
+
</InputGroup>
|
|
72
|
+
```
|
|
73
|
+
### Example 2
|
|
74
|
+
```tsx
|
|
75
|
+
// Icon-only button for compact actions
|
|
76
|
+
<InputGroup>
|
|
77
|
+
<InputGroupInput readOnly value="API Key: sk_live_123..." />
|
|
78
|
+
<InputGroupAddon align="inline-end">
|
|
79
|
+
<InputGroupButton size="icon-xs">
|
|
80
|
+
<Copy className="size-4" />
|
|
81
|
+
</InputGroupButton>
|
|
82
|
+
</InputGroupAddon>
|
|
83
|
+
</InputGroup>
|
|
84
|
+
```
|
|
85
|
+
### Example 3
|
|
86
|
+
```tsx
|
|
87
|
+
// Button with icon and text
|
|
88
|
+
<InputGroup>
|
|
89
|
+
<InputGroupInput type="email" placeholder="Enter email" />
|
|
90
|
+
<InputGroupAddon align="inline-end">
|
|
91
|
+
<InputGroupButton size="sm">
|
|
92
|
+
<Send className="size-4" />
|
|
93
|
+
Subscribe
|
|
94
|
+
</InputGroupButton>
|
|
95
|
+
</InputGroupAddon>
|
|
96
|
+
</InputGroup>
|
|
97
|
+
```
|
|
98
|
+
### Example 4
|
|
99
|
+
```tsx
|
|
100
|
+
// Submit button in block addon
|
|
101
|
+
<InputGroup>
|
|
102
|
+
<InputGroupTextarea placeholder="Write your message..." />
|
|
103
|
+
<InputGroupAddon align="block-end">
|
|
104
|
+
<InputGroupButton size="sm" variant="default" type="submit">
|
|
105
|
+
Post Comment
|
|
106
|
+
</InputGroupButton>
|
|
107
|
+
</InputGroupAddon>
|
|
108
|
+
</InputGroup>
|
|
109
|
+
```
|
|
110
|
+
### Example 5
|
|
111
|
+
```tsx
|
|
112
|
+
// Multiple buttons with different variants
|
|
113
|
+
<InputGroup>
|
|
114
|
+
<InputGroupTextarea placeholder="Compose..." />
|
|
115
|
+
<InputGroupAddon align="block-end">
|
|
116
|
+
<InputGroupButton size="sm" variant="outline">Cancel</InputGroupButton>
|
|
117
|
+
<InputGroupButton size="sm" variant="default">Send</InputGroupButton>
|
|
118
|
+
</InputGroupAddon>
|
|
119
|
+
</InputGroup>
|
|
120
|
+
```
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# InputGroupInput
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
InputGroupInput - Text input element within an InputGroup A styled input component designed to work seamlessly within an InputGroup container. Inherits all standard HTML input props and removes default borders, shadows, and focus rings since the parent InputGroup handles visual states. Automatically flexes to fill available space between addons.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { InputGroupInput } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<InputGroupInput
|
|
13
|
+
className="value"
|
|
14
|
+
placeholder="value"
|
|
15
|
+
type={value}
|
|
16
|
+
value={value}
|
|
17
|
+
defaultValue={value}
|
|
18
|
+
onChange={handleChange}
|
|
19
|
+
disabled={true}
|
|
20
|
+
readOnly={true}
|
|
21
|
+
"aria-invalid"={value}
|
|
22
|
+
name="value"
|
|
23
|
+
id="value"
|
|
24
|
+
required={true}
|
|
25
|
+
/>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Component Props
|
|
29
|
+
|
|
30
|
+
### className
|
|
31
|
+
- **Type**: `string`
|
|
32
|
+
- **Required**: No
|
|
33
|
+
- **Description**: No description available
|
|
34
|
+
|
|
35
|
+
### placeholder
|
|
36
|
+
- **Type**: `string`
|
|
37
|
+
- **Required**: No
|
|
38
|
+
- **Description**: No description available
|
|
39
|
+
|
|
40
|
+
### type
|
|
41
|
+
- **Type**: `React.HTMLInputTypeAttribute`
|
|
42
|
+
- **Required**: No
|
|
43
|
+
- **Description**: No description available
|
|
44
|
+
|
|
45
|
+
### value
|
|
46
|
+
- **Type**: `string | number`
|
|
47
|
+
- **Required**: No
|
|
48
|
+
- **Description**: No description available
|
|
49
|
+
|
|
50
|
+
### defaultValue
|
|
51
|
+
- **Type**: `string | number`
|
|
52
|
+
- **Required**: No
|
|
53
|
+
- **Description**: No description available
|
|
54
|
+
|
|
55
|
+
### onChange
|
|
56
|
+
- **Type**: `React.ChangeEventHandler<HTMLInputElement>`
|
|
57
|
+
- **Required**: No
|
|
58
|
+
- **Description**: No description available
|
|
59
|
+
|
|
60
|
+
### disabled
|
|
61
|
+
- **Type**: `boolean`
|
|
62
|
+
- **Required**: No
|
|
63
|
+
- **Description**: No description available
|
|
64
|
+
|
|
65
|
+
### readOnly
|
|
66
|
+
- **Type**: `boolean`
|
|
67
|
+
- **Required**: No
|
|
68
|
+
- **Description**: No description available
|
|
69
|
+
|
|
70
|
+
### "aria-invalid"
|
|
71
|
+
- **Type**: `boolean | "true" | "false"`
|
|
72
|
+
- **Required**: No
|
|
73
|
+
- **Description**: No description available
|
|
74
|
+
|
|
75
|
+
### name
|
|
76
|
+
- **Type**: `string`
|
|
77
|
+
- **Required**: No
|
|
78
|
+
- **Description**: No description available
|
|
79
|
+
|
|
80
|
+
### id
|
|
81
|
+
- **Type**: `string`
|
|
82
|
+
- **Required**: No
|
|
83
|
+
- **Description**: No description available
|
|
84
|
+
|
|
85
|
+
### required
|
|
86
|
+
- **Type**: `boolean`
|
|
87
|
+
- **Required**: No
|
|
88
|
+
- **Description**: No description available
|
|
89
|
+
|
|
90
|
+
## Examples
|
|
91
|
+
|
|
92
|
+
### Example 1
|
|
93
|
+
```tsx
|
|
94
|
+
// Basic text input with icon
|
|
95
|
+
<InputGroup>
|
|
96
|
+
<InputGroupAddon align="inline-start">
|
|
97
|
+
<Search className="size-4" />
|
|
98
|
+
</InputGroupAddon>
|
|
99
|
+
<InputGroupInput placeholder="Search..." />
|
|
100
|
+
</InputGroup>
|
|
101
|
+
```
|
|
102
|
+
### Example 2
|
|
103
|
+
```tsx
|
|
104
|
+
// Email input with validation
|
|
105
|
+
<InputGroup>
|
|
106
|
+
<InputGroupAddon align="inline-start">
|
|
107
|
+
<Mail className="size-4" />
|
|
108
|
+
</InputGroupAddon>
|
|
109
|
+
<InputGroupInput
|
|
110
|
+
type="email"
|
|
111
|
+
placeholder="you
|
|
112
|
+
### Example 3
|
|
113
|
+
```tsx
|
|
114
|
+
// Controlled number input
|
|
115
|
+
const [amount, setAmount] = useState("");
|
|
116
|
+
<InputGroup>
|
|
117
|
+
<InputGroupAddon align="inline-start">
|
|
118
|
+
<DollarSign className="size-4" />
|
|
119
|
+
</InputGroupAddon>
|
|
120
|
+
<InputGroupInput
|
|
121
|
+
type="number"
|
|
122
|
+
placeholder="0.00"
|
|
123
|
+
value={amount}
|
|
124
|
+
onChange={(e) => setAmount(e.target.value)}
|
|
125
|
+
/>
|
|
126
|
+
<InputGroupAddon align="inline-end">
|
|
127
|
+
<InputGroupText>USD</InputGroupText>
|
|
128
|
+
</InputGroupAddon>
|
|
129
|
+
</InputGroup>
|
|
130
|
+
```
|
|
131
|
+
### Example 4
|
|
132
|
+
```tsx
|
|
133
|
+
// Read-only input for displaying values
|
|
134
|
+
<InputGroup>
|
|
135
|
+
<InputGroupInput
|
|
136
|
+
readOnly
|
|
137
|
+
value="API Key: sk_live_123456789"
|
|
138
|
+
/>
|
|
139
|
+
<InputGroupAddon align="inline-end">
|
|
140
|
+
<InputGroupButton size="icon-xs">
|
|
141
|
+
<Copy className="size-4" />
|
|
142
|
+
</InputGroupButton>
|
|
143
|
+
</InputGroupAddon>
|
|
144
|
+
</InputGroup>
|
|
145
|
+
```
|