Skip to content

Commit 3507791

Browse files
committed
component updates, a start
1 parent e2e2338 commit 3507791

File tree

9 files changed

+115
-39
lines changed

9 files changed

+115
-39
lines changed

package-lock.json

Lines changed: 15 additions & 26 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,8 @@
3434
"vite": "^6.2",
3535
"vue": "^3.5.0",
3636
"vue-router": "^4.4.0"
37+
},
38+
"dependencies": {
39+
"lucide-vue-next": "^0.487.0"
3740
}
3841
}

src/components/PageTitleSection.vue

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
<template>
22
<section>
33
<div class="flex items-end justify-between flex-wrap gap-2 md:gap-4">
4-
<div>
5-
<h1 class="font-bold text-2xl md:text-3xl leading-tight">
4+
<div class="flex flex-col gap-2">
5+
<h1 class="font-bold text-2xl leading-tight">
66
<slot name="title" />
77
</h1>
8+
<div
9+
v-if="$slots.subTitle"
10+
class="text-muted-color"
11+
>
12+
<slot name="subTitle" />
13+
</div>
814
</div>
915
<div>
1016
<div v-if="$slots.end">
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<script setup>
2+
import { ref, watchEffect, inject } from 'vue';
3+
import { Sun, Moon, Monitor } from 'lucide-vue-next';
4+
5+
const colorMode = inject('colorMode');
6+
const selectedColorMode = ref(colorMode.value);
7+
8+
const options = [
9+
{ label: 'Light', value: 'light', icon: Sun },
10+
{ label: 'Dark', value: 'dark', icon: Moon },
11+
{ label: 'System', value: 'auto', icon: Monitor },
12+
];
13+
14+
watchEffect(() => colorMode.value = selectedColorMode.value)
15+
</script>
16+
17+
<template>
18+
<SelectButton
19+
v-model="selectedColorMode"
20+
:options="options"
21+
:allowEmpty="false"
22+
optionLabel="label"
23+
optionValue="value"
24+
>
25+
<template #option="{ option }">
26+
<component :is="option.icon" /> {{ option.label }}
27+
</template>
28+
</SelectButton>
29+
</template>
Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,36 @@
11
<script setup lang="ts">
22
import { useTemplateRef } from 'vue';
33
import Menu from 'primevue/menu';
4+
import type { ExtendedMenuItem } from '@/types';
45
5-
type MenuType = InstanceType<typeof Menu>
6+
const componentProps = defineProps<{
7+
model: ExtendedMenuItem[]
8+
}>();
9+
10+
type MenuType = InstanceType<typeof Menu>;
611
const childRef = useTemplateRef<MenuType>('child-ref');
12+
713
defineExpose({
814
childRef,
15+
toggle: (event: Event) => childRef.value?.toggle(event)
916
});
1017
</script>
1118

1219
<template>
13-
<Menu ref="child-ref">
20+
<Menu
21+
ref="child-ref"
22+
:model="componentProps.model"
23+
>
24+
<template
25+
v-for="(_, slotName) in $slots"
26+
#[slotName]="slotProps"
27+
>
28+
<slot
29+
v-if="slotName != 'item'"
30+
:name="slotName"
31+
v-bind="slotProps ?? {}"
32+
/>
33+
</template>
1434
<template #item="{ item, props }">
1535
<RouterLink
1636
v-if="item.route"
@@ -24,11 +44,16 @@ defineExpose({
2444
class="p-menu-item-link"
2545
@click="navigate"
2646
>
27-
<span
47+
<i
2848
v-if="item.icon"
2949
:class="item.icon"
3050
class="p-menu-item-icon"
3151
/>
52+
<component
53+
:is="item.lucideIcon"
54+
v-else-if="item.lucideIcon"
55+
class="p-menu-item-icon"
56+
/>
3257
<span class="p-menu-item-label">{{ item.label }}</span>
3358
</a>
3459
</RouterLink>
@@ -38,11 +63,16 @@ defineExpose({
3863
:target="item.target"
3964
v-bind="props.action"
4065
>
41-
<span
66+
<i
4267
v-if="item.icon"
4368
:class="item.icon"
4469
class="p-menu-item-icon"
4570
/>
71+
<component
72+
:is="item.lucideIcon"
73+
v-else-if="item.lucideIcon"
74+
class="p-menu-item-icon"
75+
/>
4676
<span class="p-menu-item-label">{{ item.label }}</span>
4777
</a>
4878
</template>
File renamed without changes.

0 commit comments

Comments
 (0)