From b808dc93e741e793d47548377a66ddf081819617 Mon Sep 17 00:00:00 2001 From: Antonio De Lucreziis Date: Thu, 5 Jun 2025 01:56:43 +0200 Subject: [PATCH] added more themes --- .prettierrc.mjs | 1 + README.md | 48 +-- package.json | 2 + src/components/PostCard.astro | 35 +++ src/config.ts | 12 + src/config.yaml | 1 - src/env.d.ts | 7 - src/layouts/Base.astro | 29 +- src/layouts/Post.astro | 9 +- src/materiale/dispensa-1.pdf | Bin 0 -> 27503 bytes src/pages/appunti/index.astro | 44 +++ src/pages/index.astro | 40 ++- src/pages/posts/first-post.md | 34 +-- src/pages/posts/index.astro | 36 +++ src/style.css | 5 + src/themes/base.css | 437 ++++++++++++++++++++++++++++ src/themes/colorful.css | 534 ++++++++++++++++++++++++++++++++++ src/themes/mono.css | 478 ++++++++++++++++++++++++++++++ 18 files changed, 1667 insertions(+), 85 deletions(-) create mode 100644 src/components/PostCard.astro create mode 100644 src/config.ts delete mode 100644 src/config.yaml delete mode 100644 src/env.d.ts create mode 100644 src/materiale/dispensa-1.pdf create mode 100644 src/pages/appunti/index.astro create mode 100644 src/pages/posts/index.astro create mode 100644 src/style.css create mode 100644 src/themes/base.css create mode 100644 src/themes/colorful.css create mode 100644 src/themes/mono.css diff --git a/.prettierrc.mjs b/.prettierrc.mjs index 42d2ed7..a3a1586 100644 --- a/.prettierrc.mjs +++ b/.prettierrc.mjs @@ -1,5 +1,6 @@ /** @type {import("prettier").Config} */ export default { + printWidth: 120, singleQuote: true, quoteProps: 'consistent', tabWidth: 4, diff --git a/README.md b/README.md index d8af7d2..1a18921 100644 --- a/README.md +++ b/README.md @@ -1,47 +1 @@ -# Astro Starter Kit: Minimal - -```sh -bun create astro@latest -- --template minimal -``` - -[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/minimal) -[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/minimal) -[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/minimal/devcontainer.json) - -> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! - -## 🚀 Project Structure - -Inside of your Astro project, you'll see the following folders and files: - -```text -/ -├── public/ -├── src/ -│ └── pages/ -│ └── index.astro -└── package.json -``` - -Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name. - -There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components. - -Any static assets, like images, can be placed in the `public/` directory. - -## 🧞 Commands - -All commands are run from the root of the project, from a terminal: - -| Command | Action | -| :------------------------ | :----------------------------------------------- | -| `bun install` | Installs dependencies | -| `bun dev` | Starts local dev server at `localhost:4321` | -| `bun build` | Build your production site to `./dist/` | -| `bun preview` | Preview your build locally, before deploying | -| `bun astro ...` | Run CLI commands like `astro add`, `astro check` | -| `bun astro -- --help` | Get help using the Astro CLI | - -## 👀 Want to learn more? - -Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). +# Poisson Blog Template diff --git a/package.json b/package.json index 7e9ea41..1ae6bfc 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,9 @@ "version": "0.0.1", "scripts": { "dev": "astro dev", + "start": "astro dev", "build": "astro build", + "build:poisson": "astro build --site 'https://poisson.phc.dm.unipi.it/~ncognome' --base '/~ncognome'", "preview": "astro preview", "astro": "astro" }, diff --git a/src/components/PostCard.astro b/src/components/PostCard.astro new file mode 100644 index 0000000..9612ffb --- /dev/null +++ b/src/components/PostCard.astro @@ -0,0 +1,35 @@ +--- +type Props = { + post: { + title: string + publishDate: string + description: string + url: string + } +} + +const { post } = Astro.props +--- + +
+ +
+ { + new Date(post.publishDate) + .toLocaleDateString('it-IT', { + year: 'numeric', + month: 'long', + day: 'numeric', + }) + // to Title Case + .replace(/(\w)(\w*)/g, (match, p1, p2) => p1.toUpperCase() + p2.toLowerCase()) + } +
+
+ {post.description} +
+
diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..bab36d6 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,12 @@ +export type PostFrontmatter = { + title: string + description: string + tags: string[] + + publishDate: string + draft: boolean +} + +export default { + title: 'n.cognome', +} diff --git a/src/config.yaml b/src/config.yaml deleted file mode 100644 index 23e6f97..0000000 --- a/src/config.yaml +++ /dev/null @@ -1 +0,0 @@ -title: Sito di n.cognome \ No newline at end of file diff --git a/src/env.d.ts b/src/env.d.ts deleted file mode 100644 index 6e750db..0000000 --- a/src/env.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -declare module '@/config.yaml' { - const content: { - title: string - } - - export default content -} diff --git a/src/layouts/Base.astro b/src/layouts/Base.astro index c063998..463cbd7 100644 --- a/src/layouts/Base.astro +++ b/src/layouts/Base.astro @@ -1,6 +1,8 @@ --- import 'katex/dist/katex.min.css' -import config from '@/config.yaml' +import '@/style.css' + +import config from '@/config' --- @@ -26,6 +28,7 @@ import config from '@/config.yaml' }) $s.appendChild($e.firstChild) + $e.remove() }) document.querySelectorAll('.math-display').forEach($e => { @@ -42,6 +45,7 @@ import config from '@/config.yaml' }) $s.appendChild($e.firstChild) + $e.remove() }) }) @@ -49,6 +53,29 @@ import config from '@/config.yaml' {config.title} +
+

