Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 0 additions & 12 deletions .eslintrc.js

This file was deleted.

14 changes: 14 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
## Summary

<!-- 1–3 bullets describing what this PR does and why. -->

## Test plan

- [ ] `npm run lint` passes
- [ ] `npm run develop` boots and the affected pages render
- [ ] If user-facing strings changed, both `en.json` and `es.json` are updated

## Checklist

- [ ] Followed [CONTRIBUTING.md](../CONTRIBUTING.md)
- [ ] Acknowledged the [Code of Conduct](../CODE_OF_CONDUCT.md)
28 changes: 20 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,23 +1,35 @@
name: CI
on: [push, pull_request]

on:
push:
branches: [main]
pull_request:

permissions:
contents: read

concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- uses: actions/setup-node@v3
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 18
node-version-file: .nvmrc
cache: npm
- name: Install
run: npm ci
- name: Lint
run: npm run lint
- name: Build
run: npm run build
- name: Percy Test
run: npx percy snapshot _site/
with:
build-directory: "public/"
- name: Percy Snapshot
run: npx --yes @percy/cli snapshot public/
env:
PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }}
19 changes: 13 additions & 6 deletions .github/workflows/greetings.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
name: Greetings

on: [pull_request, issues]
on:
pull_request_target:
issues:
types: [opened]

permissions:
issues: write
pull-requests: write

jobs:
greeting:
runs-on: ubuntu-latest
steps:
- uses: actions/first-interaction@v1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
issue-message: 'Gracias por tu interes en Fullstack Nights y por hacer este GitHub Issue! Pronto estaremos en contacto.'
pr-message: 'Gracias por tu interes en Fullstack Nights y por hacer este Pull Request! Pronto estaremos en contacto.'
- uses: actions/first-interaction@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
issue-message: "Gracias por tu interes en Fullstack Nights y por hacer este GitHub Issue! Pronto estaremos en contacto."
pr-message: "Gracias por tu interes en Fullstack Nights y por hacer este Pull Request! Pronto estaremos en contacto."
25 changes: 14 additions & 11 deletions .github/workflows/stale.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,22 @@ name: Mark stale issues and pull requests

on:
schedule:
- cron: "0 0 * * sun"
- cron: "0 0 * * sun"
workflow_dispatch:

permissions:
issues: write
pull-requests: write

jobs:
stale:

runs-on: ubuntu-latest

steps:
- uses: actions/stale@v1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'This issue has been marked as stale by our fancy bot. CC: @eluciano11 @froi'
stale-pr-message: 'This pull request has been marked as stale by our fancy bot. CC: @eluciano11 @froi'
stale-issue-label: 'no-issue-activity'
stale-pr-label: 'no-pr-activity'
days-before-close: -1
- uses: actions/stale@v9
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: "This issue has been marked as stale by our fancy bot. CC: @eluciano11 @rnegron"
stale-pr-message: "This pull request has been marked as stale by our fancy bot. CC: @eluciano11 @rnegron"
stale-issue-label: "no-issue-activity"
stale-pr-label: "no-pr-activity"
days-before-close: -1
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
18.14.2
22.22.2
7 changes: 2 additions & 5 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
{
"recommendations": [
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint"
]
}
"recommendations": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint"]
}
68 changes: 68 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Commands

Node version is pinned via `.nvmrc` (currently `22.22.2`, lts/jod). Use `nvm use` before running anything.

- `npm run develop` — start the Gatsby dev server (`gatsby develop`); also aliased as `npm start`
- `npm run build` — production build into `public/`
- `npm run serve` — serve the production build
- `npm run clean` — `gatsby clean` (run this when you hit Gatsby cache weirdness)
- `npm run lint` — `oxlint src/` (zero-config; replaced ESLint)
- `npm run format` — Prettier 3 over `**/*.{js,jsx,json,md}`

There is no unit test runner — the `test` script is a placeholder. CI (`.github/workflows/ci.yml`) runs `lint`, `build`, and a Percy visual snapshot step against `public/` (requires `PERCY_TOKEN`).

