@autono/open-pages 0.1.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 (110) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +108 -0
  3. package/bin.js +2 -0
  4. package/dist/build-TP72kiw7.js +35 -0
  5. package/dist/cli/bin.d.ts +1 -0
  6. package/dist/cli/bin.js +100 -0
  7. package/dist/config-C9or4m4J.d.ts +23 -0
  8. package/dist/config-L0IbktJ0.js +3135 -0
  9. package/dist/design-C13iz9_4.js +35 -0
  10. package/dist/dev-I2IyEh5W.js +97 -0
  11. package/dist/export-B-kBRWB1.js +4 -0
  12. package/dist/export-ic28osQP.js +131 -0
  13. package/dist/index.d.ts +56 -0
  14. package/dist/index.js +3 -0
  15. package/dist/locale/index.d.ts +24 -0
  16. package/dist/locale/index.js +881 -0
  17. package/dist/open-pages-plugin-D_DN_zjh.js +632 -0
  18. package/dist/preview-BrDuvgAN.js +21 -0
  19. package/dist/sync-Be_hxSOF.js +139 -0
  20. package/dist/sync-lKEXyPOh.js +3 -0
  21. package/dist/types-C5NCdDT-.d.ts +219 -0
  22. package/dist/update-CV62NhBT.js +37 -0
  23. package/dist/update-package-Cxt57pz7.js +152 -0
  24. package/dist/version-B6AiiGvT.js +26 -0
  25. package/dist/version-CeffgdfZ.js +3 -0
  26. package/dist/vite/index.d.ts +14 -0
  27. package/dist/vite/index.js +7 -0
  28. package/env.d.ts +59 -0
  29. package/package.json +106 -0
  30. package/skills/apply-comments/SKILL.md +86 -0
  31. package/skills/create-page/SKILL.md +92 -0
  32. package/skills/create-theme/SKILL.md +223 -0
  33. package/skills/current-page/SKILL.md +106 -0
  34. package/skills/page-authoring/SKILL.md +148 -0
  35. package/skills/page-authoring/references/assets-and-fonts.md +85 -0
  36. package/skills/page-authoring/references/html-pages.md +65 -0
  37. package/skills/page-authoring/references/interactivity.md +77 -0
  38. package/skills/page-authoring/references/layout-and-responsive.md +71 -0
  39. package/skills/page-authoring/references/typography-and-color.md +60 -0
  40. package/src/app/app.tsx +45 -0
  41. package/src/app/components/asset-view.tsx +1665 -0
  42. package/src/app/components/command/command-menu.tsx +227 -0
  43. package/src/app/components/command/command.tsx +142 -0
  44. package/src/app/components/command/home-command-menu.tsx +96 -0
  45. package/src/app/components/icon-tooltip.tsx +34 -0
  46. package/src/app/components/language-toggle.tsx +46 -0
  47. package/src/app/components/sidebar/folder-item.tsx +269 -0
  48. package/src/app/components/sidebar/icon-picker.tsx +61 -0
  49. package/src/app/components/sidebar/sidebar-footer.tsx +139 -0
  50. package/src/app/components/sidebar/sidebar.tsx +302 -0
  51. package/src/app/components/theme-toggle.tsx +66 -0
  52. package/src/app/components/themes/theme-detail.tsx +226 -0
  53. package/src/app/components/themes/themes-gallery.tsx +104 -0
  54. package/src/app/components/ui/badge.tsx +48 -0
  55. package/src/app/components/ui/button.tsx +93 -0
  56. package/src/app/components/ui/card.tsx +92 -0
  57. package/src/app/components/ui/context-menu.tsx +247 -0
  58. package/src/app/components/ui/dialog.tsx +155 -0
  59. package/src/app/components/ui/dropdown-menu.tsx +267 -0
  60. package/src/app/components/ui/input.tsx +25 -0
  61. package/src/app/components/ui/label.tsx +21 -0
  62. package/src/app/components/ui/popover.tsx +82 -0
  63. package/src/app/components/ui/progress.tsx +33 -0
  64. package/src/app/components/ui/scroll-area.tsx +53 -0
  65. package/src/app/components/ui/select.tsx +195 -0
  66. package/src/app/components/ui/separator.tsx +26 -0
  67. package/src/app/components/ui/slider.tsx +68 -0
  68. package/src/app/components/ui/sonner.tsx +48 -0
  69. package/src/app/components/ui/tabs.tsx +79 -0
  70. package/src/app/components/ui/textarea.tsx +22 -0
  71. package/src/app/components/ui/toggle-group.tsx +84 -0
  72. package/src/app/components/ui/toggle.tsx +45 -0
  73. package/src/app/components/ui/tooltip.tsx +75 -0
  74. package/src/app/favicon.ico +0 -0
  75. package/src/app/frame/inspect.ts +140 -0
  76. package/src/app/frame/main.tsx +91 -0
  77. package/src/app/frame.html +12 -0
  78. package/src/app/index.html +13 -0
  79. package/src/app/lib/asset-filter.test.ts +176 -0
  80. package/src/app/lib/asset-filter.ts +80 -0
  81. package/src/app/lib/assets.ts +257 -0
  82. package/src/app/lib/design.ts +58 -0
  83. package/src/app/lib/folders.ts +239 -0
  84. package/src/app/lib/frame.ts +38 -0
  85. package/src/app/lib/locale-store.ts +67 -0
  86. package/src/app/lib/page-thumb.tsx +46 -0
  87. package/src/app/lib/pages.ts +28 -0
  88. package/src/app/lib/sdk.ts +43 -0
  89. package/src/app/lib/themes.ts +22 -0
  90. package/src/app/lib/use-locale.ts +8 -0
  91. package/src/app/lib/use-page-module.ts +48 -0
  92. package/src/app/lib/use-page-titles.ts +29 -0
  93. package/src/app/lib/use-restart-server.ts +78 -0
  94. package/src/app/lib/utils.test.ts +25 -0
  95. package/src/app/lib/utils.ts +6 -0
  96. package/src/app/main.tsx +14 -0
  97. package/src/app/routes/assets.tsx +9 -0
  98. package/src/app/routes/home-shell.tsx +252 -0
  99. package/src/app/routes/home.tsx +846 -0
  100. package/src/app/routes/page.tsx +329 -0
  101. package/src/app/routes/themes.tsx +34 -0
  102. package/src/app/styles.css +405 -0
  103. package/src/app/virtual.d.ts +53 -0
  104. package/src/locale/en.ts +218 -0
  105. package/src/locale/format.ts +12 -0
  106. package/src/locale/index.ts +6 -0
  107. package/src/locale/ja.ts +221 -0
  108. package/src/locale/types.ts +215 -0
  109. package/src/locale/zh-cn.ts +218 -0
  110. package/src/locale/zh-tw.ts +218 -0
