veloria-ui 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 (41) hide show
  1. package/CHANGELOG.md +206 -0
  2. package/LICENSE +21 -0
  3. package/README.md +253 -0
  4. package/dist/cli/index.js +511 -0
  5. package/dist/index.d.mts +1317 -0
  6. package/dist/index.d.ts +1317 -0
  7. package/dist/index.js +5373 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/index.mjs +5130 -0
  10. package/dist/index.mjs.map +1 -0
  11. package/dist/provider.d.mts +15 -0
  12. package/dist/provider.d.ts +15 -0
  13. package/dist/provider.js +1197 -0
  14. package/dist/provider.js.map +1 -0
  15. package/dist/provider.mjs +1161 -0
  16. package/dist/provider.mjs.map +1 -0
  17. package/dist/tailwind.d.ts +25 -0
  18. package/dist/tailwind.js +129 -0
  19. package/package.json +138 -0
  20. package/src/cli/index.ts +303 -0
  21. package/src/cli/registry.ts +139 -0
  22. package/src/components/advanced-forms/index.tsx +975 -0
  23. package/src/components/basic/Button.tsx +135 -0
  24. package/src/components/basic/IconButton.tsx +69 -0
  25. package/src/components/basic/index.tsx +446 -0
  26. package/src/components/data-display/index.tsx +1158 -0
  27. package/src/components/feedback/index.tsx +1051 -0
  28. package/src/components/forms/index.tsx +476 -0
  29. package/src/components/layout/index.tsx +296 -0
  30. package/src/components/media/index.tsx +437 -0
  31. package/src/components/navigation/index.tsx +484 -0
  32. package/src/components/overlay/index.tsx +473 -0
  33. package/src/components/utility/index.tsx +566 -0
  34. package/src/hooks/index.ts +602 -0
  35. package/src/hooks/use-toast.tsx +74 -0
  36. package/src/index.ts +396 -0
  37. package/src/provider.tsx +54 -0
  38. package/src/styles/atlas.css +252 -0
  39. package/src/tailwind.ts +124 -0
  40. package/src/types/index.ts +95 -0
  41. package/src/utils/cn.ts +66 -0
