|
8 | 8 | const props = $props(); |
9 | 9 | let { children, data } = props; |
10 | 10 |
|
| 11 | + const SITE_TITLE = 'rustytime'; |
| 12 | + const SITE_DESCRIPTION = 'Blazingly fast time tracking for developers.'; |
| 13 | + const SITE_URL = 'https://rustytime.shymike.dev'; |
| 14 | +
|
| 15 | + const ogImagePath = favicon.startsWith('/') ? favicon : `/${favicon}`; |
| 16 | + const ogImageUrl = `${SITE_URL}${ogImagePath}`; |
| 17 | +
|
| 18 | + let canonicalUrl = $state(SITE_URL); |
| 19 | +
|
| 20 | + $effect(() => { |
| 21 | + canonicalUrl = `${SITE_URL}${page.url.pathname}${page.url.search}`; |
| 22 | + }); |
| 23 | +
|
11 | 24 | type AuthData = App.PageData['auth']; |
12 | 25 | const DEFAULT_AUTH: AuthData = { |
13 | 26 | isAuthenticated: false, |
|
38 | 51 |
|
39 | 52 | <svelte:head> |
40 | 53 | <link rel="icon" href={favicon} /> |
41 | | - <title>{page.url.pathname === '/' ? '' : page.url.pathname.slice(1) + ' - '} rustytime</title> |
42 | | - <meta name="description" content="Blazingly fast time tracking for developers." /> |
| 54 | + <link rel="canonical" href={canonicalUrl} /> |
| 55 | + <title>{SITE_TITLE}</title> |
| 56 | + <meta name="description" content={SITE_DESCRIPTION} /> |
| 57 | + <meta property="og:type" content="website" /> |
| 58 | + <meta property="og:site_name" content={SITE_TITLE} /> |
| 59 | + <meta property="og:title" content={SITE_TITLE} /> |
| 60 | + <meta property="og:description" content={SITE_DESCRIPTION} /> |
| 61 | + <meta property="og:url" content={canonicalUrl} /> |
| 62 | + <meta property="og:image" content={ogImageUrl} /> |
| 63 | + <meta property="og:image:alt" content="rustytime logo" /> |
| 64 | + <meta name="twitter:card" content="summary_large_image" /> |
| 65 | + <meta name="twitter:title" content={SITE_TITLE} /> |
| 66 | + <meta name="twitter:description" content={SITE_DESCRIPTION} /> |
| 67 | + <meta name="twitter:image" content={ogImageUrl} /> |
43 | 68 | </svelte:head> |
44 | 69 |
|
45 | 70 | <div class="app-container flex h-screen bg-mantle"> |
|
0 commit comments