@moloodev/ui 0.0.0-stage → 0.2.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.
Files changed (93) hide show
  1. package/package.json +139 -3
  2. package/registry/components.ts +135 -0
  3. package/registry/fonts.css +81 -0
  4. package/registry/suit-OFL.txt +94 -0
  5. package/registry/wanted-sans-OFL.txt +93 -0
  6. package/src/components/ui/accordion.tsx +74 -0
  7. package/src/components/ui/alert-dialog.tsx +187 -0
  8. package/src/components/ui/alert.tsx +83 -0
  9. package/src/components/ui/aspect-ratio.tsx +22 -0
  10. package/src/components/ui/attachment.tsx +207 -0
  11. package/src/components/ui/avatar.tsx +109 -0
  12. package/src/components/ui/badge.tsx +54 -0
  13. package/src/components/ui/breadcrumb.tsx +126 -0
  14. package/src/components/ui/bubble.tsx +128 -0
  15. package/src/components/ui/button-group.tsx +103 -0
  16. package/src/components/ui/button.tsx +68 -0
  17. package/src/components/ui/calendar.tsx +222 -0
  18. package/src/components/ui/card.tsx +103 -0
  19. package/src/components/ui/carousel.tsx +242 -0
  20. package/src/components/ui/chart.tsx +398 -0
  21. package/src/components/ui/checkbox.tsx +28 -0
  22. package/src/components/ui/collapsible.tsx +40 -0
  23. package/src/components/ui/combobox.tsx +299 -0
  24. package/src/components/ui/command.tsx +218 -0
  25. package/src/components/ui/context-menu.tsx +271 -0
  26. package/src/components/ui/data-table.tsx +919 -0
  27. package/src/components/ui/date-picker.tsx +65 -0
  28. package/src/components/ui/dialog.tsx +224 -0
  29. package/src/components/ui/drawer.tsx +231 -0
  30. package/src/components/ui/dropdown-menu.tsx +268 -0
  31. package/src/components/ui/dropzone.tsx +186 -0
  32. package/src/components/ui/empty.tsx +101 -0
  33. package/src/components/ui/field.tsx +238 -0
  34. package/src/components/ui/form.tsx +83 -0
  35. package/src/components/ui/highlighted-source.tsx +200 -0
  36. package/src/components/ui/hover-card.tsx +51 -0
  37. package/src/components/ui/image-field.tsx +796 -0
  38. package/src/components/ui/input-group.tsx +149 -0
  39. package/src/components/ui/input-otp.tsx +86 -0
  40. package/src/components/ui/input-step.ts +19 -0
  41. package/src/components/ui/input.tsx +100 -0
  42. package/src/components/ui/item.tsx +201 -0
  43. package/src/components/ui/kbd.tsx +91 -0
  44. package/src/components/ui/kind-icon-glob.ts +24 -0
  45. package/src/components/ui/kind-icon-load.ts +52 -0
  46. package/src/components/ui/kind-icon-static.ts +46 -0
  47. package/src/components/ui/kind-icon.tsx +84 -0
  48. package/src/components/ui/kind-mark.tsx +65 -0
  49. package/src/components/ui/label.tsx +29 -0
  50. package/src/components/ui/marker.tsx +71 -0
  51. package/src/components/ui/menubar.tsx +277 -0
  52. package/src/components/ui/message-scroller.tsx +137 -0
  53. package/src/components/ui/message.tsx +92 -0
  54. package/src/components/ui/moloo-logo.tsx +45 -0
  55. package/src/components/ui/native-select.tsx +61 -0
  56. package/src/components/ui/navigation-menu.tsx +168 -0
  57. package/src/components/ui/outline-list.tsx +73 -0
  58. package/src/components/ui/pagination.tsx +130 -0
  59. package/src/components/ui/panel.tsx +108 -0
  60. package/src/components/ui/popover.tsx +90 -0
  61. package/src/components/ui/progress.tsx +117 -0
  62. package/src/components/ui/radio-group.tsx +38 -0
  63. package/src/components/ui/resizable.tsx +52 -0
  64. package/src/components/ui/scroll-area.tsx +54 -0
  65. package/src/components/ui/select.tsx +205 -0
  66. package/src/components/ui/separator.tsx +25 -0
  67. package/src/components/ui/sheet.tsx +140 -0
  68. package/src/components/ui/sidebar.tsx +746 -0
  69. package/src/components/ui/skeleton.tsx +13 -0
  70. package/src/components/ui/slider.tsx +52 -0
  71. package/src/components/ui/spinner.tsx +18 -0
  72. package/src/components/ui/switch.tsx +32 -0
  73. package/src/components/ui/table.tsx +116 -0
  74. package/src/components/ui/tabs.tsx +83 -0
  75. package/src/components/ui/tag-list-input.tsx +194 -0
  76. package/src/components/ui/textarea.tsx +18 -0
  77. package/src/components/ui/timeline.tsx +265 -0
  78. package/src/components/ui/toast.tsx +237 -0
  79. package/src/components/ui/toggle-group.tsx +90 -0
  80. package/src/components/ui/toggle.tsx +45 -0
  81. package/src/components/ui/tooltip.tsx +66 -0
  82. package/src/css.d.ts +1 -0
  83. package/src/hooks/use-clipboard.ts +82 -0
  84. package/src/hooks/use-mobile.ts +21 -0
  85. package/src/index.ts +106 -0
  86. package/src/kind-icon.ts +4 -0
  87. package/src/lib/format-relative-time.ts +41 -0
  88. package/src/lib/list-selection.ts +61 -0
  89. package/src/lib/utils.ts +6 -0
  90. package/src/moloo.css +360 -0
  91. package/src/styles.css +36 -0
  92. package/src/typeset.css +518 -0
  93. package/README.md +0 -3