@@ -0,0 +1,267 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react';
5
+ import { Menu as DropdownMenuPrimitive } from '@base-ui/react/menu';
6
+
7
+ import { cn } from '@/lib/utils';
8
+
9
+ type DropdownMenuPositionerProps = Pick<
10
+ React.ComponentProps<typeof DropdownMenuPrimitive.Positioner>,
11
+ 'side' | 'sideOffset' | 'align' | 'alignOffset'
12
+ >;
13
+
14
+ function DropdownMenu({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
15
+ return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} />;
16
+ }
17
+
18
+ function DropdownMenuPortal({
19
+ ...props
20
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {
21
+ return <DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />;
22
+ }
23
+
24
+ function DropdownMenuTrigger({
25
+ ...props
26
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {
27
+ return <DropdownMenuPrimitive.Trigger data-slot="dropdown-menu-trigger" {...props} />;
28
+ }
29
+
30
+ function DropdownMenuContent({
31
+ className,
32
+ side,
33
+ sideOffset = 6,
34
+ align,
35
+ alignOffset,
36
+ ...props
37
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Popup> & DropdownMenuPositionerProps) {
38
+ return (
39
+ <DropdownMenuPrimitive.Portal>
40
+ <DropdownMenuPrimitive.Positioner
41
+ side={side}
42
+ sideOffset={sideOffset}
43
+ align={align}
44
+ alignOffset={alignOffset}
45
+ className="isolate z-50 outline-none"
46
+ >
47
+ <DropdownMenuPrimitive.Popup
48
+ data-slot="dropdown-menu-content"
49
+ className={cn(
50
+ 'z-50 max-h-(--available-height) min-w-[9rem] origin-(--transform-origin)',
51
+ 'overflow-x-hidden overflow-y-auto rounded-[8px] border border-border bg-popover p-1 text-popover-foreground shadow-floating outline-none',
52
+ 'transition-[transform,scale,opacity] data-starting-style:scale-95 data-starting-style:opacity-0 data-ending-style:scale-95 data-ending-style:opacity-0',
53
+ className,
54
+ )}
55
+ {...props}
56
+ />
57
+ </DropdownMenuPrimitive.Positioner>
58
+ </DropdownMenuPrimitive.Portal>
59
+ );
60
+ }
61
+
62
+ function DropdownMenuGroup({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {
63
+ return <DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />;
64
+ }
65
+
66
+ function DropdownMenuItem({
67
+ className,
68
+ inset,
69
+ variant = 'default',
70
+ ...props
71
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {
72
+ inset?: boolean;
73
+ variant?: 'default' | 'destructive';
74
+ }) {
75
+ return (
76
+ <DropdownMenuPrimitive.Item
77
+ data-slot="dropdown-menu-item"
78
+ data-inset={inset}
79
+ data-variant={variant}
80
+ className={cn(
81
+ 'relative flex cursor-default items-center gap-2 rounded-[5px] px-2 py-1.5 text-[12.5px] outline-hidden select-none transition-colors',
82
+ 'focus:bg-foreground focus:text-background',
83
+ 'data-[active=true]:bg-muted data-[active=true]:text-foreground',
84
+ 'data-[disabled]:pointer-events-none data-[disabled]:opacity-45 data-[inset]:pl-8',
85
+ 'data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive data-[variant=destructive]:focus:text-white',
86
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5 [&_svg:not([class*='text-'])]:text-current [&_svg]:opacity-80",
87
+ className,
88
+ )}
89
+ {...props}
90
+ />
91
+ );
92
+ }
93
+
94
+ function DropdownMenuCheckboxItem({
95
+ className,
96
+ children,
97
+ checked,
98
+ ...props
99
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {
100
+ return (
101
+ <DropdownMenuPrimitive.CheckboxItem
102
+ data-slot="dropdown-menu-checkbox-item"
103
+ className={cn(
104
+ 'relative flex cursor-default items-center gap-2 rounded-[5px] py-1.5 pr-2 pl-8 text-[12.5px] outline-hidden select-none focus:bg-foreground focus:text-background data-[disabled]:pointer-events-none data-[disabled]:opacity-45',
105
+ className,
106
+ )}
107
+ checked={checked}
108
+ {...props}
109
+ >
110
+ <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
111
+ <DropdownMenuPrimitive.CheckboxItemIndicator>
112
+ <CheckIcon className="size-3.5" />
113
+ </DropdownMenuPrimitive.CheckboxItemIndicator>
114
+ </span>
115
+ {children}
116
+ </DropdownMenuPrimitive.CheckboxItem>
117
+ );
118
+ }
119
+
120
+ function DropdownMenuRadioGroup({
121
+ ...props
122
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {
123
+ return <DropdownMenuPrimitive.RadioGroup data-slot="dropdown-menu-radio-group" {...props} />;
124
+ }
125
+
126
+ function DropdownMenuRadioItem({
127
+ className,
128
+ children,
129
+ ...props
130
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {
131
+ return (
132
+ <DropdownMenuPrimitive.RadioItem
133
+ data-slot="dropdown-menu-radio-item"
134
+ className={cn(
135
+ 'relative flex cursor-default items-center gap-2 rounded-[5px] py-1.5 pr-2 pl-8 text-[12.5px] outline-hidden select-none focus:bg-foreground focus:text-background data-[disabled]:pointer-events-none data-[disabled]:opacity-45',
136
+ className,
137
+ )}
138
+ {...props}
139
+ >
140
+ <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
141
+ <DropdownMenuPrimitive.RadioItemIndicator>
142
+ <CircleIcon className="size-2 fill-current" />
143
+ </DropdownMenuPrimitive.RadioItemIndicator>
144
+ </span>
145
+ {children}
146
+ </DropdownMenuPrimitive.RadioItem>
147
+ );
148
+ }
149
+
150
+ function DropdownMenuLabel({
151
+ className,
152
+ inset,
153
+ ...props
154
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.GroupLabel> & {
155
+ inset?: boolean;
156
+ }) {
157
+ return (
158
+ <DropdownMenuPrimitive.GroupLabel
159
+ data-slot="dropdown-menu-label"
160
+ data-inset={inset}
161
+ className={cn(
162
+ 'eyebrow px-2 py-1.5 data-[inset]:pl-8',
163
+ className,
164
+ )}
165
+ {...props}
166
+ />
167
+ );
168
+ }
169
+
170
+ function DropdownMenuSeparator({
171
+ className,
172
+ ...props
173
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {
174
+ return (
175
+ <DropdownMenuPrimitive.Separator
176
+ data-slot="dropdown-menu-separator"
177
+ className={cn('-mx-1 my-1 h-px bg-hairline', className)}
178
+ {...props}
179
+ />
180
+ );
181
+ }
182
+
183
+ function DropdownMenuShortcut({ className, ...props }: React.ComponentProps<'span'>) {
184
+ return (
185
+ <span
186
+ data-slot="dropdown-menu-shortcut"
187
+ className={cn(
188
+ 'ml-auto font-mono text-[10.5px] tracking-[0.06em] text-muted-foreground/80',
189
+ className,
190
+ )}
191
+ {...props}
192
+ />
193
+ );
194
+ }
195
+
196
+ function DropdownMenuSub({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.SubmenuRoot>) {
197
+ return <DropdownMenuPrimitive.SubmenuRoot data-slot="dropdown-menu-sub" {...props} />;
198
+ }
199
+
200
+ function DropdownMenuSubTrigger({
201
+ className,
202
+ inset,
203
+ children,
204
+ ...props
205
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.SubmenuTrigger> & {
206
+ inset?: boolean;
207
+ }) {
208
+ return (
209
+ <DropdownMenuPrimitive.SubmenuTrigger
210
+ data-slot="dropdown-menu-sub-trigger"
211
+ data-inset={inset}
212
+ className={cn(
213
+ 'flex cursor-default items-center gap-2 rounded-[5px] px-2 py-1.5 text-[12.5px] outline-hidden select-none focus:bg-foreground focus:text-background data-[inset]:pl-8 data-popup-open:bg-muted',
214
+ className,
215
+ )}
216
+ {...props}
217
+ >
218
+ {children}
219
+ <ChevronRightIcon className="ml-auto size-3.5 opacity-60" />
220
+ </DropdownMenuPrimitive.SubmenuTrigger>
221
+ );
222
+ }
223
+
224
+ function DropdownMenuSubContent({
225
+ className,
226
+ ...props
227
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Popup>) {
228
+ return (
229
+ <DropdownMenuPrimitive.Portal>
230
+ <DropdownMenuPrimitive.Positioner
231
+ align="start"
232
+ alignOffset={-3}
233
+ side="right"
234
+ sideOffset={0}
235
+ className="isolate z-50 outline-none"
236
+ >
237
+ <DropdownMenuPrimitive.Popup
238
+ data-slot="dropdown-menu-sub-content"
239
+ className={cn(
240
+ 'z-50 min-w-[9rem] overflow-hidden rounded-[8px] border border-border bg-popover p-1 text-popover-foreground shadow-floating outline-none',
241
+ 'transition-[transform,scale,opacity] data-starting-style:scale-95 data-starting-style:opacity-0 data-ending-style:scale-95 data-ending-style:opacity-0',
242
+ className,
243
+ )}
244
+ {...props}
245
+ />
246
+ </DropdownMenuPrimitive.Positioner>
247
+ </DropdownMenuPrimitive.Portal>
248
+ );
249
+ }
250
+
251
+ export {
252
+ DropdownMenu,
253
+ DropdownMenuPortal,
254
+ DropdownMenuTrigger,
255
+ DropdownMenuContent,
256
+ DropdownMenuGroup,
257
+ DropdownMenuLabel,
258
+ DropdownMenuItem,
259
+ DropdownMenuCheckboxItem,
260
+ DropdownMenuRadioGroup,
261
+ DropdownMenuRadioItem,
262
+ DropdownMenuSeparator,
263
+ DropdownMenuShortcut,
264
+ DropdownMenuSub,
265
+ DropdownMenuSubTrigger,
266
+ DropdownMenuSubContent,
267
+ };
@@ -0,0 +1,25 @@
1
+ import * as React from 'react';
2
+
3
+ import { cn } from '@/lib/utils';
4
+
5
+ function Input({ className, type, ...props }: React.ComponentProps<'input'>) {
6
+ return (
7
+ <input
8
+ type={type}
9
+ data-slot="input"
10
+ className={cn(
11
+ 'h-8 w-full min-w-0 rounded-[5px] border border-border bg-background px-2.5 text-[13px] outline-none',
12
+ 'transition-colors selection:bg-brand-soft selection:text-foreground',
13
+ 'placeholder:text-muted-foreground/70',
14
+ 'focus-visible:border-foreground/40 focus-visible:ring-2 focus-visible:ring-ring/30',
15
+ 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',
16
+ 'aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/25',
17
+ 'file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground',
18
+ className,
19
+ )}
20
+ {...props}
21
+ />
22
+ );
23
+ }
24
+
25
+ export { Input };
@@ -0,0 +1,21 @@
1
+ import * as React from "react"
2
+
3
+ import { cn } from "@/lib/utils"
4
+
5
+ function Label({
6
+ className,
7
+ ...props
8
+ }: React.ComponentProps<"label">) {
9
+ return (
10
+ <label
11
+ data-slot="label"
12
+ className={cn(
13
+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
14
+ className
15
+ )}
16
+ {...props}
17
+ />
18
+ )
19
+ }
20
+
21
+ export { Label }
@@ -0,0 +1,82 @@
1
+ import * as React from 'react';
2
+ import { Popover as PopoverPrimitive } from '@base-ui/react/popover';
3
+
4
+ import { cn } from '@/lib/utils';
5
+
6
+ function Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {
7
+ return <PopoverPrimitive.Root data-slot="popover" {...props} />;
8
+ }
9
+
10
+ function PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {
11
+ return <PopoverPrimitive.Trigger data-slot="popover-trigger" {...props} />;
12
+ }
13
+
14
+ function PopoverContent({
15
+ className,
16
+ side,
17
+ align = 'center',
18
+ sideOffset = 6,
19
+ alignOffset,
20
+ collisionPadding,
21
+ ...props
22
+ }: React.ComponentProps<typeof PopoverPrimitive.Popup> &
23
+ Pick<
24
+ React.ComponentProps<typeof PopoverPrimitive.Positioner>,
25
+ 'side' | 'sideOffset' | 'align' | 'alignOffset' | 'collisionPadding'
26
+ >) {
27
+ return (
28
+ <PopoverPrimitive.Portal>
29
+ <PopoverPrimitive.Positioner
30
+ side={side}
31
+ align={align}
32
+ sideOffset={sideOffset}
33
+ alignOffset={alignOffset}
34
+ collisionPadding={collisionPadding}
35
+ className="isolate z-50"
36
+ >
37
+ <PopoverPrimitive.Popup
38
+ data-slot="popover-content"
39
+ className={cn(
40
+ 'w-72 origin-(--transform-origin) rounded-[8px] border border-border bg-popover p-3 text-popover-foreground shadow-floating outline-hidden',
41
+ 'transition-[transform,scale,opacity] data-starting-style:scale-95 data-starting-style:opacity-0 data-ending-style:scale-95 data-ending-style:opacity-0',
42
+ className,
43
+ )}
44
+ {...props}
45
+ />
46
+ </PopoverPrimitive.Positioner>
47
+ </PopoverPrimitive.Portal>
48
+ );
49
+ }
50
+
51
+ function PopoverHeader({ className, ...props }: React.ComponentProps<'div'>) {
52
+ return (
53
+ <div
54
+ data-slot="popover-header"
55
+ className={cn('flex flex-col gap-1 text-sm', className)}
56
+ {...props}
57
+ />
58
+ );
59
+ }
60
+
61
+ function PopoverTitle({ className, ...props }: React.ComponentProps<'h2'>) {
62
+ return <div data-slot="popover-title" className={cn('font-medium', className)} {...props} />;
63
+ }
64
+
65
+ function PopoverDescription({ className, ...props }: React.ComponentProps<'p'>) {
66
+ return (
67
+ <p
68
+ data-slot="popover-description"
69
+ className={cn('text-muted-foreground', className)}
70
+ {...props}
71
+ />
72
+ );
73
+ }
74
+
75
+ export {
76
+ Popover,
77
+ PopoverTrigger,
78
+ PopoverContent,
79
+ PopoverHeader,
80
+ PopoverTitle,
81
+ PopoverDescription,
82
+ };
@@ -0,0 +1,33 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { Progress as ProgressPrimitive } from "@base-ui/react/progress"
5
+
6
+ import { cn } from "@/lib/utils"
7
+
8
+ function Progress({
9
+ className,
10
+ value,
11
+ ...props
12
+ }: React.ComponentProps<typeof ProgressPrimitive.Root>) {
13
+ return (
14
+ <ProgressPrimitive.Root
15
+ data-slot="progress"
16
+ value={value}
17
+ className={cn(
18
+ "relative h-[3px] w-full overflow-hidden rounded-full bg-muted",
19
+ className
20
+ )}
21
+ {...props}
22
+ >
23
+ <ProgressPrimitive.Track className="h-full w-full">
24
+ <ProgressPrimitive.Indicator
25
+ data-slot="progress-indicator"
26
+ className="h-full bg-brand transition-all"
27
+ />
28
+ </ProgressPrimitive.Track>
29
+ </ProgressPrimitive.Root>
30
+ )
31
+ }
32
+
33
+ export { Progress }
@@ -0,0 +1,53 @@
1
+ import * as React from 'react';
2
+ import { ScrollArea as ScrollAreaPrimitive } from '@base-ui/react/scroll-area';
3
+
4
+ import { cn } from '@/lib/utils';
5
+
6
+ function ScrollArea({
7
+ className,
8
+ children,
9
+ ...props
10
+ }: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {
11
+ return (
12
+ <ScrollAreaPrimitive.Root
13
+ data-slot="scroll-area"
14
+ className={cn('relative', className)}
15
+ {...props}
16
+ >
17
+ <ScrollAreaPrimitive.Viewport
18
+ data-slot="scroll-area-viewport"
19
+ className="size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1"
20
+ >
21
+ {children}
22
+ </ScrollAreaPrimitive.Viewport>
23
+ <ScrollBar />
24
+ <ScrollAreaPrimitive.Corner />
25
+ </ScrollAreaPrimitive.Root>
26
+ );
27
+ }
28
+
29
+ function ScrollBar({
30
+ className,
31
+ orientation = 'vertical',
32
+ ...props
33
+ }: React.ComponentProps<typeof ScrollAreaPrimitive.Scrollbar>) {
34
+ return (
35
+ <ScrollAreaPrimitive.Scrollbar
36
+ data-slot="scroll-area-scrollbar"
37
+ data-orientation={orientation}
38
+ orientation={orientation}
39
+ className={cn(
40
+ 'flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent',
41
+ className,
42
+ )}
43
+ {...props}
44
+ >
45
+ <ScrollAreaPrimitive.Thumb
46
+ data-slot="scroll-area-thumb"
47
+ className="relative flex-1 rounded-full bg-border"
48
+ />
49
+ </ScrollAreaPrimitive.Scrollbar>
50
+ );
51
+ }
52
+
53
+ export { ScrollArea, ScrollBar };
@@ -0,0 +1,195 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react"
5
+ import { Select as SelectPrimitive } from "@base-ui/react/select"
6
+
7
+ import { cn } from "@/lib/utils"
8
+
9
+ const Select = SelectPrimitive.Root
10
+
11
+ function SelectGroup({
12
+ ...props
13
+ }: React.ComponentProps<typeof SelectPrimitive.Group>) {
14
+ return <SelectPrimitive.Group data-slot="select-group" {...props} />
15
+ }
16
+
17
+ function SelectValue({
18
+ ...props
19
+ }: React.ComponentProps<typeof SelectPrimitive.Value>) {
20
+ return <SelectPrimitive.Value data-slot="select-value" {...props} />
21
+ }
22
+
23
+ function SelectTrigger({
24
+ className,
25
+ size = "default",
26
+ children,
27
+ ...props
28
+ }: React.ComponentProps<typeof SelectPrimitive.Trigger> & {
29
+ size?: "sm" | "default"
30
+ }) {
31
+ return (
32
+ <SelectPrimitive.Trigger
33
+ data-slot="select-trigger"
34
+ data-size={size}
35
+ className={cn(
36
+ "flex w-fit items-center justify-between gap-2 rounded-[5px] border border-border bg-background px-2.5 text-[13px] whitespace-nowrap outline-none transition-colors",
37
+ "hover:border-foreground/25 focus-visible:border-foreground/40 focus-visible:ring-2 focus-visible:ring-ring/30",
38
+ "disabled:cursor-not-allowed disabled:opacity-50",
39
+ "aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/25",
40
+ "data-[placeholder]:text-muted-foreground/70 data-[size=default]:h-8 data-[size=sm]:h-7",
41
+ "*:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2",
42
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5 [&_svg:not([class*='text-'])]:text-muted-foreground",
43
+ className
44
+ )}
45
+ {...props}
46
+ >
47
+ {children}
48
+ <SelectPrimitive.Icon
49
+ render={<ChevronDownIcon className="size-3.5 opacity-50" />}
50
+ />
51
+ </SelectPrimitive.Trigger>
52
+ )
53
+ }
54
+
55
+ function SelectContent({
56
+ className,
57
+ children,
58
+ side,
59
+ align = "center",
60
+ sideOffset = 4,
61
+ alignOffset,
62
+ alignItemWithTrigger = true,
63
+ ...props
64
+ }: React.ComponentProps<typeof SelectPrimitive.Popup> &
65
+ Pick<
66
+ React.ComponentProps<typeof SelectPrimitive.Positioner>,
67
+ "side" | "sideOffset" | "align" | "alignOffset" | "alignItemWithTrigger"
68
+ >) {
69
+ return (
70
+ <SelectPrimitive.Portal>
71
+ <SelectPrimitive.Positioner
72
+ side={side}
73
+ align={align}
74
+ sideOffset={sideOffset}
75
+ alignOffset={alignOffset}
76
+ alignItemWithTrigger={alignItemWithTrigger}
77
+ >
78
+ <SelectPrimitive.Popup
79
+ data-slot="select-content"
80
+ className={cn(
81
+ "relative isolate z-50 max-h-(--available-height) min-w-[9rem] origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-[8px] border border-border bg-popover text-popover-foreground shadow-floating transition-[transform,scale,opacity] data-starting-style:scale-95 data-starting-style:opacity-0 data-ending-style:scale-95 data-ending-style:opacity-0",
82
+ className
83
+ )}
84
+ {...props}
85
+ >
86
+ <SelectScrollUpButton />
87
+ <SelectPrimitive.List className="p-1">{children}</SelectPrimitive.List>
88
+ <SelectScrollDownButton />
89
+ </SelectPrimitive.Popup>
90
+ </SelectPrimitive.Positioner>
91
+ </SelectPrimitive.Portal>
92
+ )
93
+ }
94
+
95
+ function SelectLabel({
96
+ className,
97
+ ...props
98
+ }: React.ComponentProps<typeof SelectPrimitive.GroupLabel>) {
99
+ return (
100
+ <SelectPrimitive.GroupLabel
101
+ data-slot="select-label"
102
+ className={cn("px-2 py-1.5 text-xs text-muted-foreground", className)}
103
+ {...props}
104
+ />
105
+ )
106
+ }
107
+
108
+ function SelectItem({
109
+ className,
110
+ children,
111
+ ...props
112
+ }: React.ComponentProps<typeof SelectPrimitive.Item>) {
113
+ return (
114
+ <SelectPrimitive.Item
115
+ data-slot="select-item"
116
+ className={cn(
117
+ "relative flex w-full cursor-default items-center gap-2 rounded-[5px] py-1.5 pr-8 pl-2 text-[12.5px] outline-hidden select-none data-highlighted:bg-foreground data-highlighted:text-background data-[disabled]:pointer-events-none data-[disabled]:opacity-45 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5 [&_svg:not([class*='text-'])]:text-current *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
118
+ className
119
+ )}
120
+ {...props}
121
+ >
122
+ <span
123
+ data-slot="select-item-indicator"
124
+ className="absolute right-2 flex size-3.5 items-center justify-center"
125
+ >
126
+ <SelectPrimitive.ItemIndicator>
127
+ <CheckIcon className="size-3.5" />
128
+ </SelectPrimitive.ItemIndicator>
129
+ </span>
130
+ <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
131
+ </SelectPrimitive.Item>
132
+ )
133
+ }
134
+
135
+ function SelectSeparator({
136
+ className,
137
+ ...props
138
+ }: React.ComponentProps<typeof SelectPrimitive.Separator>) {
139
+ return (
140
+ <SelectPrimitive.Separator
141
+ data-slot="select-separator"
142
+ className={cn("pointer-events-none -mx-1 my-1 h-px bg-border", className)}
143
+ {...props}
144
+ />
145
+ )
146
+ }
147
+
148
+ function SelectScrollUpButton({
149
+ className,
150
+ ...props
151
+ }: React.ComponentProps<typeof SelectPrimitive.ScrollUpArrow>) {
152
+ return (
153
+ <SelectPrimitive.ScrollUpArrow
154
+ data-slot="select-scroll-up-button"
155
+ className={cn(
156
+ "top-0 flex w-full cursor-default items-center justify-center py-1",
157
+ className
158
+ )}
159
+ {...props}
160
+ >
161
+ <ChevronUpIcon className="size-4" />
162
+ </SelectPrimitive.ScrollUpArrow>
163
+ )
164
+ }
165
+
166
+ function SelectScrollDownButton({
167
+ className,
168
+ ...props
169
+ }: React.ComponentProps<typeof SelectPrimitive.ScrollDownArrow>) {
170
+ return (
171
+ <SelectPrimitive.ScrollDownArrow
172
+ data-slot="select-scroll-down-button"
173
+ className={cn(
174
+ "bottom-0 flex w-full cursor-default items-center justify-center py-1",
175
+ className
176
+ )}
177
+ {...props}
178
+ >
179
+ <ChevronDownIcon className="size-4" />
180
+ </SelectPrimitive.ScrollDownArrow>
181
+ )
182
+ }
183
+
184
+ export {
185
+ Select,
186
+ SelectContent,
187
+ SelectGroup,
188
+ SelectItem,
189
+ SelectLabel,
190
+ SelectScrollDownButton,
191
+ SelectScrollUpButton,
192
+ SelectSeparator,
193
+ SelectTrigger,
194
+ SelectValue,
195
+ }