Skip to content

Commit 36d4fcb

Browse files
add lucide icons, stats page, new post, 5 new frases
1 parent 13aa9c4 commit 36d4fcb

File tree

14 files changed

+394
-70
lines changed

14 files changed

+394
-70
lines changed

package-lock.json

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
"framer-motion": "^11.11.0",
3434
"fuse.js": "^7.1.0",
3535
"html2canvas": "^1.4.1",
36+
"lucide-react": "^0.575.0",
3637
"markdown-it": "^14.1.1",
3738
"react": "^18.3.0",
3839
"react-dom": "^18.3.0",

src/components/Footer.astro

Lines changed: 14 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
---
22
import { SITE } from "../config";
3+
import Icon from "./icons/Icon.tsx";
34
---
45

56
<footer class="border-t border-[#1a1a1a] bg-[#0a0a0a]">
@@ -20,57 +21,23 @@ import { SITE } from "../config";
2021
class="text-[#525252] hover:text-lime-400 transition-colors"
2122
aria-label="Twitter"
2223
>
23-
<svg
24-
xmlns="http://www.w3.org/2000/svg"
25-
width="18"
26-
height="18"
27-
viewBox="0 0 24 24"
28-
fill="currentColor"
29-
>
30-
<path
31-
d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"
32-
></path>
33-
</svg>
24+
<Icon name="Twitter" size={18} client:load />
3425
</a>
35-
<!-- Instagram -->
26+
<!-- Email/Newsletter -->
3627
<a
3728
href="#"
3829
class="text-[#525252] hover:text-lime-400 transition-colors"
39-
aria-label="Instagram"
30+
aria-label="Email"
4031
>
41-
<svg
42-
xmlns="http://www.w3.org/2000/svg"
43-
width="18"
44-
height="18"
45-
viewBox="0 0 24 24"
46-
fill="none"
47-
stroke="currentColor"
48-
stroke-width="2"
49-
stroke-linecap="round"
50-
stroke-linejoin="round"
51-
>
52-
<rect x="2" y="2" width="20" height="20" rx="5" ry="5"
53-
></rect><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"
54-
></path><line x1="17.5" y1="6.5" x2="17.51" y2="6.5"></line>
55-
</svg>
32+
<Icon name="Mail" size={18} client:load />
5633
</a>
5734
<!-- GitHub -->
5835
<a
5936
href="#"
6037
class="text-[#525252] hover:text-lime-400 transition-colors"
6138
aria-label="GitHub"
6239
>
63-
<svg
64-
xmlns="http://www.w3.org/2000/svg"
65-
width="18"
66-
height="18"
67-
viewBox="0 0 24 24"
68-
fill="currentColor"
69-
>
70-
<path
71-
d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"
72-
></path>
73-
</svg>
40+
<Icon name="Github" size={18} client:load />
7441
</a>
7542
</div>
7643
</div>
@@ -134,22 +101,16 @@ import { SITE } from "../config";
134101
href="/rss.xml"
135102
class="text-sm text-[#737373] hover:text-lime-400 transition-colors flex items-center gap-2"
136103
>
137-
<svg
138-
xmlns="http://www.w3.org/2000/svg"
139-
width="14"
140-
height="14"
141-
viewBox="0 0 24 24"
142-
fill="none"
143-
stroke="currentColor"
144-
stroke-width="2"
145-
stroke-linecap="round"
146-
stroke-linejoin="round"
147-
><path d="M4 11a9 9 0 0 1 9 9"></path><path
148-
d="M4 4a16 16 0 0 1 16 16"></path><circle cx="5" cy="19" r="1"
149-
></circle></svg
150-
>
104+
<Icon name="Rss" size={18} client:load />
151105
RSS Feed
152106
</a>
107+
<a
108+
href="/stats"
109+
class="text-sm text-[#737373] hover:text-lime-400 transition-colors flex items-center gap-2"
110+
>
111+
<Icon name="BarChart2" size={12} client:load />
112+
Stats del blog
113+
</a>
153114
<p class="text-xs text-[#2a2a2a]">
154115
Hecho con Astro y demasiado café ☕
155116
</p>

src/components/PostCard.astro

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
---
21
import TagBadge from "./TagBadge.astro";
32
import { format } from "date-fns";
43
import { es } from "date-fns/locale";
4+
import Icon from "./icons/Icon.tsx";
55

