BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
翻訳待ち
El único directorio nacional de airsoft del Perú: canchas de airsoft en Lima y todo el país, tiendas, grupos, eventos, importadores y equipos.
翻訳待ち
スポーツ・フィットネスJavaScript · PythonGitHub @ElRadarDelAirsoftオンライン所有者未確認
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
El Radar del Airsoft - Perú
翻訳待ち
Loading the full README.
Read the full README ↗Directorio web de la comunidad de airsoft en Perú: canchas, tiendas, grupos de WhatsApp, eventos, importadores, mercado de pulgas, workshops, jugadores y equipos.
Sin backend, sin login. Todo el contenido vive en un único archivo JSON estático.
src/components/Icons.jsx)Edita únicamente public/data/airsoft.json. Es el único
archivo que necesitas tocar para agregar, modificar o quitar canchas, tiendas, eventos, etc.
nombre, whatsapp, direccion...), solo los valores."" (no lo borres).id que no se repita en esa categoría).+51 para que los links wa.me y tel:
funcionen bien.public/images/<categoria>/archivo.jpg y se referencian como
/images/<categoria>/archivo.jpg. Si dejas "imagen": "", la card muestra un ícono en su lugar.Requiere Node.js 18+.
npm install
npm run dev
Abre http://localhost:5173.
npm run build
Corre vite build y después scripts/prerender.mjs, que genera páginas HTML estáticas
indexables (una por campo, tienda, ciudad y post de blog — con su propio title/meta/OG/
JSON-LD) más sitemap.xml, robots.txt y llms.txt, todo dentro de dist/.
.github/workflows/deploy.yml corre npm run build y publica
dist/ en cada push a main. El repo debe tener Settings → Pages → Build and deployment → Source en "GitHub Actions" (no "Deploy from a branch", que intenta procesar el repo con Jekyll
y falla). Sitio en https://elradardelairsoft.github.io/.netlify.toml con npm run build y dist como carpeta publicada.SITE_URL en scripts/prerender.mjs (y las urls hardcodeadas en index.html) ya apuntan al
dominio real de GitHub Pages. Si el sitio se muda a un dominio propio, actualízalas ahí.departamento no vacío y cada tienda con ciudad no vacía generan su
propia página en /campos/<departamento>/<nombre>/ o /tiendas/<ciudad>/<nombre>/
(más una landing por departamento/ciudad). Si dejas esos campos vacíos, la entrada sigue
apareciendo en el directorio normal, solo no genera página propia.src/data/blogPosts.js (array plano, sin Markdown). Cada post genera
/blog/<slug>/. Formato pensado para que un LLM te pueda citar: respuesta directa de
2-3 líneas al inicio, headings en formato pregunta./) sigue
siendo la SPA interactiva de siempre.public/404.webp (la ilustración del topo) se usa en dist/404.html, generada también por
scripts/prerender.mjs. Netlify y Vercel sirven automáticamente un 404.html en la raíz
del build como página de error — no requiere configuración extra. Pesa ~2MB; si la
reemplazas, conviene comprimirla primero.public/
data/airsoft.json <- ÚNICO archivo de contenido a editar
images/<categoria>/ <- imágenes referenciadas desde el JSON
src/
components/
Header.jsx Buscador + logo + dark mode toggle
Footer.jsx Contacto admin + última actualización
CategoryTabs.jsx Tabs de las 9 categorías + "Ver todo"
CategoryGrid.jsx Grid responsivo (agrupa por categoría)
Card.jsx Card genérica reusada por las 9 categorías
ContactBadge.jsx Badge clicable (teléfono/email/web/dirección→maps)
SocialIcons.jsx Fila de íconos RRSS clicables
DarkModeToggle.jsx
SearchBar.jsx
Icons.jsx Íconos SVG propios (sin dependencias)
data/
categoryConfig.js Mapea cada categoría del JSON a un esquema común
que consume <Card />. Si agregas una 10ma categoría,
este es el único lugar de código que necesitas tocar.
hooks/
useAirsoftData.js Importa public/data/airsoft.json de forma estática (build time)
utils/
whatsapp.js Helpers para construir links wa.me / Google Maps
slug.js slugify() — usado por Card.jsx y scripts/prerender.mjs
App.jsx Filtrado por categoría + búsqueda global
scripts/
prerender.mjs Genera las páginas estáticas SEO/GEO + sitemap/robots/llms.txt
public/data/airsoft.json.categoryConfig (src/data/categoryConfig.js) con su
label, emoji y función normalize() que mapee los campos del JSON al
esquema común. El resto de la UI (tabs, grid, cards, búsqueda) se actualiza solo.