diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..b89f4bd --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,3 @@ +# Default owners for everything in the repo. +# These maintainers are requested for review on every pull request. +* @eluciano11 @rnegron diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..cf38f30 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,35 @@ +name: Bug report +description: Report something that is broken on the site. +labels: [bug] +body: + - type: textarea + id: what-happened + attributes: + label: What happened? + description: A clear description of the bug, and what you expected instead. + validations: + required: true + - type: textarea + id: steps + attributes: + label: Steps to reproduce + placeholder: | + 1. Go to '...' + 2. Click on '...' + 3. See error + validations: + required: true + - type: input + id: environment + attributes: + label: Browser / device + placeholder: e.g. Chrome 138 on macOS, Safari on iPhone + validations: + required: false + - type: textarea + id: screenshots + attributes: + label: Screenshots + description: Drag and drop any screenshots here (optional). + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..3a3eb71 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Discord community + url: https://discord.gg/aeKTqu6A + about: Questions, ideas, and general chat happen on our Discord — say hi! + - name: Website + url: https://fullstacknights.com + about: Learn more about Fullstack Nights and upcoming events. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..2369d50 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,24 @@ +name: Feature request +description: Suggest an improvement or new idea for the site. +labels: [enhancement] +body: + - type: textarea + id: problem + attributes: + label: What problem does this solve? + description: Describe the motivation. What's missing or frustrating today? + validations: + required: true + - type: textarea + id: proposal + attributes: + label: Proposed solution + description: What would you like to see happen? + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + validations: + required: false diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..5cbad15 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,22 @@ +version: 2 +updates: + - package-ecosystem: npm + directory: "/" + schedule: + interval: weekly + open-pull-requests-limit: 10 + groups: + gatsby: + patterns: + - "gatsby" + - "gatsby-*" + dev-dependencies: + dependency-type: development + commit-message: + prefix: chore + - package-ecosystem: github-actions + directory: "/" + schedule: + interval: weekly + commit-message: + prefix: ci diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index efadef3..6305858 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,6 +27,8 @@ jobs: run: npm ci - name: Lint run: npm run lint + - name: Format check + run: npx prettier --check "**/*.{js,jsx,json,md}" - name: Build run: npm run build - name: Percy Snapshot diff --git a/.github/workflows/greetings.yml b/.github/workflows/greetings.yml index 7e4d780..fa15c9e 100644 --- a/.github/workflows/greetings.yml +++ b/.github/workflows/greetings.yml @@ -16,5 +16,5 @@ jobs: - 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." + issue_message: "¡Gracias por tu interés en Fullstack Nights y por abrir este Issue! Pronto estaremos en contacto. / Thanks for your interest in Fullstack Nights and for opening this issue! We'll be in touch soon." + pr_message: "¡Gracias por tu interés en Fullstack Nights y por hacer este Pull Request! Pronto estaremos en contacto. / Thanks for your interest in Fullstack Nights and for opening this pull request! We'll be in touch soon." diff --git a/CLAUDE.md b/CLAUDE.md index c20ee82..1cf8997 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -43,7 +43,9 @@ i18next is initialized in `gatsby-browser.js`. Languages are detected via `i18ne 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 default function MyPage() { + /* ... */ +} export const Head = () => ; ``` diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 7a750fb..715289c 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -2,7 +2,7 @@ ## Short version -Our conference is dedicated to offering a welcoming experience for everyone, regardless of their gender, sexual orientation, ability, appearance, ethnicity or religion. We do not tolerate abuses towards the participants of the conference in any form. Sexual language and/or sexualized images are not appropriate for any aspect of the conference, including talks, workshops, gatherings, Twitter or any other online medium associated to the event. Conference participants who violate these rules could be sanctioned or expelled from the conference without any reimbursement, at the discretion of the conference organizers. +Our conference is dedicated to offering a welcoming experience for everyone, regardless of their gender, sexual orientation, ability, appearance, ethnicity or religion. We do not tolerate abuses towards the participants of the conference in any form. Sexual language and/or sexualized images are not appropriate for any aspect of the conference, including talks, workshops, gatherings, Discord, X or any other online medium associated to the event. Conference participants who violate these rules could be sanctioned or expelled from the conference without any reimbursement, at the discretion of the conference organizers. ## Long version diff --git a/README.md b/README.md index 2eb0d58..c8005da 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ **Charlas sobre tecnología y diseño en un ambiente informal.** [![CI](https://github.com/fullstacknights/website/actions/workflows/ci.yml/badge.svg)](https://github.com/fullstacknights/website/actions/workflows/ci.yml) +[![Discord](https://img.shields.io/discord/1521687604586614926?label=Discord&logo=discord&logoColor=white&color=5865F2)](https://discord.gg/aeKTqu6A) [![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/) @@ -12,6 +13,9 @@ +The marketing site for [Fullstack Nights](https://fullstacknights.com) — a Puerto Rico +tech and design community. Built with Gatsby 5, React 18, and Tailwind 3. + ## Quick start ```sh @@ -19,3 +23,45 @@ nvm use # picks up Node version from .nvmrc npm install npm run develop # http://localhost:8000 ``` + +## Scripts + +| Command | What it does | +| ----------------- | ------------------------------------------------ | +| `npm run develop` | Start the Gatsby dev server (alias: `npm start`) | +| `npm run build` | Production build into `public/` | +| `npm run serve` | Serve the production build | +| `npm run lint` | `oxlint` over `src/` | +| `npm run format` | Prettier over `**/*.{js,jsx,json,md}` | +| `npm run clean` | `gatsby clean` (clears the Gatsby cache) | + +## Project layout + +``` +src/ + components/ Shared React components (barrel export via index.js) + pages/ Filesystem routes (about.js → /about/) + locales/ i18n strings — en.json / es.json, kept in sync + config.js CONFIG.activeEvent toggles event-related UI +static/ Copied to site root verbatim (photos, assets) +netlify/ Serverless functions (form submissions) +``` + +## Deployment + +The site deploys to [Netlify](https://www.netlify.com/) on every push to `main` +(see `netlify.toml`). CI (`.github/workflows/ci.yml`) runs lint, format check, +build, and a Percy visual snapshot on each pull request. + +## Community + +- Join us on [Discord](https://discord.gg/aeKTqu6A) +- Read the [Code of Conduct](CODE_OF_CONDUCT.md) ([español](https://fullstacknights.com/code-of-conduct/)) + +## Contributing + +Contributions are welcome — see [CONTRIBUTING.md](CONTRIBUTING.md) to get started. + +## License + +[MIT](LICENSE) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..789150c --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,19 @@ +# Security Policy + +## Reporting a vulnerability + +This is a static marketing site, but we still take security seriously. If you +find a vulnerability, please **do not open a public issue**. + +Instead, report it privately through +[GitHub's private vulnerability reporting](https://github.com/fullstacknights/website/security/advisories/new), +or reach out to an organizer on our [Discord](https://discord.gg/aeKTqu6A). + +We'll acknowledge your report as soon as we can and keep you updated on the fix. + +## Scope + +- The website and its build tooling in this repository. +- The Netlify serverless functions under `netlify/`. + +Thanks for helping keep the community safe. diff --git a/netlify/functions/submission-created.js b/netlify/functions/submission-created.js index 7474db1..25807db 100644 --- a/netlify/functions/submission-created.js +++ b/netlify/functions/submission-created.js @@ -63,7 +63,10 @@ exports.handler = async (event) => { console.error( `submission-created: Discord returned ${response.status} for form "${formName}"` ); - return { statusCode: 502, body: `Discord webhook failed: ${response.status}` }; + return { + statusCode: 502, + body: `Discord webhook failed: ${response.status}` + }; } } catch (error) { console.error( diff --git a/src/components/submission-form.js b/src/components/submission-form.js index f86ff0e..6155858 100644 --- a/src/components/submission-form.js +++ b/src/components/submission-form.js @@ -57,7 +57,10 @@ function SubmissionForm() { event.preventDefault(); setStatus("submitting"); - fetch("/", { method: "POST", body: new URLSearchParams(new FormData(event.target)) }) + fetch("/", { + method: "POST", + body: new URLSearchParams(new FormData(event.target)) + }) .then((response) => { if (!response.ok) throw new Error(response.statusText); setStatus("success"); diff --git a/src/constants.js b/src/constants.js index a42e7e2..7cade13 100644 --- a/src/constants.js +++ b/src/constants.js @@ -1,6 +1,6 @@ import CONFIG from "./config"; -export const DISCORD_LINK = "https://discord.gg/5MTV7Kmwn5"; +export const DISCORD_LINK = "https://discord.gg/aeKTqu6A"; export const ORGANIZERS = [ {