package/src/index.ts ADDED
@@ -0,0 +1,396 @@
1
+ /**
2
+ * veloria-ui
3
+ *
4
+ * Build anything. Ship faster.
5
+ * 102 production-ready components — accessible, composable, dark-mode ready.
6
+ *
7
+ * By JohnDev19 — https://github.com/JohnDev19/Veloria-UI
8
+ * Docs: https://veloria-ui.vercel.app/
9
+ * Issues: https://github.com/JohnDev19/Veloria-UI/issues
10
+ *
11
+ * @license MIT
12
+ */
13
+
14
+ // ─── Basic ────────────────────────────────────────────────────────────────
15
+ export { Button, buttonVariants } from "./components/basic/Button";
16
+ export type { ButtonProps } from "./components/basic/Button";
17
+ export { IconButton, iconButtonVariants } from "./components/basic/IconButton";
18
+ export type { IconButtonProps } from "./components/basic/IconButton";
19
+ export {
20
+ Link,
21
+ Badge, badgeVariants,
22
+ Avatar,
23
+ AvatarGroup,
24
+ Divider,
25
+ Tag,
26
+ Chip,
27
+ Tooltip,
28
+ TooltipProvider,
29
+ TooltipRoot,
30
+ TooltipTrigger,
31
+ TooltipContent,
32
+ } from "./components/basic";
33
+ export type {
34
+ LinkProps,
35
+ BadgeProps,
36
+ AvatarProps,
37
+ AvatarGroupProps,
38
+ DividerProps,
39
+ TagProps,
40
+ ChipProps,
41
+ TooltipProps,
42
+ } from "./components/basic";
43
+
44
+ // ─── Layout ───────────────────────────────────────────────────────────────
45
+ export {
46
+ Container,
47
+ Stack,
48
+ Grid,
49
+ Flex,
50
+ Section,
51
+ Spacer,
52
+ AspectRatio,
53
+ Center,
54
+ ScrollArea,
55
+ Masonry,
56
+ } from "./components/layout";
57
+ export type {
58
+ ContainerProps,
59
+ StackProps,
60
+ GridProps,
61
+ FlexProps,
62
+ SectionProps,
63
+ SpacerProps,
64
+ CenterProps,
65
+ MasonryProps,
66
+ } from "./components/layout";
67
+
68
+ // ─── Navigation ───────────────────────────────────────────────────────────
69
+ export {
70
+ Navbar,
71
+ Sidebar,
72
+ Menu,
73
+ MenuItem,
74
+ DropdownMenu,
75
+ DropdownMenuTrigger,
76
+ DropdownMenuContent,
77
+ DropdownMenuItem,
78
+ DropdownMenuSeparator,
79
+ DropdownMenuLabel,
80
+ DropdownMenuGroup,
81
+ DropdownMenuPortal,
82
+ DropdownMenuSub,
83
+ DropdownMenuRadioGroup,
84
+ Breadcrumb,
85
+ Pagination,
86
+ Tabs,
87
+ TabsList,
88
+ TabsTrigger,
89
+ TabsContent,
90
+ Stepper,
91
+ } from "./components/navigation";
92
+ export type {
93
+ NavbarProps,
94
+ SidebarProps,
95
+ MenuItemProps,
96
+ BreadcrumbItem,
97
+ BreadcrumbProps,
98
+ PaginationProps,
99
+ StepperStep,
100
+ StepperProps,
101
+ } from "./components/navigation";
102
+
103
+ // ─── Forms ────────────────────────────────────────────────────────────────
104
+ export {
105
+ Input, inputVariants,
106
+ TextArea,
107
+ Select,
108
+ SelectGroup,
109
+ SelectValue,
110
+ SelectTrigger,
111
+ SelectContent,
112
+ SelectItem,
113
+ SelectLabel,
114
+ SelectSeparator,
115
+ Checkbox,
116
+ RadioGroup,
117
+ Switch,
118
+ Slider,
119
+ RangeSlider,
120
+ DatePicker,
121
+ TimePicker,
122
+ } from "./components/forms";
123
+ export type {
124
+ InputProps,
125
+ TextAreaProps,
126
+ CheckboxProps,
127
+ RadioGroupProps,
128
+ RadioOption,
129
+ SwitchProps,
130
+ DatePickerProps,
131
+ TimePickerProps,
132
+ } from "./components/forms";
133
+
134
+ // ─── Advanced Forms ───────────────────────────────────────────────────────
135
+ export {
136
+ FileUpload,
137
+ OTPInput,
138
+ ColorPicker,
139
+ SearchInput,
140
+ PasswordInput,
141
+ Combobox,
142
+ MultiSelect,
143
+ FormField,
144
+ FormLabel,
145
+ FormError,
146
+ } from "./components/advanced-forms";
147
+ export type {
148
+ FileUploadProps,
149
+ OTPInputProps,
150
+ ColorPickerProps,
151
+ SearchInputProps,
152
+ PasswordInputProps,
153
+ ComboboxOption,
154
+ ComboboxProps,
155
+ MultiSelectProps,
156
+ FormFieldProps,
157
+ FormLabelProps,
158
+ FormErrorProps,
159
+ } from "./components/advanced-forms";
160
+
161
+ // ─── Data Display ─────────────────────────────────────────────────────────
162
+ export {
163
+ Card,
164
+ CardHeader,
165
+ CardTitle,
166
+ CardDescription,
167
+ CardContent,
168
+ CardFooter,
169
+ Table,
170
+ TableHeader,
171
+ TableBody,
172
+ TableRow,
173
+ TableHead,
174
+ TableCell,
175
+ TableCaption,
176
+ DataTable,
177
+ List,
178
+ ListItem,
179
+ Statistic,
180
+ Timeline,
181
+ Calendar,
182
+ CodeBlock,
183
+ Chart,
184
+ } from "./components/data-display";
185
+ export type {
186
+ CardProps,
187
+ DataTableColumn,
188
+ DataTableProps,
189
+ ListProps,
190
+ ListItemProps,
191
+ StatisticProps,
192
+ TimelineEvent,
193
+ TimelineProps,
194
+ CalendarProps,
195
+ CodeBlockProps,
196
+ ChartProps,
197
+ } from "./components/data-display";
198
+
199
+ // ─── Feedback ─────────────────────────────────────────────────────────────
200
+ export {
201
+ Alert,
202
+ AlertTitle,
203
+ AlertDescription,
204
+ ToastProvider,
205
+ ToastViewport,
206
+ Toast,
207
+ ToastTitle,
208
+ ToastDescription,
209
+ ToastClose,
210
+ ToastAction,
211
+ Snackbar,
212
+ Progress,
213
+ CircularProgress,
214
+ Skeleton,
215
+ LoadingSpinner,
216
+ EmptyState,
217
+ StatusIndicator,
218
+ Notification,
219
+ } from "./components/feedback";
220
+ export type {
221
+ AlertProps,
222
+ SnackbarProps,
223
+ ProgressProps,
224
+ CircularProgressProps,
225
+ SkeletonProps,
226
+ LoadingSpinnerProps,
227
+ EmptyStateProps,
228
+ StatusIndicatorProps,
229
+ NotificationProps,
230
+ } from "./components/feedback";
231
+
232
+ // ─── Overlay ──────────────────────────────────────────────────────────────
233
+ export {
234
+ Modal,
235
+ Dialog,
236
+ DialogTrigger,
237
+ DialogPortal,
238
+ DialogOverlay,
239
+ DialogClose,
240
+ DialogContent,
241
+ DialogHeader,
242
+ DialogFooter,
243
+ DialogTitle,
244
+ DialogDescription,
245
+ Drawer,
246
+ Sheet,
247
+ Popover,
248
+ PopoverTrigger,
249
+ PopoverContent,
250
+ HoverCard,
251
+ HoverCardTrigger,
252
+ HoverCardContent,
253
+ ContextMenu,
254
+ ContextMenuTrigger,
255
+ ContextMenuContent,
256
+ ContextMenuItem,
257
+ ContextMenuSeparator,
258
+ ContextMenuLabel,
259
+ ContextMenuGroup,
260
+ ContextMenuSub,
261
+ ContextMenuRadioGroup,
262
+ CommandDialog,
263
+ CommandItem,
264
+ CommandGroup,
265
+ CommandSeparator,
266
+ Lightbox,
267
+ ImageViewer,
268
+ } from "./components/overlay";
269
+ export type {
270
+ ModalProps,
271
+ DrawerProps,
272
+ CommandDialogProps,
273
+ LightboxProps,
274
+ } from "./components/overlay";
275
+
276
+ // ─── Media ────────────────────────────────────────────────────────────────
277
+ export {
278
+ Image,
279
+ VideoPlayer,
280
+ AudioPlayer,
281
+ Carousel,
282
+ Gallery,
283
+ } from "./components/media";
284
+ export type {
285
+ ImageProps,
286
+ VideoPlayerProps,
287
+ AudioPlayerProps,
288
+ CarouselProps,
289
+ GalleryImage,
290
+ GalleryProps,
291
+ } from "./components/media";
292
+
293
+ // ─── Utility ──────────────────────────────────────────────────────────────
294
+ export {
295
+ ThemeSwitcher,
296
+ CopyButton,
297
+ KeyboardShortcut,
298
+ ResizablePanel,
299
+ DragDropArea,
300
+ } from "./components/utility";
301
+ export type {
302
+ ThemeSwitcherProps,
303
+ CopyButtonProps,
304
+ KeyboardShortcutProps,
305
+ ResizablePanelProps,
306
+ DragDropAreaProps,
307
+ } from "./components/utility";
308
+
309
+ // ─── Hooks ────────────────────────────────────────────────────────────────
310
+ export {
311
+ useDisclosure,
312
+ useMediaQuery,
313
+ useBreakpoint,
314
+ useClipboard,
315
+ useLocalStorage,
316
+ useTheme,
317
+ useDebounce,
318
+ useOnClickOutside,
319
+ useKeydown,
320
+ useMounted,
321
+ useId,
322
+ } from "./hooks";
323
+ export type { UseDisclosureOptions, UseClipboardOptions, AtlasTheme } from "./hooks";
324
+
325
+ export {
326
+ useToast,
327
+ ToastContextProvider,
328
+ } from "./hooks/use-toast";
329
+ export type { ToastVariant, ToastData, ToastInput } from "./hooks/use-toast";
330
+
331
+ // ─── Types ────────────────────────────────────────────────────────────────
332
+ export type {
333
+ Size,
334
+ ResponsiveSize,
335
+ ColorScheme,
336
+ Variant,
337
+ Placement,
338
+ Side,
339
+ AtlasBaseProps,
340
+ AtlasAriaProps,
341
+ AsChildProps,
342
+ Orientation,
343
+ Status,
344
+ Theme,
345
+ VariantProps,
346
+ } from "./types";
347
+
348
+ // ─── Utils ────────────────────────────────────────────────────────────────
349
+ export { cn, composeEventHandlers, generateId, isBrowser, isDefined, noop } from "./utils/cn";
350
+
351
+ // ─── Tailwind plugin ──────────────────────────────────────────────────────
352
+ export { atlasPlugin, atlasPreset } from "./tailwind";
353
+
354
+ // ─── v0.1.2 — New Components ─────────────────────────────────────────────
355
+
356
+ // Advanced Forms
357
+ export { PhoneInput, TagInput, CurrencyInput, RatingInput } from "./components/advanced-forms";
358
+ export type { PhoneInputProps, TagInputProps, CurrencyInputProps, RatingInputProps } from "./components/advanced-forms";
359
+
360
+ // Data Display
361
+ export { StatsCard, TreeView, JsonViewer, Heatmap, KanbanBoard } from "./components/data-display";
362
+ export type {
363
+ StatsCardProps, TreeNode, TreeViewProps,
364
+ JsonViewerProps, JsonValue,
365
+ HeatmapCell, HeatmapProps,
366
+ KanbanCard, KanbanColumn, KanbanBoardProps,
367
+ } from "./components/data-display";
368
+
369
+ // Feedback & Overlay
370
+ export { BannerAlert, ConfirmDialog, FloatingActionButton, RichTooltip, Tour } from "./components/feedback";
371
+ export type {
372
+ BannerAlertProps, ConfirmDialogProps,
373
+ FABAction, FloatingActionButtonProps,
374
+ RichTooltipProps, TourStep, TourProps,
375
+ } from "./components/feedback";
376
+
377
+ // Utility
378
+ export { InfiniteScroll, VirtualList } from "./components/utility";
379
+ export type { InfiniteScrollProps, VirtualListProps } from "./components/utility";
380
+
381
+ // ─── v0.1.2 — New Hooks ──────────────────────────────────────────────────
382
+ export {
383
+ useForm,
384
+ usePagination,
385
+ useIntersection,
386
+ useWindowSize,
387
+ useStep,
388
+ useCountdown,
389
+ } from "./hooks";
390
+ export type {
391
+ UseFormOptions, UseFormReturn,
392
+ UsePaginationOptions, UsePaginationReturn,
393
+ UseIntersectionOptions, WindowSize,
394
+ UseStepOptions, UseStepReturn,
395
+ UseCountdownOptions, UseCountdownReturn,
396
+ } from "./hooks";
@@ -0,0 +1,54 @@
1
+ /**
2
+ * AtlasProvider — wrap your app with this once.
3
+ *
4
+ * Covers Toast (needed for useToast) and TooltipProvider (so you don't
5
+ * have to wrap every single Tooltip yourself).
6
+ *
7
+ * Usage in app/layout.tsx:
8
+ *
9
+ * import { AtlasProvider } from "veloria-ui/provider";
10
+ *
11
+ * export default function RootLayout({ children }) {
12
+ * return (
13
+ * <html lang="en">
14
+ * <body>
15
+ * <AtlasProvider>{children}</AtlasProvider>
16
+ * </body>
17
+ * </html>
18
+ * );
19
+ * }
20
+ *
21
+ * — JohnDev19, Veloria UI
22
+ */
23
+
24
+ "use client";
25
+
26
+ import * as React from "react";
27
+ import { ToastProvider, ToastViewport } from "./components/feedback";
28
+ import { TooltipProvider } from "./components/basic";
29
+
30
+ export interface AtlasProviderProps {
31
+ children: React.ReactNode;
32
+ /** How long toasts stay on screen in ms. Default: 5000 */
33
+ toastDuration?: number;
34
+ /** Swipe direction to dismiss toasts. Default: "right" */
35
+ toastSwipeDirection?: "up" | "down" | "left" | "right";
36
+ /** Delay before tooltips open in ms. Default: 300 */
37
+ tooltipDelay?: number;
38
+ }
39
+
40
+ export function AtlasProvider({
41
+ children,
42
+ toastDuration = 5000,
43
+ toastSwipeDirection = "right",
44
+ tooltipDelay = 300,
45
+ }: AtlasProviderProps) {
46
+ return (
47
+ <ToastProvider duration={toastDuration} swipeDirection={toastSwipeDirection}>
48
+ <TooltipProvider delayDuration={tooltipDelay}>
49
+ {children}
50
+ <ToastViewport />
51
+ </TooltipProvider>
52
+ </ToastProvider>
53
+ );
54
+ }
@@ -0,0 +1,252 @@
1
+ /* ========================================================================
2
+ Veloria UI Design Tokens
3
+ Veloria UI Design System — https://veloria-ui.vercel.app/
4
+ By JohnDev19 — https://github.com/JohnDev19/Veloria-UI
5
+ ======================================================================== */
6
+
7
+ @tailwind base;
8
+ @tailwind components;
9
+ @tailwind utilities;
10
+
11
+ /* ─── Base Layer ─────────────────────────────────────────────────────────── */
12
+
13
+ @layer base {
14
+ :root {
15
+ /* ── Core Palette ── */
16
+ --background: 0 0% 100%;
17
+ --foreground: 222.2 47.4% 11.2%;
18
+
19
+ /* ── Surface ── */
20
+ --card: 0 0% 100%;
21
+ --card-foreground: 222.2 47.4% 11.2%;
22
+ --popover: 0 0% 100%;
23
+ --popover-foreground: 222.2 47.4% 11.2%;
24
+
25
+ /* ── Brand ── */
26
+ --primary: 222.2 47.4% 11.2%;
27
+ --primary-foreground: 210 40% 98%;
28
+
29
+ /* ── Secondary / Neutral ── */
30
+ --secondary: 210 40% 96.1%;
31
+ --secondary-foreground: 222.2 47.4% 11.2%;
32
+ --muted: 210 40% 96.1%;
33
+ --muted-foreground: 215.4 16.3% 46.9%;
34
+ --accent: 210 40% 96.1%;
35
+ --accent-foreground: 222.2 47.4% 11.2%;
36
+
37
+ /* ── Semantic ── */
38
+ --destructive: 0 84.2% 60.2%;
39
+ --destructive-foreground: 210 40% 98%;
40
+ --success: 142.1 76.2% 36.3%;
41
+ --success-foreground: 355.7 100% 97.3%;
42
+ --warning: 32 95% 44%;
43
+ --warning-foreground: 26 83.3% 14.1%;
44
+ --info: 221.2 83.2% 53.3%;
45
+ --info-foreground: 210 40% 98%;
46
+
47
+ /* ── Forms & Borders ── */
48
+ --border: 214.3 31.8% 91.4%;
49
+ --input: 214.3 31.8% 91.4%;
50
+ --ring: 222.2 84% 4.9%;
51
+
52
+ /* ── Radius ── */
53
+ --radius: 0.5rem;
54
+
55
+ /* ── Typography ── */
56
+ --font-sans: 'Inter Variable', 'Inter', system-ui, -apple-system, sans-serif;
57
+ --font-mono: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace;
58
+ }
59
+
60
+ .dark {
61
+ --background: 222.2 84% 4.9%;
62
+ --foreground: 210 40% 98%;
63
+
64
+ --card: 222.2 84% 4.9%;
65
+ --card-foreground: 210 40% 98%;
66
+ --popover: 222.2 84% 4.9%;
67
+ --popover-foreground: 210 40% 98%;
68
+
69
+ --primary: 210 40% 98%;
70
+ --primary-foreground: 222.2 47.4% 11.2%;
71
+
72
+ --secondary: 217.2 32.6% 17.5%;
73
+ --secondary-foreground: 210 40% 98%;
74
+ --muted: 217.2 32.6% 17.5%;
75
+ --muted-foreground: 215 20.2% 65.1%;
76
+ --accent: 217.2 32.6% 17.5%;
77
+ --accent-foreground: 210 40% 98%;
78
+
79
+ --destructive: 0 62.8% 50.6%;
80
+ --destructive-foreground: 210 40% 98%;
81
+ --success: 142.1 70.6% 45.3%;
82
+ --success-foreground: 144.9 80.4% 10%;
83
+ --warning: 32 95% 60%;
84
+ --warning-foreground: 26 83.3% 14.1%;
85
+ --info: 213.1 93.9% 67.8%;
86
+ --info-foreground: 222.2 47.4% 11.2%;
87
+
88
+ --border: 217.2 32.6% 17.5%;
89
+ --input: 217.2 32.6% 17.5%;
90
+ --ring: 212.7 26.8% 83.9%;
91
+ }
92
+ }
93
+
94
+ /* ─── Global Reset + Base Styles ─────────────────────────────────────────── */
95
+
96
+ @layer base {
97
+ * {
98
+ @apply border-border;
99
+ box-sizing: border-box;
100
+ }
101
+
102
+ html {
103
+ -webkit-font-smoothing: antialiased;
104
+ -moz-osx-font-smoothing: grayscale;
105
+ text-rendering: optimizeLegibility;
106
+ scroll-behavior: smooth;
107
+ }
108
+
109
+ body {
110
+ @apply bg-background text-foreground;
111
+ font-family: var(--font-sans);
112
+ }
113
+
114
+ h1, h2, h3, h4, h5, h6 {
115
+ @apply tracking-tight;
116
+ }
117
+
118
+ :focus-visible {
119
+ @apply outline-none ring-2 ring-ring ring-offset-2 ring-offset-background;
120
+ }
121
+ }
122
+
123
+ /* ─── Component Animations ───────────────────────────────────────────────── */
124
+
125
+ @layer utilities {
126
+ @keyframes atlas-spin {
127
+ to { transform: rotate(360deg); }
128
+ }
129
+
130
+ @keyframes atlas-ping {
131
+ 75%, 100% {
132
+ transform: scale(2);
133
+ opacity: 0;
134
+ }
135
+ }
136
+
137
+ @keyframes atlas-pulse {
138
+ 50% { opacity: 0.5; }
139
+ }
140
+
141
+ @keyframes atlas-bounce {
142
+ 0%, 100% { transform: translateY(-25%); animation-timing-function: cubic-bezier(0.8, 0, 1, 1); }
143
+ 50% { transform: none; animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
144
+ }
145
+
146
+ @keyframes atlas-fade-in {
147
+ from { opacity: 0; }
148
+ to { opacity: 1; }
149
+ }
150
+
151
+ @keyframes atlas-fade-out {
152
+ from { opacity: 1; }
153
+ to { opacity: 0; }
154
+ }
155
+
156
+ @keyframes atlas-slide-in-from-top {
157
+ from { transform: translateY(-100%); }
158
+ to { transform: translateY(0); }
159
+ }
160
+
161
+ @keyframes atlas-slide-in-from-bottom {
162
+ from { transform: translateY(100%); }
163
+ to { transform: translateY(0); }
164
+ }
165
+
166
+ @keyframes atlas-slide-in-from-left {
167
+ from { transform: translateX(-100%); }
168
+ to { transform: translateX(0); }
169
+ }
170
+
171
+ @keyframes atlas-slide-in-from-right {
172
+ from { transform: translateX(100%); }
173
+ to { transform: translateX(0); }
174
+ }
175
+
176
+ @keyframes atlas-zoom-in {
177
+ from { opacity: 0; transform: scale(0.96); }
178
+ to { opacity: 1; transform: scale(1); }
179
+ }
180
+
181
+ @keyframes atlas-zoom-out {
182
+ from { opacity: 1; transform: scale(1); }
183
+ to { opacity: 0; transform: scale(0.96); }
184
+ }
185
+
186
+ .animate-in {
187
+ animation: atlas-fade-in 150ms ease;
188
+ }
189
+
190
+ .fade-in-0 {
191
+ animation: atlas-fade-in 150ms ease;
192
+ }
193
+
194
+ .fade-out-0 {
195
+ animation: atlas-fade-out 150ms ease;
196
+ }
197
+
198
+ .zoom-in-95 {
199
+ animation: atlas-zoom-in 150ms ease;
200
+ }
201
+
202
+ .zoom-out-95 {
203
+ animation: atlas-zoom-out 150ms ease;
204
+ }
205
+
206
+ .slide-in-from-top {
207
+ animation: atlas-slide-in-from-top 150ms ease;
208
+ }
209
+
210
+ .slide-in-from-bottom {
211
+ animation: atlas-slide-in-from-bottom 150ms ease;
212
+ }
213
+
214
+ .slide-in-from-left {
215
+ animation: atlas-slide-in-from-left 200ms ease;
216
+ }
217
+
218
+ .slide-in-from-right {
219
+ animation: atlas-slide-in-from-right 200ms ease;
220
+ }
221
+
222
+ /* Composable data-state-based animations */
223
+ [data-state="open"] { animation: atlas-fade-in 150ms ease; }
224
+ [data-state="closed"] { animation: atlas-fade-out 150ms ease; }
225
+ }
226
+
227
+ /* ─── Custom Scrollbars ──────────────────────────────────────────────────── */
228
+
229
+ @layer utilities {
230
+ .atlas-scrollbar {
231
+ scrollbar-width: thin;
232
+ scrollbar-color: hsl(var(--border)) transparent;
233
+ }
234
+
235
+ .atlas-scrollbar::-webkit-scrollbar {
236
+ width: 6px;
237
+ height: 6px;
238
+ }
239
+
240
+ .atlas-scrollbar::-webkit-scrollbar-track {
241
+ background: transparent;
242
+ }
243
+
244
+ .atlas-scrollbar::-webkit-scrollbar-thumb {
245
+ background-color: hsl(var(--border));
246
+ border-radius: 9999px;
247
+ }
248
+
249
+ .atlas-scrollbar::-webkit-scrollbar-thumb:hover {
250
+ background-color: hsl(var(--muted-foreground) / 0.4);
251
+ }
252
+ }