From c281b9a673fac7aceac5f80d64f0c320836fc0aa Mon Sep 17 00:00:00 2001 From: 409 <409dev@protonmail.com> Date: Fri, 11 Jul 2025 05:20:53 +0200 Subject: [PATCH] route breadcrumbs, improve sidebar, basic folder layout --- bun.lock | 3 + components/AppSidebar.vue | 79 ++++++++++--- components/DirectoryEntry.vue | 24 ++++ components/DirectoryList.vue | 35 ++++++ components/SidebarUser.vue | 111 ++++++++++++++++++ components/ui/avatar/Avatar.vue | 18 +++ components/ui/avatar/AvatarFallback.vue | 20 ++++ components/ui/avatar/AvatarImage.vue | 16 +++ components/ui/avatar/index.ts | 3 + components/ui/collapsible/Collapsible.vue | 19 +++ .../ui/collapsible/CollapsibleContent.vue | 14 +++ .../ui/collapsible/CollapsibleTrigger.vue | 14 +++ components/ui/collapsible/index.ts | 3 + components/ui/dropdown-menu/DropdownMenu.vue | 17 +++ .../DropdownMenuCheckboxItem.vue | 38 ++++++ .../ui/dropdown-menu/DropdownMenuContent.vue | 36 ++++++ .../ui/dropdown-menu/DropdownMenuGroup.vue | 14 +++ .../ui/dropdown-menu/DropdownMenuItem.vue | 30 +++++ .../ui/dropdown-menu/DropdownMenuLabel.vue | 22 ++++ .../dropdown-menu/DropdownMenuRadioGroup.vue | 22 ++++ .../dropdown-menu/DropdownMenuRadioItem.vue | 39 ++++++ .../dropdown-menu/DropdownMenuSeparator.vue | 23 ++++ .../ui/dropdown-menu/DropdownMenuShortcut.vue | 17 +++ .../ui/dropdown-menu/DropdownMenuSub.vue | 19 +++ .../dropdown-menu/DropdownMenuSubContent.vue | 28 +++++ .../dropdown-menu/DropdownMenuSubTrigger.vue | 30 +++++ .../ui/dropdown-menu/DropdownMenuTrigger.vue | 16 +++ components/ui/dropdown-menu/index.ts | 16 +++ components/ui/scroll-area/ScrollArea.vue | 33 ++++++ components/ui/scroll-area/ScrollBar.vue | 31 +++++ components/ui/scroll-area/index.ts | 2 + layouts/default.vue | 37 ++++-- nuxt.config.ts | 2 + package.json | 1 + pages/index.vue | 4 +- pages/warrens/[...path].vue | 3 + pages/warrens/index.vue | 28 +++++ types/index.ts | 6 + utils/index.ts | 39 ++++++ 39 files changed, 883 insertions(+), 29 deletions(-) create mode 100644 components/DirectoryEntry.vue create mode 100644 components/DirectoryList.vue create mode 100644 components/SidebarUser.vue create mode 100644 components/ui/avatar/Avatar.vue create mode 100644 components/ui/avatar/AvatarFallback.vue create mode 100644 components/ui/avatar/AvatarImage.vue create mode 100644 components/ui/avatar/index.ts create mode 100644 components/ui/collapsible/Collapsible.vue create mode 100644 components/ui/collapsible/CollapsibleContent.vue create mode 100644 components/ui/collapsible/CollapsibleTrigger.vue create mode 100644 components/ui/collapsible/index.ts create mode 100644 components/ui/dropdown-menu/DropdownMenu.vue create mode 100644 components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue create mode 100644 components/ui/dropdown-menu/DropdownMenuContent.vue create mode 100644 components/ui/dropdown-menu/DropdownMenuGroup.vue create mode 100644 components/ui/dropdown-menu/DropdownMenuItem.vue create mode 100644 components/ui/dropdown-menu/DropdownMenuLabel.vue create mode 100644 components/ui/dropdown-menu/DropdownMenuRadioGroup.vue create mode 100644 components/ui/dropdown-menu/DropdownMenuRadioItem.vue create mode 100644 components/ui/dropdown-menu/DropdownMenuSeparator.vue create mode 100644 components/ui/dropdown-menu/DropdownMenuShortcut.vue create mode 100644 components/ui/dropdown-menu/DropdownMenuSub.vue create mode 100644 components/ui/dropdown-menu/DropdownMenuSubContent.vue create mode 100644 components/ui/dropdown-menu/DropdownMenuSubTrigger.vue create mode 100644 components/ui/dropdown-menu/DropdownMenuTrigger.vue create mode 100644 components/ui/dropdown-menu/index.ts create mode 100644 components/ui/scroll-area/ScrollArea.vue create mode 100644 components/ui/scroll-area/ScrollBar.vue create mode 100644 components/ui/scroll-area/index.ts create mode 100644 pages/warrens/[...path].vue create mode 100644 pages/warrens/index.vue create mode 100644 types/index.ts create mode 100644 utils/index.ts diff --git a/bun.lock b/bun.lock index 8ece64c..be4ef90 100644 --- a/bun.lock +++ b/bun.lock @@ -25,6 +25,7 @@ "vue-router": "^4.5.1", }, "devDependencies": { + "@iconify-json/lucide": "^1.2.57", "@nuxtjs/color-mode": "^3.5.2", "eslint-config-prettier": "^10.1.5", "prettier": "^3.6.2", @@ -210,6 +211,8 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + "@iconify-json/lucide": ["@iconify-json/lucide@1.2.57", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-I1CIObdPBIL/9v75KKoyHWNhq+qqN6ef8+iJY4AVpHLtnRu0Vbp6K0TKcoYZ70U+EgiL6krEbFdcjK3+fwpfHQ=="], + "@iconify/collections": ["@iconify/collections@1.0.566", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-rilPX42tJve3z/HUQdZBrMLH/d8OZlMw+D+nMsxsiC/Miyws/WGq8DtV2w9jGGZBd6HJ+VQ3prIIV7UWhV+2ug=="], "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], diff --git a/components/AppSidebar.vue b/components/AppSidebar.vue index 415ab7c..6ec416d 100644 --- a/components/AppSidebar.vue +++ b/components/AppSidebar.vue @@ -2,22 +2,28 @@ import { Icon } from '#components'; import { SidebarGroup, - SidebarGroupLabel, SidebarMenu, SidebarMenuButton, SidebarMenuItem, } from '@/components/ui/sidebar'; +import { + Collapsible, + CollapsibleTrigger, + CollapsibleContent, +} from '@/components/ui/collapsible'; -const items = [ +const route = useRoute(); + +const warrens = [ { - title: 'Home', - url: '/', - icon: h(Icon, { name: 'lucide:home' }), + title: 'Thyr', + url: '/warrens/Thyr', + icon: h(Icon, { name: 'lucide:folder-root' }), }, { - title: 'About', - url: '/about', - icon: h(Icon, { name: 'lucide:inbox' }), + title: 'Serc', + url: '/warrens/Serc', + icon: h(Icon, { name: 'lucide:folder-root' }), }, ]; @@ -26,18 +32,59 @@ const items = [ - Application - - - - - {{ item.title }} + + + + + + Your Warrens + + + + - - + + + + + + + + {{ warren.title }} + + + + + + + + + + diff --git a/components/DirectoryEntry.vue b/components/DirectoryEntry.vue new file mode 100644 index 0000000..7193c9f --- /dev/null +++ b/components/DirectoryEntry.vue @@ -0,0 +1,24 @@ + + + diff --git a/components/DirectoryList.vue b/components/DirectoryList.vue new file mode 100644 index 0000000..19aa2d9 --- /dev/null +++ b/components/DirectoryList.vue @@ -0,0 +1,35 @@ + + + diff --git a/components/SidebarUser.vue b/components/SidebarUser.vue new file mode 100644 index 0000000..1bde2c8 --- /dev/null +++ b/components/SidebarUser.vue @@ -0,0 +1,111 @@ + + + diff --git a/components/ui/avatar/Avatar.vue b/components/ui/avatar/Avatar.vue new file mode 100644 index 0000000..5aa263d --- /dev/null +++ b/components/ui/avatar/Avatar.vue @@ -0,0 +1,18 @@ + + + diff --git a/components/ui/avatar/AvatarFallback.vue b/components/ui/avatar/AvatarFallback.vue new file mode 100644 index 0000000..dc20f80 --- /dev/null +++ b/components/ui/avatar/AvatarFallback.vue @@ -0,0 +1,20 @@ + + + diff --git a/components/ui/avatar/AvatarImage.vue b/components/ui/avatar/AvatarImage.vue new file mode 100644 index 0000000..801392b --- /dev/null +++ b/components/ui/avatar/AvatarImage.vue @@ -0,0 +1,16 @@ + + + diff --git a/components/ui/avatar/index.ts b/components/ui/avatar/index.ts new file mode 100644 index 0000000..6a90410 --- /dev/null +++ b/components/ui/avatar/index.ts @@ -0,0 +1,3 @@ +export { default as Avatar } from './Avatar.vue' +export { default as AvatarFallback } from './AvatarFallback.vue' +export { default as AvatarImage } from './AvatarImage.vue' diff --git a/components/ui/collapsible/Collapsible.vue b/components/ui/collapsible/Collapsible.vue new file mode 100644 index 0000000..dcd58e2 --- /dev/null +++ b/components/ui/collapsible/Collapsible.vue @@ -0,0 +1,19 @@ + + + diff --git a/components/ui/collapsible/CollapsibleContent.vue b/components/ui/collapsible/CollapsibleContent.vue new file mode 100644 index 0000000..4120d2f --- /dev/null +++ b/components/ui/collapsible/CollapsibleContent.vue @@ -0,0 +1,14 @@ + + + diff --git a/components/ui/collapsible/CollapsibleTrigger.vue b/components/ui/collapsible/CollapsibleTrigger.vue new file mode 100644 index 0000000..be603a4 --- /dev/null +++ b/components/ui/collapsible/CollapsibleTrigger.vue @@ -0,0 +1,14 @@ + + + diff --git a/components/ui/collapsible/index.ts b/components/ui/collapsible/index.ts new file mode 100644 index 0000000..abab956 --- /dev/null +++ b/components/ui/collapsible/index.ts @@ -0,0 +1,3 @@ +export { default as Collapsible } from './Collapsible.vue' +export { default as CollapsibleContent } from './CollapsibleContent.vue' +export { default as CollapsibleTrigger } from './CollapsibleTrigger.vue' diff --git a/components/ui/dropdown-menu/DropdownMenu.vue b/components/ui/dropdown-menu/DropdownMenu.vue new file mode 100644 index 0000000..e386052 --- /dev/null +++ b/components/ui/dropdown-menu/DropdownMenu.vue @@ -0,0 +1,17 @@ + + + diff --git a/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue b/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue new file mode 100644 index 0000000..f63c967 --- /dev/null +++ b/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue @@ -0,0 +1,38 @@ + + + diff --git a/components/ui/dropdown-menu/DropdownMenuContent.vue b/components/ui/dropdown-menu/DropdownMenuContent.vue new file mode 100644 index 0000000..0aac75f --- /dev/null +++ b/components/ui/dropdown-menu/DropdownMenuContent.vue @@ -0,0 +1,36 @@ + + + diff --git a/components/ui/dropdown-menu/DropdownMenuGroup.vue b/components/ui/dropdown-menu/DropdownMenuGroup.vue new file mode 100644 index 0000000..c7eb308 --- /dev/null +++ b/components/ui/dropdown-menu/DropdownMenuGroup.vue @@ -0,0 +1,14 @@ + + + diff --git a/components/ui/dropdown-menu/DropdownMenuItem.vue b/components/ui/dropdown-menu/DropdownMenuItem.vue new file mode 100644 index 0000000..f0a9495 --- /dev/null +++ b/components/ui/dropdown-menu/DropdownMenuItem.vue @@ -0,0 +1,30 @@ + + + diff --git a/components/ui/dropdown-menu/DropdownMenuLabel.vue b/components/ui/dropdown-menu/DropdownMenuLabel.vue new file mode 100644 index 0000000..61015cc --- /dev/null +++ b/components/ui/dropdown-menu/DropdownMenuLabel.vue @@ -0,0 +1,22 @@ + + + diff --git a/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue b/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue new file mode 100644 index 0000000..d205d0b --- /dev/null +++ b/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue @@ -0,0 +1,22 @@ + + + diff --git a/components/ui/dropdown-menu/DropdownMenuRadioItem.vue b/components/ui/dropdown-menu/DropdownMenuRadioItem.vue new file mode 100644 index 0000000..3d6d908 --- /dev/null +++ b/components/ui/dropdown-menu/DropdownMenuRadioItem.vue @@ -0,0 +1,39 @@ + + + diff --git a/components/ui/dropdown-menu/DropdownMenuSeparator.vue b/components/ui/dropdown-menu/DropdownMenuSeparator.vue new file mode 100644 index 0000000..5d3fde6 --- /dev/null +++ b/components/ui/dropdown-menu/DropdownMenuSeparator.vue @@ -0,0 +1,23 @@ + + + diff --git a/components/ui/dropdown-menu/DropdownMenuShortcut.vue b/components/ui/dropdown-menu/DropdownMenuShortcut.vue new file mode 100644 index 0000000..1bcbb88 --- /dev/null +++ b/components/ui/dropdown-menu/DropdownMenuShortcut.vue @@ -0,0 +1,17 @@ + + + diff --git a/components/ui/dropdown-menu/DropdownMenuSub.vue b/components/ui/dropdown-menu/DropdownMenuSub.vue new file mode 100644 index 0000000..7329bca --- /dev/null +++ b/components/ui/dropdown-menu/DropdownMenuSub.vue @@ -0,0 +1,19 @@ + + + diff --git a/components/ui/dropdown-menu/DropdownMenuSubContent.vue b/components/ui/dropdown-menu/DropdownMenuSubContent.vue new file mode 100644 index 0000000..bb70eef --- /dev/null +++ b/components/ui/dropdown-menu/DropdownMenuSubContent.vue @@ -0,0 +1,28 @@ + + + diff --git a/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue b/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue new file mode 100644 index 0000000..c641d0a --- /dev/null +++ b/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue @@ -0,0 +1,30 @@ + + + diff --git a/components/ui/dropdown-menu/DropdownMenuTrigger.vue b/components/ui/dropdown-menu/DropdownMenuTrigger.vue new file mode 100644 index 0000000..7bc7339 --- /dev/null +++ b/components/ui/dropdown-menu/DropdownMenuTrigger.vue @@ -0,0 +1,16 @@ + + + diff --git a/components/ui/dropdown-menu/index.ts b/components/ui/dropdown-menu/index.ts new file mode 100644 index 0000000..f488d39 --- /dev/null +++ b/components/ui/dropdown-menu/index.ts @@ -0,0 +1,16 @@ +export { default as DropdownMenu } from './DropdownMenu.vue' + +export { default as DropdownMenuCheckboxItem } from './DropdownMenuCheckboxItem.vue' +export { default as DropdownMenuContent } from './DropdownMenuContent.vue' +export { default as DropdownMenuGroup } from './DropdownMenuGroup.vue' +export { default as DropdownMenuItem } from './DropdownMenuItem.vue' +export { default as DropdownMenuLabel } from './DropdownMenuLabel.vue' +export { default as DropdownMenuRadioGroup } from './DropdownMenuRadioGroup.vue' +export { default as DropdownMenuRadioItem } from './DropdownMenuRadioItem.vue' +export { default as DropdownMenuSeparator } from './DropdownMenuSeparator.vue' +export { default as DropdownMenuShortcut } from './DropdownMenuShortcut.vue' +export { default as DropdownMenuSub } from './DropdownMenuSub.vue' +export { default as DropdownMenuSubContent } from './DropdownMenuSubContent.vue' +export { default as DropdownMenuSubTrigger } from './DropdownMenuSubTrigger.vue' +export { default as DropdownMenuTrigger } from './DropdownMenuTrigger.vue' +export { DropdownMenuPortal } from 'reka-ui' diff --git a/components/ui/scroll-area/ScrollArea.vue b/components/ui/scroll-area/ScrollArea.vue new file mode 100644 index 0000000..a813e13 --- /dev/null +++ b/components/ui/scroll-area/ScrollArea.vue @@ -0,0 +1,33 @@ + + + diff --git a/components/ui/scroll-area/ScrollBar.vue b/components/ui/scroll-area/ScrollBar.vue new file mode 100644 index 0000000..7f93c74 --- /dev/null +++ b/components/ui/scroll-area/ScrollBar.vue @@ -0,0 +1,31 @@ + + + diff --git a/components/ui/scroll-area/index.ts b/components/ui/scroll-area/index.ts new file mode 100644 index 0000000..2bd4fae --- /dev/null +++ b/components/ui/scroll-area/index.ts @@ -0,0 +1,2 @@ +export { default as ScrollArea } from './ScrollArea.vue' +export { default as ScrollBar } from './ScrollBar.vue' diff --git a/layouts/default.vue b/layouts/default.vue index db04e7e..8e3fcdc 100644 --- a/layouts/default.vue +++ b/layouts/default.vue @@ -8,12 +8,15 @@ import { BreadcrumbPage, BreadcrumbSeparator, } from '@/components/ui/breadcrumb'; +const route = useRoute(); + +const breadcrumbs = computed(() => getBreadcrumbs(route.path));