@open-aippt/core 1.13.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 (142) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/bin.js +2 -0
  4. package/dist/build-DxTqmvsO.js +17 -0
  5. package/dist/cli/bin.d.ts +1 -0
  6. package/dist/cli/bin.js +86 -0
  7. package/dist/config-CjzqjrEA.js +4280 -0
  8. package/dist/config-DIC-yVPp.d.ts +23 -0
  9. package/dist/design-cpzS8aud.js +35 -0
  10. package/dist/dev-BYuTeJbA.js +20 -0
  11. package/dist/format-BCeKbTOM.js +1605 -0
  12. package/dist/index.d.ts +134 -0
  13. package/dist/index.js +467 -0
  14. package/dist/locale/index.d.ts +24 -0
  15. package/dist/locale/index.js +3 -0
  16. package/dist/preview-DlQvnJPq.js +18 -0
  17. package/dist/sync-BPZ0m27m.js +139 -0
  18. package/dist/sync-EsYusbbL.js +3 -0
  19. package/dist/types-CHmFPIG_.d.ts +430 -0
  20. package/dist/vite/index.d.ts +14 -0
  21. package/dist/vite/index.js +4 -0
  22. package/env.d.ts +59 -0
  23. package/package.json +103 -0
  24. package/skills/apply-comments/SKILL.md +83 -0
  25. package/skills/create-slide/SKILL.md +91 -0
  26. package/skills/create-theme/SKILL.md +250 -0
  27. package/skills/current-slide/SKILL.md +110 -0
  28. package/skills/slide-authoring/SKILL.md +625 -0
  29. package/src/app/app.tsx +47 -0
  30. package/src/app/components/asset-view.tsx +966 -0
  31. package/src/app/components/history-provider.tsx +120 -0
  32. package/src/app/components/image-placeholder.tsx +243 -0
  33. package/src/app/components/inspector/asset-picker-dialog.tsx +196 -0
  34. package/src/app/components/inspector/comment-widget.tsx +93 -0
  35. package/src/app/components/inspector/image-crop-dialog.tsx +212 -0
  36. package/src/app/components/inspector/inspect-overlay.tsx +387 -0
  37. package/src/app/components/inspector/inspector-panel.tsx +1115 -0
  38. package/src/app/components/inspector/inspector-provider.tsx +1218 -0
  39. package/src/app/components/inspector/save-bar.tsx +48 -0
  40. package/src/app/components/language-toggle.tsx +39 -0
  41. package/src/app/components/notes-drawer.tsx +120 -0
  42. package/src/app/components/overview-grid.tsx +363 -0
  43. package/src/app/components/panel/panel-fields.tsx +60 -0
  44. package/src/app/components/panel/panel-shell.tsx +80 -0
  45. package/src/app/components/panel/save-card.tsx +142 -0
  46. package/src/app/components/pdf-progress-toast.tsx +32 -0
  47. package/src/app/components/player.tsx +466 -0
  48. package/src/app/components/pptx-progress-toast.tsx +32 -0
  49. package/src/app/components/present/blackout-overlay.tsx +18 -0
  50. package/src/app/components/present/control-bar.tsx +315 -0
  51. package/src/app/components/present/help-overlay.tsx +57 -0
  52. package/src/app/components/present/jump-input.tsx +74 -0
  53. package/src/app/components/present/laser-pointer.tsx +39 -0
  54. package/src/app/components/present/progress-bar.tsx +26 -0
  55. package/src/app/components/present/use-idle.ts +46 -0
  56. package/src/app/components/present/use-pointer-near-bottom.ts +34 -0
  57. package/src/app/components/present/use-presenter-channel.ts +66 -0
  58. package/src/app/components/present/use-touch-swipe.ts +66 -0
  59. package/src/app/components/shared-element.tsx +48 -0
  60. package/src/app/components/sidebar/folder-item.tsx +258 -0
  61. package/src/app/components/sidebar/icon-picker.tsx +61 -0
  62. package/src/app/components/sidebar/mobile-pill.tsx +34 -0
  63. package/src/app/components/sidebar/sidebar-footer.tsx +105 -0
  64. package/src/app/components/sidebar/sidebar.tsx +284 -0
  65. package/src/app/components/slide-canvas.tsx +102 -0
  66. package/src/app/components/slide-transition-layer.tsx +844 -0
  67. package/src/app/components/style-panel/design-provider.tsx +148 -0
  68. package/src/app/components/style-panel/style-panel.tsx +349 -0
  69. package/src/app/components/style-panel/use-design.ts +112 -0
  70. package/src/app/components/theme-toggle.tsx +59 -0
  71. package/src/app/components/themes/theme-detail.tsx +305 -0
  72. package/src/app/components/themes/themes-gallery.tsx +149 -0
  73. package/src/app/components/thumbnail-rail.tsx +805 -0
  74. package/src/app/components/ui/badge.tsx +45 -0
  75. package/src/app/components/ui/button.tsx +99 -0
  76. package/src/app/components/ui/card.tsx +92 -0
  77. package/src/app/components/ui/context-menu.tsx +237 -0
  78. package/src/app/components/ui/dialog.tsx +157 -0
  79. package/src/app/components/ui/dropdown-menu.tsx +245 -0
  80. package/src/app/components/ui/input.tsx +25 -0
  81. package/src/app/components/ui/label.tsx +24 -0
  82. package/src/app/components/ui/popover.tsx +75 -0
  83. package/src/app/components/ui/progress.tsx +31 -0
  84. package/src/app/components/ui/scroll-area.tsx +53 -0
  85. package/src/app/components/ui/select.tsx +196 -0
  86. package/src/app/components/ui/separator.tsx +28 -0
  87. package/src/app/components/ui/slider.tsx +61 -0
  88. package/src/app/components/ui/sonner.tsx +48 -0
  89. package/src/app/components/ui/tabs.tsx +79 -0
  90. package/src/app/components/ui/textarea.tsx +22 -0
  91. package/src/app/components/ui/toggle-group.tsx +83 -0
  92. package/src/app/components/ui/toggle.tsx +45 -0
  93. package/src/app/components/ui/tooltip.tsx +58 -0
  94. package/src/app/favicon.ico +0 -0
  95. package/src/app/index.html +13 -0
  96. package/src/app/lib/assets.ts +242 -0
  97. package/src/app/lib/design-presets.ts +94 -0
  98. package/src/app/lib/design.ts +58 -0
  99. package/src/app/lib/export-html.ts +326 -0
  100. package/src/app/lib/export-pdf.ts +298 -0
  101. package/src/app/lib/export-pptx.ts +284 -0
  102. package/src/app/lib/folders.ts +239 -0
  103. package/src/app/lib/inspector/fiber.test.ts +154 -0
  104. package/src/app/lib/inspector/fiber.ts +85 -0
  105. package/src/app/lib/inspector/use-comments.ts +74 -0
  106. package/src/app/lib/inspector/use-editor.ts +73 -0
  107. package/src/app/lib/inspector/use-notes.ts +134 -0
  108. package/src/app/lib/locale-store.ts +67 -0
  109. package/src/app/lib/page-context.tsx +38 -0
  110. package/src/app/lib/print-ready.test.ts +32 -0
  111. package/src/app/lib/print-ready.ts +51 -0
  112. package/src/app/lib/sdk.test.ts +13 -0
  113. package/src/app/lib/sdk.ts +37 -0
  114. package/src/app/lib/slides.ts +26 -0
  115. package/src/app/lib/step-context.tsx +261 -0
  116. package/src/app/lib/themes.ts +22 -0
  117. package/src/app/lib/transition.ts +30 -0
  118. package/src/app/lib/use-agent-socket.ts +18 -0
  119. package/src/app/lib/use-click-page-navigation.ts +60 -0
  120. package/src/app/lib/use-is-mobile.ts +21 -0
  121. package/src/app/lib/use-locale.ts +8 -0
  122. package/src/app/lib/use-prefers-reduced-motion.ts +19 -0
  123. package/src/app/lib/use-slide-module.ts +48 -0
  124. package/src/app/lib/use-wheel-page-navigation.ts +99 -0
  125. package/src/app/lib/utils.test.ts +25 -0
  126. package/src/app/lib/utils.ts +6 -0
  127. package/src/app/main.tsx +14 -0
  128. package/src/app/routes/assets.tsx +9 -0
  129. package/src/app/routes/home-shell.tsx +213 -0
  130. package/src/app/routes/home.tsx +807 -0
  131. package/src/app/routes/presenter.tsx +418 -0
  132. package/src/app/routes/slide.tsx +1108 -0
  133. package/src/app/routes/themes.tsx +34 -0
  134. package/src/app/styles.css +429 -0
  135. package/src/app/virtual.d.ts +51 -0
  136. package/src/locale/en.ts +416 -0
  137. package/src/locale/format.ts +12 -0
  138. package/src/locale/index.ts +6 -0
  139. package/src/locale/ja.ts +422 -0
  140. package/src/locale/types.ts +443 -0
  141. package/src/locale/zh-cn.ts +414 -0
  142. package/src/locale/zh-tw.ts +414 -0
