fixed header not hiding when wanting to print
All checks were successful
Rebuild signaller for deprived.dev to rebuild site / test_service (push) Successful in 20s

This commit is contained in:
BOTAlex 2025-05-25 00:15:40 +02:00
parent 0c2ab8d93f
commit d3e11c32e6
4 changed files with 512 additions and 482 deletions

View file

@ -1,7 +1,6 @@
@import "tailwindcss"; @import "tailwindcss";
@plugin "daisyui"; @plugin "daisyui";
@plugin "daisyui/theme" { @plugin "daisyui/theme" {
name: "Deprived"; name: "Deprived";
default: true; default: true;
@ -36,7 +35,6 @@
--noise: 0; --noise: 0;
} }
@plugin "daisyui/theme" { @plugin "daisyui/theme" {
name: "dark"; name: "dark";
color-scheme: "dark"; color-scheme: "dark";
@ -70,7 +68,6 @@
--noise: 1; --noise: 1;
} }
@plugin "daisyui/theme" { @plugin "daisyui/theme" {
name: "pink"; name: "pink";
color-scheme: "light"; color-scheme: "light";
@ -104,7 +101,6 @@
--noise: 0; --noise: 0;
} }
@plugin "daisyui/theme" { @plugin "daisyui/theme" {
name: "netherrack"; name: "netherrack";
color-scheme: "dark"; color-scheme: "dark";
@ -174,8 +170,7 @@
.bg-grid-100 { .bg-grid-100 {
background: background:
linear-gradient(-90deg, rgba(255, 255, 255, 0.04) 1px, transparent 1px), linear-gradient(-90deg, rgba(255, 255, 255, 0.04) 1px, transparent 1px),
linear-gradient(rgba(255, 255, 255, 0.04) 1px, transparent 1px), linear-gradient(rgba(255, 255, 255, 0.04) 1px, transparent 1px), #f2f2f2;
#f2f2f2;
background-size: background-size:
4px 4px, 4px 4px,
4px 4px, 4px 4px,
@ -191,8 +186,7 @@
.bg-grid-200 { .bg-grid-200 {
background: background:
linear-gradient(-90deg, rgba(255, 255, 255, 0.04) 1px, transparent 1px), linear-gradient(-90deg, rgba(255, 255, 255, 0.04) 1px, transparent 1px),
linear-gradient(rgba(255, 255, 255, 0.04) 1px, transparent 1px), linear-gradient(rgba(255, 255, 255, 0.04) 1px, transparent 1px), #f2f2f2;
#f2f2f2;
background-size: background-size:
4px 4px, 4px 4px,
4px 4px, 4px 4px,
@ -208,8 +202,7 @@
.bg-grid-300 { .bg-grid-300 {
background: background:
linear-gradient(-90deg, rgba(255, 255, 255, 0.04) 1px, transparent 1px), linear-gradient(-90deg, rgba(255, 255, 255, 0.04) 1px, transparent 1px),
linear-gradient(rgba(255, 255, 255, 0.04) 1px, transparent 1px), linear-gradient(rgba(255, 255, 255, 0.04) 1px, transparent 1px), #f2f2f2;
#f2f2f2;
background-size: background-size:
4px 4px, 4px 4px,
4px 4px, 4px 4px,
@ -221,3 +214,9 @@
80px 80px; 80px 80px;
background-color: var(--color-base-300); background-color: var(--color-base-300);
} }
@media print {
.hide-on-print {
display: none !important;
}
}

View file

@ -1,18 +1,18 @@
<!-- If url contains "hideOnPrint" param, then detect if start printing then hide elements --> <!-- If url contains "hideOnPrint" param, then detect if start printing then hide elements -->
<script lang="ts"> <script lang="ts">
import "../app.css"; import "../app.css";
import { fly } from 'svelte/transition'; import { fly } from "svelte/transition";
import MediaQuery from 'svelte-media-queries'; import MediaQuery from "svelte-media-queries";
import { Dices } from "@lucide/svelte"; import { Dices } from "@lucide/svelte";
let hideOnPrint: boolean; let hideOnPrint: boolean = $state(false);
let { children } = $props(); let { children } = $props();
import DeprivedLogo from "$lib/images/DeprivedLogo.svelte"; import DeprivedLogo from "$lib/images/DeprivedLogo.svelte";
import HamburgerMenuIcon from "$lib/images/HamburgerMenuIcon.svelte"; import HamburgerMenuIcon from "$lib/images/HamburgerMenuIcon.svelte";
const footerCollapseThreshold : string = '1000px'; const footerCollapseThreshold: string = "1000px";
const headerCollapseThreshold : string = '1000px'; const headerCollapseThreshold: string = "1000px";
let footerCollapse: boolean; let footerCollapse: boolean;
let isMobile: boolean = $state(false); let isMobile: boolean = $state(false);
@ -22,54 +22,65 @@
navbarHidden = true; navbarHidden = true;
} }
import { afterNavigate } from '$app/navigation'; import { afterNavigate } from "$app/navigation";
afterNavigate(() => { afterNavigate(() => {
const params = new URLSearchParams(window.location.search); const params = new URLSearchParams(window.location.search);
hideOnPrint = params.get('hideOnPrint') === '1'; hideOnPrint = params.get("hideOnPrint") === "1";
//console.log(hideOnPrint); console.log(hideOnPrint);
}); });
import { onMount } from 'svelte'; import { onMount } from "svelte";
import Zooter from "./comps/Zooter.svelte"; import Zooter from "./comps/Zooter.svelte";
onMount(async () => { onMount(async () => {
const lock = document.createElement('meta'); const lock = document.createElement("meta");
lock.name = 'darkreader-lock'; lock.name = "darkreader-lock";
document.head.appendChild(lock); document.head.appendChild(lock);
}); });
function nextTheme() { function nextTheme() {
let theme: string | null = null; let theme: string | null = null;
if (typeof localStorage !== 'undefined') { if (typeof localStorage !== "undefined") {
theme = localStorage.getItem('theme'); theme = localStorage.getItem("theme");
} }
const themesArr = (window as any).AvailableThemes; const themesArr = (window as any).AvailableThemes;
let nextTheme = "dark"; let nextTheme = "dark";
if (theme == "null" || theme == "undefined" || theme == undefined || theme == null){ if (
theme == "null" ||
theme == "undefined" ||
theme == undefined ||
theme == null
) {
} else { } else {
nextTheme = themesArr[(1 - -themesArr.indexOf(theme)) % themesArr.length]; nextTheme = themesArr[(1 - -themesArr.indexOf(theme)) % themesArr.length];
} }
console.log("Slecting: " + nextTheme); console.log("Slecting: " + nextTheme);
document.documentElement.setAttribute('data-theme', nextTheme); document.documentElement.setAttribute("data-theme", nextTheme);
localStorage.setItem('theme', nextTheme); localStorage.setItem("theme", nextTheme);
} }
</script> </script>
{#snippet SwitchThemeButton()} {#snippet SwitchThemeButton()}
<div class="tooltip tooltip-bottom grid place-content-center" data-tip="Switch theme"> <div
class="tooltip tooltip-bottom grid place-content-center"
data-tip="Switch theme"
>
<button class="cursor-pointer" onclick={nextTheme}> <Dices /></button> <button class="cursor-pointer" onclick={nextTheme}> <Dices /></button>
</div> </div>
{/snippet} {/snippet}
<!-- Detect mobile --> <!-- Detect mobile -->
<MediaQuery query='(max-width: {footerCollapseThreshold})' bind:matches={footerCollapse} /> <MediaQuery
<MediaQuery query='(max-width: {headerCollapseThreshold})' bind:matches={isMobile} /> query="(max-width: {footerCollapseThreshold})"
bind:matches={footerCollapse}
/>
<MediaQuery
query="(max-width: {headerCollapseThreshold})"
bind:matches={isMobile}
/>
<!-- Nav bar --> <!-- Nav bar -->
<div class=" bg-base-200 p-0"> <div class=" bg-base-200 p-0">
@ -78,7 +89,10 @@
{#if !isMobile} {#if !isMobile}
<div class="desktop"> <div class="desktop">
<a href="/" class="nav-head"> <a href="/" class="nav-head">
<DeprivedLogo Class="fill-base-content p-2" Style="width: 3.5rem; height: auto;"/> <DeprivedLogo
Class="fill-base-content p-2"
Style="width: 3.5rem; height: auto;"
/>
<!-- <h3 id="logo-text">The Deprived Devs</h3> --> <!-- <h3 id="logo-text">The Deprived Devs</h3> -->
</a> </a>
<div class="nav-spacer" /> <div class="nav-spacer" />
@ -88,7 +102,11 @@
{@render SwitchThemeButton()} {@render SwitchThemeButton()}
<a href="/zhen/cv/rev2?hideOnPrint=1" target="_blank" style="width: 7.5rem;">Zhen CV</a> <a
href="/zhen/cv/rev2?hideOnPrint=1"
target="_blank"
style="width: 7.5rem;">Zhen CV</a
>
<a href="/tools" style="width: 7.5rem;">Tools</a> <a href="/tools" style="width: 7.5rem;">Tools</a>
<a href="https://botalex.itch.io/" target="_blank">Games</a> <a href="https://botalex.itch.io/" target="_blank">Games</a>
<!-- <a href="/posts">Blog</a> <!-- <a href="/posts">Blog</a>
@ -97,20 +115,33 @@
{:else} {:else}
<div class="collapsed shadow-xl"> <div class="collapsed shadow-xl">
<a onclick={resetNavBar} href="/" class="nav-head"> <a onclick={resetNavBar} href="/" class="nav-head">
<DeprivedLogo Class="fill-base-content p-2" Style="width: 3.5rem; height: auto;"/> <DeprivedLogo
Class="fill-base-content p-2"
Style="width: 3.5rem; height: auto;"
/>
<!-- <h3 id="logo-text">The Deprived Devs</h3> --> <!-- <h3 id="logo-text">The Deprived Devs</h3> -->
</a> </a>
<div class="nav-spacer" /> <div class="nav-spacer" />
{@render SwitchThemeButton()} {@render SwitchThemeButton()}
<div class="px-1"></div> <div class="px-1"></div>
<button id="toggle-nav" onclick={() => {navbarHidden = !navbarHidden; console.log(navbarHidden);}}> <button
id="toggle-nav"
onclick={() => {
navbarHidden = !navbarHidden;
console.log(navbarHidden);
}}
>
<HamburgerMenuIcon Class="fill-base-content" /> <HamburgerMenuIcon Class="fill-base-content" />
</button> </button>
</div> </div>
{#if !navbarHidden} {#if !navbarHidden}
<div class="nav-list" transition:fly={{ y: -25, duration: 350 }}> <div class="nav-list" transition:fly={{ y: -25, duration: 350 }}>
<!-- <a onclick={resetNavBar} href="/">Home</a> --> <!-- <a onclick={resetNavBar} href="/">Home</a> -->
<a onclick={resetNavBar} href="https://botalex.itch.io/" target="_blank">Games</a> <a
onclick={resetNavBar}
href="https://botalex.itch.io/"
target="_blank">Games</a
>
<a href="/zhen/cv/rev2?hideOnPrint=1" target="_blank">Zhen's CV</a> <a href="/zhen/cv/rev2?hideOnPrint=1" target="_blank">Zhen's CV</a>
<!-- <a onclick={resetNavBar} href="/posts">Blog</a> <!-- <a onclick={resetNavBar} href="/posts">Blog</a>
<a onclick={resetNavBar} href="/about">About</a> --> <a onclick={resetNavBar} href="/about">About</a> -->
@ -126,6 +157,20 @@
<Zooter bind:hideOnPrint /> <Zooter bind:hideOnPrint />
</div> </div>
{#if footerCollapse}
<style>
.about-container {
flex-direction: column;
justify-content: center !important;
gap: 25px;
}
</style>
{/if}
{#if isMobile}
<style>
</style>
{/if}
<style lang="scss"> <style lang="scss">
/* Nav bar. */ /* Nav bar. */
@ -159,7 +204,6 @@
border: none; border: none;
} }
.nav-list { .nav-list {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -266,26 +310,4 @@
a:hover { a:hover {
filter: brightness(130%); filter: brightness(130%);
} }
@media print {
.hide-on-print {
display: none;
}
}
</style> </style>
{#if footerCollapse}
<style>
.about-container {
flex-direction: column;
justify-content: center !important;
gap: 25px;
}
</style>
{/if}
{#if isMobile}
<style>
</style>
{/if}

View file

@ -155,7 +155,7 @@
on:resize={onResize} on:resize={onResize}
/> />
<div class="w-full"> <div class="{hideOnPrint ? 'hide-on-print' : ''} w-full">
<!-- Keep scrolling thing --> <!-- Keep scrolling thing -->
<div class="hidden h-64 w-full flex flex-col justify-center items-center"> <div class="hidden h-64 w-full flex flex-col justify-center items-center">
<div>Keep scrolling to veiw Zhen's portfolio site!</div> <div>Keep scrolling to veiw Zhen's portfolio site!</div>
@ -180,9 +180,7 @@
<!-- About footer --> <!-- About footer -->
<div <div
class="{hideOnPrint class="sticky bottom-0 flex flex-col justify-center pt-8 bg-base-300 mt-8"
? 'hide-on-print'
: ''} sticky bottom-0 flex flex-col justify-center pt-8 bg-base-300 mt-8"
> >
<div class="flex justify-center"> <div class="flex justify-center">
<div class="grid gap-8 sm:grid-cols-3 items-center w-full"> <div class="grid gap-8 sm:grid-cols-3 items-center w-full">

View file

@ -1,8 +1,8 @@
<script lang="ts"> <script lang="ts">
// Left side // Left side
import NameAndImage from "../CompsRev2/NameAndImage.svelte"; import NameAndImage from "../CompsRev2/NameAndImage.svelte";
import ShortProfile from "../CompsRev2/ShortProfile.svelte" import ShortProfile from "../CompsRev2/ShortProfile.svelte";
import CombinedContacts from "../CompsRev2/CombinedContacts.svelte" import CombinedContacts from "../CompsRev2/CombinedContacts.svelte";
import LinkedInQR from "../CompsRev2/LinkedInQR.svelte"; import LinkedInQR from "../CompsRev2/LinkedInQR.svelte";
// Right side // Right side
@ -22,14 +22,14 @@
import LinkToSource from "../CompsRev2/LinkToSource.svelte"; import LinkToSource from "../CompsRev2/LinkToSource.svelte";
// Discord embed // Discord embed
import preveiwImage from "$lib/zhen/cv-comps/EposCvPreveiw.png" import preveiwImage from "$lib/zhen/cv-comps/EposCvPreveiw.png";
// Print detection setup // Print detection setup
import { onMount } from "svelte"; import { onMount } from "svelte";
onMount(() => { onMount(() => {
// Check if the query parameter exists in the URL // Check if the query parameter exists in the URL
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
const hideOnPrintParam = urlParams.get('hideOnPrint'); const hideOnPrintParam = urlParams.get("hideOnPrint");
// If the query parameter is not detected, reload the page with the parameter added // If the query parameter is not detected, reload the page with the parameter added
if (!hideOnPrintParam) { if (!hideOnPrintParam) {
@ -39,28 +39,38 @@
function getFormattedDate(): string { function getFormattedDate(): string {
const date = new Date(); const date = new Date();
const day = String(date.getDate()).padStart(2, '0'); const day = String(date.getDate()).padStart(2, "0");
const month = String(date.getMonth() + 1).padStart(2, '0'); const month = String(date.getMonth() + 1).padStart(2, "0");
const year = date.getFullYear(); const year = date.getFullYear();
return `${day}-${month}-${year}`; return `${day}-${month}-${year}`;
} }
</script> </script>
<title>Zhentao Wei's CV {getFormattedDate()}</title> <title>Zhentao Wei's CV {getFormattedDate()}</title>
<meta content="Zhentao Wei's CV" property="og:title" /> <meta content="Zhentao Wei's CV" property="og:title" />
<meta content="This CV is made completely with svelte + html + css + js" property="og:description" /> <meta
content="This CV is made completely with svelte + html + css + js"
property="og:description"
/>
<meta content={preveiwImage} property="og:image" /> <meta content={preveiwImage} property="og:image" />
<meta content="#bdd6ee" data-react-helmet="true" name="theme-color" /> <meta content="#bdd6ee" data-react-helmet="true" name="theme-color" />
<div class="cv-info-container hide-on-print"> <div class="cv-info-container hide-on-print">
<div> <div>
Under here is my CV rev1 for an application made entirely in HTML and CSS. The page is designed to be saved as PDF. Under here is my CV rev1 for an application made entirely in HTML and CSS.
This can be done by pressing <div class="keyboard-key">P</div> + <div class="keyboard-key">CTRL</div>, then set scaling to 100% and no margins. Lastly, select save to PDF or print. The page is designed to be saved as PDF. This can be done by pressing <div
class="keyboard-key"
>
P
</div>
+
<div class="keyboard-key">CTRL</div>
, then set scaling to 100% and no margins. Lastly, select save to PDF or print.
<br /> <br />
<br /> <br />
I have to sadly recommend chrome for this process. Firefox somehow messes with the quality of the PDF :( I have to sadly recommend chrome for this process. Firefox somehow messes with
the quality of the PDF :(
</div> </div>
</div> </div>
@ -227,7 +237,7 @@
mask-image: linear-gradient(180deg, #000 0%, transparent 110%); mask-image: linear-gradient(180deg, #000 0%, transparent 110%);
color: rgb(190, 190, 190); color: rgb(190, 190, 190);
font-family: 'CozetteVector'; font-family: "CozetteVector";
font-size: x-large; font-size: x-large;
} }
@ -241,3 +251,4 @@
} }
} }
</style> </style>