@inferencesh/ui 0.0.0-stage → 0.1.2

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.
Files changed (165) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +68 -2
  3. package/components.json +22 -0
  4. package/package.json +231 -4
  5. package/src/components/audio-player.tsx +549 -0
  6. package/src/components/button.tsx +13 -0
  7. package/src/components/chart.tsx +403 -0
  8. package/src/components/circuit.tsx +276 -0
  9. package/src/components/code-block/code-block.tsx +260 -0
  10. package/src/components/code-block/index.ts +18 -0
  11. package/src/components/code-block/languages.ts +311 -0
  12. package/src/components/code-block/styles.ts +39 -0
  13. package/src/components/code-block/tokenizer.ts +290 -0
  14. package/src/components/code-block/types.ts +38 -0
  15. package/src/components/code-block/utils.ts +39 -0
  16. package/src/components/code.tsx +48 -0
  17. package/src/components/cookie-consent.tsx +137 -0
  18. package/src/components/copy-button.tsx +44 -0
  19. package/src/components/country-dropdown.tsx +188 -0
  20. package/src/components/glow-loader-fast.tsx +32 -0
  21. package/src/components/glow-loader-mono.tsx +33 -0
  22. package/src/components/glow-loader-sm-fast.tsx +32 -0
  23. package/src/components/glow-loader-sm-mono.tsx +34 -0
  24. package/src/components/glow-loader-sm.tsx +32 -0
  25. package/src/components/glow-loader.tsx +32 -0
  26. package/src/components/glow-logo.tsx +32 -0
  27. package/src/components/gradient.tsx +80 -0
  28. package/src/components/index.ts +45 -0
  29. package/src/components/inline-sidebar.tsx +351 -0
  30. package/src/components/input-color.tsx +349 -0
  31. package/src/components/logo-base.tsx +213 -0
  32. package/src/components/logo-color.tsx +23 -0
  33. package/src/components/logo-full.tsx +71 -0
  34. package/src/components/logo-svg.tsx +23 -0
  35. package/src/components/menu-navigation.tsx +359 -0
  36. package/src/components/multi-select.tsx +721 -0
  37. package/src/components/pastel-gradient.tsx +25 -0
  38. package/src/components/pixel-symmetry.tsx +151 -0
  39. package/src/components/progress.tsx +28 -0
  40. package/src/components/scroll-more.tsx +131 -0
  41. package/src/components/select.tsx +85 -0
  42. package/src/components/shimmering-text.tsx +108 -0
  43. package/src/components/sidebar-light.tsx +102 -0
  44. package/src/components/sonner.tsx +38 -0
  45. package/src/components/theme-switcher-sidebar.tsx +56 -0
  46. package/src/components/theme-switcher-simple.tsx +110 -0
  47. package/src/components/theme-switcher.tsx +47 -0
  48. package/src/components/toggle-group.tsx +55 -0
  49. package/src/components/tooltip-button.tsx +91 -0
  50. package/src/components/tooltip.tsx +71 -0
  51. package/src/components/tree-view.tsx +499 -0
  52. package/src/components/unglow-loader.tsx +33 -0
  53. package/src/components/waveform.tsx +1632 -0
  54. package/src/components/zoomable-image.tsx +76 -0
  55. package/src/docs/api-docs.tsx +763 -0
  56. package/src/docs/callout.tsx +160 -0
  57. package/src/docs/code-group.tsx +215 -0
  58. package/src/docs/copy-menu.tsx +143 -0
  59. package/src/docs/doc-tabs.tsx +84 -0
  60. package/src/docs/index.ts +16 -0
  61. package/src/docs/steps.tsx +105 -0
  62. package/src/docs/table-of-contents.tsx +174 -0
  63. package/src/examples/guide-markdown.ts +129 -0
  64. package/src/examples/index.ts +1153 -0
  65. package/src/global.d.ts +1 -0
  66. package/src/hooks/use-copy-to-clipboard.ts +36 -0
  67. package/src/hooks/use-mobile.ts +19 -0
  68. package/src/lib/display-name.ts +15 -0
  69. package/src/lib/example-input.ts +130 -0
  70. package/src/lib/plans.ts +44 -0
  71. package/src/lib/safe-content.ts +137 -0
  72. package/src/lib/schema.ts +320 -0
  73. package/src/lib/storage.ts +108 -0
  74. package/src/markdown/docs-markdown-renderer.tsx +518 -0
  75. package/src/markdown/helpers.ts +95 -0
  76. package/src/markdown/index.ts +24 -0
  77. package/src/markdown/markdown-renderer.tsx +232 -0
  78. package/src/markdown/youtube-embed.tsx +43 -0
  79. package/src/og/image.ts +312 -0
  80. package/src/og/index.tsx +430 -0
  81. package/src/og/query.ts +26 -0
  82. package/src/shadcn/accordion.tsx +71 -0
  83. package/src/shadcn/alert-dialog.tsx +187 -0
  84. package/src/shadcn/alert.tsx +75 -0
  85. package/src/shadcn/aspect-ratio.tsx +22 -0
  86. package/src/shadcn/attachment.tsx +207 -0
  87. package/src/shadcn/avatar.tsx +106 -0
  88. package/src/shadcn/badge.tsx +51 -0
  89. package/src/shadcn/breadcrumb.tsx +124 -0
  90. package/src/shadcn/bubble.tsx +127 -0
  91. package/src/shadcn/button-group.tsx +87 -0
  92. package/src/shadcn/button.tsx +57 -0
  93. package/src/shadcn/calendar.tsx +219 -0
  94. package/src/shadcn/card.tsx +102 -0
  95. package/src/shadcn/carousel.tsx +242 -0
  96. package/src/shadcn/chart.tsx +372 -0
  97. package/src/shadcn/checkbox.tsx +28 -0
  98. package/src/shadcn/collapsible.tsx +19 -0
  99. package/src/shadcn/combobox.tsx +297 -0
  100. package/src/shadcn/command.tsx +194 -0
  101. package/src/shadcn/context-menu.tsx +270 -0
  102. package/src/shadcn/dialog.tsx +158 -0
  103. package/src/shadcn/direction.tsx +4 -0
  104. package/src/shadcn/drawer.tsx +227 -0
  105. package/src/shadcn/dropdown-menu.tsx +265 -0
  106. package/src/shadcn/empty.tsx +103 -0
  107. package/src/shadcn/field.tsx +238 -0
  108. package/src/shadcn/form.tsx +173 -0
  109. package/src/shadcn/hover-card.tsx +50 -0
  110. package/src/shadcn/index.ts +53 -0
  111. package/src/shadcn/input-group.tsx +156 -0
  112. package/src/shadcn/input-otp.tsx +84 -0
  113. package/src/shadcn/input.tsx +19 -0
  114. package/src/shadcn/item.tsx +201 -0
  115. package/src/shadcn/kbd.tsx +26 -0
  116. package/src/shadcn/label.tsx +19 -0
  117. package/src/shadcn/marker.tsx +70 -0
  118. package/src/shadcn/menubar.tsx +278 -0
  119. package/src/shadcn/message-scroller.tsx +131 -0
  120. package/src/shadcn/message.tsx +91 -0
  121. package/src/shadcn/native-select.tsx +60 -0
  122. package/src/shadcn/navigation-menu.tsx +167 -0
  123. package/src/shadcn/pagination.tsx +130 -0
  124. package/src/shadcn/popover.tsx +87 -0
  125. package/src/shadcn/progress.tsx +82 -0
  126. package/src/shadcn/radio-group.tsx +35 -0
  127. package/src/shadcn/resizable.tsx +49 -0
  128. package/src/shadcn/scroll-area.tsx +52 -0
  129. package/src/shadcn/select.tsx +200 -0
  130. package/src/shadcn/separator.tsx +22 -0
  131. package/src/shadcn/sheet.tsx +136 -0
  132. package/src/shadcn/sidebar.tsx +721 -0
  133. package/src/shadcn/skeleton.tsx +13 -0
  134. package/src/shadcn/slider.tsx +51 -0
  135. package/src/shadcn/sonner.tsx +49 -0
  136. package/src/shadcn/spinner.tsx +10 -0
  137. package/src/shadcn/switch.tsx +29 -0
  138. package/src/shadcn/table.tsx +115 -0
  139. package/src/shadcn/tabs.tsx +79 -0
  140. package/src/shadcn/textarea.tsx +17 -0
  141. package/src/shadcn/toggle-group.tsx +89 -0
  142. package/src/shadcn/toggle.tsx +44 -0
  143. package/src/shadcn/tooltip.tsx +63 -0
  144. package/src/theme/config.ts +48 -0
  145. package/src/theme/css/base.css +92 -0
  146. package/src/theme/css/bitboy.css +75 -0
  147. package/src/theme/css/dark.css +47 -0
  148. package/src/theme/css/designer.css +122 -0
  149. package/src/theme/css/fonts.css +33 -0
  150. package/src/theme/css/globals.css +14 -0
  151. package/src/theme/css/hackintosh.css +57 -0
  152. package/src/theme/css/llama.css +103 -0
  153. package/src/theme/css/safelist.css +39 -0
  154. package/src/theme/css/shadcn.css +77 -0
  155. package/src/theme/css/theme.css +216 -0
  156. package/src/theme/embed-theme.ts +146 -0
  157. package/src/theme/fonts/FiraCode-VF.woff2 +0 -0
  158. package/src/theme/fonts/Hack-Regular.woff2 +0 -0
  159. package/src/theme/fonts/LICENSE-FiraCode.txt +93 -0
  160. package/src/theme/fonts/LICENSE-Hack.txt +45 -0
  161. package/src/theme/fonts/LICENSE-MonaSans.txt +93 -0
  162. package/src/theme/fonts/Mona-Sans.woff2 +0 -0
  163. package/src/theme/index.ts +15 -0
  164. package/src/utils/cn.ts +3 -0
  165. package/src/utils/index.ts +2 -0
