Update contact, add donate page

This commit is contained in:
juancmandev 2025-03-14 20:49:21 -06:00
parent 4893b9c06a
commit a2a805a8b2
25 changed files with 89 additions and 56 deletions

BIN
public/monero-address.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@ -0,0 +1,14 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
xjMEZQiCxhYJKwYBBAHaRw8BAQdAKsyJoNrC9MIIih/2f+x2jFXe2EW+ufeN
lIOE0wUbcFbNK2NvbnRhY3RAanVhbmNtYW4uZGV2IDxjb250YWN0QGp1YW5j
bWFuLmRldj7CjAQQFgoAPgWCZQiCxgQLCQcICZCfsJTzxXuuVwMVCAoEFgAC
AQIZAQKbAwIeARYhBIDg/gtFKi+0hRG+G5+wlPPFe65XAAAnYAD/conTgzwr
wtm67uDfpSqauckqEEbiS3kCpVAMDptlc5kBAMp5qzA0RrHWwAtliwjckGta
Je8cmSNneuO2CmwF0yoHzjgEZQiCxhIKKwYBBAGXVQEFAQEHQM2jOtm0nD9e
Gj88A9FDxXir8tCxpM+g9FlxeTKrJuJ5AwEIB8J4BBgWCAAqBYJlCILGCZCf
sJTzxXuuVwKbDBYhBIDg/gtFKi+0hRG+G5+wlPPFe65XAABRXQEA56u9jKY5
ut2tlCJyauN9llxYwp45cyJNvUdoV/QaKhsBALN7snvKxUGqDoxyQi3LpEKE
uNjlRcRwNYo3k71qw3YK
=mkZ4
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -11,7 +11,7 @@ type Props = {
export default function Footer({ lang }: Props) { export default function Footer({ lang }: Props) {
return ( return (
<footer className='px-2 pt-14 pb-28 text-center lg:px-0 prose prose-invert min-w-full'> <footer className='px-2 pt-14 pb-28 text-center md:px-0 prose prose-invert min-w-full'>
<section> <section>
<p> <p>
{footerLocales[lang].built_with} {footerLocales[lang].built_with}

View File

@ -28,9 +28,9 @@ const { lang } = Astro.props;
--- ---
<header <header
class='py-2 px-2 lg:px-0 fixed top-0 z-50 flex w-full items-center justify-between border-b border-secondary backdrop-blur-lg' class='py-2 px-2 md:px-0 fixed top-0 z-50 flex w-full items-center justify-between border-b border-secondary backdrop-blur-lg'
> >
<div class='w-full max-w-[800px] mx-auto flex items-center justify-between'> <div class='w-full max-w-3xl mx-auto flex items-center justify-between'>
<section class='flex max-w-max'> <section class='flex max-w-max'>
<LinkButton <LinkButton
href={lang === 'en' ? '/' : '/es'} href={lang === 'en' ? '/' : '/es'}

View File

@ -6,6 +6,7 @@ import {
PocketKnife, PocketKnife,
Info, Info,
Mail, Mail,
CircleDollarSign,
} from 'lucide-react'; } from 'lucide-react';
import { useTranslations, type lang } from '@/i18n/utils'; import { useTranslations, type lang } from '@/i18n/utils';
@ -39,6 +40,10 @@ export const navItems: TNavItem[] = [
type: 'contact', type: 'contact',
icon: <Mail />, icon: <Mail />,
}, },
{
type: 'donate',
icon: <CircleDollarSign />
}
]; ];
type Props = { type Props = {
@ -49,7 +54,7 @@ export default function Navigation(props: Props) {
const t = useTranslations(props.lang as any); const t = useTranslations(props.lang as any);
return ( return (
<nav className='prose prose-invert max-w-[800px] mx-auto px-2 lg:px-0 py-16'> <nav className='prose prose-invert max-w-3xl mx-auto px-2 md:px-0 py-16'>
<h2 id='navigation'>{t('navigation')}</h2> <h2 id='navigation'>{t('navigation')}</h2>
<ul className='list-none p-0 flex flex-wrap gap-4'> <ul className='list-none p-0 flex flex-wrap gap-4'>
{navItems.map((navItem, index) => ( {navItems.map((navItem, index) => (

View File

@ -21,7 +21,7 @@ const buttonVariants = cva(
size: { size: {
default: 'h-10 px-4 py-2', default: 'h-10 px-4 py-2',
sm: 'h-9 rounded-md px-3', sm: 'h-9 rounded-md px-3',
lg: 'h-11 rounded-md px-8', md: 'h-11 rounded-md px-8',
icon: 'h-10 w-10', icon: 'h-10 w-10',
}, },
}, },

View File

@ -7,22 +7,7 @@ description:
# Contact # Contact
You can contact me if: ## Email
- Just say hi
- You want to contract me
- Ask me about a tool that I use or some topic
Please, consider that:
- I won't work for free
- I won't work on your startup idea, and I'll just get equity in return (I can't
pay my bills with lottery tickets)
- I won't work for you and get "exposure" (I can't pay my bills with exposure)
- I won't communicate via phone number; all communication must be via email (we
can use Discord, Slack, etc. once you hire me).
## My email
Just change `[at]` for `@` and `[dot]` for `.`. This is for preventing web Just change `[at]` for `@` and `[dot]` for `.`. This is for preventing web
crawlers from getting my email: crawlers from getting my email:
@ -31,9 +16,15 @@ crawlers from getting my email:
contact[at]juancman[dot]dev contact[at]juancman[dot]dev
``` ```
You may [download my PGP key](/publickey.contact@juancman.dev-80e0fe0b452a2fb48511be1b9fb094f3c57bae57.asc) to validate my emails.
## Social media ## Social media
You can send me a direct message: If you want to talk about contracting me, you may check my career:
- [LinkedIn](https://www.linkedin.com/in/juancmandev) - [LinkedIn](https://www.linkedin.com/in/juancmandev)
You may check my GitHub, but I have also my own Gitea instance:
- [GitHub](https://github.com/juancmandev) - [GitHub](https://github.com/juancmandev)
- [Gitea](https://git.juancman.dev/juancmandev)

View File

@ -0,0 +1,14 @@
---
title: Donate
description: Support me if you like my stuff!
---
# Donate
Support me if you like my stuff!
## Crypto
Decentralized money!
- **Monero**: `8AXTKuv3oNg9tS6t5cSiu3Ec7LeLriXkqKURGhkq6AxfipX8ghvEnm4dDAbRfPVzB4gjGG9oR9Dng4yMr8ndAoN8FT3nYo6` [QR Code](/monero-address.png)

View File

@ -7,23 +7,7 @@ description:
# Contacto # Contacto
Puedes contactarme si: ## Email
- Solo quieres decirme "hola"
- Quieres contratarme
- Preguntarme sobre alguna herramienta que utilizo o sobre algún tema
Por favor, considera que:
- No trabajo gratis
- No trabajaré en tu idea de startup a cambio de equity (no puedo pagar mis
facturas con tickets de lotería)
- No trabajaré a cambio de "exposición" (no puedo pagar mis facturas con
exposición)
- No me comunicaré via número telefónico, toda comunicación debe ser via email
(podemos usar Discord, Slack, etc. una vez me contrates)
## Mi email
Solo cambia `[at]` por `@` y `[dot]` por `.`. Esto es para evitar que web Solo cambia `[at]` por `@` y `[dot]` por `.`. Esto es para evitar que web
crawlers obtengan mi email. crawlers obtengan mi email.
@ -32,9 +16,15 @@ crawlers obtengan mi email.
contact[at]juancman[dot]dev contact[at]juancman[dot]dev
``` ```
Puedes [descargar mi PGP key](/publickey.contact@juancman.dev-80e0fe0b452a2fb48511be1b9fb094f3c57bae57.asc) para validar mis emails.
## Redes sociales ## Redes sociales
Puedes enviarme un mensaje en: Si quieres hablar sobre contratarme, puedes revisar mi carrera:
- [LinkedIn](https://www.linkedin.com/in/juancmandev) - [LinkedIn](https://www.linkedin.com/in/juancmandev)
Puedes revisar mi GitHub, aunque igual tengo mi propia instancia de Gitea:
- [GitHub](https://github.com/juancmandev) - [GitHub](https://github.com/juancmandev)
- [Gitea](https://git.juancman.dev/juancmandev)

View File

@ -0,0 +1,14 @@
---
title: Donar
description: ¡Apóyame si te gusta lo que hago!
---
# Donar
¡Apóyame si te gusta lo que hago!
## Cripto
¡Dinero decentralizado!
- **Monero**: `8AXTKuv3oNg9tS6t5cSiu3Ec7LeLriXkqKURGhkq6AxfipX8ghvEnm4dDAbRfPVzB4gjGG9oR9Dng4yMr8ndAoN8FT3nYo6` [Código QR](/monero-address.png)

View File

@ -23,6 +23,8 @@ export const ui = {
'about.to': '/about', 'about.to': '/about',
'contact.label': 'Contact', 'contact.label': 'Contact',
'contact.to': '/contact', 'contact.to': '/contact',
'donate.label': 'Donate',
'donate.to': '/donate',
}, },
es: { es: {
navigation: 'Navegación', navigation: 'Navegación',
@ -40,5 +42,7 @@ export const ui = {
'about.to': '/es/acerca-de', 'about.to': '/es/acerca-de',
'contact.label': 'Contacto', 'contact.label': 'Contacto',
'contact.to': '/es/contacto', 'contact.to': '/es/contacto',
'donate.label': 'Donar',
'donate.to': '/es/donar',
}, },
} as const; } as const;

View File

@ -63,7 +63,7 @@ const { title, description } = Astro.props;
</head> </head>
<body> <body>
<Header lang={lang} /> <Header lang={lang} />
<main class='width-global px-2 lg:px-0 pt-32'> <main class='max-w-3xl mx-auto px-2 md:px-0 pt-20 md:pt-32'>
<slot /> <slot />
</main> </main>
<Navigation lang={lang} /> <Navigation lang={lang} />

View File

@ -6,7 +6,7 @@ import Layout from '@/layouts/Layout.astro';
title='Not found' title='Not found'
description='Error 404: Not found.' description='Error 404: Not found.'
> >
<div class='prose prose-invert max-w-[800px] mx-auto'> <div class='prose prose-invert max-w-3xl mx-auto'>
<h1 class=''>Error 404: Not found</h1> <h1 class=''>Error 404: Not found</h1>
</div> </div>
</Layout> </Layout>

View File

@ -32,7 +32,7 @@ const { Content, remarkPluginFrontmatter: data } = await render(project);
title={data.title} title={data.title}
description={data.description} description={data.description}
> >
<article class='prose prose-invert max-w-[800px] mx-auto'> <article class='prose prose-invert max-w-3xl mx-auto'>
<Content components={{ ...components }} /> <Content components={{ ...components }} />
</article> </article>
</Layout> </Layout>

View File

@ -36,7 +36,7 @@ const { Content, remarkPluginFrontmatter: data } = await render(post);
title={data.title} title={data.title}
description={data.description} description={data.description}
> >
<article class='prose prose-invert max-w-[800px] mx-auto'> <article class='prose prose-invert max-w-3xl mx-auto'>
<h1>{data.title}</h1> <h1>{data.title}</h1>
<Content components={{ ...components }} /> <Content components={{ ...components }} />
<hr /> <hr />

View File

@ -27,7 +27,7 @@ const lang = getLangFromUrl(Astro.url);
--- ---
<Layout {...pageData}> <Layout {...pageData}>
<div class='prose prose-invert max-w-[800px] mx-auto'> <div class='prose prose-invert max-w-3xl mx-auto'>
<h1>{pageData.title}</h1> <h1>{pageData.title}</h1>
<p>{pageData.description}</p> <p>{pageData.description}</p>
<PostItemList <PostItemList

View File

@ -32,7 +32,7 @@ const { Content, remarkPluginFrontmatter: data } = await render(page);
title={data.title} title={data.title}
description={data.description} description={data.description}
> >
<article class='prose prose-invert max-w-[800px] mx-auto'> <article class='prose prose-invert max-w-3xl mx-auto'>
<Content components={{ ...components }} /> <Content components={{ ...components }} />
</article> </article>
</Layout> </Layout>

View File

@ -36,7 +36,7 @@ const { Content, remarkPluginFrontmatter: data } = await render(blog);
title={data.title} title={data.title}
description={data.description} description={data.description}
> >
<article class='prose prose-invert max-w-[800px] mx-auto'> <article class='prose prose-invert max-w-3xl mx-auto'>
<h1>{data.title}</h1> <h1>{data.title}</h1>
<Content components={{ ...components }} /> <Content components={{ ...components }} />
<hr /> <hr />

View File

@ -27,7 +27,7 @@ const lang = getLangFromUrl(Astro.url);
--- ---
<Layout {...pageData}> <Layout {...pageData}>
<section class='prose prose-invert max-w-[800px] mx-auto'> <section class='prose prose-invert max-w-3xl mx-auto'>
<h1>{pageData.title}</h1> <h1>{pageData.title}</h1>
<p>{pageData.description}</p> <p>{pageData.description}</p>
</section> </section>

View File

@ -30,7 +30,7 @@ const lang = getLangFromUrl(Astro.url);
--- ---
<Layout {...pageData}> <Layout {...pageData}>
<div class='prose prose-invert max-w-[800px] mx-auto'> <div class='prose prose-invert max-w-3xl mx-auto'>
<h1 class='text-primary'>Bienvenido a mi dominio, extraño.</h1> <h1 class='text-primary'>Bienvenido a mi dominio, extraño.</h1>
<p> <p>
Soy <strong class='text-primary'>juancmandev</strong>; <strong Soy <strong class='text-primary'>juancmandev</strong>; <strong

View File

@ -34,7 +34,7 @@ const { Content, remarkPluginFrontmatter: data } = await render(video);
title={data.title} title={data.title}
description={data.description} description={data.description}
> >
<article class='prose prose-invert max-w-[800px] mx-auto'> <article class='prose prose-invert max-w-3xl mx-auto'>
<h1>{data.title}</h1> <h1>{data.title}</h1>
<Content components={{ ...components }} /> <Content components={{ ...components }} />
<hr /> <hr />

View File

@ -20,7 +20,7 @@ const lang = getLangFromUrl(Astro.url);
--- ---
<Layout {...pageData}> <Layout {...pageData}>
<div class='prose prose-invert max-w-[800px] mx-auto'> <div class='prose prose-invert max-w-3xl mx-auto'>
<h1>{pageData.title}</h1> <h1>{pageData.title}</h1>
<p>{pageData.description}</p> <p>{pageData.description}</p>
<PostItemList <PostItemList

View File

@ -31,7 +31,7 @@ const lang = getLangFromUrl(Astro.url);
--- ---
<Layout {...pageData}> <Layout {...pageData}>
<div class='prose prose-invert max-w-[800px] mx-auto'> <div class='prose prose-invert max-w-3xl mx-auto'>
<h1 class='text-primary'>Welcome to my domain, stranger.</h1> <h1 class='text-primary'>Welcome to my domain, stranger.</h1>
<!-- <Random /> --> <!-- <Random /> -->
<p> <p>

View File

@ -14,7 +14,7 @@ const data = await pb.collection('microblogs').getFullList({
title='Microblog' title='Microblog'
description='Short-format writing. Instead of using shitty social media.' description='Short-format writing. Instead of using shitty social media.'
> >
<div class='prose prose-invert max-w-[800px] mx-auto'> <div class='prose prose-invert max-w-3xl mx-auto'>
<h1>Microblog</h1> <h1>Microblog</h1>
<p>Short-format writing.</p> <p>Short-format writing.</p>
<p>Instead of using shitty social media.</p> <p>Instead of using shitty social media.</p>

View File

@ -5,6 +5,7 @@
@layer base { @layer base {
* { * {
@apply border-border; @apply border-border;
scroll-margin-top: 60px;
} }
body { body {
@apply bg-background text-foreground; @apply bg-background text-foreground;
@ -12,6 +13,9 @@
.prose { .prose {
@apply max-w-none; @apply max-w-none;
} }
li {
overflow-wrap: break-word
}
[data-rehype-pretty-code-figure] { [data-rehype-pretty-code-figure] {
@apply bg-[#1e1e2e] rounded-md pt-4; @apply bg-[#1e1e2e] rounded-md pt-4;
} }
@ -33,7 +37,4 @@
.prose pre > code { .prose pre > code {
@apply bg-transparent border-none; @apply bg-transparent border-none;
} }
* {
scroll-margin-top: 72px;
}
} }