diff --git a/.github/workflows/default.yaml b/.github/workflows/default.yaml new file mode 100644 index 0000000..09d55d2 --- /dev/null +++ b/.github/workflows/default.yaml @@ -0,0 +1,48 @@ +name: Deploy to GitHub Pages + +on: + push: + branches: [ main ] + +permissions: + contents: read + pages: write + id-token: write + +jobs: + build: + steps: + - name: Checkout your repository using git + uses: actions/checkout@v4 + - name: 🗳️ Setup pnpm cache + uses: https://github.com/actions/cache@v3 + with: + path: ${{ env.PNPM_STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ env.PNPM_CACHE_ID }} + restore-keys: | + ${{ runner.os }}-pnpm-store + - name: Install, build, and upload your site + uses: withastro/action@v2 + # with: + # path: . # The root location of your Astro project inside the repository. (optional) + # node-version: 20 # The specific version of Node that should be used to build your site. Defaults to 20. (optional) + # package-manager: pnpm@latest # The Node package manager that should be used to install dependencies and build your site. Automatically detected based on your lockfile. (optional) + + deploy: + needs: build + runs-on: ubuntu-latest + steps: + + - name: 🚀 Deploy files via SFTP + uses: https://github.com/pressidium/lftp-mirror-action@v1 + with: + host: ${{ secrets.FTP_HOST }} + port: ${{ secrets.FTP_PORT || 21 }} + user: ${{ secrets.FTP_USERNAME }} + pass: ${{ secrets.FTP_PASSWORD }} + onlyNewer: true + parallel: '4' + settings: 'sftp:auto-confirm=yes' + localDir: 'public' + remoteDir: '/share' + options: '--verbose' diff --git a/public/app.css b/public/app.css index 96da8cb..dbf5d07 100644 --- a/public/app.css +++ b/public/app.css @@ -9,16 +9,21 @@ h3 { font-family: 'Roboto', sans-serif; } -article h2 { +article>h2 { font-size: 24px; margin-top: 20px; } -article h3 { +article>h3 { font-size: 20px; margin-top: 16px; } +article>p>a, +article a { + color: var(--fill) !important; +} + :root { --neutral-1000: #000000; --neutral-800: #16161E; diff --git a/src/components/GoogleyEye.svelte b/src/components/GoogleyEye.svelte index b6d4708..13ea1f8 100644 --- a/src/components/GoogleyEye.svelte +++ b/src/components/GoogleyEye.svelte @@ -92,8 +92,7 @@
($visible = !$visible)} - role="button" - tabindex="0" + role="img" aria-label="Toggle Googley Eyes" aria-hidden="true" on:keydown={(ev) => (ev.key === "Enter" ? ($visible = !$visible) : "")} diff --git a/src/components/HeroCard.astro b/src/components/HeroCard.astro index 30170df..b97b040 100644 --- a/src/components/HeroCard.astro +++ b/src/components/HeroCard.astro @@ -1,7 +1,7 @@ --- import markdownToText from "@helpers/markdownToText"; import { Card } from "./card"; -import { useTranslatedPath } from "@i18n/utils"; +import { useTranslatedPath, useTranslations } from "@i18n/utils"; import Image from "@components/Image.astro"; interface Props { @@ -25,6 +25,7 @@ const { } = Astro.props.post; const translatePath = useTranslatedPath(Astro); +const t = useTranslations(Astro); const imagePath = `../content/${collection}/${slug.split("/")[0]}/${headerImg}`; @@ -44,7 +45,7 @@ const link = translatePath(`/${collection}/${slug.split("/")[0]}`); {markdownToText(body).slice(0, 200)} - + { image?.format && ( diff --git a/src/components/Image.astro b/src/components/Image.astro index 17f7172..b2028c8 100644 --- a/src/components/Image.astro +++ b/src/components/Image.astro @@ -11,8 +11,6 @@ interface Props { const { src: image, alt, maxWidth } = Astro.props; -console.log({ image, alt, maxWidth }); - const sizes = [ { width: 240, diff --git a/src/components/Nav.astro b/src/components/Nav.astro index 15cff39..f5c9e29 100644 --- a/src/components/Nav.astro +++ b/src/components/Nav.astro @@ -1,6 +1,7 @@ --- import { useTranslations, useTranslatedPath } from "../i18n/utils"; import Logo from "./Logo.astro"; +import ToggleTheme from "@components/ThemeToggle.svelte"; function isActive(path: string) { return Astro.url.pathname === path ? "active" : ""; @@ -10,10 +11,6 @@ const t = useTranslations(Astro); const translatePath = useTranslatedPath(Astro); const paths = [ - { - link: translatePath("/"), - component: Logo, - }, { link: translatePath("/blog"), text: t("nav.blog"), @@ -33,16 +30,26 @@ const paths = [ ]; --- -
    + diff --git a/src/components/ThemeToggle.svelte b/src/components/ThemeToggle.svelte new file mode 100644 index 0000000..b9eebfe --- /dev/null +++ b/src/components/ThemeToggle.svelte @@ -0,0 +1,59 @@ + + + diff --git a/src/content/photos/sestri-levante/index.mdx b/src/content/photos/sestri-levante/index.mdx index a986c8e..c8e4fca 100644 --- a/src/content/photos/sestri-levante/index.mdx +++ b/src/content/photos/sestri-levante/index.mdx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e1f1fc05fb83cd1ef9f0b272dddae7be03c2b4c5d96ae0c44153dd44c75f771c -size 933 +oid sha256:8884466d19e91b63b245758e15a7caba0165f2032e345fada7097c03d52f4110 +size 957 diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index bc56050..3eff277 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -72,7 +72,7 @@ const { title, width = "compact" } = Astro.props;
    -
    +
    diff --git a/src/pages/projects/index.astro b/src/pages/projects/index.astro index 715e2d3..90f379b 100644 --- a/src/pages/projects/index.astro +++ b/src/pages/projects/index.astro @@ -7,7 +7,9 @@ import HeroCard from "@components/HeroCard.astro"; const locale = getLocale(Astro.url); const pages = await getCollection("projects"); -const posts = filterCollection(pages, locale); +const posts = filterCollection(pages, locale) + .sort((a, b) => b.data.date - a.data.date) + .sort((a) => (a.data.featured ? -1 : 1)); --- diff --git a/src/pages/tag/[tag].astro b/src/pages/tag/[tag].astro new file mode 100644 index 0000000..920c18d --- /dev/null +++ b/src/pages/tag/[tag].astro @@ -0,0 +1,71 @@ +--- +import Layout from "@layouts/Layout.astro"; +import { getCollection } from "astro:content"; +import { useTranslatedPath } from "@i18n/utils"; + +const collections = ["blog", "photos", "projects"]; + +const tp = useTranslatedPath(Astro); + +export async function getStaticPaths() { +const collections = ["blog", "photos", "projects"]; +const posts = await Promise.all( + collections.map((collection) => { + return getCollection(collection, { + fields: ["slug", "title", "date", "tags"], + }); + }), +); + +const tags = new Set(); + +posts.flat().forEach((post) => { + if (!post.data?.tags) return; + post.data.tags.forEach((tag) => { + tags.add(tag.toLowerCase()); + }); +}); + + return [...tags.values()].map((tag) => { + return { + params: { + tag, + }, + }; + }); +} + +const { tag } = Astro.params; + + +const allPosts = (await Promise.all( + collections.map((collection) => { + return getCollection(collection, { + fields: ["slug", "title", "date", "tags"], + }); + }), +)).flat(); + + + +const posts = allPosts.filter((post) => { + return post.data?.tags?.find(t => t.toLowerCase() === tag); +}); + + +--- + + +
    +

    Tags

    + {posts.length} +
    + { + posts.map((post) => { + return {post.slug}; + }) + } +
    +
    +
    + diff --git a/src/pages/tag/index.astro b/src/pages/tag/index.astro new file mode 100644 index 0000000..872f227 --- /dev/null +++ b/src/pages/tag/index.astro @@ -0,0 +1,41 @@ +--- +import Layout from "@layouts/Layout.astro"; +import { getCollection } from "astro:content"; +import { useTranslatedPath } from "@i18n/utils"; + +const tp = useTranslatedPath(Astro); + +const collections = ["blog", "photos", "projects"]; + +const posts = await Promise.all( + collections.map((collection) => { + return getCollection(collection, { + fields: ["slug", "title", "date", "tags"], + }); + }), +); + +const tags = new Set(); + +posts.flat().forEach((post) => { + if (!post.data?.tags) return; + post.data.tags.forEach((tag) => { + tags.add(tag.toLowerCase()); + }); +}); + +const _tags = [...tags.values()]; +--- + + +
    +

    Tags

    +
    + { + _tags.map((t) => { + return {t}; + }) + } +
    +
    +
    diff --git a/uno.config.ts b/uno.config.ts index 311da6c..0bd7b24 100644 --- a/uno.config.ts +++ b/uno.config.ts @@ -15,7 +15,7 @@ export default defineConfig({ "border-neutral": "border-neutral-300 dark:border-neutral-1000", "border-light": "border-neutral-100 dark:border-neutral-500", "divide-x-neutral": ['divide-x-neutral-300', "dark:divide-x-neutral-1000"], - "gradient": "bg-gradient-to-br from-neutral-000 dark:from-neutral-500 to-neutral-200 dark:to-neutral-800", + "gradient": "bg-gradient-to-br from-neutral-000 to-neutral-000 dark:from-neutral-500 dark:to-neutral-800", }, theme: { borderRadius: {