## Architecture

Static marketing site for Fullstack Nights (a Puerto Rico tech/design community), built with **Gatsby 5 + React 18 + Tailwind 3 + PostCSS**.

### Active event toggle (`src/config.js`)

`CONFIG.activeEvent` is the single switch that drives event-related UI across the site:

- When `false`: the `/schedule/` route is filtered out of the nav (`getSections` in `src/constants.js`) and the homepage hides `<UpcomingEvent>`.
- When `true`: set `CONFIG.event` to `{ type, date, venue, participants }`. `type` is `"topic-tables"` or anything else (treated as Speakers). The homepage layout shifts (different spacing classes are applied).

When adding a new event, edit only `src/config.js` — no other files should hardcode event data.

### Internationalization (`src/i18n.js`, `src/locales/{en,es}.json`)

i18next is initialized in `gatsby-browser.js`. Languages are detected via `i18next-browser-languagedetector` with fallback `en`. The language switcher in `getLanguageSwitcher` toggles between `en-US` and `es-PR` specifically. All user-facing strings should go through `useTranslation()` and live in both `en.json` and `es.json` — keep the two files structurally in sync.

### Components (`src/components/`)

- Barrel re-export from `src/components/index.js` — import shared components from `"../components/index"`.
- Each component pairs `foo.js` with an optional `foo.module.css` (CSS Modules). Tailwind utility classes are used inline; `.module.css` is reserved for things Tailwind can't express.
- `Layout` wraps every page with `<Menu>` + `<main>` + `<Footer>`. Pages render inside `<Layout>` in the page body.

### SEO / `<head>` injection

This project uses **Gatsby's built-in [Head API](https://www.gatsbyjs.com/docs/reference/built-in-components/gatsby-head/)** — `react-helmet` was removed. Each page in `src/pages/` exports a top-level `Head` component **at module scope**, not inside the page's JSX:

```js
export default function MyPage() { /* ... */ }
export const Head = () => <SEO title="My Page" />;
```

`src/components/seo.js` returns a fragment of plain `<title>`, `<meta>`, and `<html lang>` tags (no `<Helmet>` wrapper). It uses `useStaticQuery` to read site metadata. **Adding a new page means adding the `Head` export** — without it, that page silently loses its title and meta tags.

### SVG handling

`gatsby-plugin-react-svg` is configured (in `gatsby-config.js`) to inline-import only files matching `*.inline.svg`. Use the `.inline.svg` suffix when you need the SVG as a React component (e.g. `import RSS from "../assets/rss.inline.svg"`); use a normal `.svg` import for static `<img src>` usage.

### Static assets

`static/` is copied to the site root verbatim. Photos are organized by role: `static/{founders,organizers,moderators,past-speakers}/`. The `ORGANIZERS` / `FOUNDERS` arrays in `src/constants.js` and `src/past-speakers.js` / `src/past-moderators.js` reference these paths as absolute (`/founders/...`).

### Styling

- Tailwind config (`tailwind.config.js`) defines a custom design system: brand colors, custom `spacing` scale in 5px increments, custom `fontSize` scale (`xs`–`xl`, `h1`–`h4`). Prefer these tokens over arbitrary values.
- `postcss.config.js` runs `@fullhuman/postcss-purgecss` only in production against `./src/**/*.js`. Dynamic class names that aren't statically present in JS source can be purged — keep class strings literal.
- Global CSS is loaded via `gatsby-browser.js` (`src/styles/global.css`, `src/styles/typography.css`).

### Pages

Files in `src/pages/` map 1:1 to routes via Gatsby's filesystem routing: `about.js` → `/about/`, etc. `404.js` is the not-found page.
26 changes: 26 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Contributing

Thanks for your interest in Fullstack Nights! This project welcomes contributions from the community.

## Setup

```sh
nvm use # picks up Node version from .nvmrc
npm install
npm run develop # http://localhost:8000
```

