Skip to content

Commit 4b01d33

Browse files
authored
feat: migrate header, sidebar, maincontent inset to shadcn components (#180)
1 parent 6009ef6 commit 4b01d33

82 files changed

Lines changed: 2157 additions & 330 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

frontend/.biomelintrc-auto-import.json

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@
55
"ApiClient",
66
"ApiKey",
77
"ApiPlugin",
8+
"Breadcrumb",
9+
"BreadcrumbEllipsis",
10+
"BreadcrumbItem",
11+
"BreadcrumbLink",
12+
"BreadcrumbList",
13+
"BreadcrumbPage",
14+
"BreadcrumbSeparator",
815
"Button",
916
"ButtonVariants",
1017
"ColumnInfo",
@@ -24,6 +31,21 @@
2431
"DropTargetType",
2532
"DropValidation",
2633
"DropZoneConfig",
34+
"DropdownMenu",
35+
"DropdownMenuCheckboxItem",
36+
"DropdownMenuContent",
37+
"DropdownMenuGroup",
38+
"DropdownMenuItem",
39+
"DropdownMenuLabel",
40+
"DropdownMenuPortal",
41+
"DropdownMenuRadioGroup",
42+
"DropdownMenuRadioItem",
43+
"DropdownMenuSeparator",
44+
"DropdownMenuShortcut",
45+
"DropdownMenuSub",
46+
"DropdownMenuSubContent",
47+
"DropdownMenuSubTrigger",
48+
"DropdownMenuTrigger",
2749
"EffectScope",
2850
"ExtendedError",
2951
"ExtendedErrorCode",
@@ -35,6 +57,7 @@
3557
"FileUploadUploaderEvent",
3658
"FrontendErrorCode",
3759
"InjectionKey",
60+
"Input",
3861
"ItemSchema",
3962
"Label",
4063
"MaybeRef",
@@ -51,10 +74,52 @@
5174
"Ref",
5275
"ReferenceSchemaMapping",
5376
"RequiredFieldHighlight",
77+
"SIDEBAR_COOKIE_MAX_AGE",
78+
"SIDEBAR_COOKIE_NAME",
79+
"SIDEBAR_KEYBOARD_SHORTCUT",
80+
"SIDEBAR_WIDTH",
81+
"SIDEBAR_WIDTH_ICON",
82+
"SIDEBAR_WIDTH_MOBILE",
5483
"SchemaCompletenessResult",
5584
"SchemaDragDropContext",
5685
"SchemaRequest",
86+
"Separator",
5787
"ShallowRef",
88+
"Sheet",
89+
"SheetClose",
90+
"SheetContent",
91+
"SheetDescription",
92+
"SheetFooter",
93+
"SheetHeader",
94+
"SheetTitle",
95+
"SheetTrigger",
96+
"Sidebar",
97+
"SidebarContent",
98+
"SidebarFooter",
99+
"SidebarGroup",
100+
"SidebarGroupAction",
101+
"SidebarGroupContent",
102+
"SidebarGroupLabel",
103+
"SidebarHeader",
104+
"SidebarInput",
105+
"SidebarInset",
106+
"SidebarMenu",
107+
"SidebarMenuAction",
108+
"SidebarMenuBadge",
109+
"SidebarMenuButton",
110+
"SidebarMenuButtonProps",
111+
"SidebarMenuButtonVariants",
112+
"SidebarMenuItem",
113+
"SidebarMenuSkeleton",
114+
"SidebarMenuSub",
115+
"SidebarMenuSubButton",
116+
"SidebarMenuSubItem",
117+
"SidebarProps",
118+
"SidebarProvider",
119+
"SidebarRail",
120+
"SidebarSeparator",
121+
"SidebarTrigger",
122+
"Skeleton",
58123
"Slot",
59124
"Slots",
60125
"StatementRank",
@@ -63,6 +128,10 @@
63128
"StatementSchemaMapping",
64129
"TermsSchemaMapping",
65130
"TieredMenu",
131+
"Tooltip",
132+
"TooltipContent",
133+
"TooltipProvider",
134+
"TooltipTrigger",
66135
"TransformationFunction",
67136
"TransformationParameter",
68137
"TransformationRule",
@@ -160,6 +229,7 @@
160229
"pausableWatch",
161230
"provide",
162231
"provideLocal",
232+
"provideSidebarContext",
163233
"reactify",
164234
"reactifyObject",
165235
"reactive",
@@ -182,6 +252,7 @@
182252
"shallowReactive",
183253
"shallowReadonly",
184254
"shallowRef",
255+
"sidebarMenuButtonVariants",
185256
"storeToRefs",
186257
"syncRef",
187258
"syncRefs",
@@ -351,6 +422,7 @@
351422
"useScrollLock",
352423
"useSessionStorage",
353424
"useShare",
425+
"useSidebar",
354426
"useSlots",
355427
"useSorted",
356428
"useSpeechRecognition",

frontend/auto-imports.d.ts

Lines changed: 200 additions & 217 deletions
Large diffs are not rendered by default.

frontend/components.d.ts

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ declare module 'vue' {
1010
export interface GlobalComponents {
1111
AutoComplete: typeof import('primevue/autocomplete')['default']
1212
BasePropertyValueEditor: typeof import('./src/features/wikibase-schema/components/BasePropertyValueEditor.vue')['default']
13+
Breadcrumb: typeof import('./src/components/ui/breadcrumb/Breadcrumb.vue')['default']
14+
BreadcrumbEllipsis: typeof import('./src/components/ui/breadcrumb/BreadcrumbEllipsis.vue')['default']
15+
BreadcrumbItem: typeof import('./src/components/ui/breadcrumb/BreadcrumbItem.vue')['default']
16+
BreadcrumbLink: typeof import('./src/components/ui/breadcrumb/BreadcrumbLink.vue')['default']
17+
BreadcrumbList: typeof import('./src/components/ui/breadcrumb/BreadcrumbList.vue')['default']
18+
BreadcrumbPage: typeof import('./src/components/ui/breadcrumb/BreadcrumbPage.vue')['default']
19+
BreadcrumbSeparator: typeof import('./src/components/ui/breadcrumb/BreadcrumbSeparator.vue')['default']
1320
Button: typeof import('./src/components/ui/button/Button.vue')['default']
1421
Card: typeof import('primevue/card')['default']
1522
Checkbox: typeof import('primevue/checkbox')['default']
@@ -25,9 +32,27 @@ declare module 'vue' {
2532
DataTabPanel: typeof import('./src/features/data-processing/components/DataTabPanel.vue')['default']
2633
DefaultLayout: typeof import('./src/core/layouts/DefaultLayout.vue')['default']
2734
Dialog: typeof import('primevue/dialog')['default']
35+
Divider: typeof import('primevue/divider')['default']
36+
DropdownMenu: typeof import('./src/components/ui/dropdown-menu/DropdownMenu.vue')['default']
37+
DropdownMenuCheckboxItem: typeof import('./src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue')['default']
38+
DropdownMenuContent: typeof import('./src/components/ui/dropdown-menu/DropdownMenuContent.vue')['default']
39+
DropdownMenuGroup: typeof import('./src/components/ui/dropdown-menu/DropdownMenuGroup.vue')['default']
40+
DropdownMenuItem: typeof import('./src/components/ui/dropdown-menu/DropdownMenuItem.vue')['default']
41+
DropdownMenuLabel: typeof import('./src/components/ui/dropdown-menu/DropdownMenuLabel.vue')['default']
42+
DropdownMenuRadioGroup: typeof import('./src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue')['default']
43+
DropdownMenuRadioItem: typeof import('./src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue')['default']
44+
DropdownMenuSeparator: typeof import('./src/components/ui/dropdown-menu/DropdownMenuSeparator.vue')['default']
45+
DropdownMenuShortcut: typeof import('./src/components/ui/dropdown-menu/DropdownMenuShortcut.vue')['default']
46+
DropdownMenuSub: typeof import('./src/components/ui/dropdown-menu/DropdownMenuSub.vue')['default']
47+
DropdownMenuSubContent: typeof import('./src/components/ui/dropdown-menu/DropdownMenuSubContent.vue')['default']
48+
DropdownMenuSubTrigger: typeof import('./src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue')['default']
49+
DropdownMenuTrigger: typeof import('./src/components/ui/dropdown-menu/DropdownMenuTrigger.vue')['default']
2850
DropZone: typeof import('./src/features/wikibase-schema/components/DropZone.vue')['default']
51+
FileUpload: typeof import('primevue/fileupload')['default']
2952
Header: typeof import('./src/shared/components/Header.vue')['default']
53+
Input: typeof import('./src/components/ui/input/Input.vue')['default']
3054
InputText: typeof import('primevue/inputtext')['default']
55+
Label: typeof import('./src/components/ui/label/Label.vue')['default']
3156
MainContent: typeof import('./src/shared/components/MainContent.vue')['default']
3257
OpenProject: typeof import('./src/features/project-management/pages/OpenProject.vue')['default']
3358
Paginator: typeof import('primevue/paginator')['default']
@@ -46,7 +71,41 @@ declare module 'vue' {
4671
SchemaSelector: typeof import('./src/features/wikibase-schema/components/SchemaSelector.vue')['default']
4772
SchemaTabPanel: typeof import('./src/features/wikibase-schema/components/SchemaTabPanel.vue')['default']
4873
Select: typeof import('primevue/select')['default']
49-
Sidebar: typeof import('./src/shared/components/Sidebar.vue')['default']
74+
Separator: typeof import('./src/components/ui/separator/Separator.vue')['default']
75+
Sheet: typeof import('./src/components/ui/sheet/Sheet.vue')['default']
76+
SheetClose: typeof import('./src/components/ui/sheet/SheetClose.vue')['default']
77+
SheetContent: typeof import('./src/components/ui/sheet/SheetContent.vue')['default']
78+
SheetDescription: typeof import('./src/components/ui/sheet/SheetDescription.vue')['default']
79+
SheetFooter: typeof import('./src/components/ui/sheet/SheetFooter.vue')['default']
80+
SheetHeader: typeof import('./src/components/ui/sheet/SheetHeader.vue')['default']
81+
SheetOverlay: typeof import('./src/components/ui/sheet/SheetOverlay.vue')['default']
82+
SheetTitle: typeof import('./src/components/ui/sheet/SheetTitle.vue')['default']
83+
SheetTrigger: typeof import('./src/components/ui/sheet/SheetTrigger.vue')['default']
84+
Sidebar: typeof import('./src/components/ui/sidebar/Sidebar.vue')['default']
85+
SidebarContent: typeof import('./src/components/ui/sidebar/SidebarContent.vue')['default']
86+
SidebarFooter: typeof import('./src/components/ui/sidebar/SidebarFooter.vue')['default']
87+
SidebarGroup: typeof import('./src/components/ui/sidebar/SidebarGroup.vue')['default']
88+
SidebarGroupAction: typeof import('./src/components/ui/sidebar/SidebarGroupAction.vue')['default']
89+
SidebarGroupContent: typeof import('./src/components/ui/sidebar/SidebarGroupContent.vue')['default']
90+
SidebarGroupLabel: typeof import('./src/components/ui/sidebar/SidebarGroupLabel.vue')['default']
91+
SidebarHeader: typeof import('./src/components/ui/sidebar/SidebarHeader.vue')['default']
92+
SidebarInput: typeof import('./src/components/ui/sidebar/SidebarInput.vue')['default']
93+
SidebarInset: typeof import('./src/components/ui/sidebar/SidebarInset.vue')['default']
94+
SidebarMenu: typeof import('./src/components/ui/sidebar/SidebarMenu.vue')['default']
95+
SidebarMenuAction: typeof import('./src/components/ui/sidebar/SidebarMenuAction.vue')['default']
96+
SidebarMenuBadge: typeof import('./src/components/ui/sidebar/SidebarMenuBadge.vue')['default']
97+
SidebarMenuButton: typeof import('./src/components/ui/sidebar/SidebarMenuButton.vue')['default']
98+
SidebarMenuButtonChild: typeof import('./src/components/ui/sidebar/SidebarMenuButtonChild.vue')['default']
99+
SidebarMenuItem: typeof import('./src/components/ui/sidebar/SidebarMenuItem.vue')['default']
100+
SidebarMenuSkeleton: typeof import('./src/components/ui/sidebar/SidebarMenuSkeleton.vue')['default']
101+
SidebarMenuSub: typeof import('./src/components/ui/sidebar/SidebarMenuSub.vue')['default']
102+
SidebarMenuSubButton: typeof import('./src/components/ui/sidebar/SidebarMenuSubButton.vue')['default']
103+
SidebarMenuSubItem: typeof import('./src/components/ui/sidebar/SidebarMenuSubItem.vue')['default']
104+
SidebarProvider: typeof import('./src/components/ui/sidebar/SidebarProvider.vue')['default']
105+
SidebarRail: typeof import('./src/components/ui/sidebar/SidebarRail.vue')['default']
106+
SidebarSeparator: typeof import('./src/components/ui/sidebar/SidebarSeparator.vue')['default']
107+
SidebarTrigger: typeof import('./src/components/ui/sidebar/SidebarTrigger.vue')['default']
108+
Skeleton: typeof import('./src/components/ui/skeleton/Skeleton.vue')['default']
50109
StatementEditor: typeof import('./src/features/wikibase-schema/components/StatementEditor.vue')['default']
51110
StatementManager: typeof import('./src/features/wikibase-schema/components/StatementManager.vue')['default']
52111
Tab: typeof import('primevue/tab')['default']
@@ -60,6 +119,10 @@ declare module 'vue' {
60119
TieredMenu: typeof import('primevue/tieredmenu')['default']
61120
Toast: typeof import('primevue/toast')['default']
62121
ToggleSwitch: typeof import('primevue/toggleswitch')['default']
122+
Tooltip: typeof import('./src/components/ui/tooltip/Tooltip.vue')['default']
123+
TooltipContent: typeof import('./src/components/ui/tooltip/TooltipContent.vue')['default']
124+
TooltipProvider: typeof import('./src/components/ui/tooltip/TooltipProvider.vue')['default']
125+
TooltipTrigger: typeof import('./src/components/ui/tooltip/TooltipTrigger.vue')['default']
63126
ValidationDisplay: typeof import('./src/features/wikibase-schema/components/ValidationDisplay.vue')['default']
64127
ValueMappingEditor: typeof import('./src/features/wikibase-schema/components/ValueMappingEditor.vue')['default']
65128
WikibaseSchemaEditor: typeof import('./src/features/wikibase-schema/components/WikibaseSchemaEditor.vue')['default']
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<script lang="ts" setup>
2+
import type { HTMLAttributes } from 'vue'
3+
4+
const props = defineProps<{
5+
class?: HTMLAttributes['class']
6+
}>()
7+
</script>
8+
9+
<template>
10+
<nav
11+
aria-label="breadcrumb"
12+
data-slot="breadcrumb"
13+
:class="props.class"
14+
>
15+
<slot />
16+
</nav>
17+
</template>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<script lang="ts" setup>
2+
import { cn } from '@frontend/lib/utils'
3+
import { MoreHorizontal } from 'lucide-vue-next'
4+
import type { HTMLAttributes } from 'vue'
5+
6+
const props = defineProps<{
7+
class?: HTMLAttributes['class']
8+
}>()
9+
</script>
10+
11+
<template>
12+
<span
13+
data-slot="breadcrumb-ellipsis"
14+
role="presentation"
15+
aria-hidden="true"
16+
:class="cn('flex size-9 items-center justify-center', props.class)"
17+
>
18+
<slot>
19+
<MoreHorizontal class="size-4" />
20+
</slot>
21+
<span class="sr-only">More</span>
22+
</span>
23+
</template>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<script lang="ts" setup>
2+
import { cn } from '@frontend/lib/utils'
3+
import type { HTMLAttributes } from 'vue'
4+
5+
const props = defineProps<{
6+
class?: HTMLAttributes['class']
7+
}>()
8+
</script>
9+
10+
<template>
11+
<li
12+
data-slot="breadcrumb-item"
13+
:class="cn('inline-flex items-center gap-1.5', props.class)"
14+
>
15+
<slot />
16+
</li>
17+
</template>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<script lang="ts" setup>
2+
import { cn } from '@frontend/lib/utils'
3+
import type { PrimitiveProps } from 'reka-ui'
4+
import { Primitive } from 'reka-ui'
5+
import type { HTMLAttributes } from 'vue'
6+
7+
const props = withDefaults(defineProps<PrimitiveProps & { class?: HTMLAttributes['class'] }>(), {
8+
as: 'a',
9+
})
10+
</script>
11+
12+
<template>
13+
<Primitive
14+
data-slot="breadcrumb-link"
15+
:as="as"
16+
:as-child="asChild"
17+
:class="cn('hover:text-foreground transition-colors', props.class)"
18+
>
19+
<slot />
20+
</Primitive>
21+
</template>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<script lang="ts" setup>
2+
import { cn } from '@frontend/lib/utils'
3+
import type { HTMLAttributes } from 'vue'
4+
5+
const props = defineProps<{
6+
class?: HTMLAttributes['class']
7+
}>()
8+
</script>
9+
10+
<template>
11+
<ol
12+
data-slot="breadcrumb-list"
13+
:class="cn('text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5', props.class)"
14+
>
15+
<slot />
16+
</ol>
17+
</template>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<script lang="ts" setup>
2+
import { cn } from '@frontend/lib/utils'
3+
import type { HTMLAttributes } from 'vue'
4+
5+
const props = defineProps<{
6+
class?: HTMLAttributes['class']
7+
}>()
8+
</script>
9+
10+
<template>
11+
<span
12+
data-slot="breadcrumb-page"
13+
role="link"
14+
aria-disabled="true"
15+
aria-current="page"
16+
:class="cn('text-foreground font-normal', props.class)"
17+
>
18+
<slot />
19+
</span>
20+
</template>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<script lang="ts" setup>
2+
import { cn } from '@frontend/lib/utils'
3+
import { ChevronRight } from 'lucide-vue-next'
4+
import type { HTMLAttributes } from 'vue'
5+
6+
const props = defineProps<{
7+
class?: HTMLAttributes['class']
8+
}>()
9+
</script>
10+
11+
<template>
12+
<li
13+
data-slot="breadcrumb-separator"
14+
role="presentation"
15+
aria-hidden="true"
16+
:class="cn('[&>svg]:size-3.5', props.class)"
17+
>
18+
<slot>
19+
<ChevronRight />
20+
</slot>
21+
</li>
22+
</template>

0 commit comments

Comments
 (0)