@@ -0,0 +1,131 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import {
5
+ MessageScroller as MessageScrollerPrimitive,
6
+ useMessageScroller,
7
+ useMessageScrollerScrollable,
8
+ useMessageScrollerVisibility,
9
+ } from "@shadcn/react/message-scroller"
10
+ import { cn } from "cn"
11
+
12
+ import { Button } from "@inferencesh/ui/shadcn/button"
13
+ import { ArrowDownIcon } from "lucide-react"
14
+
15
+ function MessageScrollerProvider(
16
+ props: React.ComponentProps<typeof MessageScrollerPrimitive.Provider>
17
+ ) {
18
+ return <MessageScrollerPrimitive.Provider {...props} />
19
+ }
20
+
21
+ function MessageScroller({
22
+ className,
23
+ ...props
24
+ }: React.ComponentProps<typeof MessageScrollerPrimitive.Root>) {
25
+ return (
26
+ <MessageScrollerPrimitive.Root
27
+ data-slot="message-scroller"
28
+ className={cn(
29
+ "group/message-scroller relative flex size-full min-h-0 flex-col overflow-hidden",
30
+ className
31
+ )}
32
+ {...props}
33
+ />
34
+ )
35
+ }
36
+
37
+ function MessageScrollerViewport({
38
+ className,
39
+ ...props
40
+ }: React.ComponentProps<typeof MessageScrollerPrimitive.Viewport>) {
41
+ return (
42
+ <MessageScrollerPrimitive.Viewport
43
+ data-slot="message-scroller-viewport"
44
+ className={cn(
45
+ "size-full min-h-0 min-w-0 scroll-fade-b scrollbar-thin scrollbar-gutter-stable overflow-y-auto overscroll-contain contain-content data-autoscrolling:scrollbar-thumb-transparent data-autoscrolling:scrollbar-track-transparent data-pending-scroll:invisible",
46
+ className
47
+ )}
48
+ {...props}
49
+ />
50
+ )
51
+ }
52
+
53
+ function MessageScrollerContent({
54
+ className,
55
+ ...props
56
+ }: React.ComponentProps<typeof MessageScrollerPrimitive.Content>) {
57
+ return (
58
+ <MessageScrollerPrimitive.Content
59
+ data-slot="message-scroller-content"
60
+ className={cn("flex h-max min-h-full flex-col gap-6", className)}
61
+ {...props}
62
+ />
63
+ )
64
+ }
65
+
66
+ function MessageScrollerItem({
67
+ className,
68
+ scrollAnchor = false,
69
+ ...props
70
+ }: React.ComponentProps<typeof MessageScrollerPrimitive.Item>) {
71
+ return (
72
+ <MessageScrollerPrimitive.Item
73
+ data-slot="message-scroller-item"
74
+ scrollAnchor={scrollAnchor}
75
+ className={cn(
76
+ "min-w-0 shrink-0 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]",
77
+ className
78
+ )}
79
+ {...props}
80
+ />
81
+ )
82
+ }
83
+
84
+ function MessageScrollerButton({
85
+ direction = "end",
86
+ className,
87
+ children,
88
+ render,
89
+ variant = "secondary",
90
+ size = "icon-sm",
91
+ ...props
92
+ }: React.ComponentProps<typeof MessageScrollerPrimitive.Button> &
93
+ Pick<React.ComponentProps<typeof Button>, "variant" | "size">) {
94
+ return (
95
+ <MessageScrollerPrimitive.Button
96
+ data-slot="message-scroller-button"
97
+ data-direction={direction}
98
+ data-variant={variant}
99
+ data-size={size}
100
+ direction={direction}
101
+ className={cn(
102
+ "absolute inset-s-1/2 -translate-x-1/2 border-border bg-background text-foreground transition-[translate,scale,opacity] duration-200 hover:bg-muted hover:text-foreground data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-400 data-[active=false]:ease-[cubic-bezier(0.7,0,0.84,0)] data-[active=true]:translate-y-0 data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-[cubic-bezier(0.23,1,0.32,1)] data-[direction=end]:bottom-4 data-[direction=end]:data-[active=false]:translate-y-full data-[direction=start]:top-4 data-[direction=start]:data-[active=false]:-translate-y-full rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180",
103
+ className
104
+ )}
105
+ render={render ?? <Button variant={variant} size={size} />}
106
+ {...props}
107
+ >
108
+ {children ?? (
109
+ <>
110
+ <ArrowDownIcon
111
+ />
112
+ <span className="sr-only">
113
+ {direction === "end" ? "Scroll to end" : "Scroll to start"}
114
+ </span>
115
+ </>
116
+ )}
117
+ </MessageScrollerPrimitive.Button>
118
+ )
119
+ }
120
+
121
+ export {
122
+ MessageScrollerProvider,
123
+ MessageScroller,
124
+ MessageScrollerViewport,
125
+ MessageScrollerContent,
126
+ MessageScrollerItem,
127
+ MessageScrollerButton,
128
+ useMessageScroller,
129
+ useMessageScrollerScrollable,
130
+ useMessageScrollerVisibility,
131
+ }
@@ -0,0 +1,91 @@
1
+ import * as React from "react"
2
+ import { cn } from "cn"
3
+
4
+ function MessageGroup({ className, ...props }: React.ComponentProps<"div">) {
5
+ return (
6
+ <div
7
+ data-slot="message-group"
8
+ className={cn("flex min-w-0 flex-col gap-2", className)}
9
+ {...props}
10
+ />
11
+ )
12
+ }
13
+
14
+ function Message({
15
+ className,
16
+ align = "start",
17
+ ...props
18
+ }: React.ComponentProps<"div"> & { align?: "start" | "end" }) {
19
+ return (
20
+ <div
21
+ data-slot="message"
22
+ data-align={align}
23
+ className={cn(
24
+ "group/message relative flex w-full min-w-0 gap-2 text-sm data-[align=end]:flex-row-reverse",
25
+ className
26
+ )}
27
+ {...props}
28
+ />
29
+ )
30
+ }
31
+
32
+ function MessageAvatar({ className, ...props }: React.ComponentProps<"div">) {
33
+ return (
34
+ <div
35
+ data-slot="message-avatar"
36
+ className={cn(
37
+ "flex w-fit min-w-8 shrink-0 items-center justify-center self-end overflow-hidden rounded-full bg-muted group-has-data-[slot=message-footer]/message:-translate-y-8",
38
+ className
39
+ )}
40
+ {...props}
41
+ />
42
+ )
43
+ }
44
+
45
+ function MessageContent({ className, ...props }: React.ComponentProps<"div">) {
46
+ return (
47
+ <div
48
+ data-slot="message-content"
49
+ className={cn(
50
+ "flex w-full min-w-0 flex-col gap-2.5 wrap-break-word group-data-[align=end]/message:*:data-slot:self-end",
51
+ className
52
+ )}
53
+ {...props}
54
+ />
55
+ )
56
+ }
57
+
58
+ function MessageHeader({ className, ...props }: React.ComponentProps<"div">) {
59
+ return (
60
+ <div
61
+ data-slot="message-header"
62
+ className={cn(
63
+ "flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0",
64
+ className
65
+ )}
66
+ {...props}
67
+ />
68
+ )
69
+ }
70
+
71
+ function MessageFooter({ className, ...props }: React.ComponentProps<"div">) {
72
+ return (
73
+ <div
74
+ data-slot="message-footer"
75
+ className={cn(
76
+ "flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0 group-data-[align=end]/message:justify-end",
77
+ className
78
+ )}
79
+ {...props}
80
+ />
81
+ )
82
+ }
83
+
84
+ export {
85
+ MessageGroup,
86
+ Message,
87
+ MessageAvatar,
88
+ MessageContent,
89
+ MessageFooter,
90
+ MessageHeader,
91
+ }
@@ -0,0 +1,60 @@
1
+ import * as React from "react"
2
+ import { cn } from "cn"
3
+ import { ChevronDownIcon } from "lucide-react"
4
+
5
+ type NativeSelectProps = Omit<React.ComponentProps<"select">, "size"> & {
6
+ size?: "sm" | "default"
7
+ }
8
+
9
+ function NativeSelect({
10
+ className,
11
+ size = "default",
12
+ ...props
13
+ }: NativeSelectProps) {
14
+ return (
15
+ <div
16
+ className={cn(
17
+ "group/native-select relative w-fit has-[select:disabled]:opacity-50",
18
+ className
19
+ )}
20
+ data-slot="native-select-wrapper"
21
+ data-size={size}
22
+ >
23
+ <select
24
+ data-slot="native-select"
25
+ data-size={size}
26
+ className="h-8 w-full min-w-0 appearance-none rounded-lg border border-input bg-transparent py-1 pr-8 pl-2.5 text-sm transition-colors outline-none select-none selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-[size=sm]:py-0.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40"
27
+ {...props}
28
+ />
29
+ <ChevronDownIcon className="pointer-events-none absolute top-1/2 right-2.5 size-4 -translate-y-1/2 text-muted-foreground select-none" aria-hidden="true" data-slot="native-select-icon" />
30
+ </div>
31
+ )
32
+ }
33
+
34
+ function NativeSelectOption({
35
+ className,
36
+ ...props
37
+ }: React.ComponentProps<"option">) {
38
+ return (
39
+ <option
40
+ data-slot="native-select-option"
41
+ className={cn("bg-[Canvas] text-[CanvasText]", className)}
42
+ {...props}
43
+ />
44
+ )
45
+ }
46
+
47
+ function NativeSelectOptGroup({
48
+ className,
49
+ ...props
50
+ }: React.ComponentProps<"optgroup">) {
51
+ return (
52
+ <optgroup
53
+ data-slot="native-select-optgroup"
54
+ className={cn("bg-[Canvas] text-[CanvasText]", className)}
55
+ {...props}
56
+ />
57
+ )
58
+ }
59
+
60
+ export { NativeSelect, NativeSelectOptGroup, NativeSelectOption }
@@ -0,0 +1,167 @@
1
+ import { NavigationMenu as NavigationMenuPrimitive } from "@base-ui/react/navigation-menu"
2
+ import { cva } from "class-variance-authority"
3
+ import { cn } from "cn"
4
+ import { ChevronDownIcon } from "lucide-react"
5
+
6
+ function NavigationMenu({
7
+ align = "start",
8
+ className,
9
+ children,
10
+ ...props
11
+ }: NavigationMenuPrimitive.Root.Props &
12
+ Pick<NavigationMenuPrimitive.Positioner.Props, "align">) {
13
+ return (
14
+ <NavigationMenuPrimitive.Root
15
+ data-slot="navigation-menu"
16
+ className={cn(
17
+ "group/navigation-menu relative flex max-w-max flex-1 items-center justify-center",
18
+ className
19
+ )}
20
+ {...props}
21
+ >
22
+ {children}
23
+ <NavigationMenuPositioner align={align} />
24
+ </NavigationMenuPrimitive.Root>
25
+ )
26
+ }
27
+
28
+ function NavigationMenuList({
29
+ className,
30
+ ...props
31
+ }: React.ComponentPropsWithRef<typeof NavigationMenuPrimitive.List>) {
32
+ return (
33
+ <NavigationMenuPrimitive.List
34
+ data-slot="navigation-menu-list"
35
+ className={cn(
36
+ "group flex flex-1 list-none items-center justify-center gap-0",
37
+ className
38
+ )}
39
+ {...props}
40
+ />
41
+ )
42
+ }
43
+
44
+ function NavigationMenuItem({
45
+ className,
46
+ ...props
47
+ }: React.ComponentPropsWithRef<typeof NavigationMenuPrimitive.Item>) {
48
+ return (
49
+ <NavigationMenuPrimitive.Item
50
+ data-slot="navigation-menu-item"
51
+ className={cn("relative", className)}
52
+ {...props}
53
+ />
54
+ )
55
+ }
56
+
57
+ const navigationMenuTriggerStyle = cva(
58
+ "group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-lg px-2.5 py-1.5 text-sm font-medium transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-popup-open:bg-muted/50 data-popup-open:hover:bg-muted data-open:bg-muted/50 data-open:hover:bg-muted data-open:focus:bg-muted"
59
+ )
60
+
61
+ function NavigationMenuTrigger({
62
+ className,
63
+ children,
64
+ ...props
65
+ }: NavigationMenuPrimitive.Trigger.Props) {
66
+ return (
67
+ <NavigationMenuPrimitive.Trigger
68
+ data-slot="navigation-menu-trigger"
69
+ className={cn(navigationMenuTriggerStyle(), "group", className)}
70
+ {...props}
71
+ >
72
+ {children}{" "}
73
+ <ChevronDownIcon className="relative top-px ml-1 size-3 transition duration-300 group-data-popup-open/navigation-menu-trigger:rotate-180 group-data-open/navigation-menu-trigger:rotate-180" aria-hidden="true" />
74
+ </NavigationMenuPrimitive.Trigger>
75
+ )
76
+ }
77
+
78
+ function NavigationMenuContent({
79
+ className,
80
+ ...props
81
+ }: NavigationMenuPrimitive.Content.Props) {
82
+ return (
83
+ <NavigationMenuPrimitive.Content
84
+ data-slot="navigation-menu-content"
85
+ className={cn(
86
+ "data-ending-style:data-activation-direction=left:translate-x-[50%] data-ending-style:data-activation-direction=right:translate-x-[-50%] data-starting-style:data-activation-direction=left:translate-x-[-50%] data-starting-style:data-activation-direction=right:translate-x-[50%] h-full w-auto p-1 transition-[opacity,transform,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] group-data-[viewport=false]/navigation-menu:rounded-lg group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:ring-1 group-data-[viewport=false]/navigation-menu:ring-foreground/10 group-data-[viewport=false]/navigation-menu:duration-300 data-ending-style:opacity-0 data-starting-style:opacity-0 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none group-data-[viewport=false]/navigation-menu:data-open:animate-in group-data-[viewport=false]/navigation-menu:data-open:fade-in-0 group-data-[viewport=false]/navigation-menu:data-open:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-closed:animate-out group-data-[viewport=false]/navigation-menu:data-closed:fade-out-0 group-data-[viewport=false]/navigation-menu:data-closed:zoom-out-95",
87
+ className
88
+ )}
89
+ {...props}
90
+ />
91
+ )
92
+ }
93
+
94
+ function NavigationMenuPositioner({
95
+ className,
96
+ side = "bottom",
97
+ sideOffset = 8,
98
+ align = "start",
99
+ alignOffset = 0,
100
+ ...props
101
+ }: NavigationMenuPrimitive.Positioner.Props) {
102
+ return (
103
+ <NavigationMenuPrimitive.Portal>
104
+ <NavigationMenuPrimitive.Positioner
105
+ side={side}
106
+ sideOffset={sideOffset}
107
+ align={align}
108
+ alignOffset={alignOffset}
109
+ className={cn(
110
+ "isolate z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[top,left,right,bottom] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-instant:transition-none data-[side=bottom]:before:top-[-10px] data-[side=bottom]:before:right-0 data-[side=bottom]:before:left-0",
111
+ className
112
+ )}
113
+ {...props}
114
+ >
115
+ <NavigationMenuPrimitive.Popup className="data-[ending-style]:easing-[ease] xs:w-(--popup-width) relative h-(--popup-height) w-(--popup-width) origin-(--transform-origin) rounded-lg bg-popover text-popover-foreground shadow ring-1 ring-foreground/10 transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] outline-none data-ending-style:scale-90 data-ending-style:opacity-0 data-ending-style:duration-150 data-starting-style:scale-90 data-starting-style:opacity-0">
116
+ <NavigationMenuPrimitive.Viewport className="relative size-full overflow-hidden" />
117
+ </NavigationMenuPrimitive.Popup>
118
+ </NavigationMenuPrimitive.Positioner>
119
+ </NavigationMenuPrimitive.Portal>
120
+ )
121
+ }
122
+
123
+ function NavigationMenuLink({
124
+ className,
125
+ ...props
126
+ }: NavigationMenuPrimitive.Link.Props) {
127
+ return (
128
+ <NavigationMenuPrimitive.Link
129
+ data-slot="navigation-menu-link"
130
+ className={cn(
131
+ "flex items-center gap-2 rounded-lg p-2 text-sm transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 in-data-[slot=navigation-menu-content]:rounded-md data-active:bg-muted/50 data-active:hover:bg-muted data-active:focus:bg-muted [&_svg:not([class*='size-'])]:size-4",
132
+ className
133
+ )}
134
+ {...props}
135
+ />
136
+ )
137
+ }
138
+
139
+ function NavigationMenuIndicator({
140
+ className,
141
+ ...props
142
+ }: React.ComponentPropsWithRef<typeof NavigationMenuPrimitive.Icon>) {
143
+ return (
144
+ <NavigationMenuPrimitive.Icon
145
+ data-slot="navigation-menu-indicator"
146
+ className={cn(
147
+ "top-full z-1 flex h-1.5 items-end justify-center overflow-hidden data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in",
148
+ className
149
+ )}
150
+ {...props}
151
+ >
152
+ <div className="relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md" />
153
+ </NavigationMenuPrimitive.Icon>
154
+ )
155
+ }
156
+
157
+ export {
158
+ NavigationMenu,
159
+ NavigationMenuContent,
160
+ NavigationMenuIndicator,
161
+ NavigationMenuItem,
162
+ NavigationMenuLink,
163
+ NavigationMenuList,
164
+ NavigationMenuTrigger,
165
+ navigationMenuTriggerStyle,
166
+ NavigationMenuPositioner,
167
+ }
@@ -0,0 +1,130 @@
1
+ import * as React from "react"
2
+ import { cn } from "cn"
3
+
4
+ import { Button } from "@inferencesh/ui/shadcn/button"
5
+ import { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from "lucide-react"
6
+
7
+ function Pagination({ className, ...props }: React.ComponentProps<"nav">) {
8
+ return (
9
+ <nav
10
+ role="navigation"
11
+ aria-label="pagination"
12
+ data-slot="pagination"
13
+ className={cn("mx-auto flex w-full justify-center", className)}
14
+ {...props}
15
+ />
16
+ )
17
+ }
18
+
19
+ function PaginationContent({
20
+ className,
21
+ ...props
22
+ }: React.ComponentProps<"ul">) {
23
+ return (
24
+ <ul
25
+ data-slot="pagination-content"
26
+ className={cn("flex items-center gap-0.5", className)}
27
+ {...props}
28
+ />
29
+ )
30
+ }
31
+
32
+ function PaginationItem({ ...props }: React.ComponentProps<"li">) {
33
+ return <li data-slot="pagination-item" {...props} />
34
+ }
35
+
36
+ type PaginationLinkProps = {
37
+ isActive?: boolean
38
+ } & Pick<React.ComponentProps<typeof Button>, "size"> &
39
+ React.ComponentProps<"a">
40
+
41
+ function PaginationLink({
42
+ className,
43
+ isActive,
44
+ size = "icon",
45
+ ...props
46
+ }: PaginationLinkProps) {
47
+ return (
48
+ <Button
49
+ variant={isActive ? "outline" : "ghost"}
50
+ size={size}
51
+ className={cn(className)}
52
+ nativeButton={false}
53
+ render={
54
+ <a
55
+ aria-current={isActive ? "page" : undefined}
56
+ data-slot="pagination-link"
57
+ data-active={isActive}
58
+ {...props}
59
+ />
60
+ }
61
+ />
62
+ )
63
+ }
64
+
65
+ function PaginationPrevious({
66
+ className,
67
+ text = "Previous",
68
+ ...props
69
+ }: React.ComponentProps<typeof PaginationLink> & { text?: string }) {
70
+ return (
71
+ <PaginationLink
72
+ aria-label="Go to previous page"
73
+ size="default"
74
+ className={cn("pl-1.5!", className)}
75
+ {...props}
76
+ >
77
+ <ChevronLeftIcon data-icon="inline-start" />
78
+ <span className="hidden sm:block">{text}</span>
79
+ </PaginationLink>
80
+ )
81
+ }
82
+
83
+ function PaginationNext({
84
+ className,
85
+ text = "Next",
86
+ ...props
87
+ }: React.ComponentProps<typeof PaginationLink> & { text?: string }) {
88
+ return (
89
+ <PaginationLink
90
+ aria-label="Go to next page"
91
+ size="default"
92
+ className={cn("pr-1.5!", className)}
93
+ {...props}
94
+ >
95
+ <span className="hidden sm:block">{text}</span>
96
+ <ChevronRightIcon data-icon="inline-end" />
97
+ </PaginationLink>
98
+ )
99
+ }
100
+
101
+ function PaginationEllipsis({
102
+ className,
103
+ ...props
104
+ }: React.ComponentProps<"span">) {
105
+ return (
106
+ <span
107
+ aria-hidden
108
+ data-slot="pagination-ellipsis"
109
+ className={cn(
110
+ "flex size-8 items-center justify-center [&_svg:not([class*='size-'])]:size-4",
111
+ className
112
+ )}
113
+ {...props}
114
+ >
115
+ <MoreHorizontalIcon
116
+ />
117
+ <span className="sr-only">More pages</span>
118
+ </span>
119
+ )
120
+ }
121
+
122
+ export {
123
+ Pagination,
124
+ PaginationContent,
125
+ PaginationEllipsis,
126
+ PaginationItem,
127
+ PaginationLink,
128
+ PaginationNext,
129
+ PaginationPrevious,
130
+ }
@@ -0,0 +1,87 @@
1
+ import * as React from "react"
2
+ import { Popover as PopoverPrimitive } from "@base-ui/react/popover"
3
+ import { cn } from "cn"
4
+
5
+ function Popover({ ...props }: PopoverPrimitive.Root.Props) {
6
+ return <PopoverPrimitive.Root data-slot="popover" {...props} />
7
+ }
8
+
9
+ function PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {
10
+ return <PopoverPrimitive.Trigger data-slot="popover-trigger" {...props} />
11
+ }
12
+
13
+ function PopoverContent({
14
+ className,
15
+ align = "center",
16
+ alignOffset = 0,
17
+ side = "bottom",
18
+ sideOffset = 4,
19
+ ...props
20
+ }: PopoverPrimitive.Popup.Props &
21
+ Pick<
22
+ PopoverPrimitive.Positioner.Props,
23
+ "align" | "alignOffset" | "side" | "sideOffset"
24
+ >) {
25
+ return (
26
+ <PopoverPrimitive.Portal>
27
+ <PopoverPrimitive.Positioner
28
+ align={align}
29
+ alignOffset={alignOffset}
30
+ side={side}
31
+ sideOffset={sideOffset}
32
+ className="isolate z-50"
33
+ >
34
+ <PopoverPrimitive.Popup
35
+ data-slot="popover-content"
36
+ className={cn(
37
+ "z-50 flex w-72 origin-(--transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
38
+ className
39
+ )}
40
+ {...props}
41
+ />
42
+ </PopoverPrimitive.Positioner>
43
+ </PopoverPrimitive.Portal>
44
+ )
45
+ }
46
+
47
+ function PopoverHeader({ className, ...props }: React.ComponentProps<"div">) {
48
+ return (
49
+ <div
50
+ data-slot="popover-header"
51
+ className={cn("flex flex-col gap-0.5 text-sm", className)}
52
+ {...props}
53
+ />
54
+ )
55
+ }
56
+
57
+ function PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {
58
+ return (
59
+ <PopoverPrimitive.Title
60
+ data-slot="popover-title"
61
+ className={cn("font-medium", className)}
62
+ {...props}
63
+ />
64
+ )
65
+ }
66
+
67
+ function PopoverDescription({
68
+ className,
69
+ ...props
70
+ }: PopoverPrimitive.Description.Props) {
71
+ return (
72
+ <PopoverPrimitive.Description
73
+ data-slot="popover-description"
74
+ className={cn("text-muted-foreground", className)}
75
+ {...props}
76
+ />
77
+ )
78
+ }
79
+
80
+ export {
81
+ Popover,
82
+ PopoverContent,
83
+ PopoverDescription,
84
+ PopoverHeader,
85
+ PopoverTitle,
86
+ PopoverTrigger,
87
+ }