66
interface Props {
77
title: string;
@@ -105,14 +105,22 @@ const orderNum = String(index + 1).padStart(2, "0");
105105
</p>
106106

107107
<div class="flex flex-wrap items-center gap-3 mt-4 text-xs text-[#525252]">
108-
<time datetime={pubDate.toISOString()}>{formattedDate}</time>
108+
<time datetime={pubDate.toISOString()} class="flex items-center gap-1">
109+
<Icon name="Calendar" size={12} color="#525252" client:load />{" "}
110+
{formattedDate}
111+
</time>
109112
<span class="text-[#1a1a1a]">·</span>
110-
<span>{readingTime}</span>
113+
<span class="flex items-center gap-1">
114+
<Icon name="Clock" size={12} color="#525252" client:load />{" "}
115+
{readingTime}
116+
</span>
111117
{tags.length > 0 && (
112118
<>
113119
<span class="text-[#1a1a1a]">·</span>
114120
{tags.map((tag) => (
115-
<span class="text-[#525252]">#{tag}</span>
121+
<span class="text-[#525252] flex items-center gap-1">
122+
<Icon name="Tag" size={12} color="#525252" client:load /> {tag}
123+
</span>
116124
))}
117125
</>
118126
)}

src/components/ReadingMode.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import React, { useState, useEffect } from 'react';
22
import { motion, AnimatePresence } from 'framer-motion';
33

4+
import { BookOpen, Minimize2 } from 'lucide-react';
5+
46
export default function ReadingMode() {
57
const [isActive, setIsActive] = useState(false);
68

@@ -57,29 +59,27 @@ export default function ReadingMode() {
5759
>
5860
<AnimatePresence mode="wait">
5961
{isActive ? (
60-
<motion.svg
62+
<motion.div
6163
key="close"
6264
initial={{ opacity: 0, rotate: -90 }}
6365
animate={{ opacity: 1, rotate: 0 }}
6466
exit={{ opacity: 0, rotate: 90 }}
6567
transition={{ duration: 0.2 }}
66-
xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"
68+
className="flex items-center justify-center"
6769
>
68-
<line x1="18" y1="6" x2="6" y2="18"></line>
69-
<line x1="6" y1="6" x2="18" y2="18"></line>
70-
</motion.svg>
70+
<Minimize2 size={18} />
71+
</motion.div>
7172
) : (
72-
<motion.svg
73+
<motion.div
7374
key="book"
7475
initial={{ opacity: 0, scale: 0.5 }}
7576
animate={{ opacity: 1, scale: 1 }}
7677
exit={{ opacity: 0, scale: 0.5 }}
7778
transition={{ duration: 0.2 }}
78-
xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"
79+
className="flex items-center justify-center"
7980
>
80-
<path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path>
81-
<path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path>
82-
</motion.svg>
81+
<BookOpen size={18} />
82+
</motion.div>
8383
)}
8484
</AnimatePresence>
8585
</button>

src/components/icons/Icon.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { LucideProps } from 'lucide-react'
2+
import * as Icons from 'lucide-react'
3+
4+
interface IconProps extends LucideProps {
5+
name: keyof typeof Icons
6+
}
7+
8+
export default function Icon({ name, ...props }: IconProps) {
9+
const LucideIcon = Icons[name] as React.FC<LucideProps>
10+
if (!LucideIcon) return null
11+
return <LucideIcon {...props} />
12+
}

src/content/frases/frase-26.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
texto: "Explicar demasiado es una forma de pedir permiso. Y pedir permiso es entregar poder."
3+
categoria: "poder"
4+
fecha: 2026-02-22
5+
---

src/content/frases/frase-27.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
texto: "No le debes una explicación a quien no tiene autoridad real sobre tu vida."
3+
categoria: "poder"
4+
fecha: 2026-02-22
5+
---

src/content/frases/frase-28.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
texto: "Informar y justificarse no es lo mismo. Uno es comunicación. El otro es inseguridad."
3+
categoria: "reflexiones"
4+
fecha: 2026-02-22
5+
---

src/content/frases/frase-29.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
texto: "David escribió sus errores en los Salmos. La mayoría de nosotros los borra del historial."
3+
categoria: "biblia"
4+
fecha: 2026-02-22
5+
---

0 commit comments

Comments
 (0)