Skip to content

Commit bb006a1

Browse files
committed
Reflex 8.5
1 parent b75c57d commit bb006a1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+540
-107
lines changed

link_bio/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Web de links de MoureDev
22

33
[![Python](https://img.shields.io/badge/Python-3.12+-yellow?style=for-the-badge&logo=python&logoColor=white&labelColor=101010)](https://python.org)
4-
[![Reflex](https://img.shields.io/badge/Reflex-0.7.14+-5646ED?style=for-the-badge&logo=reflex&logoColor=white&labelColor=101010)](https://reflex.dev)
4+
[![Reflex](https://img.shields.io/badge/Reflex-0.8.5+-5646ED?style=for-the-badge&logo=reflex&logoColor=white&labelColor=101010)](https://reflex.dev)
55

66
## Proyecto desarrollado con [Python](https://www.python.org/) y [Reflex](https://reflex.dev/) que representa un sitio web personal estilo "[link in bio](https://moure.dev/)"
77

link_bio/link_bio/components/newsletter.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
from annotated_types import T
12
import reflex as rx
23
import link_bio.constants as const
34
from link_bio.components.link_button import link_button
5+
from link_bio.styles.colors import TextColor
46
from link_bio.styles.styles import Spacing
57

68

@@ -16,6 +18,15 @@ def newsletter() -> rx.Component:
1618
"<iframe src='https://embeds.beehiiv.com/c9c3f7b7-7ed9-428a-a58f-cb53577fa352?slim=true' data-test-id='beehiiv-embed' title='Formulario de suscripción newsletter mouredev pro' width='100%' height='52' frameborder='0' scrolling='no' style='margin: 0; border-radius: 6px !important; background-color: transparent;'></iframe>",
1719
width="100%"
1820
),
21+
rx.hstack(
22+
rx.icon("mail-check"),
23+
rx.text(
24+
"Más de 90.000 ya siguen mis novedades y consejos",
25+
color=TextColor.LIGHT.value,
26+
size=Spacing.MEDIUM_SMALL.value
27+
),
28+
align="center"
29+
),
1930
spacing=Spacing.DEFAULT.value,
2031
width="100%"
2132
)

link_bio/link_bio/constants.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,17 @@
1212

1313
# Comunidad
1414
PRO_URL = "https://mouredev.pro"
15-
TWITCH_URL = "https://twitch.tv/mouredev"
1615
YOUTUBE_URL = "https://youtube.com/@mouredev"
17-
YOUTUBE_SECONDARY_URL = "https://youtube.com/@mouredevtv"
1816
DISCORD_URL = "https://discord.gg/mouredev"
17+
TWITCH_URL = "https://twitch.tv/mouredev"
1918

2019
# Newsletter
2120
NEWSLETTER_URL = "https://newsletter.moure.dev"
2221

2322
# Recursos y más
23+
RESOURCES_URL = "https://mouredev.pro/recursos"
2424
BOOK_URL = "https://mouredev.com/libro-git"
25+
YOUTUBE_SECONDARY_URL = "https://youtube.com/@mouredevtv"
2526
BOOKS_URL = "https://amazon.es/shop/mouredev/list/2ZIHJJFJ9AVZ3"
2627
SETUP_URL = "https://mouredev.com/setup"
2728
MOUREDEV_URL = "https://mouredev.com"

link_bio/link_bio/pages/index.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import reflex as rx
22
import link_bio.utils as utils
33
import link_bio.styles.styles as styles
4+
from link_bio.routes import Route
45
from link_bio.components.navbar import navbar
56
from link_bio.components.footer import footer
67
from link_bio.views.header import header
@@ -10,6 +11,7 @@
1011

1112

1213
@rx.page(
14+
route=Route.INDEX.value,
1315
title=utils.index_title,
1416
description=utils.index_description,
1517
image=utils.preview,

link_bio/link_bio/styles/colors.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class Color(Enum):
88
PURPLE = "#7D00FE"
99
YELLOW = "#FFA61E"
1010
ORANGE = "#FF5500"
11+
GREEN = "#00AA47"
1112

1213

1314
class TextColor(Enum):

link_bio/link_bio/styles/styles.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class Size(Enum):
3030
class Spacing(Enum):
3131
ZERO = "0"
3232
VERY_SMALL = "1"
33+
MEDIUM_SMALL = "2"
3334
SMALL = "3"
3435
DEFAULT = "4"
3536
LARGE = "5"

link_bio/link_bio/views/courses_links.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -58,26 +58,35 @@ def courses_links() -> rx.Component:
5858
"/icons/code.svg",
5959
const.LANGUAGES_COURSE_URL
6060
),
61-
6261
title("Mucho más en"),
6362
link_button(
64-
"Twitch",
65-
"Transmisiones sobre programación y desarrollo",
66-
"/icons/twitch.svg",
67-
const.TWITCH_URL
63+
"mouredev pro",
64+
"Estudia programación de manera diferente",
65+
"/icons/pro.svg",
66+
const.PRO_URL,
67+
True,
68+
Color.ORANGE.value
69+
),
70+
link_button(
71+
"Guías de programación",
72+
"Mi listado de guías gratis en PDF para aprender desarrollo",
73+
"/icons/book.svg",
74+
const.RESOURCES_URL,
75+
True,
76+
Color.GREEN.value
77+
),
78+
link_button(
79+
"Discord",
80+
"El chat y los grupos de estudio de la comunidad",
81+
"/icons/discord.svg",
82+
const.DISCORD_URL
6883
),
6984
link_button(
7085
"YouTube",
7186
"Cursos y tutoriales sobre desarrollo de software",
7287
"/icons/youtube.svg",
7388
const.YOUTUBE_URL
7489
),
75-
link_button(
76-
"YouTube [canal secundario]",
77-
"Emisiones en directo destacadas",
78-
"/icons/youtube.svg",
79-
const.YOUTUBE_SECONDARY_URL
80-
),
8190
newsletter(),
8291
width="100%",
8392
spacing=Spacing.DEFAULT.value,

link_bio/link_bio/views/header.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ def header(details=True) -> rx.Component:
118118
),
119119
rx.spacer(),
120120
info_text(
121-
"2.5M+", "seguidores"
121+
"2.9M+", "seguidores"
122122
),
123123
width="100%"
124124
),

link_bio/link_bio/views/index_links.py

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@ def index_links() -> rx.Component:
2929
Color.YELLOW.value
3030
),
3131
link_button(
32-
"Twitch",
33-
"Transmisiones sobre programación y desarrollo",
34-
"/icons/twitch.svg",
35-
const.TWITCH_URL
32+
"Guías de programación",
33+
"Mi listado de guías gratis en PDF para aprender desarrollo",
34+
"/icons/book.svg",
35+
const.RESOURCES_URL,
36+
True,
37+
Color.GREEN.value
3638
),
3739
link_button(
3840
"Discord",
@@ -46,13 +48,8 @@ def index_links() -> rx.Component:
4648
"/icons/youtube.svg",
4749
const.YOUTUBE_URL
4850
),
49-
link_button(
50-
"YouTube | canal secundario",
51-
"Emisiones en directo destacadas",
52-
"/icons/youtube.svg",
53-
const.YOUTUBE_SECONDARY_URL
54-
),
55-
51+
title("Newsletter"),
52+
newsletter(),
5653
rx.cond(
5754
PageState.featured_info,
5855
rx.vstack(
@@ -68,7 +65,6 @@ def index_links() -> rx.Component:
6865
spacing=Spacing.DEFAULT.value
6966
)
7067
),
71-
7268
title("Recursos y más"),
7369
link_button(
7470
"Git y GitHub desde cero",
@@ -77,23 +73,35 @@ def index_links() -> rx.Component:
7773
const.BOOK_URL
7874
),
7975
link_button(
80-
"Libros recomendados",
81-
"Mi listado de libros sobre programación, ciencia y tecnología",
82-
"/icons/book.svg",
83-
const.BOOKS_URL
84-
),
85-
link_button(
86-
"Mi setup",
87-
"Listado con todos los elementos que uso en mi trabajo",
88-
"/icons/setup.svg",
89-
const.SETUP_URL
76+
"Twitch",
77+
"Transmisiones sobre programación y desarrollo",
78+
"/icons/twitch.svg",
79+
const.TWITCH_URL
9080
),
9181
link_button(
92-
"MoureDev",
93-
"Mi sitio web",
94-
"/icons/logo_symbol.svg",
95-
const.MOUREDEV_URL
82+
"YouTube | canal secundario",
83+
"Emisiones en directo destacadas",
84+
"/icons/youtube.svg",
85+
const.YOUTUBE_SECONDARY_URL
9686
),
87+
# link_button(
88+
# "Libros recomendados",
89+
# "Mi listado de libros sobre programación, ciencia y tecnología",
90+
# "/icons/book.svg",
91+
# const.BOOKS_URL
92+
# ),
93+
# link_button(
94+
# "Mi setup",
95+
# "Listado con todos los elementos que uso en mi trabajo",
96+
# "/icons/setup.svg",
97+
# const.SETUP_URL
98+
# ),
99+
# link_button(
100+
# "MoureDev",
101+
# "Mi sitio web",
102+
# "/icons/logo_symbol.svg",
103+
# const.MOUREDEV_URL
104+
# ),
97105
link_button(
98106
"Invítame a un café",
99107
"¿Quieres ayudarme a que siga creando contenido?",
@@ -114,9 +122,6 @@ def index_links() -> rx.Component:
114122
"/icons/email.svg",
115123
f"mailto:{const.EMAIL}"
116124
),
117-
118-
title("Newsletter"),
119-
newsletter(),
120125
width="100%",
121126
spacing=Spacing.DEFAULT.value,
122127
on_mount=PageState.featured_links

link_bio/public/404.html

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,44 @@
1-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">404 - Not Found</title><meta content="The page was not found" name="description" data-next-head=""/><meta content="favicon.ico" property="og:image" data-next-head=""/><link rel="preload" href="/_next/static/css/cb97655cffc59994.css" as="style"/><link rel="stylesheet" href="/_next/static/css/cb97655cffc59994.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-2aa3ab9bb630d3af.js" defer=""></script><script src="/_next/static/chunks/framework-2f335d22a7318891.js" defer=""></script><script src="/_next/static/chunks/main-4d7c0a32a691f599.js" defer=""></script><script src="/_next/static/chunks/pages/_app-ef7ba7939dff799f.js" defer=""></script><script src="/_next/static/chunks/pages/404-72a30975ea7e0995.js" defer=""></script><script src="/_next/static/HbXtt0b8qbKqxu-d3V4m7/_buildManifest.js" defer=""></script><script src="/_next/static/HbXtt0b8qbKqxu-d3V4m7/_ssgManifest.js" defer=""></script></head><body><div id="__next"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(u)p(u);else try{let n=localStorage.getItem(i)||s,y=l&&n==="system"?c():n;p(y)}catch(n){}})("class","theme","system",null,["light","dark"],null,true,true)</script><style data-emotion="css hzase2">.css-hzase2{font-family:Poppins;--default-font-family:Poppins;font-weight:400;background-color:#1A1A1A;background-image:url('/bg_dark_pattern.png');background-repeat:repeat;background-attachment:fixed;}</style><div data-is-root-theme="true" data-accent-color="blue" data-gray-color="slate" data-has-background="true" data-panel-background="translucent" data-radius="medium" data-scaling="100%" class="radix-themes css-hzase2"><style data-emotion="css 17rg0dp">.css-17rg0dp{position:fixed;width:100vw;height:0;}</style><div title="Connection Error: " class="css-17rg0dp"></div><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"HbXtt0b8qbKqxu-d3V4m7","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[{"src":"https://www.googletagmanager.com/gtag/js?id=G-3YGHT3XJFS","strategy":"afterInteractive"},{"strategy":"afterInteractive","children":"\nwindow.dataLayer = window.dataLayer || [];\nfunction gtag(){dataLayer.push(arguments);}\ngtag('js', new Date());\ngtag('config', 'G-3YGHT3XJFS');\n"}]}</script></body></html>
1+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta content="width=device-width, initial-scale=1" name="viewport"/><title>404 - Not Found</title><meta content="The page was not found" name="description"/><meta content="favicon.ico" property="og:image"/><link rel="modulepreload" href="/assets/manifest-a4c3d1d5.js"/><link rel="modulepreload" href="/assets/entry.client-OcIKOGXW.js"/><link rel="modulepreload" href="/assets/jsx-runtime-Di6BxXTD.js"/><link rel="modulepreload" href="/assets/chunk-C37GKA54-F5Z9KoKe.js"/><link rel="modulepreload" href="/assets/root-D1vM9tsb.js"/><link rel="modulepreload" href="/assets/state-DFR20yDW.js"/><link rel="modulepreload" href="/assets/Helmet-BrFuWGk8.js"/><link rel="modulepreload" href="/assets/_404_._index-IIq-xn-V.js"/><script>
2+
// Only run in browser environment, not during SSR
3+
if (typeof document !== 'undefined') {
4+
try {
5+
const theme = localStorage.getItem("theme") || "system";
6+
const systemPreference = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
7+
const resolvedTheme = theme === "system" ? systemPreference : theme;
8+
9+
// Apply theme immediately - blocks until complete
10+
// Use classList to avoid overwriting other classes
11+
document.documentElement.classList.remove("light", "dark");
12+
document.documentElement.classList.add(resolvedTheme);
13+
document.documentElement.style.colorScheme = resolvedTheme;
14+
15+
} catch (e) {
16+
// Fallback to system preference on any error (resolve "system" to actual theme)
17+
const fallbackTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
18+
document.documentElement.classList.remove("light", "dark");
19+
document.documentElement.classList.add(fallbackTheme);
20+
document.documentElement.style.colorScheme = fallbackTheme;
21+
}
22+
}
23+
</script><link rel="stylesheet" href="/assets/__reflex_global_styles-CJphOYQU.css" type="text/css"/></head><body><style data-emotion="css hzase2">.css-hzase2{font-family:Poppins;--default-font-family:Poppins;font-weight:400;background-color:#1A1A1A;background-image:url('/bg_dark_pattern.png');background-repeat:repeat;background-attachment:fixed;}</style><div data-is-root-theme="true" data-accent-color="blue" data-gray-color="slate" data-has-background="true" data-panel-background="translucent" data-radius="medium" data-scaling="100%" class="radix-themes css-hzase2"><style data-emotion="css 17rg0dp">.css-17rg0dp{position:fixed;width:100vw;height:0;}</style><div title="Connection Error: " class="css-17rg0dp"></div><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section></div><script>((storageKey2, restoreKey) => {
24+
if (!window.history.state || !window.history.state.key) {
25+
let key = Math.random().toString(32).slice(2);
26+
window.history.replaceState({ key }, "");
27+
}
28+
try {
29+
let positions = JSON.parse(sessionStorage.getItem(storageKey2) || "{}");
30+
let storedY = positions[restoreKey || window.history.state.key];
31+
if (typeof storedY === "number") {
32+
window.scrollTo(0, storedY);
33+
}
34+
} catch (error) {
35+
console.error(error);
36+
sessionStorage.removeItem(storageKey2);
37+
}
38+
})("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_middleware":false,"unstable_optimizeDeps":true,"unstable_splitRouteModules":false,"unstable_subResourceIntegrity":false,"unstable_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeThrough(new TextEncoderStream());</script><script type="module" async="">import "/assets/manifest-a4c3d1d5.js";
39+
import * as route0 from "/assets/root-D1vM9tsb.js";
40+
import * as route1 from "/assets/_404_._index-IIq-xn-V.js";
41+
42+
window.__reactRouterRouteModules = {"root":route0,"404":route1};
43+
44+
import("/assets/entry.client-OcIKOGXW.js");</script><!--$?--><template id="B:0"></template><!--/$--><div hidden id="S:0"><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_3\":-5,\"_4\":-5},\"loaderData\",{},\"actionData\",\"errors\"]\n");</script><!--$?--><template id="B:1"></template><!--/$--></div><script>$RC=function(b,c,e){c=document.getElementById(c);c.parentNode.removeChild(c);var a=document.getElementById(b);if(a){b=a.previousSibling;if(e)b.data="$!",a.setAttribute("data-dgst",e);else{e=b.parentNode;a=b.nextSibling;var f=0;do{if(a&&8===a.nodeType){var d=a.data;if("/$"===d)if(0===f)break;else f--;else"$"!==d&&"$?"!==d&&"$!"!==d||f++}d=a.nextSibling;e.removeChild(a);a=d}while(a);for(;c.firstChild;)e.insertBefore(c.firstChild,a);b.data="$"}b._reactRetry&&b._reactRetry()}};$RC("B:0","S:0")</script><div hidden id="S:1"><script>window.__reactRouterContext.streamController.close();</script></div><script>$RC("B:1","S:1")</script></body></html>

0 commit comments

Comments
 (0)