featmigrate from Angular to Astro static site

BREAKING CHANGE: Complete rewrite from Angular SPA to Astro

- Replace Angular 18 with Astro 5.16.7 + Tailwind CSS
- Convert all Angular components to Astro components
- Add content collections for blog with markdown support
- Setup S3 deployment with CloudFront invalidation
- Add RSS feed and sitemap generation
- Configure Prettier and Biome for code formatting
- Switch from npm to pnpm
- Remove Amplify backend (now fully static)
- Improve SEO and performance with static generation
This commit is contained in:
Lorenzo Iovino 2026-01-08 16:46:17 +01:00
parent 7be49ba73a
commit 7cf2e858a2
192 changed files with 7829 additions and 21756 deletions

124
src/components/Footer.astro Normal file
View file

@ -0,0 +1,124 @@
---
---
<div class="w-full bg-secondary py-2 px-4">
<div class="max-w-6xl mx-auto flex justify-between flex-col-reverse sm:flex-row gap-4 sm:items-end items-center">
<div class="text-center sm:text-left text-gray-600 flex flex-col items-center sm:items-start">
<div class="flex flex-wrap items-center gap-3 text-sm">
<span class="font-medium text-gray-800">Lorenzo Iovino</span>
<span class="text-gray-400">•</span>
<a
href="/rss.xml"
class="hover:text-primary-600 transition-colors duration-200 inline-flex items-center gap-1"
title="RSS Feed"
>
RSS
</a>
<span class="text-gray-400">•</span>
<a
href="/sitemap-index.xml"
class="hover:text-primary-600 transition-colors duration-200"
title="Sitemap">Sitemap</a
>
<span class="text-gray-400">•</span>
<a
href="https://www.iubenda.com/privacy-policy/98687046"
class="hover:text-primary-600 transition-colors duration-200 iubenda-white iubenda-noiframe iubenda-embed iubenda-noiframe"
title="Privacy Policy">Privacy Policy</a
>
<script is:inline type="text/javascript">
(function (w, d) {
var loader = function () {
var s = d.createElement("script"),
tag = d.getElementsByTagName("script")[0];
s.src = "https://cdn.iubenda.com/iubenda.js";
tag.parentNode.insertBefore(s, tag);
};
if (w.addEventListener) {
w.addEventListener("load", loader, false);
} else if (w.attachEvent) {
w.attachEvent("onload", loader);
} else {
w.onload = loader;
}
})(window, document);
</script>
<span class="text-gray-400">•</span>
<a
href="https://www.iubenda.com/privacy-policy/98687046/cookie-policy"
class="hover:text-primary-600 transition-colors duration-200 iubenda-white iubenda-noiframe iubenda-embed iubenda-noiframe"
title="Cookie Policy">Cookie Policy</a
>
<script is:inline type="text/javascript">
(function (w, d) {
var loader = function () {
var s = d.createElement("script"),
tag = d.getElementsByTagName("script")[0];
s.src = "https://cdn.iubenda.com/iubenda.js";
tag.parentNode.insertBefore(s, tag);
};
if (w.addEventListener) {
w.addEventListener("load", loader, false);
} else if (w.attachEvent) {
w.attachEvent("onload", loader);
} else {
w.onload = loader;
}
})(window, document);
</script>
</div>
</div>
<div class="text-center sm:text-right text-gray-600 text-sm">
<div class="flex flex-col gap-1">
<div class="flex items-center justify-center sm:justify-end gap-1 flex-wrap">
<span>Made with</span>
<a
href="https://astro.build/"
class="inline-flex items-center hover:text-white transition-all duration-200"
title="Astro"
>
<img
class="h-5 w-5"
src="/astro.svg"
height="20"
width="20"
loading="lazy"
alt="Astro Logo"
/>
</a>
<span>and</span>
<a
href="https://tailwindcss.com/"
class="inline-flex items-center center hover:text-white transition-all duration-200"
title="TailwindCSS"
>
<img
class="h-5 w-5"
src="/tailwind.svg"
height="20"
width="20"
loading="lazy"
alt="Tailwind Logo"
/>
</a>
</div>
<a
href="https://github.com/thisloke/lorenzoiovino.com"
class="hover:text-white transition-colors duration-200 inline-flex items-center justify-center sm:justify-end gap-2 font-medium"
>
<span>Check the source code</span>
<img
src="/github.svg"
class="h-5 w-5"
height="20"
width="20"
loading="lazy"
alt="Github Logo"
/>
</a>
</div>
</div>
</div>
</div>