@@ -0,0 +1,205 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { Select as SelectPrimitive } from "@base-ui/react/select"
5
+
6
+ import { cn } from "../../lib/utils"
7
+ import { IconChevronDown, IconCheck, IconChevronUp } from "@tabler/icons-react"
8
+
9
+ /** Pass `items={[{ value, label }]}` so SelectValue shows labels, not raw values. */
10
+ const Select = SelectPrimitive.Root
11
+
12
+ function SelectGroup({ className, ...props }: SelectPrimitive.Group.Props) {
13
+ return (
14
+ <SelectPrimitive.Group
15
+ data-slot="select-group"
16
+ className={cn("scroll-my-1", className)}
17
+ {...props}
18
+ />
19
+ )
20
+ }
21
+
22
+ function SelectValue({ className, ...props }: SelectPrimitive.Value.Props) {
23
+ return (
24
+ <SelectPrimitive.Value
25
+ data-slot="select-value"
26
+ className={cn("flex flex-1 text-left", className)}
27
+ {...props}
28
+ />
29
+ )
30
+ }
31
+
32
+ function SelectTrigger({
33
+ className,
34
+ size = "default",
35
+ children,
36
+ ...props
37
+ }: SelectPrimitive.Trigger.Props & {
38
+ size?: "sm" | "default"
39
+ }) {
40
+ return (
41
+ <SelectPrimitive.Trigger
42
+ data-slot="select-trigger"
43
+ data-size={size}
44
+ className={cn(
45
+ "group/select-trigger moloo-focus moloo-field flex w-fit items-center justify-between gap-1.5 py-2 pr-2 pl-2.5 text-sm font-semibold whitespace-nowrap transition-colors outline-none select-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:shadow-[var(--moloo-invalid-shadow)] data-placeholder:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
46
+ className
47
+ )}
48
+ {...props}
49
+ >
50
+ {children}
51
+ <SelectPrimitive.Icon
52
+ render={
53
+ <IconChevronDown className="pointer-events-none size-4 text-muted-foreground transition-transform duration-200 group-data-popup-open/select-trigger:rotate-180" />
54
+ }
55
+ />
56
+ </SelectPrimitive.Trigger>
57
+ )
58
+ }
59
+
60
+ function SelectContent({
61
+ className,
62
+ children,
63
+ side = "bottom",
64
+ sideOffset = 4,
65
+ align = "center",
66
+ alignOffset = 0,
67
+ alignItemWithTrigger = false,
68
+ ...props
69
+ }: SelectPrimitive.Popup.Props &
70
+ Pick<
71
+ SelectPrimitive.Positioner.Props,
72
+ "align" | "alignOffset" | "side" | "sideOffset" | "alignItemWithTrigger"
73
+ >) {
74
+ return (
75
+ <SelectPrimitive.Portal>
76
+ <SelectPrimitive.Positioner
77
+ side={side}
78
+ sideOffset={sideOffset}
79
+ align={align}
80
+ alignOffset={alignOffset}
81
+ alignItemWithTrigger={alignItemWithTrigger}
82
+ className="isolate z-50"
83
+ >
84
+ <SelectPrimitive.Popup
85
+ data-slot="select-content"
86
+ data-align-trigger={alignItemWithTrigger || undefined}
87
+ className={cn(
88
+ "relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-md moloo-surface bg-popover text-sm text-popover-foreground duration-100 data-[align-trigger=true]:animate-none 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",
89
+ className
90
+ )}
91
+ {...props}
92
+ >
93
+ <SelectScrollUpButton />
94
+ <SelectPrimitive.List>{children}</SelectPrimitive.List>
95
+ <SelectScrollDownButton />
96
+ </SelectPrimitive.Popup>
97
+ </SelectPrimitive.Positioner>
98
+ </SelectPrimitive.Portal>
99
+ )
100
+ }
101
+
102
+ function SelectLabel({
103
+ className,
104
+ ...props
105
+ }: SelectPrimitive.GroupLabel.Props) {
106
+ return (
107
+ <SelectPrimitive.GroupLabel
108
+ data-slot="select-label"
109
+ className={cn("px-2 py-2 text-sm text-muted-foreground", className)}
110
+ {...props}
111
+ />
112
+ )
113
+ }
114
+
115
+ function SelectItem({
116
+ className,
117
+ children,
118
+ ...props
119
+ }: SelectPrimitive.Item.Props) {
120
+ return (
121
+ <SelectPrimitive.Item
122
+ data-slot="select-item"
123
+ className={cn(
124
+ "relative flex w-full cursor-default items-center gap-2 rounded-md py-2 pr-8 pl-2 text-sm font-semibold outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
125
+ className
126
+ )}
127
+ {...props}
128
+ >
129
+ <SelectPrimitive.ItemText className="flex flex-1 shrink-0 gap-2 whitespace-nowrap">
130
+ {children}
131
+ </SelectPrimitive.ItemText>
132
+ <SelectPrimitive.ItemIndicator
133
+ render={
134
+ <span className="pointer-events-none absolute right-2 flex size-4 items-center justify-center" />
135
+ }
136
+ >
137
+ <IconCheck className="pointer-events-none" />
138
+ </SelectPrimitive.ItemIndicator>
139
+ </SelectPrimitive.Item>
140
+ )
141
+ }
142
+
143
+ function SelectSeparator({
144
+ className,
145
+ ...props
146
+ }: SelectPrimitive.Separator.Props) {
147
+ return (
148
+ <SelectPrimitive.Separator
149
+ data-slot="select-separator"
150
+ className={cn("pointer-events-none -mx-1 h-px bg-border", className)}
151
+ {...props}
152
+ />
153
+ )
154
+ }
155
+
156
+ function SelectScrollUpButton({
157
+ className,
158
+ ...props
159
+ }: React.ComponentProps<typeof SelectPrimitive.ScrollUpArrow>) {
160
+ return (
161
+ <SelectPrimitive.ScrollUpArrow
162
+ data-slot="select-scroll-up-button"
163
+ className={cn(
164
+ "top-0 z-10 flex w-full cursor-default items-center justify-center moloo-surface bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",
165
+ className
166
+ )}
167
+ {...props}
168
+ >
169
+ <IconChevronUp
170
+ />
171
+ </SelectPrimitive.ScrollUpArrow>
172
+ )
173
+ }
174
+
175
+ function SelectScrollDownButton({
176
+ className,
177
+ ...props
178
+ }: React.ComponentProps<typeof SelectPrimitive.ScrollDownArrow>) {
179
+ return (
180
+ <SelectPrimitive.ScrollDownArrow
181
+ data-slot="select-scroll-down-button"
182
+ className={cn(
183
+ "bottom-0 z-10 flex w-full cursor-default items-center justify-center moloo-surface bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",
184
+ className
185
+ )}
186
+ {...props}
187
+ >
188
+ <IconChevronDown
189
+ />
190
+ </SelectPrimitive.ScrollDownArrow>
191
+ )
192
+ }
193
+
194
+ export {
195
+ Select,
196
+ SelectContent,
197
+ SelectGroup,
198
+ SelectItem,
199
+ SelectLabel,
200
+ SelectScrollDownButton,
201
+ SelectScrollUpButton,
202
+ SelectSeparator,
203
+ SelectTrigger,
204
+ SelectValue,
205
+ }
@@ -0,0 +1,25 @@
1
+ "use client"
2
+
3
+ import { Separator as SeparatorPrimitive } from "@base-ui/react/separator"
4
+
5
+ import { cn } from "../../lib/utils"
6
+
7
+ function Separator({
8
+ className,
9
+ orientation = "horizontal",
10
+ ...props
11
+ }: SeparatorPrimitive.Props) {
12
+ return (
13
+ <SeparatorPrimitive
14
+ data-slot="separator"
15
+ orientation={orientation}
16
+ className={cn(
17
+ "shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch",
18
+ className
19
+ )}
20
+ {...props}
21
+ />
22
+ )
23
+ }
24
+
25
+ export { Separator }
@@ -0,0 +1,140 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { Dialog as SheetPrimitive } from "@base-ui/react/dialog"
5
+
6
+ import { cn } from "../../lib/utils"
7
+ import { Button } from "./button"
8
+ import { IconX } from "@tabler/icons-react"
9
+
10
+ function Sheet({ ...props }: SheetPrimitive.Root.Props) {
11
+ return <SheetPrimitive.Root data-slot="sheet" {...props} />
12
+ }
13
+
14
+ function SheetTrigger({ ...props }: SheetPrimitive.Trigger.Props) {
15
+ return <SheetPrimitive.Trigger data-slot="sheet-trigger" {...props} />
16
+ }
17
+
18
+ function SheetClose({ ...props }: SheetPrimitive.Close.Props) {
19
+ return <SheetPrimitive.Close data-slot="sheet-close" {...props} />
20
+ }
21
+
22
+ function SheetPortal({ ...props }: SheetPrimitive.Portal.Props) {
23
+ return <SheetPrimitive.Portal data-slot="sheet-portal" {...props} />
24
+ }
25
+
26
+ function SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.Props) {
27
+ return (
28
+ <SheetPrimitive.Backdrop
29
+ data-slot="sheet-overlay"
30
+ className={cn(
31
+ "fixed inset-0 z-50 bg-black/40 text-sm/relaxed transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs",
32
+ className
33
+ )}
34
+ {...props}
35
+ />
36
+ )
37
+ }
38
+
39
+ function SheetContent({
40
+ className,
41
+ children,
42
+ side = "right",
43
+ showCloseButton = true,
44
+ closeLabel = "Close",
45
+ ...props
46
+ }: SheetPrimitive.Popup.Props & {
47
+ side?: "top" | "right" | "bottom" | "left"
48
+ showCloseButton?: boolean
49
+ closeLabel?: string
50
+ }) {
51
+ return (
52
+ <SheetPortal>
53
+ <SheetOverlay />
54
+ <SheetPrimitive.Popup
55
+ data-slot="sheet-content"
56
+ data-side={side}
57
+ className={cn(
58
+ "fixed z-50 flex flex-col moloo-surface bg-popover bg-clip-padding text-sm/relaxed text-popover-foreground shadow-moloo-lg transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm",
59
+ className
60
+ )}
61
+ {...props}
62
+ >
63
+ {children}
64
+ {showCloseButton && (
65
+ <SheetPrimitive.Close
66
+ data-slot="sheet-close"
67
+ render={
68
+ <Button
69
+ variant="ghost"
70
+ className="absolute top-3 right-3"
71
+ size="icon-sm"
72
+ />
73
+ }
74
+ >
75
+ <IconX
76
+ />
77
+ <span className="sr-only">{closeLabel}</span>
78
+ </SheetPrimitive.Close>
79
+ )}
80
+ </SheetPrimitive.Popup>
81
+ </SheetPortal>
82
+ )
83
+ }
84
+
85
+ function SheetHeader({ className, ...props }: React.ComponentProps<"div">) {
86
+ return (
87
+ <div
88
+ data-slot="sheet-header"
89
+ className={cn("flex flex-col gap-0.5 p-4", className)}
90
+ {...props}
91
+ />
92
+ )
93
+ }
94
+
95
+ function SheetFooter({ className, ...props }: React.ComponentProps<"div">) {
96
+ return (
97
+ <div
98
+ data-slot="sheet-footer"
99
+ className={cn("mt-auto flex flex-col gap-2 p-4", className)}
100
+ {...props}
101
+ />
102
+ )
103
+ }
104
+
105
+ function SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {
106
+ return (
107
+ <SheetPrimitive.Title
108
+ data-slot="sheet-title"
109
+ className={cn(
110
+ "font-heading text-sm font-medium text-foreground",
111
+ className
112
+ )}
113
+ {...props}
114
+ />
115
+ )
116
+ }
117
+
118
+ function SheetDescription({
119
+ className,
120
+ ...props
121
+ }: SheetPrimitive.Description.Props) {
122
+ return (
123
+ <SheetPrimitive.Description
124
+ data-slot="sheet-description"
125
+ className={cn("text-sm/relaxed text-muted-foreground", className)}
126
+ {...props}
127
+ />
128
+ )
129
+ }
130
+
131
+ export {
132
+ Sheet,
133
+ SheetTrigger,
134
+ SheetClose,
135
+ SheetContent,
136
+ SheetHeader,
137
+ SheetFooter,
138
+ SheetTitle,
139
+ SheetDescription,
140
+ }