@srcroot/ui 0.0.55 → 0.0.58
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/README.md +151 -151
- package/dist/index.d.ts +0 -0
- package/dist/index.js +120 -93
- package/package.json +7 -2
- package/src/registry/analytics/google-analytics.tsx +36 -39
- package/src/registry/analytics/google-tag-manager.tsx +62 -65
- package/src/registry/analytics/meta-pixel.tsx +44 -47
- package/src/registry/analytics/microsoft-clarity.tsx +31 -34
- package/src/registry/analytics/tiktok-pixel.tsx +34 -37
- package/src/registry/lib/utils.ts +0 -0
- package/src/registry/themes/v3/blue.css +157 -157
- package/src/registry/themes/v3/glass.css +153 -153
- package/src/registry/themes/v3/gray.css +157 -157
- package/src/registry/themes/v3/green.css +157 -157
- package/src/registry/themes/v3/neutral.css +157 -157
- package/src/registry/themes/v3/orange.css +157 -157
- package/src/registry/themes/v3/rose.css +157 -157
- package/src/registry/themes/v3/slate.css +157 -157
- package/src/registry/themes/v3/stone.css +157 -157
- package/src/registry/themes/v3/violet.css +186 -186
- package/src/registry/themes/v3/zinc.css +157 -157
- package/src/registry/themes/v4/blue.css +184 -184
- package/src/registry/themes/v4/glass.css +180 -180
- package/src/registry/themes/v4/gray.css +184 -184
- package/src/registry/themes/v4/green.css +184 -184
- package/src/registry/themes/v4/neutral.css +184 -184
- package/src/registry/themes/v4/orange.css +184 -184
- package/src/registry/themes/v4/rose.css +184 -184
- package/src/registry/themes/v4/slate.css +184 -184
- package/src/registry/themes/v4/stone.css +184 -184
- package/src/registry/themes/v4/violet.css +184 -184
- package/src/registry/themes/v4/zinc.css +184 -184
- package/src/registry/ui/accordion.tsx +164 -165
- package/src/registry/ui/alert-dialog.tsx +213 -214
- package/src/registry/ui/alert.tsx +73 -76
- package/src/registry/ui/aspect-ratio.tsx +44 -47
- package/src/registry/ui/avatar.tsx +96 -97
- package/src/registry/ui/badge.tsx +52 -55
- package/src/registry/ui/breadcrumb.tsx +147 -150
- package/src/registry/ui/button-group.tsx +64 -67
- package/src/registry/ui/button.tsx +71 -72
- package/src/registry/ui/calendar.tsx +514 -515
- package/src/registry/ui/card.tsx +88 -91
- package/src/registry/ui/carousel.tsx +214 -214
- package/src/registry/ui/chart.tsx +373 -373
- package/src/registry/ui/chatbot.tsx +86 -13
- package/src/registry/ui/checkbox.tsx +93 -94
- package/src/registry/ui/collapsible.tsx +107 -108
- package/src/registry/ui/combobox.tsx +171 -171
- package/src/registry/ui/command.tsx +300 -300
- package/src/registry/ui/container.tsx +44 -47
- package/src/registry/ui/context-menu.tsx +221 -221
- package/src/registry/ui/date-picker.tsx +228 -228
- package/src/registry/ui/dialog.tsx +269 -270
- package/src/registry/ui/drawer.tsx +10 -4
- package/src/registry/ui/dropdown-menu.tsx +529 -530
- package/src/registry/ui/empty-state.tsx +0 -2
- package/src/registry/ui/file-upload.tsx +0 -0
- package/src/registry/ui/floating-dock.tsx +0 -0
- package/src/registry/ui/form-field.tsx +91 -94
- package/src/registry/ui/google-analytics.tsx +38 -0
- package/src/registry/ui/google-tag-manager.tsx +64 -0
- package/src/registry/ui/hover-card.tsx +223 -223
- package/src/registry/ui/image.tsx +144 -147
- package/src/registry/ui/input-group.tsx +82 -85
- package/src/registry/ui/input.tsx +125 -125
- package/src/registry/ui/kbd.tsx +60 -63
- package/src/registry/ui/label.tsx +36 -37
- package/src/registry/ui/loading-spinner.tsx +108 -111
- package/src/registry/ui/map.tsx +0 -0
- package/src/registry/ui/marquee.tsx +2 -0
- package/src/registry/ui/menubar.tsx +246 -246
- package/src/registry/ui/meta-pixel.tsx +46 -0
- package/src/registry/ui/microsoft-clarity.tsx +33 -0
- package/src/registry/ui/native-select.tsx +49 -52
- package/src/registry/ui/otp-input.tsx +163 -155
- package/src/registry/ui/pagination.tsx +149 -152
- package/src/registry/ui/patterns.tsx +28 -0
- package/src/registry/ui/popover.tsx +226 -227
- package/src/registry/ui/progress.tsx +51 -52
- package/src/registry/ui/radio.tsx +99 -102
- package/src/registry/ui/resizable.tsx +314 -314
- package/src/registry/ui/scroll-animation.tsx +45 -0
- package/src/registry/ui/scroll-area.tsx +121 -122
- package/src/registry/ui/scroll-to-top.tsx +0 -0
- package/src/registry/ui/search.tsx +162 -150
- package/src/registry/ui/select.tsx +292 -293
- package/src/registry/ui/separator.tsx +46 -47
- package/src/registry/ui/sheet.tsx +6 -3
- package/src/registry/ui/sidebar.tsx +628 -628
- package/src/registry/ui/skeleton.tsx +26 -29
- package/src/registry/ui/slider.tsx +196 -197
- package/src/registry/ui/slot.tsx +69 -72
- package/src/registry/ui/star-rating.tsx +146 -134
- package/src/registry/ui/switch.tsx +72 -73
- package/src/registry/ui/table-of-contents.tsx +96 -96
- package/src/registry/ui/table.tsx +138 -139
- package/src/registry/ui/tabs.tsx +124 -125
- package/src/registry/ui/text.tsx +61 -64
- package/src/registry/ui/textarea.tsx +41 -42
- package/src/registry/ui/theme-switcher.tsx +66 -66
- package/src/registry/ui/tiktok-pixel.tsx +36 -0
- package/src/registry/ui/toast.tsx +97 -98
- package/src/registry/ui/toggle-group.tsx +129 -129
- package/src/registry/ui/toggle.tsx +72 -72
- package/src/registry/ui/tooltip.tsx +143 -144
- package/src/registry/ui/whatsapp.tsx +0 -0
|
@@ -1,144 +1,143 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import * as React from "react"
|
|
4
|
-
import { createPortal } from "react-dom"
|
|
5
|
-
import { cn } from "@/lib/utils"
|
|
6
|
-
import { Slot } from "@/components/ui/slot"
|
|
7
|
-
|
|
8
|
-
interface TooltipContextValue {
|
|
9
|
-
open: boolean
|
|
10
|
-
setOpen: (open: boolean) => void
|
|
11
|
-
mousePosition: { x: number; y: number }
|
|
12
|
-
setMousePosition: (pos: { x: number; y: number }) => void
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const TooltipContext = React.createContext<TooltipContextValue | null>(null)
|
|
16
|
-
|
|
17
|
-
interface TooltipProviderProps {
|
|
18
|
-
children: React.ReactNode
|
|
19
|
-
delayDuration?: number
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* TooltipProvider wraps your app to enable tooltips
|
|
24
|
-
*/
|
|
25
|
-
function TooltipProvider({ children }: TooltipProviderProps) {
|
|
26
|
-
return <>{children}</>
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
interface TooltipProps {
|
|
30
|
-
children: React.ReactNode
|
|
31
|
-
open?: boolean
|
|
32
|
-
onOpenChange?: (open: boolean) => void
|
|
33
|
-
defaultOpen?: boolean
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Tooltip component for hover hints - appears at mouse cursor position
|
|
38
|
-
*
|
|
39
|
-
* @example
|
|
40
|
-
* <TooltipProvider>
|
|
41
|
-
* <Tooltip>
|
|
42
|
-
* <TooltipTrigger>Hover me</TooltipTrigger>
|
|
43
|
-
* <TooltipContent>Tooltip text</TooltipContent>
|
|
44
|
-
* </Tooltip>
|
|
45
|
-
* </TooltipProvider>
|
|
46
|
-
*/
|
|
47
|
-
function Tooltip({ children, open: controlledOpen, onOpenChange, defaultOpen = false }: TooltipProps) {
|
|
48
|
-
const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)
|
|
49
|
-
const [mousePosition, setMousePosition] = React.useState({ x: 0, y: 0 })
|
|
50
|
-
|
|
51
|
-
const open = controlledOpen !== undefined ? controlledOpen : uncontrolledOpen
|
|
52
|
-
const setOpen = onOpenChange || setUncontrolledOpen
|
|
53
|
-
|
|
54
|
-
return (
|
|
55
|
-
<TooltipContext.Provider value={{ open, setOpen, mousePosition, setMousePosition }}>
|
|
56
|
-
<span className="relative inline-block">
|
|
57
|
-
{children}
|
|
58
|
-
</span>
|
|
59
|
-
</TooltipContext.Provider>
|
|
60
|
-
)
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
interface TooltipTriggerProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
64
|
-
asChild?: boolean
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const TooltipTrigger = React.forwardRef<HTMLSpanElement, TooltipTriggerProps>(
|
|
68
|
-
({ children, asChild, ...props }, ref) => {
|
|
69
|
-
const context = React.useContext(TooltipContext)
|
|
70
|
-
if (!context) throw new Error("TooltipTrigger must be used within Tooltip")
|
|
71
|
-
|
|
72
|
-
const handleMouseEnter = () => context.setOpen(true)
|
|
73
|
-
const handleMouseLeave = () => context.setOpen(false)
|
|
74
|
-
const handleMouseMove = (e: React.MouseEvent) => {
|
|
75
|
-
context.setMousePosition({ x: e.clientX, y: e.clientY })
|
|
76
|
-
}
|
|
77
|
-
const handleFocus = () => context.setOpen(true)
|
|
78
|
-
const handleBlur = () => context.setOpen(false)
|
|
79
|
-
|
|
80
|
-
const Comp = asChild ? Slot : "span"
|
|
81
|
-
|
|
82
|
-
return (
|
|
83
|
-
<Comp
|
|
84
|
-
ref={ref}
|
|
85
|
-
onMouseEnter={handleMouseEnter}
|
|
86
|
-
onMouseLeave={handleMouseLeave}
|
|
87
|
-
onMouseMove={handleMouseMove}
|
|
88
|
-
onFocus={handleFocus}
|
|
89
|
-
onBlur={handleBlur}
|
|
90
|
-
tabIndex={0}
|
|
91
|
-
{...props}
|
|
92
|
-
>
|
|
93
|
-
{children}
|
|
94
|
-
</Comp>
|
|
95
|
-
)
|
|
96
|
-
}
|
|
97
|
-
)
|
|
98
|
-
TooltipTrigger.displayName = "TooltipTrigger"
|
|
99
|
-
|
|
100
|
-
const TooltipContent = React.forwardRef<
|
|
101
|
-
HTMLDivElement,
|
|
102
|
-
React.HTMLAttributes<HTMLDivElement>
|
|
103
|
-
>(({ className, children, ...props }, ref) => {
|
|
104
|
-
const context = React.useContext(TooltipContext)
|
|
105
|
-
if (!context) throw new Error("TooltipContent must be used within Tooltip")
|
|
106
|
-
|
|
107
|
-
const [mounted, setMounted] = React.useState(false)
|
|
108
|
-
|
|
109
|
-
React.useEffect(() => {
|
|
110
|
-
setMounted(true)
|
|
111
|
-
}, [])
|
|
112
|
-
|
|
113
|
-
if (!context.open) return null
|
|
114
|
-
if (!mounted) return null
|
|
115
|
-
|
|
116
|
-
// Offset from cursor (slightly above and to the right)
|
|
117
|
-
const offsetX = 10
|
|
118
|
-
const offsetY = -10
|
|
119
|
-
|
|
120
|
-
return createPortal(
|
|
121
|
-
<div
|
|
122
|
-
ref={ref}
|
|
123
|
-
role="tooltip"
|
|
124
|
-
style={{
|
|
125
|
-
position: 'fixed',
|
|
126
|
-
left: context.mousePosition.x + offsetX,
|
|
127
|
-
top: context.mousePosition.y + offsetY,
|
|
128
|
-
transform: 'translateY(-100%)',
|
|
129
|
-
}}
|
|
130
|
-
className={cn(
|
|
131
|
-
"z-[9999] overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 pointer-events-none whitespace-nowrap",
|
|
132
|
-
className
|
|
133
|
-
)}
|
|
134
|
-
{...props}
|
|
135
|
-
>
|
|
136
|
-
{children}
|
|
137
|
-
</div>,
|
|
138
|
-
document.body
|
|
139
|
-
)
|
|
140
|
-
})
|
|
141
|
-
TooltipContent.displayName = "TooltipContent"
|
|
142
|
-
|
|
143
|
-
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
|
|
144
|
-
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { createPortal } from "react-dom"
|
|
5
|
+
import { cn } from "@/lib/utils"
|
|
6
|
+
import { Slot } from "@/components/ui/slot"
|
|
7
|
+
|
|
8
|
+
interface TooltipContextValue {
|
|
9
|
+
open: boolean
|
|
10
|
+
setOpen: (open: boolean) => void
|
|
11
|
+
mousePosition: { x: number; y: number }
|
|
12
|
+
setMousePosition: (pos: { x: number; y: number }) => void
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const TooltipContext = React.createContext<TooltipContextValue | null>(null)
|
|
16
|
+
|
|
17
|
+
interface TooltipProviderProps {
|
|
18
|
+
children: React.ReactNode
|
|
19
|
+
delayDuration?: number
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* TooltipProvider wraps your app to enable tooltips
|
|
24
|
+
*/
|
|
25
|
+
function TooltipProvider({ children }: TooltipProviderProps) {
|
|
26
|
+
return <>{children}</>
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface TooltipProps {
|
|
30
|
+
children: React.ReactNode
|
|
31
|
+
open?: boolean
|
|
32
|
+
onOpenChange?: (open: boolean) => void
|
|
33
|
+
defaultOpen?: boolean
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Tooltip component for hover hints - appears at mouse cursor position
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* <TooltipProvider>
|
|
41
|
+
* <Tooltip>
|
|
42
|
+
* <TooltipTrigger>Hover me</TooltipTrigger>
|
|
43
|
+
* <TooltipContent>Tooltip text</TooltipContent>
|
|
44
|
+
* </Tooltip>
|
|
45
|
+
* </TooltipProvider>
|
|
46
|
+
*/
|
|
47
|
+
function Tooltip({ children, open: controlledOpen, onOpenChange, defaultOpen = false }: TooltipProps) {
|
|
48
|
+
const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)
|
|
49
|
+
const [mousePosition, setMousePosition] = React.useState({ x: 0, y: 0 })
|
|
50
|
+
|
|
51
|
+
const open = controlledOpen !== undefined ? controlledOpen : uncontrolledOpen
|
|
52
|
+
const setOpen = onOpenChange || setUncontrolledOpen
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<TooltipContext.Provider value={{ open, setOpen, mousePosition, setMousePosition }}>
|
|
56
|
+
<span className="relative inline-block">
|
|
57
|
+
{children}
|
|
58
|
+
</span>
|
|
59
|
+
</TooltipContext.Provider>
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
interface TooltipTriggerProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
64
|
+
asChild?: boolean
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const TooltipTrigger = React.forwardRef<HTMLSpanElement, TooltipTriggerProps>(
|
|
68
|
+
({ children, asChild, ...props }, ref) => {
|
|
69
|
+
const context = React.useContext(TooltipContext)
|
|
70
|
+
if (!context) throw new Error("TooltipTrigger must be used within Tooltip")
|
|
71
|
+
|
|
72
|
+
const handleMouseEnter = () => context.setOpen(true)
|
|
73
|
+
const handleMouseLeave = () => context.setOpen(false)
|
|
74
|
+
const handleMouseMove = (e: React.MouseEvent) => {
|
|
75
|
+
context.setMousePosition({ x: e.clientX, y: e.clientY })
|
|
76
|
+
}
|
|
77
|
+
const handleFocus = () => context.setOpen(true)
|
|
78
|
+
const handleBlur = () => context.setOpen(false)
|
|
79
|
+
|
|
80
|
+
const Comp = asChild ? Slot : "span"
|
|
81
|
+
|
|
82
|
+
return (
|
|
83
|
+
<Comp
|
|
84
|
+
ref={ref}
|
|
85
|
+
onMouseEnter={handleMouseEnter}
|
|
86
|
+
onMouseLeave={handleMouseLeave}
|
|
87
|
+
onMouseMove={handleMouseMove}
|
|
88
|
+
onFocus={handleFocus}
|
|
89
|
+
onBlur={handleBlur}
|
|
90
|
+
tabIndex={0}
|
|
91
|
+
{...props}
|
|
92
|
+
>
|
|
93
|
+
{children}
|
|
94
|
+
</Comp>
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
)
|
|
98
|
+
TooltipTrigger.displayName = "TooltipTrigger"
|
|
99
|
+
|
|
100
|
+
const TooltipContent = React.forwardRef<
|
|
101
|
+
HTMLDivElement,
|
|
102
|
+
React.HTMLAttributes<HTMLDivElement>
|
|
103
|
+
>(({ className, children, ...props }, ref) => {
|
|
104
|
+
const context = React.useContext(TooltipContext)
|
|
105
|
+
if (!context) throw new Error("TooltipContent must be used within Tooltip")
|
|
106
|
+
|
|
107
|
+
const [mounted, setMounted] = React.useState(false)
|
|
108
|
+
|
|
109
|
+
React.useEffect(() => {
|
|
110
|
+
setMounted(true)
|
|
111
|
+
}, [])
|
|
112
|
+
|
|
113
|
+
if (!context.open) return null
|
|
114
|
+
if (!mounted) return null
|
|
115
|
+
|
|
116
|
+
// Offset from cursor (slightly above and to the right)
|
|
117
|
+
const offsetX = 10
|
|
118
|
+
const offsetY = -10
|
|
119
|
+
|
|
120
|
+
return createPortal(
|
|
121
|
+
<div
|
|
122
|
+
ref={ref}
|
|
123
|
+
role="tooltip"
|
|
124
|
+
style={{
|
|
125
|
+
position: 'fixed',
|
|
126
|
+
left: context.mousePosition.x + offsetX,
|
|
127
|
+
top: context.mousePosition.y + offsetY,
|
|
128
|
+
transform: 'translateY(-100%)',
|
|
129
|
+
}}
|
|
130
|
+
className={cn(
|
|
131
|
+
"z-[9999] overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 pointer-events-none whitespace-nowrap",
|
|
132
|
+
className
|
|
133
|
+
)}
|
|
134
|
+
{...props}
|
|
135
|
+
>
|
|
136
|
+
{children}
|
|
137
|
+
</div>,
|
|
138
|
+
document.body
|
|
139
|
+
)
|
|
140
|
+
})
|
|
141
|
+
TooltipContent.displayName = "TooltipContent"
|
|
142
|
+
|
|
143
|
+
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
|
|
File without changes
|