$ // y si todo o casi todo en un archivo, y GPLV2 ΒΏPOR QUE?
// por que estaba enojado con paginas con paywalls arcaicos
// (te hablo a ti -> lwn.net <-)
// y si todo o casi todo en un archivo, y GPLV2 ΒΏPOR QUE?
// por que estaba enojado con paginas con paywalls arcaicos
// (te hablo a ti -> lwn.net <-)
// y si todo o casi todo en un archivo, y GPLV2 ΒΏPOR QUE?
// por que estaba enojado con paginas con paywalls arcaicos
// (te hablo a ti -> lwn.net <-)
ββββββββββββ ββββββ βββ ββββββββββββββββ ββββββββββββββββββββ
ββββββββββββ βββββββββββ ββββββββββββββ βββββββββββββββββββββ βββ βββ βββ ββββββ βββ ββββββββββββββββββββ ββββββββ βββ βββ βββ ββββββ βββ ββββββββββββββββββββ ββββββββ βββ βββββββββββββ βββ βββ ββββββ βββ βββββββββββββββββββ βββ βββββββ βββ βββ βββ ββββββ βββββββββββββββββββ
ββββββββββββ ββββββ βββ ββββββββββββββββ ββββββββββββββββββββ
ββββββββββββ βββββββββββ ββββββββββββββ βββββββββββββββββββββ βββ βββ βββ ββββββ βββ ββββββββββββββββββββ ββββββββ βββ βββ βββ ββββββ βββ ββββββββββββββββββββ ββββββββ βββ βββββββββββββ βββ βββ ββββββ βββ βββββββββββββββββββ βββ βββββββ βββ βββ βββ ββββββ βββββββββββββββββββ
// RECOLECTOR DE BASURA EN CASCADA REVERSA
let currentParentId = currentComment?.parentId;
while (currentParentId) { // Si el padre ya era fantasma y no le quedΓ³ nada ΓΊtil... Β‘exterminado! if (!parentHasLiveChildren) { await deleteDoc(parentRef); currentParentId = parentNode.parentId; continue; } break;
}
// RECOLECTOR DE BASURA EN CASCADA REVERSA
let currentParentId = currentComment?.parentId;
while (currentParentId) { // Si el padre ya era fantasma y no le quedΓ³ nada ΓΊtil... Β‘exterminado! if (!parentHasLiveChildren) { await deleteDoc(parentRef); currentParentId = parentNode.parentId; continue; } break;
}
// RECOLECTOR DE BASURA EN CASCADA REVERSA
let currentParentId = currentComment?.parentId;
while (currentParentId) { // Si el padre ya era fantasma y no le quedΓ³ nada ΓΊtil... Β‘exterminado! if (!parentHasLiveChildren) { await deleteDoc(parentRef); currentParentId = parentNode.parentId; continue; } break;
}
// Porque en el aΓ±o 2024 seguimos usando el fragmento de la URL
// como sistema de rutas. React Router llorando en un rincΓ³n.
// Ventaja: sin SSR, sin 404s, sin drama. Solo un # y listo.
const HASH_VIEWS = { '#reciente': 'feed', '#configuracion': 'settings', '#favoritos': 'favorites', '#nuevopost': 'new-post', // #post-{ID} β abre ese post directamente (compartible) // #cualquier-otra-cosa β filtra por ese tag
};
// Porque en el aΓ±o 2024 seguimos usando el fragmento de la URL
// como sistema de rutas. React Router llorando en un rincΓ³n.
// Ventaja: sin SSR, sin 404s, sin drama. Solo un # y listo.
const HASH_VIEWS = { '#reciente': 'feed', '#configuracion': 'settings', '#favoritos': 'favorites', '#nuevopost': 'new-post', // #post-{ID} β abre ese post directamente (compartible) // #cualquier-otra-cosa β filtra por ese tag
};
// Porque en el aΓ±o 2024 seguimos usando el fragmento de la URL
// como sistema de rutas. React Router llorando en un rincΓ³n.
// Ventaja: sin SSR, sin 404s, sin drama. Solo un # y listo.
const HASH_VIEWS = { '#reciente': 'feed', '#configuracion': 'settings', '#favoritos': 'favorites', '#nuevopost': 'new-post', // #post-{ID} β abre ese post directamente (compartible) // #cualquier-otra-cosa β filtra por ese tag
};
// EASTER EGG: si el usuario busca "windows" β BSoD de Linux.
// (si alguien reporta esto como bug, es que no entiende la cultura)
watch(searchQuery, (v) => { showWindowsEgg.value = v.toLowerCase().includes('windows');
});
// EASTER EGG: si el usuario busca "windows" β BSoD de Linux.
// (si alguien reporta esto como bug, es que no entiende la cultura)
watch(searchQuery, (v) => { showWindowsEgg.value = v.toLowerCase().includes('windows');
});
// EASTER EGG: si el usuario busca "windows" β BSoD de Linux.
// (si alguien reporta esto como bug, es que no entiende la cultura)
watch(searchQuery, (v) => { showWindowsEgg.value = v.toLowerCase().includes('windows');
});
[data-theme="hc"] { --bg: #000000; --accent: #1aabff; --border: #0078d4;
}
[data-theme="hc"] .post-card { border-color: #0078d4; box-shadow: 0 0 0 1px #0078d4;
}
[data-theme="hc"] .post-card:hover { box-shadow: 0 0 16px rgba(26,171,255,.4);
}
[data-theme="hc"] { --bg: #000000; --accent: #1aabff; --border: #0078d4;
}
[data-theme="hc"] .post-card { border-color: #0078d4; box-shadow: 0 0 0 1px #0078d4;
}
[data-theme="hc"] .post-card:hover { box-shadow: 0 0 16px rgba(26,171,255,.4);
}
[data-theme="hc"] { --bg: #000000; --accent: #1aabff; --border: #0078d4;
}
[data-theme="hc"] .post-card { border-color: #0078d4; box-shadow: 0 0 0 1px #0078d4;
}
[data-theme="hc"] .post-card:hover { box-shadow: 0 0 16px rgba(26,171,255,.4);
}
// Filtra los posts del autor desde el array LOCAL (sin query extra πΈ)
const authorPostsList = posts.value.filter(p => p.authorUid === post.authorUid || p.author === post.author
);
// Filtra los posts del autor desde el array LOCAL (sin query extra πΈ)
const authorPostsList = posts.value.filter(p => p.authorUid === post.authorUid || p.author === post.author
);
// Filtra los posts del autor desde el array LOCAL (sin query extra πΈ)
const authorPostsList = posts.value.filter(p => p.authorUid === post.authorUid || p.author === post.author
);
-weight: 500;">git clone https://github.com/Qmaker-programmer/tuxtimes.-weight: 500;">git
cd tuxtimes
-weight: 500;">npm -weight: 500;">install
cp src/firebase.example.js src/firebase.js
-weight: 500;">npm run dev
-weight: 500;">git clone https://github.com/Qmaker-programmer/tuxtimes.-weight: 500;">git
cd tuxtimes
-weight: 500;">npm -weight: 500;">install
cp src/firebase.example.js src/firebase.js
-weight: 500;">npm run dev
-weight: 500;">git clone https://github.com/Qmaker-programmer/tuxtimes.-weight: 500;">git
cd tuxtimes
-weight: 500;">npm -weight: 500;">install
cp src/firebase.example.js src/firebase.js
-weight: 500;">npm run dev
// Filtra los posts del autor desde el array LOCAL (sin query extra πΈ)
const authorPostsList = posts.value.filter(p => p.authorUid === post.authorUid || p.author === post.author
);
// Filtra los posts del autor desde el array LOCAL (sin query extra πΈ)
const authorPostsList = posts.value.filter(p => p.authorUid === post.authorUid || p.author === post.author
);
// Filtra los posts del autor desde el array LOCAL (sin query extra πΈ)
const authorPostsList = posts.value.filter(p => p.authorUid === post.authorUid || p.author === post.author
);
-weight: 500;">git clone https://github.com/Qmaker-programmer/tuxtimes.-weight: 500;">git
cd tuxtimes
-weight: 500;">npm -weight: 500;">install
cp src/firebase.example.js src/firebase.js
-weight: 500;">npm run dev
-weight: 500;">git clone https://github.com/Qmaker-programmer/tuxtimes.-weight: 500;">git
cd tuxtimes
-weight: 500;">npm -weight: 500;">install
cp src/firebase.example.js src/firebase.js
-weight: 500;">npm run dev
-weight: 500;">git clone https://github.com/Qmaker-programmer/tuxtimes.-weight: 500;">git
cd tuxtimes
-weight: 500;">npm -weight: 500;">install
cp src/firebase.example.js src/firebase.js
-weight: 500;">npm run dev - πΈ Paywall de $35/aΓ±o para leer artΓculos de la semana
- π Solo los editores pueden publicar β no hay comunidad
- ποΈ La interfaz parece un periΓ³dico de 1994 (sin hipΓ©rbole)
- π± Sin dark mode. Sin responsivo decente. Sin filtros modernos. - Vue 3 Composition API β porque Options API es 2020
- Firebase Auth β Google OAuth sin servidores propios
- Firestore β NoSQL que cobra por query (asΓ aprendes a no hacer queries en bucles)
- marked β Markdown β HTML, magia negra controlada
- Vite β porque webpack es un recuerdo doloroso
- GPLv2 β por coherencia ideolΓ³gica y enojo - Si tiene hijos vivos β soft delete: [Este comentario ha sido eliminado]
- Si no tiene hijos β purga fΓsica de Firestore
- Cascada reversa: sube por el Γ‘rbol eliminando padres fantasmas vacΓos - β
Auth completa (Google + Email)
- β
Editor Markdown con preview en tiempo real
- β
Comentarios en Γ‘rbol con poda de fantasmas
- β
3 temas (dark/light/high contrast)
- β
PaginaciΓ³n de 20 posts con sort
- β
Perfiles pΓΊblicos de autor
- β
Sistema de favoritos
- β
Responsive en 3 breakpoints
- β
Easter egg de Windows
- β³ Tests (el futuro nosotros lo resolverΓ‘)
- β³ PaginaciΓ³n en Firestore (ahora es client-side β sΓ, lo sΓ©) - β
Auth completa (Google + Email)
- β
Editor Markdown con preview en tiempo real
- β
Comentarios en Γ‘rbol con poda de fantasmas
- β
3 temas (dark/light/high contrast)
- β
PaginaciΓ³n de 20 posts con sort
- β
Perfiles pΓΊblicos de autor
- β
Sistema de favoritos
- β
Responsive en 3 breakpoints
- β
Easter egg de Windows
- β³ Tests (el futuro nosotros lo resolverΓ‘)
- β³ PaginaciΓ³n en Firestore (ahora es client-side β sΓ, lo sΓ©)