@@ -0,0 +1,245 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react';
5
+ import { DropdownMenu as DropdownMenuPrimitive } from 'radix-ui';
6
+
7
+ import { cn } from '@/lib/utils';
8
+
9
+ function DropdownMenu({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
10
+ return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} />;
11
+ }
12
+
13
+ function DropdownMenuPortal({
14
+ ...props
15
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {
16
+ return <DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />;
17
+ }
18
+
19
+ function DropdownMenuTrigger({
20
+ ...props
21
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {
22
+ return <DropdownMenuPrimitive.Trigger data-slot="dropdown-menu-trigger" {...props} />;
23
+ }
24
+
25
+ function DropdownMenuContent({
26
+ className,
27
+ sideOffset = 6,
28
+ ...props
29
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {
30
+ return (
31
+ <DropdownMenuPrimitive.Portal>
32
+ <DropdownMenuPrimitive.Content
33
+ data-slot="dropdown-menu-content"
34
+ sideOffset={sideOffset}
35
+ className={cn(
36
+ 'z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[9rem] origin-(--radix-dropdown-menu-content-transform-origin)',
37
+ 'overflow-x-hidden overflow-y-auto rounded-[8px] border border-border bg-popover p-1 text-popover-foreground shadow-floating',
38
+ 'data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1',
39
+ 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',
40
+ 'data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95',
41
+ className,
42
+ )}
43
+ {...props}
44
+ />
45
+ </DropdownMenuPrimitive.Portal>
46
+ );
47
+ }
48
+
49
+ function DropdownMenuGroup({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {
50
+ return <DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />;
51
+ }
52
+
53
+ function DropdownMenuItem({
54
+ className,
55
+ inset,
56
+ variant = 'default',
57
+ ...props
58
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {
59
+ inset?: boolean;
60
+ variant?: 'default' | 'destructive';
61
+ }) {
62
+ return (
63
+ <DropdownMenuPrimitive.Item
64
+ data-slot="dropdown-menu-item"
65
+ data-inset={inset}
66
+ data-variant={variant}
67
+ className={cn(
68
+ 'relative flex cursor-default items-center gap-2 rounded-[5px] px-2 py-1.5 text-[12.5px] outline-hidden select-none transition-colors',
69
+ 'focus:bg-foreground focus:text-background',
70
+ 'data-[active=true]:bg-muted data-[active=true]:text-foreground',
71
+ 'data-[disabled]:pointer-events-none data-[disabled]:opacity-45 data-[inset]:pl-8',
72
+ 'data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive data-[variant=destructive]:focus:text-white',
73
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5 [&_svg:not([class*='text-'])]:text-current [&_svg]:opacity-80",
74
+ className,
75
+ )}
76
+ {...props}
77
+ />
78
+ );
79
+ }
80
+
81
+ function DropdownMenuCheckboxItem({
82
+ className,
83
+ children,
84
+ checked,
85
+ ...props
86
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {
87
+ return (
88
+ <DropdownMenuPrimitive.CheckboxItem
89
+ data-slot="dropdown-menu-checkbox-item"
90
+ className={cn(
91
+ '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',
92
+ className,
93
+ )}
94
+ checked={checked}
95
+ {...props}
96
+ >
97
+ <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
98
+ <DropdownMenuPrimitive.ItemIndicator>
99
+ <CheckIcon className="size-3.5" />
100
+ </DropdownMenuPrimitive.ItemIndicator>
101
+ </span>
102
+ {children}
103
+ </DropdownMenuPrimitive.CheckboxItem>
104
+ );
105
+ }
106
+
107
+ function DropdownMenuRadioGroup({
108
+ ...props
109
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {
110
+ return <DropdownMenuPrimitive.RadioGroup data-slot="dropdown-menu-radio-group" {...props} />;
111
+ }
112
+
113
+ function DropdownMenuRadioItem({
114
+ className,
115
+ children,
116
+ ...props
117
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {
118
+ return (
119
+ <DropdownMenuPrimitive.RadioItem
120
+ data-slot="dropdown-menu-radio-item"
121
+ className={cn(
122
+ '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',
123
+ className,
124
+ )}
125
+ {...props}
126
+ >
127
+ <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
128
+ <DropdownMenuPrimitive.ItemIndicator>
129
+ <CircleIcon className="size-2 fill-current" />
130
+ </DropdownMenuPrimitive.ItemIndicator>
131
+ </span>
132
+ {children}
133
+ </DropdownMenuPrimitive.RadioItem>
134
+ );
135
+ }
136
+
137
+ function DropdownMenuLabel({
138
+ className,
139
+ inset,
140
+ ...props
141
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {
142
+ inset?: boolean;
143
+ }) {
144
+ return (
145
+ <DropdownMenuPrimitive.Label
146
+ data-slot="dropdown-menu-label"
147
+ data-inset={inset}
148
+ className={cn(
149
+ 'eyebrow px-2 py-1.5 data-[inset]:pl-8',
150
+ className,
151
+ )}
152
+ {...props}
153
+ />
154
+ );
155
+ }
156
+
157
+ function DropdownMenuSeparator({
158
+ className,
159
+ ...props
160
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {
161
+ return (
162
+ <DropdownMenuPrimitive.Separator
163
+ data-slot="dropdown-menu-separator"
164
+ className={cn('-mx-1 my-1 h-px bg-hairline', className)}
165
+ {...props}
166
+ />
167
+ );
168
+ }
169
+
170
+ function DropdownMenuShortcut({ className, ...props }: React.ComponentProps<'span'>) {
171
+ return (
172
+ <span
173
+ data-slot="dropdown-menu-shortcut"
174
+ className={cn(
175
+ 'ml-auto font-mono text-[10.5px] tracking-[0.06em] text-muted-foreground/80',
176
+ className,
177
+ )}
178
+ {...props}
179
+ />
180
+ );
181
+ }
182
+
183
+ function DropdownMenuSub({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {
184
+ return <DropdownMenuPrimitive.Sub data-slot="dropdown-menu-sub" {...props} />;
185
+ }
186
+
187
+ function DropdownMenuSubTrigger({
188
+ className,
189
+ inset,
190
+ children,
191
+ ...props
192
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {
193
+ inset?: boolean;
194
+ }) {
195
+ return (
196
+ <DropdownMenuPrimitive.SubTrigger
197
+ data-slot="dropdown-menu-sub-trigger"
198
+ data-inset={inset}
199
+ className={cn(
200
+ '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-[state=open]:bg-muted',
201
+ className,
202
+ )}
203
+ {...props}
204
+ >
205
+ {children}
206
+ <ChevronRightIcon className="ml-auto size-3.5 opacity-60" />
207
+ </DropdownMenuPrimitive.SubTrigger>
208
+ );
209
+ }
210
+
211
+ function DropdownMenuSubContent({
212
+ className,
213
+ ...props
214
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {
215
+ return (
216
+ <DropdownMenuPrimitive.SubContent
217
+ data-slot="dropdown-menu-sub-content"
218
+ className={cn(
219
+ 'z-50 min-w-[9rem] overflow-hidden rounded-[8px] border border-border bg-popover p-1 text-popover-foreground shadow-floating',
220
+ 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',
221
+ 'data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95',
222
+ className,
223
+ )}
224
+ {...props}
225
+ />
226
+ );
227
+ }
228
+
229
+ export {
230
+ DropdownMenu,
231
+ DropdownMenuPortal,
232
+ DropdownMenuTrigger,
233
+ DropdownMenuContent,
234
+ DropdownMenuGroup,
235
+ DropdownMenuLabel,
236
+ DropdownMenuItem,
237
+ DropdownMenuCheckboxItem,
238
+ DropdownMenuRadioGroup,
239
+ DropdownMenuRadioItem,
240
+ DropdownMenuSeparator,
241
+ DropdownMenuShortcut,
242
+ DropdownMenuSub,
243
+ DropdownMenuSubTrigger,
244
+ DropdownMenuSubContent,
245
+ };
@@ -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,24 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { Label as LabelPrimitive } from "radix-ui"
5
+
6
+ import { cn } from "@/lib/utils"
7
+
8
+ function Label({
9
+ className,
10
+ ...props
11
+ }: React.ComponentProps<typeof LabelPrimitive.Root>) {
12
+ return (
13
+ <LabelPrimitive.Root
14
+ data-slot="label"
15
+ className={cn(
16
+ "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",
17
+ className
18
+ )}
19
+ {...props}
20
+ />
21
+ )
22
+ }
23
+
24
+ export { Label }
@@ -0,0 +1,75 @@
1
+ import * as React from 'react';
2
+ import { Popover as PopoverPrimitive } from 'radix-ui';
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
+ align = 'center',
17
+ sideOffset = 6,
18
+ ...props
19
+ }: React.ComponentProps<typeof PopoverPrimitive.Content>) {
20
+ return (
21
+ <PopoverPrimitive.Portal>
22
+ <PopoverPrimitive.Content
23
+ data-slot="popover-content"
24
+ align={align}
25
+ sideOffset={sideOffset}
26
+ className={cn(
27
+ 'z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-[8px] border border-border bg-popover p-3 text-popover-foreground shadow-floating outline-hidden',
28
+ 'data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1',
29
+ 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',
30
+ 'data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95',
31
+ className,
32
+ )}
33
+ {...props}
34
+ />
35
+ </PopoverPrimitive.Portal>
36
+ );
37
+ }
38
+
39
+ function PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {
40
+ return <PopoverPrimitive.Anchor data-slot="popover-anchor" {...props} />;
41
+ }
42
+
43
+ function PopoverHeader({ className, ...props }: React.ComponentProps<'div'>) {
44
+ return (
45
+ <div
46
+ data-slot="popover-header"
47
+ className={cn('flex flex-col gap-1 text-sm', className)}
48
+ {...props}
49
+ />
50
+ );
51
+ }
52
+
53
+ function PopoverTitle({ className, ...props }: React.ComponentProps<'h2'>) {
54
+ return <div data-slot="popover-title" className={cn('font-medium', className)} {...props} />;
55
+ }
56
+
57
+ function PopoverDescription({ className, ...props }: React.ComponentProps<'p'>) {
58
+ return (
59
+ <p
60
+ data-slot="popover-description"
61
+ className={cn('text-muted-foreground', className)}
62
+ {...props}
63
+ />
64
+ );
65
+ }
66
+
67
+ export {
68
+ Popover,
69
+ PopoverTrigger,
70
+ PopoverContent,
71
+ PopoverAnchor,
72
+ PopoverHeader,
73
+ PopoverTitle,
74
+ PopoverDescription,
75
+ };
@@ -0,0 +1,31 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { Progress as ProgressPrimitive } from "radix-ui"
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
+ className={cn(
17
+ "relative h-[3px] w-full overflow-hidden rounded-full bg-muted",
18
+ className
19
+ )}
20
+ {...props}
21
+ >
22
+ <ProgressPrimitive.Indicator
23
+ data-slot="progress-indicator"
24
+ className="h-full w-full flex-1 bg-brand transition-all"
25
+ style={{ transform: `translateX(-${100 - (value || 0)}%)` }}
26
+ />
27
+ </ProgressPrimitive.Root>
28
+ )
29
+ }
30
+
31
+ export { Progress }
@@ -0,0 +1,53 @@
1
+ import * as React from 'react';
2
+ import { ScrollArea as ScrollAreaPrimitive } from 'radix-ui';
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.ScrollAreaScrollbar>) {
34
+ return (
35
+ <ScrollAreaPrimitive.ScrollAreaScrollbar
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.ScrollAreaThumb
46
+ data-slot="scroll-area-thumb"
47
+ className="relative flex-1 rounded-full bg-border"
48
+ />
49
+ </ScrollAreaPrimitive.ScrollAreaScrollbar>
50
+ );
51
+ }
52
+
53
+ export { ScrollArea, ScrollBar };
@@ -0,0 +1,196 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react"
5
+ import { Select as SelectPrimitive } from "radix-ui"
6
+
7
+ import { cn } from "@/lib/utils"
8
+
9
+ function Select({
10
+ ...props
11
+ }: React.ComponentProps<typeof SelectPrimitive.Root>) {
12
+ return <SelectPrimitive.Root data-slot="select" {...props} />
13
+ }
14
+
15
+ function SelectGroup({
16
+ ...props
17
+ }: React.ComponentProps<typeof SelectPrimitive.Group>) {
18
+ return <SelectPrimitive.Group data-slot="select-group" {...props} />
19
+ }
20
+
21
+ function SelectValue({
22
+ ...props
23
+ }: React.ComponentProps<typeof SelectPrimitive.Value>) {
24
+ return <SelectPrimitive.Value data-slot="select-value" {...props} />
25
+ }
26
+
27
+ function SelectTrigger({
28
+ className,
29
+ size = "default",
30
+ children,
31
+ ...props
32
+ }: React.ComponentProps<typeof SelectPrimitive.Trigger> & {
33
+ size?: "sm" | "default"
34
+ }) {
35
+ return (
36
+ <SelectPrimitive.Trigger
37
+ data-slot="select-trigger"
38
+ data-size={size}
39
+ className={cn(
40
+ "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",
41
+ "hover:border-foreground/25 focus-visible:border-foreground/40 focus-visible:ring-2 focus-visible:ring-ring/30",
42
+ "disabled:cursor-not-allowed disabled:opacity-50",
43
+ "aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/25",
44
+ "data-[placeholder]:text-muted-foreground/70 data-[size=default]:h-8 data-[size=sm]:h-7",
45
+ "*:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2",
46
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5 [&_svg:not([class*='text-'])]:text-muted-foreground",
47
+ className
48
+ )}
49
+ {...props}
50
+ >
51
+ {children}
52
+ <SelectPrimitive.Icon asChild>
53
+ <ChevronDownIcon className="size-3.5 opacity-50" />
54
+ </SelectPrimitive.Icon>
55
+ </SelectPrimitive.Trigger>
56
+ )
57
+ }
58
+
59
+ function SelectContent({
60
+ className,
61
+ children,
62
+ position = "item-aligned",
63
+ align = "center",
64
+ ...props
65
+ }: React.ComponentProps<typeof SelectPrimitive.Content>) {
66
+ return (
67
+ <SelectPrimitive.Portal>
68
+ <SelectPrimitive.Content
69
+ data-slot="select-content"
70
+ className={cn(
71
+ "relative z-50 max-h-(--radix-select-content-available-height) min-w-[9rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-[8px] border border-border bg-popover text-popover-foreground shadow-floating data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
72
+ position === "popper" &&
73
+ "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
74
+ className
75
+ )}
76
+ position={position}
77
+ align={align}
78
+ {...props}
79
+ >
80
+ <SelectScrollUpButton />
81
+ <SelectPrimitive.Viewport
82
+ className={cn(
83
+ "p-1",
84
+ position === "popper" &&
85
+ "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"
86
+ )}
87
+ >
88
+ {children}
89
+ </SelectPrimitive.Viewport>
90
+ <SelectScrollDownButton />
91
+ </SelectPrimitive.Content>
92
+ </SelectPrimitive.Portal>
93
+ )
94
+ }
95
+
96
+ function SelectLabel({
97
+ className,
98
+ ...props
99
+ }: React.ComponentProps<typeof SelectPrimitive.Label>) {
100
+ return (
101
+ <SelectPrimitive.Label
102
+ data-slot="select-label"
103
+ className={cn("px-2 py-1.5 text-xs text-muted-foreground", className)}
104
+ {...props}
105
+ />
106
+ )
107
+ }
108
+
109
+ function SelectItem({
110
+ className,
111
+ children,
112
+ ...props
113
+ }: React.ComponentProps<typeof SelectPrimitive.Item>) {
114
+ return (
115
+ <SelectPrimitive.Item
116
+ data-slot="select-item"
117
+ className={cn(
118
+ "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 focus:bg-foreground focus: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",
119
+ className
120
+ )}
121
+ {...props}
122
+ >
123
+ <span
124
+ data-slot="select-item-indicator"
125
+ className="absolute right-2 flex size-3.5 items-center justify-center"
126
+ >
127
+ <SelectPrimitive.ItemIndicator>
128
+ <CheckIcon className="size-3.5" />
129
+ </SelectPrimitive.ItemIndicator>
130
+ </span>
131
+ <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
132
+ </SelectPrimitive.Item>
133
+ )
134
+ }
135
+
136
+ function SelectSeparator({
137
+ className,
138
+ ...props
139
+ }: React.ComponentProps<typeof SelectPrimitive.Separator>) {
140
+ return (
141
+ <SelectPrimitive.Separator
142
+ data-slot="select-separator"
143
+ className={cn("pointer-events-none -mx-1 my-1 h-px bg-border", className)}
144
+ {...props}
145
+ />
146
+ )
147
+ }
148
+
149
+ function SelectScrollUpButton({
150
+ className,
151
+ ...props
152
+ }: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {
153
+ return (
154
+ <SelectPrimitive.ScrollUpButton
155
+ data-slot="select-scroll-up-button"
156
+ className={cn(
157
+ "flex cursor-default items-center justify-center py-1",
158
+ className
159
+ )}
160
+ {...props}
161
+ >
162
+ <ChevronUpIcon className="size-4" />
163
+ </SelectPrimitive.ScrollUpButton>
164
+ )
165
+ }
166
+
167
+ function SelectScrollDownButton({
168
+ className,
169
+ ...props
170
+ }: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {
171
+ return (
172
+ <SelectPrimitive.ScrollDownButton
173
+ data-slot="select-scroll-down-button"
174
+ className={cn(
175
+ "flex cursor-default items-center justify-center py-1",
176
+ className
177
+ )}
178
+ {...props}
179
+ >
180
+ <ChevronDownIcon className="size-4" />
181
+ </SelectPrimitive.ScrollDownButton>
182
+ )
183
+ }
184
+
185
+ export {
186
+ Select,
187
+ SelectContent,
188
+ SelectGroup,
189
+ SelectItem,
190
+ SelectLabel,
191
+ SelectScrollDownButton,
192
+ SelectScrollUpButton,
193
+ SelectSeparator,
194
+ SelectTrigger,
195
+ SelectValue,
196
+ }
@@ -0,0 +1,28 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import { Separator as SeparatorPrimitive } from 'radix-ui';
5
+
6
+ import { cn } from '@/lib/utils';
7
+
8
+ function Separator({
9
+ className,
10
+ orientation = 'horizontal',
11
+ decorative = true,
12
+ ...props
13
+ }: React.ComponentProps<typeof SeparatorPrimitive.Root>) {
14
+ return (
15
+ <SeparatorPrimitive.Root
16
+ data-slot="separator"
17
+ decorative={decorative}
18
+ orientation={orientation}
19
+ className={cn(
20
+ 'shrink-0 bg-hairline data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch',
21
+ className,
22
+ )}
23
+ {...props}
24
+ />
25
+ );
26
+ }
27
+
28
+ export { Separator };