@falcondev-oss/nuxt-layers-base 0.19.7 → 0.20.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.
@@ -0,0 +1,77 @@
1
+ <script setup lang="ts">
2
+ import type {
3
+ DashboardNavbarProps,
4
+ DashboardNavbarSlots,
5
+ DashboardPanelProps,
6
+ DashboardToolbarProps,
7
+ NavigationMenuItem,
8
+ NavigationMenuProps,
9
+ } from '@nuxt/ui'
10
+ import type { AddPropertyPrefix } from '~/types/helpers'
11
+ import * as R from 'remeda'
12
+
13
+ defineProps<{
14
+ panel?: DashboardPanelProps
15
+ navbar?: {
16
+ showSidebarToggle?: boolean
17
+ title?: string
18
+ ui?: DashboardNavbarProps['ui']
19
+ }
20
+ toolbar?: {
21
+ items?: NavigationMenuItem[]
22
+ itemsEnd?: NavigationMenuItem[]
23
+ ui?: DashboardToolbarProps['ui']
24
+ itemsUi?: NavigationMenuProps['ui']
25
+ itemsEndUi?: NavigationMenuProps['ui']
26
+ }
27
+ }>()
28
+
29
+ const slots = defineSlots<
30
+ {
31
+ default: any
32
+ } & AddPropertyPrefix<DashboardNavbarSlots, 'navbar'>
33
+ >()
34
+
35
+ const omitNavbarSlots = ['navbar-leading'] satisfies (keyof typeof slots)[]
36
+ const navbarSlots = computed(() =>
37
+ R.pipe(
38
+ slots,
39
+ R.pickBy((_, key) => key.startsWith('navbar-')),
40
+ R.omit(omitNavbarSlots),
41
+ R.keys(),
42
+ R.pullObject(
43
+ (key) => key.replace('navbar-', ''),
44
+ (key) => key,
45
+ ),
46
+ ),
47
+ )
48
+ </script>
49
+
50
+ <template>
51
+ <UDashboardPanel v-bind="panel">
52
+ <template #header>
53
+ <UDashboardNavbar v-if="navbar" :ui="navbar.ui" class="bg-white" :title="navbar.title">
54
+ <template v-if="navbar.showSidebarToggle" #leading>
55
+ <UDashboardSidebarCollapse />
56
+ </template>
57
+
58
+ <template v-for="(originalName, slotName) in navbarSlots" #[slotName]="slotData">
59
+ <!-- @vue-ignore -->
60
+ <slot :name="originalName" v-bind="slotData || {}" />
61
+ </template>
62
+ </UDashboardNavbar>
63
+ <UDashboardToolbar v-if="toolbar" :ui="toolbar.ui" class="bg-white">
64
+ <UNavigationMenu :items="toolbar.items" highlight :ui="toolbar.itemsUi" />
65
+ <UNavigationMenu
66
+ :items="toolbar.itemsEnd"
67
+ class="ml-auto"
68
+ highlight
69
+ :ui="toolbar.itemsEndUi"
70
+ />
71
+ </UDashboardToolbar>
72
+ </template>
73
+ <template #body>
74
+ <slot />
75
+ </template>
76
+ </UDashboardPanel>
77
+ </template>
@@ -0,0 +1,81 @@
1
+ <script setup lang="ts">
2
+ import type { DashboardSidebarProps, NavigationMenuItem, NavigationMenuProps } from '@nuxt/ui'
3
+
4
+ defineProps<{
5
+ sidebar?: DashboardSidebarProps
6
+ logo?: {
7
+ src?: string
8
+ iconSrc?: string
9
+ }
10
+ items?: NavigationMenuItem[]
11
+ bottomItems?: NavigationMenuItem[]
12
+ userMenu?: {
13
+ name: string
14
+ avatarSrc?: string
15
+ }
16
+ itemsUi?: NavigationMenuProps['ui']
17
+ bottomItemsUi?: NavigationMenuProps['ui']
18
+ }>()
19
+
20
+ const slots = defineSlots<{
21
+ default: any
22
+ logo: any
23
+ icon: any
24
+ }>()
25
+
26
+ const config = useRuntimeConfig()
27
+ </script>
28
+
29
+ <template>
30
+ <UDashboardGroup storage="local" :storage-key="`${config.public.projectId}-dashboard`" unit="rem">
31
+ <UDashboardSidebar v-bind="sidebar" class="bg-white" mode="drawer">
32
+ <template v-if="logo?.src || logo?.iconSrc" #header="{ collapsed }">
33
+ <slot v-if="!collapsed" name="logo">
34
+ <img v-if="logo.src" class="h-5 w-auto shrink-0" :src="logo.src" />
35
+ </slot>
36
+ <slot v-if="collapsed || (!logo.src && !slots.logo)" name="icon">
37
+ <img
38
+ v-if="logo.iconSrc"
39
+ class="size-5"
40
+ :src="logo.iconSrc"
41
+ :class="{
42
+ 'mx-auto': collapsed,
43
+ }"
44
+ />
45
+ </slot>
46
+ </template>
47
+ <template #default="{ collapsed }">
48
+ <UNavigationMenu
49
+ v-if="items"
50
+ :collapsed="collapsed"
51
+ :items="items"
52
+ orientation="vertical"
53
+ :ui="itemsUi"
54
+ />
55
+
56
+ <UNavigationMenu
57
+ v-if="bottomItems"
58
+ :collapsed="collapsed"
59
+ :items="bottomItems"
60
+ orientation="vertical"
61
+ class="mt-auto"
62
+ :ui="bottomItemsUi"
63
+ />
64
+ </template>
65
+ <template v-if="userMenu" #footer="{ collapsed }">
66
+ <UButton
67
+ :label="collapsed ? undefined : userMenu.name"
68
+ :avatar="{
69
+ src: userMenu.avatarSrc,
70
+ alt: userMenu.name,
71
+ }"
72
+ color="neutral"
73
+ variant="ghost"
74
+ class="w-full"
75
+ :block="collapsed"
76
+ />
77
+ </template>
78
+ </UDashboardSidebar>
79
+ <slot />
80
+ </UDashboardGroup>
81
+ </template>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@falcondev-oss/nuxt-layers-base",
3
3
  "type": "module",