+ {config.title} +

+
+ + + + + + + + +
+ diff --git a/src/layouts/Post.astro b/src/layouts/Post.astro index 1c6684a..0257f15 100644 --- a/src/layouts/Post.astro +++ b/src/layouts/Post.astro @@ -1,10 +1,13 @@ --- +import config from '@/config' import Base from './Base.astro' -const { title } = Astro.props +const { frontmatter } = Astro.props --- -

Post: {title}

- +
+

{frontmatter.title}

+ +
diff --git a/src/materiale/dispensa-1.pdf b/src/materiale/dispensa-1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3c57e767f926062c37aeef56fdf7b91f491babc2 GIT binary patch literal 27503 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 KG7(u(xc>#w&GE(n literal 0 HcmV?d00001 diff --git a/src/pages/appunti/index.astro b/src/pages/appunti/index.astro new file mode 100644 index 0000000..2e6323d --- /dev/null +++ b/src/pages/appunti/index.astro @@ -0,0 +1,44 @@ +--- +import Base from '@/layouts/Base.astro' +import config from '@/config' +--- + + +
+

Appunti

+ +
+

Corso 1

+

+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Quod beatae, alias vitae assumenda quia + corporis quos natus laboriosam illo consectetur. Praesentium explicabo vitae assumenda saepe impedit + commodi iusto. Enim harum perspiciatis quae ea nihil iusto saepe cum! Doloribus, ullam dolorum. +

+

+ Scarica +

+
+
+

Corso 2

+

+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Quod beatae, alias vitae assumenda quia + corporis quos natus laboriosam illo consectetur. Praesentium explicabo vitae assumenda saepe impedit + commodi iusto. Enim harum perspiciatis quae ea nihil iusto saepe cum! Doloribus, ullam dolorum. +

+

+ Scarica +

+
+
+

Corso 3

+

+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Quod beatae, alias vitae assumenda quia + corporis quos natus laboriosam illo consectetur. Praesentium explicabo vitae assumenda saepe impedit + commodi iusto. Enim harum perspiciatis quae ea nihil iusto saepe cum! Doloribus, ullam dolorum. +

+

+ Scarica +

+
+
+ diff --git a/src/pages/index.astro b/src/pages/index.astro index a6bf2ba..bc7e5bb 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,7 +1,43 @@ --- -import Base from '../layouts/Base.astro' +import Base from '@/layouts/Base.astro' +import type { MarkdownInstance } from 'astro' +import type { PostFrontmatter } from '@/config' +import config from '@/config' +import PostCard from '@/components/PostCard.astro' + +const posts = import.meta.glob>('./posts/*.md', { eager: true }) --- -

Homepage

+
+
+

Ciao!

+

+ Benvenuto sulla pagina poisson di {config.title}, il mio blog personale. Qui troverai + articoli su vari argomenti, appunti di studio e molto altro. +

+
+

Post Recenti

+
+ { + Object.values(posts) + .filter(post => !post.frontmatter.draft) + .toSorted((a, b) => { + return ( + new Date(b.frontmatter.publishDate).getTime() - + new Date(a.frontmatter.publishDate).getTime() + ) + }) + .slice(0, 3) + .map(post => ( + + )) + } +
+
diff --git a/src/pages/posts/first-post.md b/src/pages/posts/first-post.md index 468f1fc..3d00e06 100644 --- a/src/pages/posts/first-post.md +++ b/src/pages/posts/first-post.md @@ -1,7 +1,7 @@ --- -layout: ../../layouts/Post.astro +layout: '@/layouts/Post.astro' title: This is the first post of my new Astro blog. -pubDate: 2023-12-23 +publishDate: 2025-06-04 description: | Lorem ipsum dolor sit amet consectetur, adipisicing elit. Animi, obcaecati quos. Odit fugiat exercitationem cupiditate adipisci ipsa praesentium @@ -10,20 +10,19 @@ description: | tags: ['tag1', 'tag2', 'tag3', 'tag4'] --- -This is a paragraph. Lorem ipsum dolor sit amet consectetur adipisicing elit. -Tenetur vero esse non molestias eos excepturi, inventore atque cupiditate. Sed -voluptatem quas omnis culpa, et odit. +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. +Praesent libero $\sum_{i=1}^{n} i^2 = \frac{n(n+1)(2n+1)}{6}$ +Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum +imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue -Lorem ipsum dolor sit amet consectetur adipisicing elit. Tenetur vero esse non -molestias eos excepturi, inventore atque cupiditate. Sed voluptatem quas omnis -culpa, et odit. +$$ +\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi} +$$ -Lorem ipsum dolor sit amet consectetur adipisicing elit. Tenetur vero esse non +neque. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales,lorem ipsum dolor sit amet consectetur adipisicing elit. Tenetur vero esse non molestias eos excepturi, inventore atque cupiditate. Sed voluptatem quas omnis culpa, et odit. -## Headings - # H1 For example Lorem ipsum dolor sit amet consectetur adipisicing elit. Tenetur vero esse non @@ -60,19 +59,6 @@ Lorem ipsum dolor sit amet consectetur adipisicing elit. Tenetur vero esse non molestias eos excepturi, inventore atque cupiditate. Sed voluptatem quas omnis culpa, et odit. -## Latex and Math - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. -Praesent libero $\sum_{i=1}^{n} i^2 = \frac{n(n+1)(2n+1)}{6}$ -Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum -imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue - -$$ -\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi} -$$ - -neque. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, - ## Emphasis Emphasis, aka italics, with _asterisks_ or _underscores_. diff --git a/src/pages/posts/index.astro b/src/pages/posts/index.astro new file mode 100644 index 0000000..1c68a32 --- /dev/null +++ b/src/pages/posts/index.astro @@ -0,0 +1,36 @@ +--- +import Base from '@/layouts/Base.astro' +import type { MarkdownInstance } from 'astro' +import type { PostFrontmatter } from '@/config' +import config from '@/config' +import PostCard from '@/components/PostCard.astro' + +const posts = import.meta.glob>('./*.md', { eager: true }) +--- + + +
+

Archivio Post

+
+ { + Object.values(posts) + .filter(post => !post.frontmatter.draft) + .toSorted((a, b) => { + return ( + new Date(b.frontmatter.publishDate).getTime() - + new Date(a.frontmatter.publishDate).getTime() + ) + }) + .slice(0, 3) + .map(post => ( + + )) + } +
+
+ diff --git a/src/style.css b/src/style.css new file mode 100644 index 0000000..ca2695c --- /dev/null +++ b/src/style.css @@ -0,0 +1,5 @@ +@layer base, typography, components, utilities; + +/* @import url(@/themes/base.css); */ +/* @import url(@/themes/colorful.css); */ +@import url(@/themes/mono.css); diff --git a/src/themes/base.css b/src/themes/base.css new file mode 100644 index 0000000..64d687e --- /dev/null +++ b/src/themes/base.css @@ -0,0 +1,437 @@ +:root { + --heading-base-size: 18px; + --heading-scale-factor: 1.33; +} + +@media screen and (max-width: 768px) { + :root { + --heading-base-size: 16px; + --heading-scale-factor: 1.25; + } +} + +@layer base { + *, + *::before, + *::after { + font-family: inherit; + margin: 0; + box-sizing: border-box; + } + + html, + body { + min-height: 100%; + + font-size: 16px; + line-height: 1.75; + + /* os independent font stack */ + font-family: + -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Inter', 'Open Sans', + 'Helvetica Neue', sans-serif; + } + + body { + background: var(--bg, #fff); + padding: 0; + margin: 0; + } +} + +@layer typography { + body { + color: var(--text-fg, #333); + } + + h1, + h2, + h3, + h4, + h5, + h6 { + line-height: 1; + margin-top: 0.75em; + + @media screen and (max-width: 768px) { + margin-top: 1em; + } + } + + h1 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 5)); + font-weight: 600; + } + h2 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 4)); + font-weight: 600; + } + h3 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 3)); + font-weight: 600; + } + h4 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 2)); + font-weight: 600; + } + h5 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 1)); + font-weight: 600; + } + h6 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 0)); + font-weight: 600; + } + + p, + ul, + ol, + blockquote, + li, + pre, + table, + figure { + margin: 1rem 0; + } + + ul, + ol { + padding-left: 1.5rem; + } + + ol { + list-style-type: lower-roman; + } +} + +@layer components { + blockquote { + padding: 0.5rem 1rem; + border-left: var(--blockquote-border, 4px solid #ccc); + background: var(--blockquote-bg, #f9f9f9); + font-style: italic; + border-top-right-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; + } + + a { + color: var(--link-color, #007bff); + text-decoration: none; + + &:hover, + &:focus { + text-decoration: 2px solid underline; + } + } + + pre:not(:has(.katex)), + code { + font-family: 'Courier New', Courier, monospace; + background: var(--code-bg, #f5f5f5) !important; + border-radius: 0.5rem; + font-size: 95%; + } + + pre:not(:has(.katex)) { + padding: 0.5rem; + line-height: 1.35; + } + + header { + width: 100%; + max-width: 60rem; + position: absolute; + top: 1rem; + left: 50%; + transform: translateX(-50%); + + display: grid; + grid-template-columns: auto 1fr auto auto; + align-items: center; + + border: var(--header-border, 1px solid #ccc); + border-radius: var(--header-border-radius, 1rem); + padding: var(--header-padding, 0.5rem); + + > h1 { + justify-self: start; + + display: grid; + place-content: center; + + font-size: 1.5rem; + font-weight: 600; + margin: 0; + + padding: 0 0.5rem; + + > a { + color: inherit; + text-decoration: none; + } + } + + /* Hide hamburger menu elements on desktop */ + .hamburger-toggle { + display: none; + } + + .hamburger-icon { + display: none; + flex-direction: column; + cursor: pointer; + padding: 0.5rem; + gap: 0.25rem; + + span { + width: 1.5rem; + height: 0.125rem; + background-color: var(--text-fg, #333); + transition: all 0.3s ease; + border-radius: 0.125rem; + } + } + + > nav { + justify-self: end; + + display: grid; + grid-auto-flow: column; + gap: 1rem; + + > .nav-item { + display: grid; + + > a { + text-decoration: none; + color: inherit; + font-weight: 500; + border-radius: 0.5rem; + padding: 0.5rem 1rem; + + &:hover, + &:focus { + /* text-decoration: 2px solid underline; */ + background-color: var(--nav-hover-bg-color, #f0f0f0); + } + } + } + } + + /* Responsive header styles */ + @media (max-width: 1024px) and (min-width: 769px) { + max-width: 90%; + margin: 0 auto; + } + + @media (max-width: 768px) { + position: fixed; + top: 0; + left: 0; + right: 0; + transform: none; + max-width: none; + width: 100%; + border-radius: 0; + border: none; + border-bottom: var(--header-border, 1px solid #ccc); + background-color: var(--background-color, #fff); + z-index: 1000; + grid-template-columns: auto 1fr auto; + padding: 1rem; + + > h1 { + font-size: 1.25rem; + padding: 0; + } + + /* Show hamburger icon on mobile */ + .hamburger-icon { + display: flex; + z-index: 1001; + } + + /* Animate hamburger icon when menu is open */ + .hamburger-toggle:checked + .hamburger-icon span:nth-child(1) { + transform: rotate(45deg) translate(0.15rem, 0.375rem); + } + + .hamburger-toggle:checked + .hamburger-icon span:nth-child(2) { + opacity: 0; + } + + .hamburger-toggle:checked + .hamburger-icon span:nth-child(3) { + transform: rotate(-45deg) translate(0.15rem, -0.375rem); + } + + /* Mobile navigation */ + > nav { + position: fixed; + top: 0; + right: -100%; + width: 80%; + max-width: 300px; + height: 100vh; + background-color: var(--background-color, #fff); + border-left: var(--header-border, 1px solid #ccc); + transition: right 0.3s ease; + z-index: 999; + + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: stretch; + gap: 0; + padding-top: 54px; + + > .nav-item { + display: block; + border-bottom: var(--header-border, 1px solid #ccc); + + &:first-child { + border-top: var(--header-border, 1px solid #ccc); + } + + > a { + display: block; + padding: 1rem 1.5rem; + border-radius: 0; + font-size: 1.1rem; + + &:hover, + &:focus { + background-color: var(--nav-hover-bg-color, #f0f0f0); + } + } + } + } + + /* Show navigation when checkbox is checked */ + .hamburger-toggle:checked ~ nav { + right: 0; + } + + /* Overlay when menu is open */ + .hamburger-toggle:checked::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + z-index: 998; + } + } + + @media (max-width: 480px) { + padding: 0.75rem; + + > h1 { + font-size: 1.1rem; + } + + > nav { + width: 90%; + max-width: none; + } + } + } + + main, + article { + max-width: 52rem; + margin: 9rem auto; + + /* Responsive main/article styles */ + @media (max-width: 1024px) and (min-width: 769px) { + max-width: 90%; + padding: 0 1rem; + } + + @media (max-width: 768px) { + margin-top: 6rem; + padding: 0 1rem; + max-width: none; + } + + @media (max-width: 480px) { + margin-top: 5rem; + padding: 0 0.75rem; + } + } + + .card { + display: grid; + grid-auto-flow: row; + gap: 0.5rem; + + padding: 1rem; + border: var(--header-border, 1px solid #ccc); + border-radius: 0.5rem; + background: var(--card-bg, #fff); + + .title { + font-size: 1.25rem; + font-weight: 600; + } + + .date { + font-size: 0.875rem; + color: var(--text-fg-dimmed, #666); + } + + .description { + font-size: 1rem; + color: var(--text-fg, #333); + } + + &:hover { + background: var(--card-hover-bg, #f0f0f0); + } + + @media (max-width: 480px) { + padding: 0.75rem; + } + } + + .card-list { + display: grid; + grid-auto-flow: row; + gap: 1rem; + margin: 1rem 0; + } + + .jumbotron { + height: 50vh; + display: grid; + place-content: center; + text-align: center; + + p { + max-width: 40ch; + } + + /* Responsive jumbotron */ + @media (max-width: 768px) { + height: 40vh; + padding: 0 1rem; + + h1 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 3)); + } + + h2 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 2)); + } + } + + @media (max-width: 480px) { + height: 35vh; + + h1 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 2)); + } + } + } +} diff --git a/src/themes/colorful.css b/src/themes/colorful.css new file mode 100644 index 0000000..05957b3 --- /dev/null +++ b/src/themes/colorful.css @@ -0,0 +1,534 @@ +:root { + --heading-base-size: 18px; + --heading-scale-factor: 1.33; + + /* Colorful theme colors */ + --bg: linear-gradient(135deg, #f8f9ff 0%, #fff5f5 50%, #f0fff4 100%); + --text-fg: #2d3748; + --text-fg-dimmed: #4a5568; + --link-color: #3182ce; + --blockquote-border: 4px solid #ed8936; + --blockquote-bg: linear-gradient(135deg, #fff5f0 0%, #fef5e7 100%); + --code-bg: linear-gradient(135deg, #edf2f7 0%, #e2e8f0 100%); + --header-border: 1px solid #cbd5e0; + --header-border-radius: 1rem; + --header-padding: 0.5rem; + --background-color: #ffffff; + --card-bg: linear-gradient(135deg, #ffffff 0%, #f7fafc 100%); + --card-hover-bg: linear-gradient(135deg, #edf2f7 0%, #e2e8f0 100%); +} + +@media screen and (max-width: 768px) { + :root { + --heading-base-size: 16px; + --heading-scale-factor: 1.25; + } +} + +@layer base { + *, + *::before, + *::after { + font-family: inherit; + margin: 0; + box-sizing: border-box; + } + + html, + body { + min-height: 100%; + + font-size: 16px; + line-height: 1.75; + + /* os independent font stack */ + font-family: + -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Inter', 'Open Sans', + 'Helvetica Neue', sans-serif; + } + + body { + background: var(--bg, #fff); + padding: 0; + margin: 0; + } +} + +@layer typography { + body { + color: var(--text-fg, #333); + } + + h1, + h2, + h3, + h4, + h5, + h6 { + line-height: 1; + margin-top: 0.75em; + + @media screen and (max-width: 768px) { + margin-top: 1em; + } + } + + h1 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 5)); + font-weight: 600; + } + h2 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 4)); + font-weight: 600; + } + h3 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 3)); + font-weight: 600; + } + h4 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 2)); + font-weight: 600; + } + h5 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 1)); + font-weight: 600; + } + h6 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 0)); + font-weight: 600; + } + + p, + ul, + ol, + blockquote, + li, + pre, + table, + figure { + margin: 1rem 0; + } + + ul, + ol { + padding-left: 1.5rem; + } + + ol { + list-style-type: lower-roman; + } +} + +@layer components { + blockquote { + padding: 0.5rem 1rem; + border-left: var(--blockquote-border, 4px solid #ccc); + background: var(--blockquote-bg, #f9f9f9); + font-style: italic; + border-top-right-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; + box-shadow: 0 2px 4px rgba(237, 137, 54, 0.1); + } + + a { + color: var(--link-color, #007bff); + text-decoration: none; + + &:hover, + &:focus { + text-decoration: 2px solid underline; + color: #2b6cb0; + } + } + + pre:not(:has(.katex)), + code { + font-family: 'Courier New', Courier, monospace; + border-radius: 0.5rem; + font-size: 95%; + } + + pre:not(:has(.katex)) { + padding: 0.5rem; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + border: 1px solid #cbd5e0; + background: var(--code-bg, #f5f5f5) !important; + line-height: 1.35; + } + + header { + width: 100%; + max-width: 60rem; + position: absolute; + top: 1rem; + left: 50%; + transform: translateX(-50%); + + display: grid; + grid-template-columns: auto 1fr auto auto; + align-items: center; + + border: 2px solid transparent; + background: + linear-gradient(135deg, #ffffff 0%, #f7fafc 50%, #edf2f7 100%) padding-box, + linear-gradient(135deg, #667eea 0%, #764ba2 25%, #f093fb 50%, #f5576c 75%, #4facfe 100%) border-box; + border-radius: var(--header-border-radius, 1rem); + padding: var(--header-padding, 0.5rem); + box-shadow: + 0 8px 25px rgba(102, 126, 234, 0.15), + 0 4px 10px rgba(118, 75, 162, 0.1), + inset 0 1px 0 rgba(255, 255, 255, 0.5); + + position: relative; + + &::before { + content: ''; + position: absolute; + top: -2px; + left: -2px; + right: -2px; + bottom: -2px; + background: linear-gradient(135deg, #667eea 0%, #764ba2 25%, #f093fb 50%, #f5576c 75%, #4facfe 100%); + border-radius: inherit; + z-index: -1; + opacity: 0.8; + } + + > h1 { + justify-self: start; + + display: grid; + place-content: center; + + font-size: 1.5rem; + font-weight: 700; + margin: 0; + + padding: 0.75rem 1.25rem; + + position: relative; + border-radius: 0.75rem; + + > a { + color: inherit; + text-decoration: none; + position: relative; + z-index: 1; + } + } + + /* Hide hamburger menu elements on desktop */ + .hamburger-toggle { + display: none; + } + + .hamburger-icon { + display: none; + flex-direction: column; + cursor: pointer; + padding: 0.75rem; + gap: 0.25rem; + border-radius: 0.5rem; + background: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, rgba(118, 75, 162, 0.1) 100%); + + span { + width: 1.5rem; + height: 0.125rem; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + border-radius: 0.125rem; + box-shadow: 0 1px 2px rgba(102, 126, 234, 0.3); + } + } + + > nav { + justify-self: end; + + display: grid; + grid-auto-flow: column; + gap: 0.5rem; + + > .nav-item { + display: grid; + + > a { + padding: 0.5rem 1rem; + border-radius: 0.5rem; + background: linear-gradient(135deg, #e6fffa 0%, #f0fff4 100%); + border: 1px solid #81e6d9; + color: var(--text-fg); + font-weight: 500; + text-decoration: none; + + &:hover, + &:focus { + background: linear-gradient(135deg, #b2f5ea 0%, #c6f6d5 100%); + border-color: #38b2ac; + text-decoration: none; + } + } + } + } + + /* Responsive header styles */ + @media (max-width: 1024px) and (min-width: 769px) { + max-width: 90%; + margin: 0 auto; + } + + @media (max-width: 768px) { + position: fixed; + top: 0; + left: 0; + right: 0; + transform: none; + max-width: none; + width: 100%; + border-radius: 0; + border: none; + border-bottom: 2px solid transparent; + background: + linear-gradient(135deg, #ffffff 0%, #f7fafc 100%) padding-box, + linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%) border-box; + z-index: 1000; + grid-template-columns: auto 1fr auto; + padding: 1rem; + + &::before { + display: none; + } + + > h1 { + font-size: 1.25rem; + padding: 0.5rem 1rem; + + &::before, + &::after { + border-radius: 0.5rem; + } + + &::after { + top: 1px; + left: 1px; + right: 1px; + bottom: 1px; + border-radius: calc(0.5rem - 1px); + } + } + + /* Show hamburger icon on mobile */ + .hamburger-icon { + display: flex; + z-index: 1001; + } + + /* Animate hamburger icon when menu is open */ + .hamburger-toggle:checked + .hamburger-icon span:nth-child(1) { + transform: rotate(45deg) translate(0.15rem, 0.375rem); + } + + .hamburger-toggle:checked + .hamburger-icon span:nth-child(2) { + opacity: 0; + } + + .hamburger-toggle:checked + .hamburger-icon span:nth-child(3) { + transform: rotate(-45deg) translate(0.15rem, -0.375rem); + } + + /* Mobile navigation */ + > nav { + position: fixed; + top: 0; + right: -100%; + width: 80%; + max-width: 300px; + height: 100vh; + background: + linear-gradient(180deg, #ffffff 0%, #f7fafc 50%, #edf2f7 100%), + linear-gradient(135deg, rgba(102, 126, 234, 0.05) 0%, rgba(118, 75, 162, 0.05) 100%); + border-left: 2px solid transparent; + background-clip: padding-box; + z-index: 999; + backdrop-filter: blur(10px); + box-shadow: -4px 0 20px rgba(102, 126, 234, 0.15); + + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: stretch; + gap: 0; + padding-top: 54px; + + > .nav-item { + margin: 0.5rem; + + > a { + display: block; + padding: 1rem 1.5rem; + border-bottom: 1px solid rgba(226, 232, 240, 0.5); + border-radius: 0.75rem; + margin-bottom: 0.5rem; + background: linear-gradient(135deg, rgba(230, 255, 250, 0.3) 0%, rgba(240, 255, 244, 0.3) 100%); + + &:hover, + &:focus { + background: linear-gradient(135deg, #e6fffa 0%, #f0fff4 100%); + transform: translateX(4px); + box-shadow: 0 2px 8px rgba(129, 230, 217, 0.3); + } + } + } + } + + /* Show navigation when checkbox is checked */ + .hamburger-toggle:checked ~ nav { + right: 0; + } + + /* Overlay when menu is open */ + .hamburger-toggle:checked::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + z-index: 998; + } + } + + @media (max-width: 480px) { + padding: 0.75rem; + + > h1 { + font-size: 1.1rem; + } + + > nav { + width: 90%; + max-width: none; + } + } + } + + main, + article { + max-width: 52rem; + margin: 9rem auto; + + /* Responsive main/article styles */ + @media (max-width: 1024px) and (min-width: 769px) { + max-width: 90%; + padding: 0 1rem; + } + + @media (max-width: 768px) { + margin-top: 6rem; + padding: 0 1rem; + max-width: none; + } + + @media (max-width: 480px) { + margin-top: 5rem; + padding: 0 0.75rem; + } + } + + .card { + display: grid; + grid-auto-flow: row; + gap: 0.5rem; + + padding: 1rem; + border: 1px solid #cbd5e0; + border-radius: 0.5rem; + background: var(--card-bg, #fff); + box-shadow: + 0 1px 3px rgba(0, 0, 0, 0.1), + 0 1px 2px rgba(0, 0, 0, 0.06); + + .title { + font-size: 1.25rem; + font-weight: 600; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } + + .date { + font-size: 0.875rem; + color: var(--text-fg-dimmed, #666); + } + + .description { + font-size: 1rem; + color: var(--text-fg, #333); + } + + &:hover { + background: var(--card-hover-bg, #f0f0f0); + box-shadow: + 0 4px 6px rgba(0, 0, 0, 0.07), + 0 2px 4px rgba(0, 0, 0, 0.06); + border-color: #a0aec0; + } + + @media (max-width: 480px) { + padding: 0.75rem; + } + } + + .card-list { + display: grid; + grid-auto-flow: row; + gap: 1rem; + margin: 1rem 0; + } + + .jumbotron { + height: 50vh; + display: grid; + place-content: center; + text-align: center; + background: linear-gradient(135deg, #ffecd2 0%, #fcb69f 25%, #a8edea 50%, #fed6e3 75%, #d299c2 100%); + border-radius: 1rem; + margin: 2rem 0; + + h1, + h2 { + background: linear-gradient(135deg, #2d3748 0%, #4a5568 100%); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } + + p { + max-width: 40ch; + color: var(--text-fg); + } + + /* Responsive jumbotron */ + @media (max-width: 768px) { + height: 40vh; + padding: 0 1rem; + margin: 1rem; + + h1 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 3)); + } + + h2 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 2)); + } + } + + @media (max-width: 480px) { + height: 35vh; + + h1 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 2)); + } + } + } +} diff --git a/src/themes/mono.css b/src/themes/mono.css new file mode 100644 index 0000000..4d3def4 --- /dev/null +++ b/src/themes/mono.css @@ -0,0 +1,478 @@ +/* filepath: /home/aziis98/Develop/PHC/theme-poisson-blog/src/themes/mono.css */ + +:root { + --heading-base-size: 18px; + --heading-scale-factor: 1.33; + + /* Minimal monospace theme colors */ + --bg: #fafafa; + --text-fg: #1a1a1a; + --text-fg-dimmed: #666666; + --link-color: #df3131; /* Cornflower Blue */ + --blockquote-border: 3px solid #333333; + --blockquote-bg: #f5f5f5; + --code-bg: #f0f0f0; + --header-border: 1px solid #e0e0e0; + --header-border-radius: 0; + --header-padding: 1rem; + --background-color: #fafafa; + --card-bg: #ffffff; + --card-hover-bg: #f5f5f5; +} + +@media screen and (max-width: 768px) { + :root { + --heading-base-size: 16px; + --heading-scale-factor: 1.25; + } +} + +@layer base { + *, + *::before, + *::after { + font-family: inherit; + margin: 0; + box-sizing: border-box; + } + + html, + body { + min-height: 100%; + + font-size: 16px; + line-height: 1.75; + + /* monospace font stack */ + font-family: + 'SF Mono', Monaco, 'Inconsolata', 'Roboto Mono', 'Source Code Pro', 'Courier New', Courier, monospace; + } + + body { + background: var(--bg, #fff); + padding: 0; + margin: 0; + } +} + +@layer typography { + body { + color: var(--text-fg, #333); + } + + h1, + h2, + h3, + h4, + h5, + h6 { + line-height: 1; + margin-top: 0.75em; + + @media screen and (max-width: 768px) { + margin-top: 1em; + } + } + + h1 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 5)); + font-weight: 600; + } + h2 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 4)); + font-weight: 600; + } + h3 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 3)); + font-weight: 600; + } + h4 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 2)); + font-weight: 600; + } + h5 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 1)); + font-weight: 600; + } + h6 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 0)); + font-weight: 600; + } + + p, + ul, + ol, + blockquote, + li, + pre, + table, + figure { + margin: 1rem 0; + } + + ul, + ol { + padding-left: 1.5rem; + } + + ol { + list-style-type: lower-roman; + } +} + +@layer components { + blockquote { + padding: 0.5rem 1rem; + border-left: var(--blockquote-border, 4px solid #ccc); + background: var(--blockquote-bg, #f9f9f9); + font-style: italic; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin: 1.5rem 0; + } + + a { + color: var(--link-color, #007bff); + text-decoration: underline; + text-decoration-thickness: 2px; + text-underline-offset: 2px; + + &:hover, + &:focus { + text-decoration-thickness: 3px; + text-decoration-color: var(--link-color); + } + } + + pre:not(:has(.katex)), + code { + font-family: inherit; + background: var(--code-bg, #f5f5f5) !important; + border-radius: 0; + font-size: 95%; + border: 1px solid #e0e0e0; + } + + pre:not(:has(.katex)) { + padding: 0.5rem; + line-height: 1.35; + overflow-x: auto; + } + + header { + width: 100%; + max-width: 60rem; + position: absolute; + top: 1rem; + left: 50%; + transform: translateX(-50%); + + display: grid; + grid-template-columns: auto 1fr auto auto; + align-items: center; + + border: var(--header-border, 1px solid #ccc); + border-radius: var(--header-border-radius, 0); + padding: var(--header-padding, 1rem); + background: var(--background-color, #fafafa); + + > h1 { + justify-self: start; + + display: grid; + place-content: center; + + font-size: 1.5rem; + font-weight: 700; + margin: 0; + padding: 0 0.5rem; + text-transform: uppercase; + letter-spacing: 1px; + + > a { + color: inherit; + text-decoration: none; + } + } + + /* Hide hamburger menu elements on desktop */ + .hamburger-toggle { + display: none; + } + + .hamburger-icon { + display: none; + flex-direction: column; + cursor: pointer; + padding: 0.5rem; + gap: 0.25rem; + + span { + width: 1.5rem; + height: 0.125rem; + background-color: var(--text-fg, #333); + border-radius: 0; + } + } + + > nav { + justify-self: end; + + display: grid; + grid-auto-flow: column; + gap: 2rem; + + > .nav-item { + display: grid; + + > a { + text-decoration: none; + padding: 0.5rem 0; + border-radius: 0; + background: transparent; + border: none; + color: var(--text-fg); + font-weight: 500; + text-transform: uppercase; + font-size: 0.875rem; + letter-spacing: 0.5px; + border-bottom: 2px solid transparent; + + &:hover, + &:focus { + border-bottom-color: var(--text-fg); + text-decoration: none; + } + } + } + } + + /* Responsive header styles */ + @media (max-width: 1024px) and (min-width: 769px) { + max-width: 90%; + margin: 0 auto; + } + + @media (max-width: 768px) { + position: fixed; + top: 0; + left: 0; + right: 0; + transform: none; + max-width: none; + width: 100%; + border-radius: 0; + border: none; + border-bottom: var(--header-border, 1px solid #ccc); + background-color: var(--background-color, #fafafa); + z-index: 1000; + grid-template-columns: auto 1fr auto; + padding: 1rem; + + > h1 { + font-size: 1.25rem; + padding: 0; + } + + /* Show hamburger icon on mobile */ + .hamburger-icon { + display: flex; + z-index: 1001; + } + + /* Animate hamburger icon when menu is open */ + .hamburger-toggle:checked + .hamburger-icon span:nth-child(1) { + transform: rotate(45deg) translate(0.15rem, 0.375rem); + } + + .hamburger-toggle:checked + .hamburger-icon span:nth-child(2) { + opacity: 0; + } + + .hamburger-toggle:checked + .hamburger-icon span:nth-child(3) { + transform: rotate(-45deg) translate(0.15rem, -0.375rem); + } + + /* Mobile navigation */ + > nav { + position: fixed; + top: 0; + right: -100%; + width: 80%; + max-width: 300px; + height: 100vh; + background-color: var(--background-color, #fafafa); + border-left: var(--header-border, 1px solid #ccc); + z-index: 999; + + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: stretch; + gap: 0; + padding-top: 54px; + + > .nav-item { + margin: 0; + + > a { + display: block; + padding: 1rem 1.5rem; + border-bottom: 1px solid #e0e0e0; + border-radius: 0; + + &:hover, + &:focus { + background: var(--card-hover-bg, #f5f5f5); + border-bottom-color: var(--text-fg); + } + } + } + } + + /* Show navigation when checkbox is checked */ + .hamburger-toggle:checked ~ nav { + right: 0; + } + + /* Overlay when menu is open */ + .hamburger-toggle:checked::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + z-index: 998; + } + } + + @media (max-width: 480px) { + padding: 0.75rem; + + > h1 { + font-size: 1.1rem; + } + + > nav { + width: 90%; + max-width: none; + } + } + } + + main, + article { + max-width: 52rem; + margin: 9rem auto; + + /* Responsive main/article styles */ + @media (max-width: 1024px) and (min-width: 769px) { + max-width: 90%; + padding: 0 1rem; + } + + @media (max-width: 768px) { + margin-top: 6rem; + padding: 0 1rem; + max-width: none; + } + + @media (max-width: 480px) { + margin-top: 5rem; + padding: 0 0.75rem; + } + } + + .card { + display: grid; + grid-auto-flow: row; + gap: 0.5rem; + + padding: 1rem; + border: 1px solid #e0e0e0; + border-radius: 0; + background: var(--card-bg, #fff); + + .title { + font-size: 1.25rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + } + + .date { + font-size: 0.875rem; + color: var(--text-fg-dimmed, #666); + text-transform: uppercase; + letter-spacing: 0.5px; + } + + .description { + font-size: 1rem; + color: var(--text-fg, #333); + } + + &:hover { + background: var(--card-hover-bg, #f5f5f5); + border-color: var(--text-fg); + } + + @media (max-width: 480px) { + padding: 0.75rem; + } + } + + .card-list { + display: grid; + grid-auto-flow: row; + gap: 1rem; + margin: 1rem 0; + } + + .jumbotron { + height: 50vh; + display: grid; + place-content: center; + text-align: center; + border: 4px solid var(--text-fg); + margin: 2rem 0; + + h1, + h2 { + text-transform: uppercase; + letter-spacing: 1px; + } + + p { + max-width: 40ch; + text-transform: uppercase; + letter-spacing: 0.5px; + font-size: 1rem; + } + + /* Responsive jumbotron */ + @media (max-width: 768px) { + height: 40vh; + padding: 0 1rem; + margin: 1rem; + + h1 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 3)); + } + + h2 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 2)); + } + } + + @media (max-width: 480px) { + height: 35vh; + + h1 { + font-size: calc(var(--heading-base-size) * pow(var(--heading-scale-factor), 2)); + } + } + } +}