create-nala 3.0.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 (316) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +58 -0
  3. package/dist/index.js +227 -0
  4. package/package.json +48 -0
  5. package/template/.env.example +45 -0
  6. package/template/_gitignore +33 -0
  7. package/template/components.json +24 -0
  8. package/template/index.html +30 -0
  9. package/template/package.json +51 -0
  10. package/template/public/favicon.svg +15 -0
  11. package/template/public/icons.svg +24 -0
  12. package/template/public/img/avatar.webp +0 -0
  13. package/template/public/screenshot.png +0 -0
  14. package/template/src/App.vue +15 -0
  15. package/template/src/auto-imports.d.ts +691 -0
  16. package/template/src/components/AppLogo.vue +159 -0
  17. package/template/src/components/EmptyState.vue +60 -0
  18. package/template/src/components/PageHeader.vue +60 -0
  19. package/template/src/components/layout/AppNavbar.vue +159 -0
  20. package/template/src/components/layout/AppSidebar.vue +74 -0
  21. package/template/src/components/layout/CommandSearchDialog.vue +120 -0
  22. package/template/src/components/ui/accordion/Accordion.vue +15 -0
  23. package/template/src/components/ui/accordion/AccordionContent.vue +20 -0
  24. package/template/src/components/ui/accordion/AccordionItem.vue +20 -0
  25. package/template/src/components/ui/accordion/AccordionTrigger.vue +34 -0
  26. package/template/src/components/ui/accordion/index.ts +4 -0
  27. package/template/src/components/ui/alert/Alert.vue +21 -0
  28. package/template/src/components/ui/alert/AlertDescription.vue +17 -0
  29. package/template/src/components/ui/alert/AlertTitle.vue +17 -0
  30. package/template/src/components/ui/alert/index.ts +30 -0
  31. package/template/src/components/ui/alert-dialog/AlertDialog.vue +15 -0
  32. package/template/src/components/ui/alert-dialog/AlertDialogAction.vue +18 -0
  33. package/template/src/components/ui/alert-dialog/AlertDialogCancel.vue +25 -0
  34. package/template/src/components/ui/alert-dialog/AlertDialogContent.vue +44 -0
  35. package/template/src/components/ui/alert-dialog/AlertDialogDescription.vue +23 -0
  36. package/template/src/components/ui/alert-dialog/AlertDialogFooter.vue +22 -0
  37. package/template/src/components/ui/alert-dialog/AlertDialogHeader.vue +17 -0
  38. package/template/src/components/ui/alert-dialog/AlertDialogTitle.vue +21 -0
  39. package/template/src/components/ui/alert-dialog/AlertDialogTrigger.vue +12 -0
  40. package/template/src/components/ui/alert-dialog/index.ts +9 -0
  41. package/template/src/components/ui/avatar/Avatar.vue +50 -0
  42. package/template/src/components/ui/avatar/AvatarFallback.vue +21 -0
  43. package/template/src/components/ui/avatar/AvatarGroup.vue +69 -0
  44. package/template/src/components/ui/avatar/AvatarImage.vue +16 -0
  45. package/template/src/components/ui/avatar/index.ts +4 -0
  46. package/template/src/components/ui/badge/Badge.vue +40 -0
  47. package/template/src/components/ui/badge/index.ts +45 -0
  48. package/template/src/components/ui/breadcrumb/Breadcrumb.vue +17 -0
  49. package/template/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +23 -0
  50. package/template/src/components/ui/breadcrumb/BreadcrumbItem.vue +17 -0
  51. package/template/src/components/ui/breadcrumb/BreadcrumbLink.vue +21 -0
  52. package/template/src/components/ui/breadcrumb/BreadcrumbList.vue +17 -0
  53. package/template/src/components/ui/breadcrumb/BreadcrumbPage.vue +20 -0
  54. package/template/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +22 -0
  55. package/template/src/components/ui/breadcrumb/index.ts +7 -0
  56. package/template/src/components/ui/button/Button.spec.ts +46 -0
  57. package/template/src/components/ui/button/Button.vue +31 -0
  58. package/template/src/components/ui/button/index.ts +41 -0
  59. package/template/src/components/ui/calendar/Calendar.vue +106 -0
  60. package/template/src/components/ui/calendar/index.ts +1 -0
  61. package/template/src/components/ui/card/Card.vue +29 -0
  62. package/template/src/components/ui/card/CardAction.vue +17 -0
  63. package/template/src/components/ui/card/CardContent.vue +17 -0
  64. package/template/src/components/ui/card/CardDescription.vue +17 -0
  65. package/template/src/components/ui/card/CardFooter.vue +17 -0
  66. package/template/src/components/ui/card/CardHeader.vue +29 -0
  67. package/template/src/components/ui/card/CardTitle.vue +17 -0
  68. package/template/src/components/ui/card/index.ts +7 -0
  69. package/template/src/components/ui/chart/AreaChart.vue +143 -0
  70. package/template/src/components/ui/chart/BarChart.vue +142 -0
  71. package/template/src/components/ui/chart/DonutChart.vue +75 -0
  72. package/template/src/components/ui/chart/LineChart.vue +132 -0
  73. package/template/src/components/ui/chart/index.ts +4 -0
  74. package/template/src/components/ui/checkbox/Checkbox.vue +57 -0
  75. package/template/src/components/ui/checkbox/index.ts +1 -0
  76. package/template/src/components/ui/collapsible/Collapsible.vue +15 -0
  77. package/template/src/components/ui/collapsible/CollapsibleContent.vue +18 -0
  78. package/template/src/components/ui/collapsible/CollapsibleTrigger.vue +12 -0
  79. package/template/src/components/ui/collapsible/index.ts +3 -0
  80. package/template/src/components/ui/command/Command.vue +88 -0
  81. package/template/src/components/ui/command/CommandDialog.vue +31 -0
  82. package/template/src/components/ui/command/CommandEmpty.vue +27 -0
  83. package/template/src/components/ui/command/CommandGroup.vue +45 -0
  84. package/template/src/components/ui/command/CommandInput.vue +39 -0
  85. package/template/src/components/ui/command/CommandItem.vue +76 -0
  86. package/template/src/components/ui/command/CommandList.vue +25 -0
  87. package/template/src/components/ui/command/CommandSeparator.vue +21 -0
  88. package/template/src/components/ui/command/CommandShortcut.vue +17 -0
  89. package/template/src/components/ui/command/index.ts +25 -0
  90. package/template/src/components/ui/context-menu/ContextMenu.vue +15 -0
  91. package/template/src/components/ui/context-menu/ContextMenuCheckboxItem.vue +36 -0
  92. package/template/src/components/ui/context-menu/ContextMenuContent.vue +33 -0
  93. package/template/src/components/ui/context-menu/ContextMenuGroup.vue +12 -0
  94. package/template/src/components/ui/context-menu/ContextMenuItem.vue +36 -0
  95. package/template/src/components/ui/context-menu/ContextMenuLabel.vue +25 -0
  96. package/template/src/components/ui/context-menu/ContextMenuRadioGroup.vue +18 -0
  97. package/template/src/components/ui/context-menu/ContextMenuRadioItem.vue +36 -0
  98. package/template/src/components/ui/context-menu/ContextMenuSeparator.vue +18 -0
  99. package/template/src/components/ui/context-menu/ContextMenuShortcut.vue +17 -0
  100. package/template/src/components/ui/context-menu/ContextMenuSub.vue +15 -0
  101. package/template/src/components/ui/context-menu/ContextMenuSubContent.vue +36 -0
  102. package/template/src/components/ui/context-menu/ContextMenuSubTrigger.vue +32 -0
  103. package/template/src/components/ui/context-menu/ContextMenuTrigger.vue +13 -0
  104. package/template/src/components/ui/context-menu/index.ts +14 -0
  105. package/template/src/components/ui/date-picker/DatePicker.vue +233 -0
  106. package/template/src/components/ui/date-picker/index.ts +1 -0
  107. package/template/src/components/ui/dialog/Dialog.vue +19 -0
  108. package/template/src/components/ui/dialog/DialogClose.vue +15 -0
  109. package/template/src/components/ui/dialog/DialogContent.vue +53 -0
  110. package/template/src/components/ui/dialog/DialogDescription.vue +23 -0
  111. package/template/src/components/ui/dialog/DialogFooter.vue +27 -0
  112. package/template/src/components/ui/dialog/DialogHeader.vue +17 -0
  113. package/template/src/components/ui/dialog/DialogOverlay.vue +21 -0
  114. package/template/src/components/ui/dialog/DialogScrollContent.vue +59 -0
  115. package/template/src/components/ui/dialog/DialogTitle.vue +23 -0
  116. package/template/src/components/ui/dialog/DialogTrigger.vue +15 -0
  117. package/template/src/components/ui/dialog/index.ts +10 -0
  118. package/template/src/components/ui/dropdown-menu/DropdownMenu.vue +19 -0
  119. package/template/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +39 -0
  120. package/template/src/components/ui/dropdown-menu/DropdownMenuContent.vue +41 -0
  121. package/template/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +15 -0
  122. package/template/src/components/ui/dropdown-menu/DropdownMenuItem.vue +31 -0
  123. package/template/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +23 -0
  124. package/template/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +21 -0
  125. package/template/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +40 -0
  126. package/template/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +23 -0
  127. package/template/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +17 -0
  128. package/template/src/components/ui/dropdown-menu/DropdownMenuSub.vue +18 -0
  129. package/template/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +27 -0
  130. package/template/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +31 -0
  131. package/template/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +17 -0
  132. package/template/src/components/ui/dropdown-menu/index.ts +16 -0
  133. package/template/src/components/ui/form/FormControl.vue +17 -0
  134. package/template/src/components/ui/form/FormDescription.vue +21 -0
  135. package/template/src/components/ui/form/FormItem.vue +23 -0
  136. package/template/src/components/ui/form/FormLabel.vue +25 -0
  137. package/template/src/components/ui/form/FormMessage.vue +23 -0
  138. package/template/src/components/ui/form/index.ts +7 -0
  139. package/template/src/components/ui/form/injectionKeys.ts +4 -0
  140. package/template/src/components/ui/form/useFormField.ts +30 -0
  141. package/template/src/components/ui/hover-card/HoverCard.vue +19 -0
  142. package/template/src/components/ui/hover-card/HoverCardContent.vue +43 -0
  143. package/template/src/components/ui/hover-card/HoverCardTrigger.vue +15 -0
  144. package/template/src/components/ui/hover-card/index.ts +3 -0
  145. package/template/src/components/ui/index.ts +47 -0
  146. package/template/src/components/ui/input/Input.vue +33 -0
  147. package/template/src/components/ui/input/InputAddon.vue +29 -0
  148. package/template/src/components/ui/input/InputGroup.vue +17 -0
  149. package/template/src/components/ui/input/InputIcon.vue +29 -0
  150. package/template/src/components/ui/input/index.ts +4 -0
  151. package/template/src/components/ui/kbd/Kbd.vue +30 -0
  152. package/template/src/components/ui/kbd/index.ts +1 -0
  153. package/template/src/components/ui/label/Label.vue +26 -0
  154. package/template/src/components/ui/label/index.ts +1 -0
  155. package/template/src/components/ui/loading-bar/LoadingBar.vue +41 -0
  156. package/template/src/components/ui/loading-bar/index.ts +2 -0
  157. package/template/src/components/ui/pagination/Pagination.vue +26 -0
  158. package/template/src/components/ui/pagination/PaginationContent.vue +22 -0
  159. package/template/src/components/ui/pagination/PaginationEllipsis.vue +25 -0
  160. package/template/src/components/ui/pagination/PaginationFirst.vue +33 -0
  161. package/template/src/components/ui/pagination/PaginationItem.vue +34 -0
  162. package/template/src/components/ui/pagination/PaginationLast.vue +33 -0
  163. package/template/src/components/ui/pagination/PaginationNext.vue +33 -0
  164. package/template/src/components/ui/pagination/PaginationPrevious.vue +33 -0
  165. package/template/src/components/ui/pagination/index.ts +8 -0
  166. package/template/src/components/ui/pin-input/PinInput.vue +28 -0
  167. package/template/src/components/ui/pin-input/PinInputGroup.vue +18 -0
  168. package/template/src/components/ui/pin-input/PinInputInput.vue +24 -0
  169. package/template/src/components/ui/pin-input/PinInputSeparator.vue +21 -0
  170. package/template/src/components/ui/pin-input/index.ts +4 -0
  171. package/template/src/components/ui/popover/Popover.vue +19 -0
  172. package/template/src/components/ui/popover/PopoverAnchor.vue +15 -0
  173. package/template/src/components/ui/popover/PopoverContent.vue +45 -0
  174. package/template/src/components/ui/popover/PopoverTrigger.vue +15 -0
  175. package/template/src/components/ui/popover/index.ts +4 -0
  176. package/template/src/components/ui/progress/Progress.vue +35 -0
  177. package/template/src/components/ui/progress/index.ts +1 -0
  178. package/template/src/components/ui/radio-group/RadioGroup.vue +23 -0
  179. package/template/src/components/ui/radio-group/RadioGroupItem.vue +30 -0
  180. package/template/src/components/ui/radio-group/index.ts +2 -0
  181. package/template/src/components/ui/scroll-area/ScrollArea.vue +40 -0
  182. package/template/src/components/ui/scroll-area/ScrollBar.vue +44 -0
  183. package/template/src/components/ui/scroll-area/index.ts +2 -0
  184. package/template/src/components/ui/select/Select.vue +19 -0
  185. package/template/src/components/ui/select/SelectContent.vue +51 -0
  186. package/template/src/components/ui/select/SelectGroup.vue +15 -0
  187. package/template/src/components/ui/select/SelectItem.vue +44 -0
  188. package/template/src/components/ui/select/SelectItemText.vue +15 -0
  189. package/template/src/components/ui/select/SelectLabel.vue +17 -0
  190. package/template/src/components/ui/select/SelectScrollDownButton.vue +26 -0
  191. package/template/src/components/ui/select/SelectScrollUpButton.vue +26 -0
  192. package/template/src/components/ui/select/SelectSeparator.vue +19 -0
  193. package/template/src/components/ui/select/SelectTrigger.vue +33 -0
  194. package/template/src/components/ui/select/SelectValue.vue +15 -0
  195. package/template/src/components/ui/select/index.ts +11 -0
  196. package/template/src/components/ui/separator/Separator.vue +29 -0
  197. package/template/src/components/ui/separator/index.ts +1 -0
  198. package/template/src/components/ui/sheet/Sheet.vue +19 -0
  199. package/template/src/components/ui/sheet/SheetClose.vue +15 -0
  200. package/template/src/components/ui/sheet/SheetContent.vue +62 -0
  201. package/template/src/components/ui/sheet/SheetDescription.vue +21 -0
  202. package/template/src/components/ui/sheet/SheetFooter.vue +16 -0
  203. package/template/src/components/ui/sheet/SheetHeader.vue +15 -0
  204. package/template/src/components/ui/sheet/SheetOverlay.vue +21 -0
  205. package/template/src/components/ui/sheet/SheetTitle.vue +21 -0
  206. package/template/src/components/ui/sheet/SheetTrigger.vue +15 -0
  207. package/template/src/components/ui/sheet/index.ts +8 -0
  208. package/template/src/components/ui/sidebar/Sidebar.vue +113 -0
  209. package/template/src/components/ui/sidebar/SidebarContent.vue +18 -0
  210. package/template/src/components/ui/sidebar/SidebarControl.vue +53 -0
  211. package/template/src/components/ui/sidebar/SidebarFooter.vue +18 -0
  212. package/template/src/components/ui/sidebar/SidebarGroup.vue +18 -0
  213. package/template/src/components/ui/sidebar/SidebarGroupAction.vue +27 -0
  214. package/template/src/components/ui/sidebar/SidebarGroupContent.vue +18 -0
  215. package/template/src/components/ui/sidebar/SidebarGroupLabel.vue +25 -0
  216. package/template/src/components/ui/sidebar/SidebarHeader.vue +18 -0
  217. package/template/src/components/ui/sidebar/SidebarInput.vue +22 -0
  218. package/template/src/components/ui/sidebar/SidebarInset.vue +21 -0
  219. package/template/src/components/ui/sidebar/SidebarMenu.vue +18 -0
  220. package/template/src/components/ui/sidebar/SidebarMenuAction.vue +35 -0
  221. package/template/src/components/ui/sidebar/SidebarMenuBadge.vue +26 -0
  222. package/template/src/components/ui/sidebar/SidebarMenuButton.vue +48 -0
  223. package/template/src/components/ui/sidebar/SidebarMenuButtonChild.vue +36 -0
  224. package/template/src/components/ui/sidebar/SidebarMenuItem.vue +18 -0
  225. package/template/src/components/ui/sidebar/SidebarMenuSkeleton.vue +35 -0
  226. package/template/src/components/ui/sidebar/SidebarMenuSub.vue +22 -0
  227. package/template/src/components/ui/sidebar/SidebarMenuSubButton.vue +36 -0
  228. package/template/src/components/ui/sidebar/SidebarMenuSubItem.vue +18 -0
  229. package/template/src/components/ui/sidebar/SidebarProvider.vue +136 -0
  230. package/template/src/components/ui/sidebar/SidebarRail.vue +33 -0
  231. package/template/src/components/ui/sidebar/SidebarSeparator.vue +19 -0
  232. package/template/src/components/ui/sidebar/SidebarTrigger.vue +27 -0
  233. package/template/src/components/ui/sidebar/index.ts +61 -0
  234. package/template/src/components/ui/sidebar/utils.ts +27 -0
  235. package/template/src/components/ui/skeleton/Skeleton.vue +17 -0
  236. package/template/src/components/ui/skeleton/index.ts +1 -0
  237. package/template/src/components/ui/slider/Slider.vue +42 -0
  238. package/template/src/components/ui/slider/index.ts +1 -0
  239. package/template/src/components/ui/sonner/Sonner.vue +42 -0
  240. package/template/src/components/ui/sonner/index.ts +2 -0
  241. package/template/src/components/ui/stepper/Stepper.vue +102 -0
  242. package/template/src/components/ui/stepper/index.ts +1 -0
  243. package/template/src/components/ui/switch/Switch.vue +38 -0
  244. package/template/src/components/ui/switch/index.ts +1 -0
  245. package/template/src/components/ui/table/Table.vue +16 -0
  246. package/template/src/components/ui/table/TableBody.vue +17 -0
  247. package/template/src/components/ui/table/TableCaption.vue +17 -0
  248. package/template/src/components/ui/table/TableCell.vue +22 -0
  249. package/template/src/components/ui/table/TableEmpty.vue +34 -0
  250. package/template/src/components/ui/table/TableFooter.vue +17 -0
  251. package/template/src/components/ui/table/TableHead.vue +17 -0
  252. package/template/src/components/ui/table/TableHeader.vue +17 -0
  253. package/template/src/components/ui/table/TableRow.vue +17 -0
  254. package/template/src/components/ui/table/index.ts +9 -0
  255. package/template/src/components/ui/table/utils.ts +10 -0
  256. package/template/src/components/ui/tabs/Tabs.vue +24 -0
  257. package/template/src/components/ui/tabs/TabsContent.vue +21 -0
  258. package/template/src/components/ui/tabs/TabsList.vue +24 -0
  259. package/template/src/components/ui/tabs/TabsTrigger.vue +26 -0
  260. package/template/src/components/ui/tabs/index.ts +4 -0
  261. package/template/src/components/ui/textarea/Textarea.vue +28 -0
  262. package/template/src/components/ui/textarea/index.ts +1 -0
  263. package/template/src/components/ui/timeline/Timeline.vue +73 -0
  264. package/template/src/components/ui/timeline/index.ts +1 -0
  265. package/template/src/components/ui/toggle/Toggle.vue +35 -0
  266. package/template/src/components/ui/toggle/index.ts +28 -0
  267. package/template/src/components/ui/toggle-group/ToggleGroup.vue +41 -0
  268. package/template/src/components/ui/toggle-group/ToggleGroupItem.vue +43 -0
  269. package/template/src/components/ui/toggle-group/index.ts +12 -0
  270. package/template/src/components/ui/tooltip/Tooltip.vue +19 -0
  271. package/template/src/components/ui/tooltip/TooltipContent.vue +34 -0
  272. package/template/src/components/ui/tooltip/TooltipProvider.vue +14 -0
  273. package/template/src/components/ui/tooltip/TooltipTrigger.vue +15 -0
  274. package/template/src/components/ui/tooltip/index.ts +4 -0
  275. package/template/src/components.d.ts +228 -0
  276. package/template/src/composables/useFormatter.ts +105 -0
  277. package/template/src/composables/useThemeConfig.ts +252 -0
  278. package/template/src/layouts/AdminLayout.vue +55 -0
  279. package/template/src/layouts/AuthLayout.vue +42 -0
  280. package/template/src/lib/axios.spec.ts +46 -0
  281. package/template/src/lib/axios.ts +243 -0
  282. package/template/src/lib/formatters.spec.ts +137 -0
  283. package/template/src/lib/formatters.ts +332 -0
  284. package/template/src/lib/loading-bar.ts +103 -0
  285. package/template/src/lib/utils.spec.ts +26 -0
  286. package/template/src/lib/utils.ts +7 -0
  287. package/template/src/lib/validation.spec.ts +78 -0
  288. package/template/src/main.ts +13 -0
  289. package/template/src/router/index.ts +147 -0
  290. package/template/src/services/auth.service.spec.ts +93 -0
  291. package/template/src/services/auth.service.ts +243 -0
  292. package/template/src/services/index.ts +3 -0
  293. package/template/src/services/types.ts +28 -0
  294. package/template/src/services/user.service.spec.ts +91 -0
  295. package/template/src/services/user.service.ts +283 -0
  296. package/template/src/stores/auth.spec.ts +52 -0
  297. package/template/src/stores/auth.ts +130 -0
  298. package/template/src/style.css +587 -0
  299. package/template/src/views/_starter/BlankView.vue +47 -0
  300. package/template/src/views/auth/ConfirmEmailView.vue +209 -0
  301. package/template/src/views/auth/ForgotPasswordView.vue +151 -0
  302. package/template/src/views/auth/LockScreenView.vue +175 -0
  303. package/template/src/views/auth/LoginView.vue +54 -0
  304. package/template/src/views/auth/RegisterView.vue +265 -0
  305. package/template/src/views/auth/ResetPasswordView.vue +260 -0
  306. package/template/src/views/auth/VerifyOtpView.vue +261 -0
  307. package/template/src/views/dashboard/IndexView.vue +159 -0
  308. package/template/src/views/errors/ComingSoonView.vue +241 -0
  309. package/template/src/views/errors/MaintenanceView.vue +252 -0
  310. package/template/src/views/errors/NotFoundView.vue +81 -0
  311. package/template/src/views/errors/ServerErrorView.vue +101 -0
  312. package/template/src/views/errors/UnauthorizedView.vue +64 -0
  313. package/template/tsconfig.app.json +27 -0
  314. package/template/tsconfig.json +19 -0
  315. package/template/tsconfig.node.json +23 -0
  316. package/template/vite.config.ts +46 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 candrasp
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # create-nala
2
+
3
+ > The official scaffolding CLI for **Nala** — A modern, production-ready enterprise admin dashboard template built with Vue 3, Vite, TypeScript, and Tailwind CSS v4.
4
+
5
+ ---
6
+
7
+ ## 🚀 Quick Start
8
+
9
+ Create a new Nala admin application in seconds:
10
+
11
+ ### with `pnpm` (Recommended)
12
+ ```bash
13
+ pnpm create nala my-admin-app
14
+ ```
15
+
16
+ ### with `npm`
17
+ ```bash
18
+ npm create nala@latest my-admin-app
19
+ ```
20
+
21
+ ### with `yarn`
22
+ ```bash
23
+ yarn create nala my-admin-app
24
+ ```
25
+
26
+ ### with `bun`
27
+ ```bash
28
+ bun create nala my-admin-app
29
+ ```
30
+
31
+ ---
32
+
33
+ ## 📦 What's Included
34
+
35
+ - ⚡ **Vue 3.5+ & Vite 8+** — Blazing fast Hot Module Replacement (<100ms)
36
+ - 🎨 **Tailwind CSS v4** — High-performance CSS engine with OKLCH design tokens
37
+ - 🧩 **34+ Reka UI Primitives** — Accessible, headless UI components (shadcn-vue compatible)
38
+ - 🔒 **Full Auth Views Suite** — Login, Register, Forgot/Reset Password, 6-box OTP input, Confirm Email, Lock Screen
39
+ - 📡 **Axios Service Layer** — Typed API client with auto token injection & error toast interceptors
40
+ - 🍍 **Pinia Store** — Typed state management
41
+ - 🌓 **Dynamic Theme Switcher** — Dark, Light, System themes out of the box
42
+ - 📱 **Mobile & Desktop Layouts** — Collapsible sidebar, mobile drawer, command search palette (`Ctrl+K`)
43
+
44
+ ---
45
+
46
+ ## 🛠️ Development
47
+
48
+ ```bash
49
+ cd my-admin-app
50
+ pnpm install
51
+ pnpm dev
52
+ ```
53
+
54
+ ---
55
+
56
+ ## 📄 License
57
+
58
+ [MIT](https://github.com/candrasp/Nala/blob/main/LICENSE) © [candrasp](https://github.com/candrasp)
package/dist/index.js ADDED
@@ -0,0 +1,227 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/index.ts
4
+ import path2 from "path";
5
+ import { fileURLToPath } from "url";
6
+ import {
7
+ intro,
8
+ outro,
9
+ text,
10
+ select,
11
+ confirm,
12
+ spinner,
13
+ isCancel,
14
+ cancel,
15
+ log
16
+ } from "@clack/prompts";
17
+ import { cyan, green, dim, bold, red } from "kolorist";
18
+
19
+ // src/utils.ts
20
+ import fs from "fs";
21
+ import path from "path";
22
+ function formatTargetDir(targetDir) {
23
+ return targetDir?.trim().replace(/\/+$/g, "");
24
+ }
25
+ function isEmptyDir(dirPath) {
26
+ if (!fs.existsSync(dirPath)) {
27
+ return true;
28
+ }
29
+ const files = fs.readdirSync(dirPath);
30
+ return files.length === 0 || files.length === 1 && files[0] === ".git";
31
+ }
32
+ function emptyDir(dir) {
33
+ if (!fs.existsSync(dir)) {
34
+ return;
35
+ }
36
+ for (const file of fs.readdirSync(dir)) {
37
+ if (file === ".git") {
38
+ continue;
39
+ }
40
+ fs.rmSync(path.resolve(dir, file), { recursive: true, force: true });
41
+ }
42
+ }
43
+ function pkgFromUserAgent(userAgent) {
44
+ if (!userAgent) return "pnpm";
45
+ const pkgSpec = userAgent.split(" ")[0];
46
+ const pkgName = pkgSpec.split("/")[0];
47
+ if (["pnpm", "npm", "yarn", "bun"].includes(pkgName)) {
48
+ return pkgName;
49
+ }
50
+ return "pnpm";
51
+ }
52
+ var TEXT_FILE_EXTENSIONS = /* @__PURE__ */ new Set([
53
+ ".json",
54
+ ".html",
55
+ ".md",
56
+ ".ts",
57
+ ".js",
58
+ ".vue",
59
+ ".css",
60
+ ".svg",
61
+ ".example",
62
+ ".yaml",
63
+ ".yml"
64
+ ]);
65
+ function copyDir(srcDir, destDir, replacements = {}) {
66
+ fs.mkdirSync(destDir, { recursive: true });
67
+ for (const file of fs.readdirSync(srcDir)) {
68
+ const srcFile = path.resolve(srcDir, file);
69
+ let destFileName = file;
70
+ if (file === "_gitignore") {
71
+ destFileName = ".gitignore";
72
+ }
73
+ const destFile = path.resolve(destDir, destFileName);
74
+ const stat = fs.statSync(srcFile);
75
+ if (stat.isDirectory()) {
76
+ copyDir(srcFile, destFile, replacements);
77
+ } else {
78
+ const ext = path.extname(file).toLowerCase();
79
+ if (TEXT_FILE_EXTENSIONS.has(ext) || file.startsWith(".env") || file === "_gitignore" || file === "LICENSE") {
80
+ let content = fs.readFileSync(srcFile, "utf-8");
81
+ for (const [search, replace] of Object.entries(replacements)) {
82
+ content = content.replaceAll(search, replace);
83
+ }
84
+ fs.writeFileSync(destFile, content, "utf-8");
85
+ } else {
86
+ fs.copyFileSync(srcFile, destFile);
87
+ }
88
+ }
89
+ }
90
+ }
91
+
92
+ // src/index.ts
93
+ var __dirname2 = path2.dirname(fileURLToPath(import.meta.url));
94
+ async function run() {
95
+ const isTTY = Boolean(process.stdin.isTTY && process.stdout.isTTY);
96
+ const argv = process.argv.slice(2);
97
+ const flags = {
98
+ force: argv.includes("--force") || argv.includes("-f"),
99
+ pnpm: argv.includes("--pnpm"),
100
+ npm: argv.includes("--npm"),
101
+ yarn: argv.includes("--yarn"),
102
+ bun: argv.includes("--bun")
103
+ };
104
+ const nonFlagArgs = argv.filter((arg) => !arg.startsWith("-"));
105
+ let targetDir = formatTargetDir(nonFlagArgs[0]);
106
+ const defaultProjectName = targetDir || "nala-admin-app";
107
+ if (isTTY) {
108
+ console.log();
109
+ intro(bold(cyan("\u2726 create-nala \u2014 Scaffold a Modern Vue 3 Admin Dashboard \u2726")));
110
+ } else {
111
+ console.log(bold(cyan("\n\u2726 create-nala (Non-interactive mode) \u2726\n")));
112
+ }
113
+ if (!targetDir) {
114
+ if (isTTY) {
115
+ const projectDirInput = await text({
116
+ message: "Project name / directory:",
117
+ placeholder: defaultProjectName,
118
+ defaultValue: defaultProjectName,
119
+ validate(value) {
120
+ if (!value || value.trim().length === 0) {
121
+ return "Project name cannot be empty.";
122
+ }
123
+ if (/[<>:"/\\|?*]/.test(value)) {
124
+ return "Directory name contains invalid characters.";
125
+ }
126
+ }
127
+ });
128
+ if (isCancel(projectDirInput)) {
129
+ cancel("Scaffolding cancelled.");
130
+ process.exit(0);
131
+ }
132
+ targetDir = formatTargetDir(projectDirInput) || defaultProjectName;
133
+ } else {
134
+ targetDir = defaultProjectName;
135
+ }
136
+ }
137
+ const root = path2.resolve(process.cwd(), targetDir);
138
+ const appSlug = path2.basename(root);
139
+ const appName = appSlug.split(/[-_]+/).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
140
+ if (!isEmptyDir(root)) {
141
+ if (flags.force) {
142
+ emptyDir(root);
143
+ } else if (isTTY) {
144
+ const shouldOverwrite = await confirm({
145
+ message: `Target directory "${targetDir}" is not empty. Remove existing files and continue?`,
146
+ initialValue: false
147
+ });
148
+ if (isCancel(shouldOverwrite) || !shouldOverwrite) {
149
+ cancel("Operation cancelled.");
150
+ process.exit(0);
151
+ }
152
+ emptyDir(root);
153
+ } else {
154
+ console.error(red(`Error: Target directory "${targetDir}" is not empty. Use --force to overwrite.`));
155
+ process.exit(1);
156
+ }
157
+ }
158
+ const detectedPkgManager = pkgFromUserAgent(process.env.npm_config_user_agent);
159
+ let pkgManager = detectedPkgManager;
160
+ if (flags.pnpm) pkgManager = "pnpm";
161
+ else if (flags.npm) pkgManager = "npm";
162
+ else if (flags.yarn) pkgManager = "yarn";
163
+ else if (flags.bun) pkgManager = "bun";
164
+ else if (isTTY) {
165
+ const pkgManagerSelection = await select({
166
+ message: "Select package manager:",
167
+ initialValue: detectedPkgManager,
168
+ options: [
169
+ { value: "pnpm", label: "pnpm", hint: "recommended" },
170
+ { value: "npm", label: "npm" },
171
+ { value: "yarn", label: "yarn" },
172
+ { value: "bun", label: "bun" }
173
+ ]
174
+ });
175
+ if (isCancel(pkgManagerSelection)) {
176
+ cancel("Scaffolding cancelled.");
177
+ process.exit(0);
178
+ }
179
+ pkgManager = String(pkgManagerSelection);
180
+ }
181
+ const templateDir = path2.resolve(__dirname2, "../template");
182
+ if (isTTY) {
183
+ const s = spinner();
184
+ s.start(`Scaffolding project in ${cyan(root)}...`);
185
+ try {
186
+ copyDir(templateDir, root, {
187
+ NALA_APP_NAME: appName,
188
+ NALA_APP_SLUG: appSlug
189
+ });
190
+ s.stop(`Scaffolded project in ${green(root)}`);
191
+ } catch (err) {
192
+ const errorMsg = err instanceof Error ? err.message : String(err);
193
+ s.stop(red("Failed to scaffold project."));
194
+ log.error(errorMsg);
195
+ process.exit(1);
196
+ }
197
+ } else {
198
+ console.log(`Scaffolding project in ${cyan(root)}...`);
199
+ copyDir(templateDir, root, {
200
+ NALA_APP_NAME: appName,
201
+ NALA_APP_SLUG: appSlug
202
+ });
203
+ console.log(`Scaffolded project in ${green(root)}`);
204
+ }
205
+ const cdCmd = targetDir === "." ? "" : `cd ${targetDir}
206
+ `;
207
+ const installCmd = pkgManager === "yarn" ? "yarn" : `${pkgManager} install`;
208
+ const devCmd = pkgManager === "npm" ? "npm run dev" : `${pkgManager} dev`;
209
+ console.log();
210
+ if (isTTY) {
211
+ log.success(green("Project initialized successfully! \u{1F389}"));
212
+ } else {
213
+ console.log(green("\u2713 Project initialized successfully! \u{1F389}"));
214
+ }
215
+ console.log();
216
+ console.log(bold("Next steps:"));
217
+ console.log(dim(` ${cdCmd}${installCmd}
218
+ ${devCmd}`));
219
+ console.log();
220
+ if (isTTY) {
221
+ outro(cyan("Happy coding with Nala! \u2728"));
222
+ }
223
+ }
224
+ run().catch((err) => {
225
+ console.error(err);
226
+ process.exit(1);
227
+ });
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "create-nala",
3
+ "version": "3.0.0",
4
+ "description": "Scaffolding CLI tool for Nala Admin Dashboard Template",
5
+ "author": "candrasp",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "bin": {
9
+ "create-nala": "./dist/index.js"
10
+ },
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "files": [
14
+ "dist",
15
+ "template"
16
+ ],
17
+ "keywords": [
18
+ "nala",
19
+ "vue3",
20
+ "admin",
21
+ "dashboard",
22
+ "template",
23
+ "scaffold",
24
+ "create",
25
+ "starter",
26
+ "tailwind-v4",
27
+ "reka-ui",
28
+ "shadcn-vue"
29
+ ],
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/candrasp/Nala.git",
33
+ "directory": "packages/create-nala"
34
+ },
35
+ "dependencies": {
36
+ "@clack/prompts": "^0.9.1",
37
+ "kolorist": "^1.8.0"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^24.13.3",
41
+ "tsup": "^8.4.0",
42
+ "typescript": "~6.0.2"
43
+ },
44
+ "scripts": {
45
+ "build": "tsup",
46
+ "dev": "tsup --watch"
47
+ }
48
+ }
@@ -0,0 +1,45 @@
1
+ # ─── App Configuration ────────────────────────────────────────────────────────
2
+ # Application brand name (used in page titles, header branding, and notifications)
3
+ VITE_APP_NAME=Nala
4
+
5
+ # ─── API Service Layer ────────────────────────────────────────────────────────
6
+ # Backend REST / GraphQL API base URL (no trailing slash)
7
+ # When unreachable in development (DEV mode), services automatically fall back to mock data
8
+ # Examples:
9
+ # - Local development: http://localhost:8000/api/v1
10
+ # - Production server: https://api.yourdomain.com/v1
11
+ VITE_API_BASE_URL=http://localhost:3000
12
+
13
+ # ─── Internationalization & Data Formatting ──────────────────────────────────
14
+ # Default locale used by formatters (date, number, currency, relative time)
15
+ # Formatter supports standard BCP 47 language tags:
16
+ # - en-US (United States)
17
+ # - id-ID (Indonesia)
18
+ # - de-DE (Germany)
19
+ # - ja-JP (Japan)
20
+ # - fr-FR (France)
21
+ VITE_DEFAULT_LOCALE=en-US
22
+
23
+ # Default ISO 4217 currency code for formatCurrency()
24
+ # Examples: USD ($) | IDR (Rp) | EUR (€) | JPY (¥) | GBP (£)
25
+ VITE_DEFAULT_CURRENCY=USD
26
+
27
+ # Default IANA timezone string for date/time formatters
28
+ # Examples:
29
+ # - Indonesia: Asia/Jakarta (WIB) | Asia/Makassar (WITA) | Asia/Jayapura (WIT)
30
+ # - Global: UTC | America/New_York | Europe/London | Asia/Tokyo | Australia/Sydney
31
+ VITE_DEFAULT_TIMEZONE=Asia/Jakarta
32
+
33
+ # Default clock time format system
34
+ # Options:
35
+ # - '24h' : 24-hour military clock (e.g. 14:30)
36
+ # - '12h' : 12-hour clock with AM/PM (e.g. 02:30 PM)
37
+ # - 'auto' : Automatically determined by user's locale setting
38
+ VITE_DEFAULT_TIME_FORMAT=24h
39
+
40
+ # ─── Theme & Layout Customizer ───────────────────────────────────────────────
41
+ # Enable/disable the interactive live Theme Customizer drawer and navbar trigger
42
+ # Set to 'false' in production if you wish to lock your branding permanently
43
+ # Options: 'true' | 'false' (defaults to 'true')
44
+ VITE_SHOW_THEME_CUSTOMIZER=true
45
+
@@ -0,0 +1,33 @@
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ dist
12
+ dist-ssr
13
+ *.local
14
+
15
+ # Editor directories and files
16
+ .vscode/*
17
+ !.vscode/extensions.json
18
+ !.vscode/settings.json
19
+ .idea
20
+ .DS_Store
21
+ *.suo
22
+ *.ntvs*
23
+ *.njsproj
24
+ *.sln
25
+ *.sw?
26
+
27
+ # Auto-generated TypeScript declarations
28
+ src/auto-imports.d.ts
29
+ src/components.d.ts
30
+
31
+ # Environment
32
+ .env.local
33
+ .env.*.local
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://shadcn-vue.com/schema.json",
3
+ "style": "new-york",
4
+ "font": "inter",
5
+ "typescript": true,
6
+ "tailwind": {
7
+ "config": "",
8
+ "css": "src/style.css",
9
+ "baseColor": "neutral",
10
+ "cssVariables": true,
11
+ "prefix": ""
12
+ },
13
+ "iconLibrary": "lucide",
14
+ "rtl": false,
15
+ "pointer": false,
16
+ "aliases": {
17
+ "components": "@/components",
18
+ "utils": "@/lib/utils",
19
+ "ui": "@/components/ui",
20
+ "lib": "@/lib",
21
+ "composables": "@/composables"
22
+ },
23
+ "registries": {}
24
+ }
@@ -0,0 +1,30 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg?v=2" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+
8
+ <!-- Primary Meta Tags -->
9
+ <title>Nala — Modern Vue 3 Admin Dashboard Template</title>
10
+ <meta name="title" content="Nala — Modern Vue 3 Admin Dashboard Template" />
11
+ <meta name="description" content="A modern, production-ready enterprise admin dashboard template built with Vue 3, Vite, TypeScript, and Tailwind CSS v4." />
12
+ <meta name="theme-color" content="#10b981" />
13
+
14
+ <!-- Open Graph / Facebook / LinkedIn -->
15
+ <meta property="og:type" content="website" />
16
+ <meta property="og:title" content="Nala — Modern Vue 3 Admin Dashboard Template" />
17
+ <meta property="og:description" content="A modern, production-ready enterprise admin dashboard template built with Vue 3, Vite, TypeScript, and Tailwind CSS v4." />
18
+ <meta property="og:image" content="/screenshot.png" />
19
+
20
+ <!-- Twitter -->
21
+ <meta property="twitter:card" content="summary_large_image" />
22
+ <meta property="twitter:title" content="Nala — Modern Vue 3 Admin Dashboard Template" />
23
+ <meta property="twitter:description" content="A modern, production-ready enterprise admin dashboard template built with Vue 3, Vite, TypeScript, and Tailwind CSS v4." />
24
+ <meta property="twitter:image" content="/screenshot.png" />
25
+ </head>
26
+ <body>
27
+ <div id="app"></div>
28
+ <script type="module" src="/src/main.ts"></script>
29
+ </body>
30
+ </html>
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "NALA_APP_SLUG",
3
+ "version": "0.1.0",
4
+ "description": "Production-ready admin dashboard built with Vue 3, Vite, TypeScript, and Tailwind CSS v4.",
5
+ "private": true,
6
+ "type": "module",
7
+ "scripts": {
8
+ "dev": "vite --host",
9
+ "build": "vue-tsc -b && vite build",
10
+ "preview": "vite preview",
11
+ "test": "vitest",
12
+ "test:run": "vitest run"
13
+ },
14
+ "dependencies": {
15
+ "@lucide/vue": "^1.29.0",
16
+ "@tailwindcss/vite": "^4.3.3",
17
+ "@vee-validate/zod": "^4.15.1",
18
+ "@vueuse/core": "^14.4.0",
19
+ "axios": "^1.19.0",
20
+ "class-variance-authority": "^0.7.1",
21
+ "clsx": "^2.1.1",
22
+ "pinia": "^4.0.2",
23
+ "reka-ui": "^2.10.1",
24
+ "tailwind-merge": "^3.6.0",
25
+ "tailwindcss": "^4.3.3",
26
+ "vee-validate": "^4.15.1",
27
+ "vue": "^3.5.40",
28
+ "vue-router": "^5.2.0",
29
+ "vue-sonner": "^2.0.9",
30
+ "zod": "^3.24.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^24.13.3",
34
+ "@vitejs/plugin-vue": "^6.0.8",
35
+ "@vue/test-utils": "^2.4.11",
36
+ "@vue/tsconfig": "^0.9.1",
37
+ "happy-dom": "^20.11.6",
38
+ "tw-animate-css": "^1.4.0",
39
+ "typescript": "~6.0.2",
40
+ "unplugin-auto-import": "^21.1.0",
41
+ "unplugin-vue-components": "^32.1.0",
42
+ "vite": "^8.2.0",
43
+ "vitest": "^4.1.11",
44
+ "vue-tsc": "^3.3.8"
45
+ },
46
+ "pnpm": {
47
+ "ignoredBuiltDependencies": [
48
+ "vue-demi"
49
+ ]
50
+ }
51
+ }
@@ -0,0 +1,15 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000">
2
+ <rect x="0" y="0" width="1000" height="1000" rx="225" fill="#0A0A0E"/>
3
+ <defs>
4
+ <linearGradient id="nalaFaviconGrad" x1="0%" y1="0%" x2="100%" y2="100%">
5
+ <stop offset="0%" stop-color="#53F5AC" />
6
+ <stop offset="50%" stop-color="#3ECF8E" />
7
+ <stop offset="100%" stop-color="#24B47E" />
8
+ </linearGradient>
9
+ </defs>
10
+ <g transform="translate(500,500) scale(1.22) translate(-509.75,-495.8)">
11
+ <g transform="translate(0,1000) scale(0.1,-0.1)" fill="url(#nalaFaviconGrad)" stroke="none">
12
+ <path d="M6600 7929 c-127 -13 -224 -35 -287 -64 -30 -15 -74 -33 -97 -41 -22 -8 -58 -26 -79 -40 -21 -14 -49 -29 -64 -35 -42 -16 -173 -113 -242 -178 -35 -34 -77 -71 -95 -84 -17 -12 -58 -47 -91 -78 -178 -167 -310 -288 -348 -318 -48 -38 -153 -132 -347 -309 -74 -68 -156 -143 -181 -166 -74 -67 -94 -114 -94 -221 0 -80 3 -95 27 -137 60 -100 174 -167 304 -176 59 -4 85 0 150 22 44 14 91 34 105 44 55 36 177 140 279 238 58 55 145 133 193 172 48 39 159 136 245 215 246 227 449 391 528 428 57 26 85 33 160 37 106 5 138 -3 221 -57 47 -30 68 -53 102 -110 24 -40 47 -86 52 -103 4 -17 9 -596 10 -1288 0 -975 -2 -1263 -11 -1281 -30 -58 -105 -131 -164 -161 -53 -28 -71 -32 -141 -32 -75 -1 -85 2 -162 41 -57 30 -118 75 -203 150 -66 59 -151 133 -188 163 -38 30 -139 118 -226 195 -87 77 -197 174 -246 215 -48 41 -150 129 -226 195 -76 66 -150 130 -164 141 -14 12 -101 88 -193 170 -93 82 -200 176 -239 209 -98 82 -334 290 -383 336 -22 20 -78 70 -125 110 -47 40 -143 126 -215 190 -233 209 -338 264 -589 309 -111 20 -396 7 -517 -24 -162 -41 -321 -134 -417 -244 -64 -74 -149 -212 -163 -266 -6 -23 -21 -75 -34 -117 -13 -42 -29 -114 -35 -160 -7 -58 -10 -526 -8 -1524 l3 -1440 41 -108 c45 -116 72 -161 149 -245 83 -92 265 -212 375 -247 30 -10 72 -26 92 -36 63 -32 143 -48 297 -60 182 -14 377 6 476 48 33 14 88 36 123 49 35 13 80 35 100 49 20 14 42 25 48 25 19 0 166 108 247 182 44 40 90 80 103 88 20 14 254 225 384 347 30 28 98 89 151 135 234 203 449 402 473 436 38 55 48 90 49 162 0 103 -16 147 -82 211 -80 79 -146 104 -271 104 -166 0 -217 -30 -492 -280 -84 -78 -198 -177 -253 -222 -55 -44 -111 -93 -125 -108 -53 -58 -271 -247 -503 -436 -21 -17 -75 -47 -120 -67 -140 -61 -271 -48 -384 38 -38 28 -57 55 -95 130 l-47 95 -3 1255 c-2 1160 -1 1257 14 1285 42 75 95 129 156 162 57 30 72 33 147 33 76 0 89 -3 152 -36 83 -44 143 -90 287 -218 61 -54 131 -115 156 -135 58 -46 192 -163 300 -261 47 -43 121 -108 165 -146 44 -37 126 -109 182 -159 56 -49 123 -109 150 -131 113 -97 323 -282 384 -339 36 -34 97 -86 135 -117 38 -30 110 -92 159 -138 160 -146 191 -174 290 -255 54 -44 155 -130 225 -192 70 -62 156 -132 191 -156 69 -46 212 -109 294 -127 144 -33 462 -28 605 9 216 55 395 186 514 375 57 92 122 285 137 411 14 121 12 2900 -2 2967 -20 91 -91 239 -153 317 -92 116 -227 210 -391 276 -44 17 -94 39 -111 48 -47 24 -106 35 -280 52 -87 8 -158 14 -158 14 -1 -1 -39 -6 -86 -10z"/>
13
+ </g>
14
+ </g>
15
+ </svg>
@@ -0,0 +1,24 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg">
2
+ <symbol id="bluesky-icon" viewBox="0 0 16 17">
3
+ <g clip-path="url(#bluesky-clip)"><path fill="#08060d" d="M7.75 7.735c-.693-1.348-2.58-3.86-4.334-5.097-1.68-1.187-2.32-.981-2.74-.79C.188 2.065.1 2.812.1 3.251s.241 3.602.398 4.13c.52 1.744 2.367 2.333 4.07 2.145-2.495.37-4.71 1.278-1.805 4.512 3.196 3.309 4.38-.71 4.987-2.746.608 2.036 1.307 5.91 4.93 2.746 2.72-2.746.747-4.143-1.747-4.512 1.702.189 3.55-.4 4.07-2.145.156-.528.397-3.691.397-4.13s-.088-1.186-.575-1.406c-.42-.19-1.06-.395-2.741.79-1.755 1.24-3.64 3.752-4.334 5.099"/></g>
4
+ <defs><clipPath id="bluesky-clip"><path fill="#fff" d="M.1.85h15.3v15.3H.1z"/></clipPath></defs>
5
+ </symbol>
6
+ <symbol id="discord-icon" viewBox="0 0 20 19">
7
+ <path fill="#08060d" d="M16.224 3.768a14.5 14.5 0 0 0-3.67-1.153c-.158.286-.343.67-.47.976a13.5 13.5 0 0 0-4.067 0c-.128-.306-.317-.69-.476-.976A14.4 14.4 0 0 0 3.868 3.77C1.546 7.28.916 10.703 1.231 14.077a14.7 14.7 0 0 0 4.5 2.306q.545-.748.965-1.587a9.5 9.5 0 0 1-1.518-.74q.191-.14.372-.293c2.927 1.369 6.107 1.369 8.999 0q.183.152.372.294-.723.437-1.52.74.418.838.963 1.588a14.6 14.6 0 0 0 4.504-2.308c.37-3.911-.63-7.302-2.644-10.309m-9.13 8.234c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.894 0 1.614.82 1.599 1.82.001 1-.705 1.82-1.6 1.82m5.91 0c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.893 0 1.614.82 1.599 1.82 0 1-.706 1.82-1.6 1.82"/>
8
+ </symbol>
9
+ <symbol id="documentation-icon" viewBox="0 0 21 20">
10
+ <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="m15.5 13.333 1.533 1.322c.645.555.967.833.967 1.178s-.322.623-.967 1.179L15.5 18.333m-3.333-5-1.534 1.322c-.644.555-.966.833-.966 1.178s.322.623.966 1.179l1.534 1.321"/>
11
+ <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M17.167 10.836v-4.32c0-1.41 0-2.117-.224-2.68-.359-.906-1.118-1.621-2.08-1.96-.599-.21-1.349-.21-2.848-.21-2.623 0-3.935 0-4.983.369-1.684.591-3.013 1.842-3.641 3.428C3 6.449 3 7.684 3 10.154v2.122c0 2.558 0 3.838.706 4.726q.306.383.713.671c.76.536 1.79.64 3.581.66"/>
12
+ <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M3 10a2.78 2.78 0 0 1 2.778-2.778c.555 0 1.209.097 1.748-.047.48-.129.854-.503.982-.982.145-.54.048-1.194.048-1.749a2.78 2.78 0 0 1 2.777-2.777"/>
13
+ </symbol>
14
+ <symbol id="github-icon" viewBox="0 0 19 19">
15
+ <path fill="#08060d" fill-rule="evenodd" d="M9.356 1.85C5.05 1.85 1.57 5.356 1.57 9.694a7.84 7.84 0 0 0 5.324 7.44c.387.079.528-.168.528-.376 0-.182-.013-.805-.013-1.454-2.165.467-2.616-.935-2.616-.935-.349-.91-.864-1.143-.864-1.143-.71-.48.051-.48.051-.48.787.051 1.2.805 1.2.805.695 1.194 1.817.857 2.268.649.064-.507.27-.857.49-1.052-1.728-.182-3.545-.857-3.545-3.87 0-.857.31-1.558.8-2.104-.078-.195-.349-1 .077-2.078 0 0 .657-.208 2.14.805a7.5 7.5 0 0 1 1.946-.26c.657 0 1.328.092 1.946.26 1.483-1.013 2.14-.805 2.14-.805.426 1.078.155 1.883.078 2.078.502.546.799 1.247.799 2.104 0 3.013-1.818 3.675-3.558 3.87.284.247.528.714.528 1.454 0 1.052-.012 1.896-.012 2.156 0 .208.142.455.528.377a7.84 7.84 0 0 0 5.324-7.441c.013-4.338-3.48-7.844-7.773-7.844" clip-rule="evenodd"/>
16
+ </symbol>
17
+ <symbol id="social-icon" viewBox="0 0 20 20">
18
+ <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M12.5 6.667a4.167 4.167 0 1 0-8.334 0 4.167 4.167 0 0 0 8.334 0"/>
19
+ <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M2.5 16.667a5.833 5.833 0 0 1 8.75-5.053m3.837.474.513 1.035c.07.144.257.282.414.309l.93.155c.596.1.736.536.307.965l-.723.73a.64.64 0 0 0-.152.531l.207.903c.164.715-.213.991-.84.618l-.872-.52a.63.63 0 0 0-.577 0l-.872.52c-.624.373-1.003.094-.84-.618l.207-.903a.64.64 0 0 0-.152-.532l-.723-.729c-.426-.43-.289-.864.306-.964l.93-.156a.64.64 0 0 0 .412-.31l.513-1.034c.28-.562.735-.562 1.012 0"/>
20
+ </symbol>
21
+ <symbol id="x-icon" viewBox="0 0 19 19">
22
+ <path fill="#08060d" fill-rule="evenodd" d="M1.893 1.98c.052.072 1.245 1.769 2.653 3.77l2.892 4.114c.183.261.333.48.333.486s-.068.089-.152.183l-.522.593-.765.867-3.597 4.087c-.375.426-.734.834-.798.905a1 1 0 0 0-.118.148c0 .01.236.017.664.017h.663l.729-.83c.4-.457.796-.906.879-.999a692 692 0 0 0 1.794-2.038c.034-.037.301-.34.594-.675l.551-.624.345-.392a7 7 0 0 1 .34-.374c.006 0 .93 1.306 2.052 2.903l2.084 2.965.045.063h2.275c1.87 0 2.273-.003 2.266-.021-.008-.02-1.098-1.572-3.894-5.547-2.013-2.862-2.28-3.246-2.273-3.266.008-.019.282-.332 2.085-2.38l2-2.274 1.567-1.782c.022-.028-.016-.03-.65-.03h-.674l-.3.342a871 871 0 0 1-1.782 2.025c-.067.075-.405.458-.75.852a100 100 0 0 1-.803.91c-.148.172-.299.344-.99 1.127-.304.343-.32.358-.345.327-.015-.019-.904-1.282-1.976-2.808L6.365 1.85H1.8zm1.782.91 8.078 11.294c.772 1.08 1.413 1.973 1.425 1.984.016.017.241.02 1.05.017l1.03-.004-2.694-3.766L7.796 5.75 5.722 2.852l-1.039-.004-1.039-.004z" clip-rule="evenodd"/>
23
+ </symbol>
24
+ </svg>
Binary file
Binary file
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import { RouterView } from 'vue-router'
3
+ import { Toaster } from '@/components/ui/sonner'
4
+ import { LoadingBar } from '@/components/ui/loading-bar'
5
+ import { useThemeConfig } from '@/composables/useThemeConfig'
6
+
7
+ // Initialize dynamic theme & layout variables globally
8
+ useThemeConfig()
9
+ </script>
10
+
11
+ <template>
12
+ <LoadingBar />
13
+ <RouterView />
14
+ <Toaster position="top-right" rich-colors close-button />
15
+ </template>