From 557494ee04d97f2e03a6a1744aad99d47fcbf459 Mon Sep 17 00:00:00 2001 From: Ruben Hensen Date: Tue, 12 May 2026 11:43:46 +0200 Subject: [PATCH 1/8] fix: dark-mode email body legibility and cross-subdomain visited flag - EmailView: render decrypted email in a forced light-themed iframe so emails that hardcode dark text on no background stay legible when the host page is in dark mode (#159). - Marketing page: store the returning-visitor flag in a cookie scoped to the registrable domain so it carries across postguard.eu subdomains instead of being trapped per-origin in localStorage (#208). --- src/lib/components/fallback/EmailView.svelte | 2 +- src/lib/visitedCookie.ts | 25 ++++++++++++++++++++ src/routes/(marketing)/+page.js | 3 ++- src/routes/(marketing)/+page.svelte | 3 ++- 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 src/lib/visitedCookie.ts diff --git a/src/lib/components/fallback/EmailView.svelte b/src/lib/components/fallback/EmailView.svelte index d21ad1e..2c63ef1 100644 --- a/src/lib/components/fallback/EmailView.svelte +++ b/src/lib/components/fallback/EmailView.svelte @@ -70,7 +70,7 @@
diff --git a/src/lib/visitedCookie.ts b/src/lib/visitedCookie.ts new file mode 100644 index 0000000..93bf15e --- /dev/null +++ b/src/lib/visitedCookie.ts @@ -0,0 +1,25 @@ +const COOKIE_NAME = 'pg_visited' +const ONE_YEAR_SECONDS = 60 * 60 * 24 * 365 + +function registrableDomain(hostname: string): string | null { + if (!hostname || hostname === 'localhost') return null + if (/^\d+\.\d+\.\d+\.\d+$/.test(hostname)) return null + const parts = hostname.split('.') + if (parts.length < 2) return null + return parts.slice(-2).join('.') +} + +export function hasVisited(): boolean { + if (typeof document === 'undefined') return false + return document.cookie + .split(';') + .some((c) => c.trim().startsWith(`${COOKIE_NAME}=`)) +} + +export function markVisited(): void { + if (typeof document === 'undefined') return + const domain = registrableDomain(window.location.hostname) + const secure = window.location.protocol === 'https:' ? '; Secure' : '' + const domainAttr = domain ? `; Domain=.${domain}` : '' + document.cookie = `${COOKIE_NAME}=1; Max-Age=${ONE_YEAR_SECONDS}; Path=/; SameSite=Lax${domainAttr}${secure}` +} diff --git a/src/routes/(marketing)/+page.js b/src/routes/(marketing)/+page.js index ca00da6..50de015 100644 --- a/src/routes/(marketing)/+page.js +++ b/src/routes/(marketing)/+page.js @@ -1,5 +1,6 @@ import { browser } from '$app/environment' import { redirect } from '@sveltejs/kit' +import { hasVisited } from '$lib/visitedCookie' export function load() { // Only redirect returning visitors on direct/external navigation (full page load), @@ -7,7 +8,7 @@ export function load() { if ( browser && !(/** @type {any} */ (window).__pg_client_nav) && - localStorage.getItem('pg_visited') + hasVisited() ) { redirect(302, '/fileshare') } diff --git a/src/routes/(marketing)/+page.svelte b/src/routes/(marketing)/+page.svelte index c15f615..10d8653 100644 --- a/src/routes/(marketing)/+page.svelte +++ b/src/routes/(marketing)/+page.svelte @@ -4,11 +4,12 @@ import { resolve } from '$app/paths' import SEO from '$lib/components/SEO.svelte' import { FF_BUSINESS } from '$lib/env' + import { markVisited } from '$lib/visitedCookie' let contactEl: HTMLAnchorElement onMount(() => { - localStorage.setItem('pg_visited', 'true') + markVisited() if (contactEl) { const addr = `${contactEl.dataset.name}@${contactEl.dataset.domain}` contactEl.href = `mailto:${addr}` From f201db66a2a3f98a456b6d0d124687afe6e27e31 Mon Sep 17 00:00:00 2001 From: Ruben Hensen Date: Tue, 12 May 2026 11:53:13 +0200 Subject: [PATCH 2/8] fix(decrypt): theme-aware plain-text rendering, leave HTML emails alone MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously the iframe forced a light surface unconditionally. That fixed the original dark-mode bug for HTML emails (which set their own dark text on no background), but it also overrode the site theme for plain- text emails — leaving them stuck in light mode forever. - HTML emails: don't touch the styling. Email designs are self-contained. - Plain-text emails: wrap the text in
 and inject body styles that
  follow the host theme (background, color, color-scheme), reactively
  switching when the user toggles the theme via a MutationObserver on
  the  class.
---
 src/lib/components/fallback/EmailView.svelte | 43 +++++++++++++++++---
 1 file changed, 38 insertions(+), 5 deletions(-)

diff --git a/src/lib/components/fallback/EmailView.svelte b/src/lib/components/fallback/EmailView.svelte
index 2c63ef1..2a95484 100644
--- a/src/lib/components/fallback/EmailView.svelte
+++ b/src/lib/components/fallback/EmailView.svelte
@@ -1,5 +1,6 @@
 
 
 {#if parsed}
@@ -69,11 +106,7 @@
         
- +
{#if parsed.attachments && parsed.attachments.length > 0} From a230af64c952301b9246680de91151d49387c09a Mon Sep 17 00:00:00 2001 From: Ruben Hensen Date: Tue, 12 May 2026 11:57:44 +0200 Subject: [PATCH 3/8] fix(decrypt): mobile-friendly upload affordance, hide desktop-only banner On mobile the "install Thunderbird/Outlook extension" banner is irrelevant, and the dashed "drop the postguard.encrypted file here" zone implies a drag-and-drop interaction that isn't available on touch. - Hide the extension banner under 768px. - Restyle the upload label as a solid primary button on mobile and swap its text to "Upload \"postguard.encrypted\"" so it reads as a tappable action rather than a drop target. The underlying already opens the native picker on tap. - Add the new fallback.upload i18n key in EN and NL. --- src/lib/locales/en.json | 1 + src/lib/locales/nl.json | 1 + src/routes/(app)/decrypt/+page.svelte | 39 +++++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/lib/locales/en.json b/src/lib/locales/en.json index f2d296c..5d7cb06 100644 --- a/src/lib/locales/en.json +++ b/src/lib/locales/en.json @@ -98,6 +98,7 @@ "privacy": "Your emails are stored only in your browser. Clear them anytime in settings." }, "drop": "Drop the \"postguard.encrypted\" attachment here", + "upload": "Upload \"postguard.encrypted\"", "search": "Search decrypted mails...", "decrypt": { "helper": "Decrypt this mail by showing who you are with Yivi", diff --git a/src/lib/locales/nl.json b/src/lib/locales/nl.json index 4bc3bce..f454d92 100644 --- a/src/lib/locales/nl.json +++ b/src/lib/locales/nl.json @@ -98,6 +98,7 @@ "privacy": "Je e-mails worden alleen in je browser opgeslagen. Verwijder ze op elk moment via instellingen." }, "drop": "Selecteer \"postguard.encrypted\" attachment hier", + "upload": "Upload \"postguard.encrypted\"", "search": "Zoek in ontsleutelde mails...", "decrypt": { "helper": "Ontsleutel deze email door te laten zien wie je bent met Yivi", diff --git a/src/routes/(app)/decrypt/+page.svelte b/src/routes/(app)/decrypt/+page.svelte index 5383b80..4e83614 100644 --- a/src/routes/(app)/decrypt/+page.svelte +++ b/src/routes/(app)/decrypt/+page.svelte @@ -138,11 +138,16 @@ width="28px" aria-hidden="true" /> - {$_('fallback.drop')} + {$_('fallback.drop')} + {$_('fallback.upload')} {/if} @@ -294,6 +299,10 @@ } } + .upload-text-mobile { + display: none; + } + .search-bar { display: flex; align-items: center; @@ -415,6 +424,32 @@ min-height: calc(100vh - 52px); } + .extension-banner { + display: none; + } + + .upload-area { + flex-direction: row; + padding: 0.75rem 1rem; + border-style: solid; + border-color: var(--pg-primary); + background: var(--pg-primary); + color: white; + + &:hover { + color: white; + opacity: 0.9; + } + } + + .upload-text-desktop { + display: none; + } + + .upload-text-mobile { + display: inline; + } + .fallback-container { flex-direction: column; height: auto; From 46d471b5d02ca4a84a5ee566898679f6789f41fe Mon Sep 17 00:00:00 2001 From: Ruben Hensen Date: Tue, 12 May 2026 12:03:46 +0200 Subject: [PATCH 4/8] fix(decrypt): single-screen list/reader flow on mobile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On a phone the side-by-side panels squeezed both lists and the email view into ~40vh slices. Switch to a phone-style two-step flow instead. - Inbox view: full-screen panel with search/cog at the top, email list filling the middle, and the upload button pinned to the bottom (via flex order — desktop layout is unchanged). - Reader view: clicking an email or hitting Decrypt swaps to a full-screen right panel with a "Back to inbox" button up top. - "Back" resets currSelected and hashMode so the effect collapses currRight back to Nothing, restoring the list view. - Add fallback.back i18n key in EN and NL. --- src/lib/locales/en.json | 1 + src/lib/locales/nl.json | 1 + src/routes/(app)/decrypt/+page.svelte | 75 +++++++++++++++++++++++++-- 3 files changed, 72 insertions(+), 5 deletions(-) diff --git a/src/lib/locales/en.json b/src/lib/locales/en.json index 5d7cb06..2df57fd 100644 --- a/src/lib/locales/en.json +++ b/src/lib/locales/en.json @@ -99,6 +99,7 @@ }, "drop": "Drop the \"postguard.encrypted\" attachment here", "upload": "Upload \"postguard.encrypted\"", + "back": "Back to inbox", "search": "Search decrypted mails...", "decrypt": { "helper": "Decrypt this mail by showing who you are with Yivi", diff --git a/src/lib/locales/nl.json b/src/lib/locales/nl.json index f454d92..173f5be 100644 --- a/src/lib/locales/nl.json +++ b/src/lib/locales/nl.json @@ -99,6 +99,7 @@ }, "drop": "Selecteer \"postguard.encrypted\" attachment hier", "upload": "Upload \"postguard.encrypted\"", + "back": "Terug naar inbox", "search": "Zoek in ontsleutelde mails...", "decrypt": { "helper": "Ontsleutel deze email door te laten zien wie je bent met Yivi", diff --git a/src/routes/(app)/decrypt/+page.svelte b/src/routes/(app)/decrypt/+page.svelte index 4e83614..22f98e0 100644 --- a/src/routes/(app)/decrypt/+page.svelte +++ b/src/routes/(app)/decrypt/+page.svelte @@ -47,6 +47,15 @@ currRight = RIGHTMODES.Decrypt } + function backToList() { + // On mobile the list and reader are stacked single-screen flows; + // resetting both selection and hashMode collapses currRight back to + // Nothing via the effect above, which hides the reader panel. + currSelected.set(-1) + hashMode = false + currRight = RIGHTMODES.Nothing + } + function fromUrlSafeBase64(urlSafe) { let base64 = urlSafe.replace(/-/g, '+').replace(/_/g, '/') const pad = base64.length % 4 @@ -129,7 +138,10 @@ {$_('fallback.extensionPrompt')} {$_('fallback.extensionLink')} -
+
{#if !hashMode}
+ {#if currRight !== RIGHTMODES.Nothing} + + {/if} {#if currRight === RIGHTMODES.MailView} {:else if currRight === RIGHTMODES.Nothing} @@ -303,6 +321,10 @@ display: none; } + .mobile-back { + display: none; + } + .search-bar { display: flex; align-items: center; @@ -422,6 +444,7 @@ .fallback-page { height: auto; min-height: calc(100vh - 52px); + padding: 0; } .extension-banner { @@ -431,10 +454,12 @@ .upload-area { flex-direction: row; padding: 0.75rem 1rem; + margin: 0.75rem 1rem; border-style: solid; border-color: var(--pg-primary); background: var(--pg-primary); color: white; + order: 3; &:hover { color: white; @@ -450,18 +475,58 @@ display: inline; } + .search-bar { + order: 1; + padding-top: 0.75rem; + } + + .email-list-area { + order: 2; + flex: 1; + } + .fallback-container { flex-direction: column; - height: auto; + height: 100%; + gap: 0; + flex: 1; } .left-panel { - flex: none; - max-height: 40vh; + flex: 1; + max-height: none; + border: none; + border-radius: 0; } .right-panel { - min-height: 50vh; + min-height: 0; + border: none; + border-radius: 0; + flex: 1; + } + + // Single-screen flow: list view OR reader view, never both. + .fallback-container.mobile-reading .left-panel { + display: none; + } + + .fallback-container:not(.mobile-reading) .right-panel { + display: none; + } + + .mobile-back { + all: unset; + cursor: pointer; + display: flex; + align-items: center; + gap: 0.4rem; + padding: 0.75rem 1rem; + font-size: var(--pg-font-size-sm); + font-weight: var(--pg-font-weight-semibold); + color: var(--pg-primary); + border-bottom: 1px solid var(--pg-input-normal); + flex-shrink: 0; } } From 0aefd0c392a14322e3c1b6e5f37724cdd610a261 Mon Sep 17 00:00:00 2001 From: Ruben Hensen Date: Tue, 12 May 2026 12:10:49 +0200 Subject: [PATCH 5/8] fix(decrypt,addons): anchor mobile flex heights, drop left-border accents MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - decrypt mobile: anchor .fallback-page to the viewport height and add min-height:0 + explicit flex bases to the panel/list chain so the email list can shrink instead of growing to fit content and pushing the upload button below the fold. - ListView: replace the 3px left-border selected accent with a solid primary-coloured background and white text — clearer affordance and drops the "AI-template" stripe look. - Addons callout: drop the left-border stripe in favour of a full bordered, slightly muted amber card. --- src/lib/components/fallback/ListView.svelte | 14 ++++++++++---- src/routes/(app)/decrypt/+page.svelte | 15 ++++++++++----- src/routes/(marketing)/addons/+page.svelte | 3 ++- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/lib/components/fallback/ListView.svelte b/src/lib/components/fallback/ListView.svelte index 7f8ad24..60fb01a 100644 --- a/src/lib/components/fallback/ListView.svelte +++ b/src/lib/components/fallback/ListView.svelte @@ -75,17 +75,23 @@ gap: 0.15rem; padding: 0.75rem 1rem; border-bottom: 1px solid var(--pg-input-normal); - border-left: 3px solid transparent; text-align: left; - transition: background 0.15s ease; + transition: + background 0.15s ease, + color 0.15s ease; &:hover { background: var(--pg-soft-background); } &.selected { - background: var(--pg-general-background); - border-left-color: var(--pg-primary); + background: var(--pg-primary); + color: white; + + .email-sender, + .email-date { + color: rgba(255, 255, 255, 0.85); + } } &:focus-visible { diff --git a/src/routes/(app)/decrypt/+page.svelte b/src/routes/(app)/decrypt/+page.svelte index 22f98e0..5239b52 100644 --- a/src/routes/(app)/decrypt/+page.svelte +++ b/src/routes/(app)/decrypt/+page.svelte @@ -442,8 +442,8 @@ @media only screen and (max-width: 768px) { .fallback-page { - height: auto; - min-height: calc(100vh - 52px); + height: calc(100vh - 52px); + min-height: 0; padding: 0; } @@ -452,6 +452,7 @@ } .upload-area { + flex: 0 0 auto; flex-direction: row; padding: 0.75rem 1rem; margin: 0.75rem 1rem; @@ -478,11 +479,13 @@ .search-bar { order: 1; padding-top: 0.75rem; + flex: 0 0 auto; } .email-list-area { order: 2; - flex: 1; + flex: 1 1 0; + min-height: 0; } .fallback-container { @@ -490,10 +493,12 @@ height: 100%; gap: 0; flex: 1; + min-height: 0; } .left-panel { - flex: 1; + flex: 1 1 0; + min-height: 0; max-height: none; border: none; border-radius: 0; @@ -503,7 +508,7 @@ min-height: 0; border: none; border-radius: 0; - flex: 1; + flex: 1 1 0; } // Single-screen flow: list view OR reader view, never both. diff --git a/src/routes/(marketing)/addons/+page.svelte b/src/routes/(marketing)/addons/+page.svelte index 6a1ef41..e44f7c1 100644 --- a/src/routes/(marketing)/addons/+page.svelte +++ b/src/routes/(marketing)/addons/+page.svelte @@ -181,12 +181,13 @@ } .callout { - border-left: 4px solid #c9941b; background: #fff7e0; + border: 1px solid #e8d28f; padding: 0.75rem 1rem; margin: 0.75rem 0 1rem; border-radius: 4px; font-size: 0.95em; line-height: 1.4; + color: #5a3f00; } From dea65678afd79495627d77f7e189e0c186813e97 Mon Sep 17 00:00:00 2001 From: Ruben Hensen Date: Tue, 12 May 2026 12:25:00 +0200 Subject: [PATCH 6/8] revert: drop pg_visited cookie migration (#208) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cookies cannot be shared across different registrable domains (e.g. postguard.eu ↔ postguard.nl), so the cookie-scoped flag only solved the subdomain case — which already worked well enough via the existing localStorage approach for our deployed surfaces. Cross-TLD sharing would require either consolidating to a single canonical domain or a third-party tracker iframe, neither of which is in scope. Revert to localStorage and close #208. --- src/lib/visitedCookie.ts | 25 ------------------------- src/routes/(marketing)/+page.js | 3 +-- src/routes/(marketing)/+page.svelte | 3 +-- 3 files changed, 2 insertions(+), 29 deletions(-) delete mode 100644 src/lib/visitedCookie.ts diff --git a/src/lib/visitedCookie.ts b/src/lib/visitedCookie.ts deleted file mode 100644 index 93bf15e..0000000 --- a/src/lib/visitedCookie.ts +++ /dev/null @@ -1,25 +0,0 @@ -const COOKIE_NAME = 'pg_visited' -const ONE_YEAR_SECONDS = 60 * 60 * 24 * 365 - -function registrableDomain(hostname: string): string | null { - if (!hostname || hostname === 'localhost') return null - if (/^\d+\.\d+\.\d+\.\d+$/.test(hostname)) return null - const parts = hostname.split('.') - if (parts.length < 2) return null - return parts.slice(-2).join('.') -} - -export function hasVisited(): boolean { - if (typeof document === 'undefined') return false - return document.cookie - .split(';') - .some((c) => c.trim().startsWith(`${COOKIE_NAME}=`)) -} - -export function markVisited(): void { - if (typeof document === 'undefined') return - const domain = registrableDomain(window.location.hostname) - const secure = window.location.protocol === 'https:' ? '; Secure' : '' - const domainAttr = domain ? `; Domain=.${domain}` : '' - document.cookie = `${COOKIE_NAME}=1; Max-Age=${ONE_YEAR_SECONDS}; Path=/; SameSite=Lax${domainAttr}${secure}` -} diff --git a/src/routes/(marketing)/+page.js b/src/routes/(marketing)/+page.js index 50de015..ca00da6 100644 --- a/src/routes/(marketing)/+page.js +++ b/src/routes/(marketing)/+page.js @@ -1,6 +1,5 @@ import { browser } from '$app/environment' import { redirect } from '@sveltejs/kit' -import { hasVisited } from '$lib/visitedCookie' export function load() { // Only redirect returning visitors on direct/external navigation (full page load), @@ -8,7 +7,7 @@ export function load() { if ( browser && !(/** @type {any} */ (window).__pg_client_nav) && - hasVisited() + localStorage.getItem('pg_visited') ) { redirect(302, '/fileshare') } diff --git a/src/routes/(marketing)/+page.svelte b/src/routes/(marketing)/+page.svelte index 10d8653..c15f615 100644 --- a/src/routes/(marketing)/+page.svelte +++ b/src/routes/(marketing)/+page.svelte @@ -4,12 +4,11 @@ import { resolve } from '$app/paths' import SEO from '$lib/components/SEO.svelte' import { FF_BUSINESS } from '$lib/env' - import { markVisited } from '$lib/visitedCookie' let contactEl: HTMLAnchorElement onMount(() => { - markVisited() + localStorage.setItem('pg_visited', 'true') if (contactEl) { const addr = `${contactEl.dataset.name}@${contactEl.dataset.domain}` contactEl.href = `mailto:${addr}` From f18d980d807a8b8802eabd451c315267e1c2ada1 Mon Sep 17 00:00:00 2001 From: Ruben Hensen Date: Tue, 12 May 2026 12:31:31 +0200 Subject: [PATCH 7/8] fix(decrypt): plain-text emails in monospace, define semibold token Two notes from the dobby review. - Define --pg-font-weight-semibold in global.scss. It was referenced in five places (Header, marketing root, marketing layout, blog post page, and the new .mobile-back button) but never declared, silently falling back to 400. Mapping it to 600 matches the existing --medium token. - Switch the plain-text email
 to a monospace face. text/plain
  bodies routinely rely on column alignment (ASCII tables, quoted
  replies with leading '>', signatures), which broke under system-ui.
  Drop the font-family from  so it doesn't shadow the 
.
---
 src/lib/components/fallback/EmailView.svelte | 8 +++++---
 src/lib/global.scss                          | 1 +
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/lib/components/fallback/EmailView.svelte b/src/lib/components/fallback/EmailView.svelte
index 2a95484..3b7a699 100644
--- a/src/lib/components/fallback/EmailView.svelte
+++ b/src/lib/components/fallback/EmailView.svelte
@@ -43,7 +43,9 @@
 
     // HTML emails carry their own design — leave their styling untouched.
     // Plain-text emails have no styling of their own, so mirror the site
-    // theme so the text stays legible when dark mode is toggled.
+    // theme so the text stays legible when dark mode is toggled, and use
+    // a monospace face — that's what real mail clients render text/plain
+    // in, and ASCII tables / signatures / quoted replies rely on it.
     let bodyDoc = $derived.by(() => {
         if (!parsed) return ''
         if (parsed.html) {
@@ -53,9 +55,9 @@
         const fg = isDark ? '#ffffff' : '#030e17'
         const scheme = isDark ? 'dark' : 'light'
         const text = escapeHtml(parsed.text ?? '')
-        const bodyStyle = `margin:1rem;background:${bg};color:${fg};color-scheme:${scheme};font-family:system-ui,-apple-system,sans-serif;font-size:14px;line-height:1.5`
+        const bodyStyle = `margin:1rem;background:${bg};color:${fg};color-scheme:${scheme};font-size:13px;line-height:1.5`
         const preStyle =
-            'margin:0;white-space:pre-wrap;word-break:break-word;font-family:inherit'
+            'margin:0;white-space:pre-wrap;word-break:break-word;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace'
         return `
${text}
` }) diff --git a/src/lib/global.scss b/src/lib/global.scss index 151a5fa..d578d55 100644 --- a/src/lib/global.scss +++ b/src/lib/global.scss @@ -55,6 +55,7 @@ body { /* Font weights */ --pg-font-weight-regular: 400; --pg-font-weight-medium: 600; + --pg-font-weight-semibold: 600; --pg-font-weight-bold: 700; --pg-font-weight-extrabold: 800; From db41268ebd505779e47e8ef7dfb23ed44f8372be Mon Sep 17 00:00:00 2001 From: Ruben Hensen Date: Tue, 12 May 2026 12:32:56 +0200 Subject: [PATCH 8/8] refactor(styles): consolidate font-weight-semibold into font-weight-medium Both pointed at 600, so there were two tokens for one value. Drop the just-added --pg-font-weight-semibold and migrate the existing five callers (Header, marketing root + layout, blog post page, decrypt .mobile-back) to --pg-font-weight-medium. --- src/lib/components/Header.svelte | 2 +- src/lib/global.scss | 1 - src/routes/(app)/decrypt/+page.svelte | 6 +++--- src/routes/(marketing)/+layout.svelte | 6 +++--- src/routes/(marketing)/+page.svelte | 14 +++++++------- src/routes/(marketing)/blog/[slug]/+page.svelte | 4 ++-- 6 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte index 2c3f7f6..8bbb45c 100644 --- a/src/lib/components/Header.svelte +++ b/src/lib/components/Header.svelte @@ -116,7 +116,7 @@ color: white; border-radius: var(--pg-border-radius-sm); text-decoration: none; - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); font-size: var(--pg-font-size-sm); transition: opacity 0.2s ease; white-space: nowrap; diff --git a/src/lib/global.scss b/src/lib/global.scss index d578d55..151a5fa 100644 --- a/src/lib/global.scss +++ b/src/lib/global.scss @@ -55,7 +55,6 @@ body { /* Font weights */ --pg-font-weight-regular: 400; --pg-font-weight-medium: 600; - --pg-font-weight-semibold: 600; --pg-font-weight-bold: 700; --pg-font-weight-extrabold: 800; diff --git a/src/routes/(app)/decrypt/+page.svelte b/src/routes/(app)/decrypt/+page.svelte index 5239b52..e6fe4ec 100644 --- a/src/routes/(app)/decrypt/+page.svelte +++ b/src/routes/(app)/decrypt/+page.svelte @@ -265,7 +265,7 @@ a { color: var(--pg-primary); - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); text-decoration: none; &:hover { @@ -408,7 +408,7 @@ h2 { font-size: var(--pg-font-size-lg); - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); margin: 0 0 0.75rem; } @@ -528,7 +528,7 @@ gap: 0.4rem; padding: 0.75rem 1rem; font-size: var(--pg-font-size-sm); - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); color: var(--pg-primary); border-bottom: 1px solid var(--pg-input-normal); flex-shrink: 0; diff --git a/src/routes/(marketing)/+layout.svelte b/src/routes/(marketing)/+layout.svelte index d2ee0e5..0d74cf7 100644 --- a/src/routes/(marketing)/+layout.svelte +++ b/src/routes/(marketing)/+layout.svelte @@ -120,7 +120,7 @@ padding: 0.5rem 1rem; background: var(--pg-primary); color: var(--pg-on-primary); - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); text-decoration: none; z-index: 1000; transform: translateY(-200%); @@ -156,7 +156,7 @@ .footer-col { h4 { font-size: var(--pg-font-size-sm); - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); color: var(--pg-text); margin: 0 0 0.75rem; } @@ -193,7 +193,7 @@ a { color: var(--pg-text-secondary); text-decoration: none; - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); &:hover { color: var(--pg-primary); diff --git a/src/routes/(marketing)/+page.svelte b/src/routes/(marketing)/+page.svelte index c15f615..d248639 100644 --- a/src/routes/(marketing)/+page.svelte +++ b/src/routes/(marketing)/+page.svelte @@ -246,7 +246,7 @@ border: 2px solid var(--pg-primary); border-radius: var(--pg-border-radius-sm); text-decoration: none; - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); font-size: var(--pg-font-size-base); transition: opacity 0.2s ease; @@ -262,7 +262,7 @@ color: var(--pg-primary); border-radius: var(--pg-border-radius-sm); text-decoration: none; - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); font-size: var(--pg-font-size-base); transition: background 0.2s ease; @@ -365,7 +365,7 @@ .limit-suffix { font-size: var(--pg-font-size-base); - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); color: var(--pg-text); margin-bottom: 1rem; } @@ -421,7 +421,7 @@ h3 { margin: 0 0 0.75rem; font-size: var(--pg-font-size-base); - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); } p { @@ -470,7 +470,7 @@ h3 { margin: 0 0 0.75rem; font-size: var(--pg-font-size-base); - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); } p { @@ -483,7 +483,7 @@ .coming-soon-heading { font-size: var(--pg-font-size-base); - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); color: var(--pg-primary); margin-bottom: 1.5rem; } @@ -495,7 +495,7 @@ color: var(--pg-general-background); border-radius: var(--pg-border-radius-sm); text-decoration: none; - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); font-size: var(--pg-font-size-base); transition: opacity 0.2s ease; diff --git a/src/routes/(marketing)/blog/[slug]/+page.svelte b/src/routes/(marketing)/blog/[slug]/+page.svelte index f8ed0ec..169f3cf 100644 --- a/src/routes/(marketing)/blog/[slug]/+page.svelte +++ b/src/routes/(marketing)/blog/[slug]/+page.svelte @@ -153,7 +153,7 @@ } .author-name { - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); font-size: var(--pg-font-size-sm); a { @@ -198,7 +198,7 @@ } .blog-post :global(strong) { - font-weight: var(--pg-font-weight-semibold); + font-weight: var(--pg-font-weight-medium); } .blog-post :global(ol),