## Workflow

1. Fork the repo and create a topic branch from `main`.
2. Make your changes. Keep commits scoped and use [conventional commit](https://www.conventionalcommits.org/) prefixes (`feat:`, `fix:`, `docs:`, `chore:`, …).
3. Run `npm run lint` and `npm run format` before pushing.
4. Open a pull request — the [template](.github/PULL_REQUEST_TEMPLATE.md) will guide you through the rest.

## Translations

User-facing strings live in `src/locales/en.json` and `src/locales/es.json`. Keep both files in sync; pages render via `useTranslation()` from `react-i18next`.

## Code of Conduct

By participating you agree to follow our [Code of Conduct](CODE_OF_CONDUCT.md) ([español](https://fullstacknights.com/code-of-conduct/)).
29 changes: 15 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
<p align="center">
<a href="https://fullstacknights.com/">
<svg width="86" height="75" xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero" fill="none"><path d="M.07 37.777l18.323 31.839a.78.78 0 001.066.287.78.78 0 00.285-.287l8.12-14.082a.807.807 0 000-.781L18.153 37.89a.803.803 0 010-.78l9.713-16.863a.803.803 0 000-.78L19.758 5.385a.779.779 0 00-1.351 0L.07 37.223a.59.59 0 000 .554z" fill="#31D7FB"/><path d="M55.235 37.223a.559.559 0 010 .554L41.737 61.28l-7.47 12.94a.515.515 0 00.186.71c.08.046.169.07.26.07h29.336a.774.774 0 00.672-.39l21.222-36.833a.549.549 0 000-.554L64.721.39a.775.775 0 00-.672-.39H34.713a.514.514 0 00-.524.52c0 .091.024.181.07.26l5.32 9.223 15.656 27.22z" fill="#0282F8"/></g></svg>
</a>
</p>
<h1 align="center">
Fullstack Nights Website
</h1>
<div align="center">

<!-- AUTO-GENERATED-CONTENT:START (STARTER) -->
## 🎓 Learning Gatsby
<img src="src/images/logo.png" alt="Fullstack Nights" width="320" />

Looking for more guidance? Full documentation for Gatsby lives [on the website](https://www.gatsbyjs.org/). Here are some places to start:
**Charlas sobre tecnología y diseño en un ambiente informal.**

- **For most developers, we recommend starting with our [in-depth tutorial for creating a site with Gatsby](https://www.gatsbyjs.org/tutorial/).** It starts with zero assumptions about your level of ability and walks through every step of the process.
[![CI](https://github.com/fullstacknights/website/actions/workflows/ci.yml/badge.svg)](https://github.com/fullstacknights/website/actions/workflows/ci.yml)
[![License: MIT](https://img.shields.io/github/license/fullstacknights/website?color=blue)](LICENSE)
[![Node](https://img.shields.io/badge/node-%E2%89%A522-339933?logo=node.js&logoColor=white)](.nvmrc)
[![Gatsby](https://img.shields.io/badge/Gatsby-5-663399?logo=gatsby&logoColor=white)](https://www.gatsbyjs.com/)
[![Code style: Prettier](https://img.shields.io/badge/code_style-prettier-F7B93E?logo=prettier&logoColor=black)](https://prettier.io/)

- **To dive straight into code samples, head [to our documentation](https://www.gatsbyjs.org/docs/).** In particular, check out the _Guides_, _API Reference_, and _Advanced Tutorials_ sections in the sidebar.
</div>

## Quick start

<!-- AUTO-GENERATED-CONTENT:END -->
```sh
nvm use # picks up Node version from .nvmrc
npm install
npm run develop # http://localhost:8000
```
1 change: 0 additions & 1 deletion gatsby-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ module.exports = {
author: `@fullstacknights`
},
plugins: [
`gatsby-plugin-react-helmet`,
{
resolve: `gatsby-source-filesystem`,
options: {
Expand Down
Loading
Loading