Skip to content

Commit 6d44c2b

Browse files
committed
fix conflicts
2 parents 1da24d4 + c4b9cf5 commit 6d44c2b

File tree

19 files changed

+176
-16
lines changed

19 files changed

+176
-16
lines changed

.prettierignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
resources/js/components/ui/*
2+
resources/js/ziggy.js
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace App\Http\Middleware;
4+
5+
use Closure;
6+
use Illuminate\Http\Request;
7+
use Illuminate\Support\Facades\View;
8+
use Symfony\Component\HttpFoundation\Response;
9+
10+
class HandleAppearance
11+
{
12+
/**
13+
* Handle an incoming request.
14+
*
15+
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
16+
*/
17+
public function handle(Request $request, Closure $next): Response
18+
{
19+
View::share('appearance', $request->cookie('appearance') ?? 'system');
20+
21+
return $next($request);
22+
}
23+
}

app/Http/Middleware/HandleInertiaRequests.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Illuminate\Foundation\Inspiring;
66
use Illuminate\Http\Request;
77
use Inertia\Middleware;
8+
use Tighten\Ziggy\Ziggy;
89

910
class HandleInertiaRequests extends Middleware
1011
{
@@ -45,6 +46,10 @@ public function share(Request $request): array
4546
'auth' => [
4647
'user' => $request->user(),
4748
],
49+
'ziggy' => [
50+
...(new Ziggy)->toArray(),
51+
'location' => $request->url(),
52+
],
4853
];
4954
}
5055
}

bootstrap/app.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?php
22

3+
use App\Http\Middleware\HandleAppearance;
34
use App\Http\Middleware\HandleInertiaRequests;
45
use Illuminate\Foundation\Application;
56
use Illuminate\Foundation\Configuration\Exceptions;
@@ -13,7 +14,10 @@
1314
health: '/up',
1415
)
1516
->withMiddleware(function (Middleware $middleware) {
17+
$middleware->encryptCookies(except: ['appearance']);
18+
1619
$middleware->web(append: [
20+
HandleAppearance::class,
1721
HandleInertiaRequests::class,
1822
AddLinkHeadersForPreloadedAssets::class,
1923
]);

composer.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@
5656
"dev": [
5757
"Composer\\Config::disableProcessTimeout",
5858
"npx concurrently -c \"#93c5fd,#c4b5fd,#fb7185,#fdba74\" \"php artisan serve\" \"php artisan queue:listen --tries=1\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=server,queue,logs,vite"
59+
],
60+
"dev:ssr": [
61+
"npm run build:ssr",
62+
"Composer\\Config::disableProcessTimeout",
63+
"npx concurrently -c \"#93c5fd,#c4b5fd,#fb7185,#fdba74\" \"php artisan serve\" \"php artisan queue:listen --tries=1\" \"php artisan pail --timeout=0\" \"php artisan inertia:start-ssr\" --names=server,queue,logs,ssr"
5964
]
6065
},
6166
"extra": {

resources/js/components/AppHeader.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ const rightNavItems: NavItem[] = [
109109
</div>
110110

111111
<Link :href="route('dashboard')" class="flex items-center gap-x-2">
112-
<AppLogo class="hidden h-6 xl:block" />
112+
<AppLogo />
113113
</Link>
114114

115115
<!-- Desktop Menu -->

resources/js/components/Heading.vue

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
<script setup lang="ts">
2-
import { Separator } from '@/components/ui/separator';
3-
42
interface Props {
53
title: string;
64
description?: string;
@@ -16,5 +14,4 @@ defineProps<Props>();
1614
{{ description }}
1715
</p>
1816
</div>
19-
<Separator class="my-6" />
2017
</template>

resources/js/components/TextLink.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ defineProps<Props>();
1717
:tabindex="tabindex"
1818
:method="method"
1919
:as="as"
20-
class="hover:!decoration-current text-foreground underline decoration-neutral-300 underline-offset-4 transition-colors duration-300 ease-out dark:decoration-neutral-500"
20+
class="text-foreground underline decoration-neutral-300 underline-offset-4 transition-colors duration-300 ease-out hover:!decoration-current dark:decoration-neutral-500"
2121
>
2222
<slot />
2323
</Link>

resources/js/components/ui/sidebar/SidebarInset.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const props = defineProps<{
1212
:class="
1313
cn(
1414
'relative flex min-h-svh flex-1 flex-col bg-background',
15-
'peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow',
15+
'peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow',
1616
props.class,
1717
)
1818
"

resources/js/composables/useAppearance.ts

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,63 @@ import { onMounted, ref } from 'vue';
33
type Appearance = 'light' | 'dark' | 'system';
44

55
export function updateTheme(value: Appearance) {
6+
if (typeof window === 'undefined') {
7+
return;
8+
}
9+
610
if (value === 'system') {
7-
const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
11+
const mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');
12+
const systemTheme = mediaQueryList.matches ? 'dark' : 'light';
13+
814
document.documentElement.classList.toggle('dark', systemTheme === 'dark');
915
} else {
1016
document.documentElement.classList.toggle('dark', value === 'dark');
1117
}
1218
}
1319

14-
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
20+
const setCookie = (name: string, value: string, days = 365) => {
21+
if (typeof document === 'undefined') {
22+
return;
23+
}
24+
25+
const maxAge = days * 24 * 60 * 60;
26+
27+
document.cookie = `${name}=${value};path=/;max-age=${maxAge};SameSite=Lax`;
28+
};
29+
30+
const mediaQuery = () => {
31+
if (typeof window === 'undefined') {
32+
return null;
33+
}
34+
35+
return window.matchMedia('(prefers-color-scheme: dark)');
36+
};
37+
38+
const getStoredAppearance = () => {
39+
if (typeof window === 'undefined') {
40+
return null;
41+
}
42+
43+
return localStorage.getItem('appearance') as Appearance | null;
44+
};
1545

1646
const handleSystemThemeChange = () => {
17-
const currentAppearance = localStorage.getItem('appearance') as Appearance | null;
47+
const currentAppearance = getStoredAppearance();
48+
1849
updateTheme(currentAppearance || 'system');
1950
};
2051

2152
export function initializeTheme() {
53+
if (typeof window === 'undefined') {
54+
return;
55+
}
56+
2257
// Initialize theme from saved preference or default to system...
23-
const savedAppearance = localStorage.getItem('appearance') as Appearance | null;
58+
const savedAppearance = getStoredAppearance();
2459
updateTheme(savedAppearance || 'system');
2560

2661
// Set up system theme change listener...
27-
mediaQuery.addEventListener('change', handleSystemThemeChange);
62+
mediaQuery()?.addEventListener('change', handleSystemThemeChange);
2863
}
2964

3065
export function useAppearance() {
@@ -42,7 +77,13 @@ export function useAppearance() {
4277

4378
function updateAppearance(value: Appearance) {
4479
appearance.value = value;
80+
81+
// Store in localStorage for client-side persistence...
4582
localStorage.setItem('appearance', value);
83+
84+
// Store in cookie for SSR...
85+
setCookie('appearance', value);
86+
4687
updateTheme(value);
4788
}
4889

0 commit comments

Comments
 (0)