Update contact, add donate page
This commit is contained in:
parent
4893b9c06a
commit
a2a805a8b2
BIN
public/monero-address.png
Normal file
BIN
public/monero-address.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.4 KiB |
@ -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-----
|
@ -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}
|
||||||
|
@ -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'}
|
||||||
|
@ -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) => (
|
||||||
|
@ -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',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -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)
|
||||||
|
14
src/content/pages/en/donate.mdx
Normal file
14
src/content/pages/en/donate.mdx
Normal 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)
|
@ -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)
|
||||||
|
14
src/content/pages/es/donar.mdx
Normal file
14
src/content/pages/es/donar.mdx
Normal 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)
|
@ -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;
|
||||||
|
@ -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} />
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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 />
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
@ -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 />
|
||||||
|
@ -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>
|
||||||
|
@ -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
|
||||||
|
@ -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 />
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user