Skip to content

Commit 5904acf

Browse files
committed
theme preset selector
1 parent d6152de commit 5904acf

File tree

5 files changed

+81
-7
lines changed

5 files changed

+81
-7
lines changed

resources/js/app.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,18 @@ import ToastService from 'primevue/toastservice';
1212
import Container from '@/components/Container.vue';
1313
import PageTitleSection from '@/components/PageTitleSection.vue';
1414

15-
import customThemePreset from '@/theme/noir-preset';
1615
import { useColorMode } from '@vueuse/core';
16+
import { useThemePreset } from '@/composables/useThemePreset';
1717

1818
/* global Ziggy */
1919
const appName = import.meta.env.VITE_APP_NAME || 'Laravel';
20-
const colorMode = useColorMode({ emitAuto: true }); // Set Light/Dark Color Mode
20+
21+
// Site light/dark mode
22+
const colorMode = useColorMode({ emitAuto: true });
23+
24+
// Site theme preset
25+
const { getCurrentPreset } = useThemePreset();
26+
const themePreset = getCurrentPreset();
2127

2228
createInertiaApp({
2329
title: (title) => `${title} - ${appName}`,
@@ -33,7 +39,7 @@ createInertiaApp({
3339
.use(ZiggyVue, Ziggy)
3440
.use(PrimeVue, {
3541
theme: {
36-
preset: customThemePreset,
42+
preset: themePreset,
3743
options: {
3844
darkModeSelector: '.dark',
3945
cssLayer: {
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { ref, Ref } from 'vue';
2+
import { usePreset } from '@primeuix/themes';
3+
import { Preset } from '@primeuix/themes/types';
4+
import { useStorage } from '@vueuse/core';
5+
import bootstrap from '@/theme/bootstrap-preset';
6+
import breeze from '@/theme/breeze-preset';
7+
import enterprise from '@/theme/enterprise-preset';
8+
import noir from '@/theme/noir-preset';
9+
import warm from '@/theme/warm-preset';
10+
11+
interface ThemePreset {
12+
label: string,
13+
value: string,
14+
preset: Preset,
15+
}
16+
17+
const presets = ref<ThemePreset[]>([
18+
{ label: 'Bootstrap', value: 'bootstrap', preset: bootstrap },
19+
{ label: 'Breeze', value: 'breeze', preset: breeze },
20+
{ label: 'Enterprise', value: 'enterprise', preset: enterprise },
21+
{ label: 'Noir', value: 'noir', preset: noir },
22+
{ label: 'Warm', value: 'warm', preset: warm },
23+
]);
24+
25+
const selectedPreset: Ref<string> = useStorage('theme-preset', 'noir');
26+
27+
function getCurrentPreset(): Preset {
28+
return (
29+
presets.value.find((p) => p.value === selectedPreset.value)?.preset ||
30+
presets.value[3].preset
31+
);
32+
}
33+
34+
function setPreset(presetValue: string): void {
35+
const themePreset = presets.value.find((p) => p.value === presetValue);
36+
if (themePreset) {
37+
usePreset(themePreset.preset);
38+
}
39+
}
40+
41+
setPreset(selectedPreset.value);
42+
43+
export function useThemePreset() {
44+
return {
45+
presets,
46+
selectedPreset,
47+
getCurrentPreset,
48+
setPreset,
49+
};
50+
}

resources/js/layouts/app/HeaderLayout.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ const toggleMobileUserMenu = (event) => {
4747
<div>
4848
<PanelMenu
4949
:model="menuItems"
50-
class="w-full"
50+
class="mt-1 w-full"
5151
/>
5252
</div>
5353
<template #footer>

resources/js/layouts/app/SidebarLayout.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const toggleMobileUserMenu = (event) => {
4545
<div>
4646
<PanelMenu
4747
:model="menuItems"
48-
class="w-full"
48+
class="mt-1 w-full"
4949
/>
5050
</div>
5151
<template #footer>
@@ -119,7 +119,7 @@ const toggleMobileUserMenu = (event) => {
119119
<div>
120120
<PanelMenu
121121
:model="menuItems"
122-
class="w-full"
122+
class="mt-1 w-full"
123123
/>
124124
</div>
125125
</div>

resources/js/pages/settings/Appearance.vue

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
import AppLayout from '@/layouts/AppLayout.vue';
33
import SettingsLayout from '@/layouts/UserSettingsLayout.vue';
44
import SelectColorModeButton from '@/components/SelectColorModeButton.vue';
5+
import { useThemePreset } from '@/composables/useThemePreset';
6+
7+
const { presets, selectedPreset, setPreset } = useThemePreset();
58
</script>
69

710
<template>
@@ -20,7 +23,22 @@ import SelectColorModeButton from '@/components/SelectColorModeButton.vue';
2023
Update your account's appearance settings
2124
</template>
2225
<template #content>
23-
<SelectColorModeButton />
26+
<div class="space-y-6">
27+
<div class="flex flex-col gap-2">
28+
<label for="color-mode-selector">Color Mode</label>
29+
<SelectColorModeButton id="color-mode-selector" />
30+
</div>
31+
<div class="flex flex-col gap-2">
32+
<label for="theme-preset-selector">Theme</label>
33+
<Select
34+
v-model="selectedPreset"
35+
:options="presets"
36+
optionLabel="label"
37+
optionValue="value"
38+
@change="setPreset(selectedPreset)"
39+
/>
40+
</div>
41+
</div>
2442
</template>
2543
</Card>
2644
</SettingsLayout>

0 commit comments

Comments
 (0)