4
- "version": "0.19.7",
4
+ "version": "0.20.0",
5
5
  "description": "Nuxt layer with lots of useful helpers and @nuxt/ui components",
6
6
  "license": "MIT",
7
7
  "repository": "github:falcondev-oss/nuxt-layers",
@@ -1,162 +0,0 @@
1
- <script setup lang="ts">
2
- import type {
3
- DashboardNavbarProps,
4
- DashboardNavbarSlots,
5
- DashboardPanelProps,
6
- DashboardSidebarProps,
7
- DashboardToolbarProps,
8
- NavigationMenuItem,
9
- } from '@nuxt/ui'
10
- import type { AddPropertyPrefix } from '../../types/helpers'
11
- import { keys, omit, pickBy, pipe, pullObject } from 'remeda'
12
-
13
- defineProps<{
14
- sidebar?: {
15
- logo?: {
16
- src?: string
17
- iconSrc?: string
18
- }
19
- items?: NavigationMenuItem[]
20
- bottomItems?: NavigationMenuItem[]
21
- userMenu?: {
22
- name: string
23
- avatarSrc?: string
24
- }
25
- ui?: DashboardSidebarProps['ui']
26
- itemsUi?: NavigationMenuItem['ui']
27
- bottomItemsUi?: NavigationMenuItem['ui']
28
- }
29
- panel?: {
30
- navbar?: {
31
- title?: string
32
- ui?: DashboardNavbarProps['ui']
33
- }
34
- toolbar?: {
35
- items?: NavigationMenuItem[]
36
- itemsEnd?: NavigationMenuItem[]
37
- ui?: DashboardToolbarProps['ui']
38
- itemsUi?: NavigationMenuItem['ui']
39
- itemsEndUi?: NavigationMenuItem['ui']
40
- }
41
- container?: boolean
42
- ui?: DashboardPanelProps['ui']
43
- }
44
- }>()
45
-
46
- const slots = defineSlots<
47
- {
48
- default: any
49
- } & AddPropertyPrefix<DashboardNavbarSlots, 'navbar'>
50
- >()
51
-
52
- const omitNavbarSlots = ['navbar-leading'] satisfies (keyof typeof slots)[]
53
-
54
- const navbarSlots = computed(() =>
55
- pipe(
56
- slots,
57
- pickBy((_, key) => key.startsWith('navbar-')),
58
- omit(omitNavbarSlots),
59
- keys(),
60
- pullObject(
61
- (key) => key.replace('navbar-', ''),
62
- (key) => key,
63
- ),
64
- ),
65
- )
66
-
67
- const config = useRuntimeConfig()
68
- </script>
69
-
70
- <template>
71
- <UDashboardGroup storage="local" :storage-key="`${config.public.projectId}-dashboard`" unit="rem">
72
- <UDashboardSidebar
73
- v-if="sidebar"
74
- :ui="sidebar.ui"
75
- collapsible
76
- resizable
77
- class="bg-white"
78
- mode="drawer"
79
- >
80
- <template v-if="sidebar.logo?.src || sidebar.logo?.iconSrc" #header="{ collapsed }">
81
- <img
82
- v-if="!collapsed && sidebar.logo.src"
83
- class="h-5 w-auto shrink-0"
84
- :src="sidebar.logo.src"
85
- />
86
- <img
87
- v-if="(collapsed || !sidebar.logo.src) && sidebar.logo.iconSrc"
88
- class="size-5"
89
- :src="sidebar.logo.iconSrc"
90
- :class="{
91
- 'mx-auto': collapsed,
92
- }"
93
- />
94
- </template>
95
- <template #default="{ collapsed }">
96
- <UNavigationMenu
97
- v-if="sidebar.items"
98
- :collapsed="collapsed"
99
- :items="sidebar.items"
100
- orientation="vertical"
101
- :ui="sidebar.itemsUi"
102
- />
103
-
104
- <UNavigationMenu
105
- v-if="sidebar.bottomItems"
106
- :collapsed="collapsed"
107
- :items="sidebar.bottomItems"
108
- orientation="vertical"
109
- class="mt-auto"
110
- :ui="sidebar.bottomItemsUi"
111
- />
112
- </template>
113
- <template v-if="sidebar.userMenu" #footer="{ collapsed }">
114
- <UButton
115
- :label="collapsed ? undefined : sidebar.userMenu.name"
116
- :avatar="{
117
- src: sidebar.userMenu.avatarSrc,
118
- alt: sidebar.userMenu.name,
119
- }"
120
- color="neutral"
121
- variant="ghost"
122
- class="w-full"
123
- :block="collapsed"
124
- />
125
- </template>
126
- </UDashboardSidebar>
127
- <UDashboardPanel>
128
- <template #header>
129
- <UDashboardNavbar
130
- v-if="panel?.navbar"
131
- :ui="panel.navbar.ui"
132
- class="bg-white"
133
- :title="panel.navbar.title"
134
- >
135
- <template #leading>
136
- <UDashboardSidebarCollapse />
137
- </template>
138
-
139
- <template v-for="(originalName, slotName) in navbarSlots" #[slotName]="slotData">
140
- <!-- @vue-ignore -->
141
- <slot :name="originalName" v-bind="slotData || {}" />
142
- </template>
143
- </UDashboardNavbar>
144
- <UDashboardToolbar v-if="panel?.toolbar" :ui="panel.toolbar.ui" class="bg-white">
145
- <UNavigationMenu :items="panel.toolbar.items" highlight :ui="panel.toolbar.itemsUi" />
146
- <UNavigationMenu
147
- :items="panel.toolbar.itemsEnd"
148
- class="ml-auto"
149
- highlight
150
- :ui="panel.toolbar.itemsEndUi"
151
- />
152
- </UDashboardToolbar>
153
- </template>
154
- <template #body>
155
- <UContainer v-if="panel?.container">
156
- <slot />
157
- </UContainer>
158
- <slot v-else />
159
- </template>
160
- </UDashboardPanel>
161
- </UDashboardGroup>
162
- </template>