Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
64798bb
extract reveal
YaoxuanZhang Mar 25, 2026
58f03a4
develop branch and plan
YaoxuanZhang Mar 25, 2026
2530c65
add testing; need more testing; all the testing
YaoxuanZhang Mar 25, 2026
8af0af1
read ME
YaoxuanZhang Mar 25, 2026
180fe02
mega vibes
YaoxuanZhang Mar 25, 2026
59cca1e
relative pathing
YaoxuanZhang Mar 26, 2026
814cbf7
ai promaxxing
YaoxuanZhang Mar 26, 2026
597403b
appify
YaoxuanZhang Mar 26, 2026
b971f08
center error card
YaoxuanZhang Mar 26, 2026
f53aeb2
try again, and again, and again, and again, and again, and again, and…
YaoxuanZhang Mar 26, 2026
678b3f5
fix scroll snap, global css; logout broken
YaoxuanZhang Mar 26, 2026
a05ab56
gaslight the api
YaoxuanZhang Mar 26, 2026
42a25f0
feat(profile): minimal w/update
shamikkarkhanis Mar 26, 2026
20ff18e
feat(events): minimal
shamikkarkhanis Mar 26, 2026
072377a
feat(profile): header name
shamikkarkhanis Mar 26, 2026
b7a554b
add readings
YaoxuanZhang Mar 26, 2026
a7186dc
pass headers, tighten ci
YaoxuanZhang Mar 26, 2026
60edf6e
add proto
YaoxuanZhang Mar 26, 2026
7c450f8
merge with develop and fix profile
YaoxuanZhang Mar 26, 2026
df80152
Merge branch 'feature/profile-page' into develop
YaoxuanZhang Mar 26, 2026
41a39dd
profile rehaul to use api schema
YaoxuanZhang Mar 26, 2026
6e9c47c
remove duplicate save changes on profile
YaoxuanZhang Mar 26, 2026
e1aacd5
better button
YaoxuanZhang Mar 26, 2026
589e597
structural audit
YaoxuanZhang Mar 26, 2026
2f1a206
add logging
YaoxuanZhang Mar 26, 2026
edf734c
exit overlay
YaoxuanZhang Mar 26, 2026
98d0dc8
restructure topnav
YaoxuanZhang Mar 26, 2026
41a2f99
Merge branch 'develop' into feature/event-page
YaoxuanZhang Mar 26, 2026
d320534
event components
shamikkarkhanis Mar 26, 2026
d603cad
basic scrolling w/arrows
shamikkarkhanis Mar 26, 2026
266078c
dynamic opacity feather based on position
shamikkarkhanis Mar 26, 2026
ff493fe
sorta wired up events
shamikkarkhanis Mar 27, 2026
b96e6cb
event registration wired
shamikkarkhanis Mar 27, 2026
d8e698e
moved create button
shamikkarkhanis Mar 27, 2026
e1a64d7
updated with event title
shamikkarkhanis Mar 27, 2026
632b3ef
added org support
shamikkarkhanis Mar 27, 2026
c480e01
Merge pull request #1 from CAPY-RPI/feature/event-page
shamikkarkhanis Mar 27, 2026
9dfe15d
kinda working
shamikkarkhanis Apr 2, 2026
4b89f31
works well but not in safari
shamikkarkhanis Apr 3, 2026
f58db28
works on chromium browsers
shamikkarkhanis Apr 3, 2026
d9c14f5
Merge branch 'feature/sizing' into feature/scroll-plus-sizing
shamikkarkhanis Apr 3, 2026
ee52e99
works on chrome browsers, just use that for demo
shamikkarkhanis Apr 3, 2026
d074e2b
Merge pull request #3 from CAPY-RPI/feature/scroll-plus-sizing
shamikkarkhanis Apr 3, 2026
4a3a9fe
feat(create): create button
shamikkarkhanis Apr 3, 2026
757b9cc
functional serach
shamikkarkhanis Apr 3, 2026
770a41c
orgs only show joinable
shamikkarkhanis Apr 3, 2026
38c43c1
time placeholder
shamikkarkhanis Apr 3, 2026
5a61146
don't show registered events in reccomended
shamikkarkhanis Apr 3, 2026
4c878e3
Merge pull request #4 from CAPY-RPI/feature/caps-67-user-testing-updates
shamikkarkhanis Apr 3, 2026
ebfc6bb
fixed search icon
shamikkarkhanis Apr 13, 2026
6e34f7f
added keyboard shortcuts
Rkoester47 Apr 14, 2026
9843bf1
Merge pull request #5 from CAPY-RPI/feature/caps-68-fix-search-icon
shamikkarkhanis Apr 14, 2026
f944c3d
Added shortcut documentation on hover
Rkoester47 Apr 15, 2026
88d588b
Merge branch 'develop' into feature/caps-69-keyboard-shortcuts
shamikkarkhanis Apr 16, 2026
0d582b8
fix(config)
shamikkarkhanis Apr 16, 2026
d70133a
fix(prettier)
shamikkarkhanis Apr 16, 2026
8610b77
Merge pull request #6 from CAPY-RPI/feature/caps-69-keyboard-shortcuts
shamikkarkhanis Apr 16, 2026
f71316c
Better Scrollbar
JManion32 Apr 17, 2026
8cc4e2c
Merge pull request #7 from CAPY-RPI/better-scrolling
JManion32 Apr 17, 2026
e2327be
Removed Number Spinners
JManion32 Apr 17, 2026
140eabf
Merge pull request #8 from CAPY-RPI/feature/caps-71-polished-spinners
JManion32 Apr 17, 2026
fd843cb
Lowercase hotkey binds
JManion32 Apr 17, 2026
48168b6
Merge pull request #9 from CAPY-RPI/exact-hover-hotkeys
JManion32 Apr 17, 2026
3043ed7
Fixed
JManion32 Apr 17, 2026
266413a
Merge pull request #10 from CAPY-RPI/feature/caps-72-profile-page-uns…
JManion32 Apr 17, 2026
3f7ceff
Visually Disabled Pill Button
JManion32 Apr 17, 2026
b241621
Merge pull request #11 from CAPY-RPI/feature/caps-74-create-organizat…
JManion32 Apr 17, 2026
9784a7a
experimenting
shamikkarkhanis Apr 23, 2026
f025581
scrolling, scaling, sleeping...
shamikkarkhanis Apr 23, 2026
6545baf
Merge pull request #12 from CAPY-RPI/feature/mobile
shamikkarkhanis Apr 23, 2026
20b1c52
fix(event): rail item cap of 20 moved to 100
shamikkarkhanis Apr 28, 2026
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
14 changes: 14 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# API Configuration
# The target URL for the Vite dev proxy.
# In production, this should likely be the same origin.
VITE_API_BASE_URL=https://dev.capyrpi.org

# The path prefix for API calls.
VITE_API_VERSION=/api/v1

# OAuth & Local Development
# The host header sent to the backend for redirect URI generation.
VITE_DEV_HOST=localhost:5173

# The protocol header sent to the backend for redirect URI generation.
VITE_DEV_PROTO=http
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ on:
pull_request:
branches:
- main
- develop
push:
branches:
- main
- develop

permissions:
contents: read
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ on:
pull_request:
branches:
- main
- develop
push:
branches:
- main
- develop
tags:
- 'v*'
workflow_dispatch:
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,4 @@ dist-ssr
*.njsproj
*.sln
*.sw?
.agents/
169 changes: 169 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
# Capy Lander

Premium, horizontal-first React landing page based on Figma design `8:426`.

---

## 🏗️ Architecture

- **React 19 + TypeScript + Vite**
- **Feature-based folders:**
- `src/sections/` — Page sections (feature-based)
- `src/components/` — Shared UI components
- `src/hooks/` — Custom React hooks
- `src/data/` — Static content/data
- `src/theme/tokens.css` — Design tokens (colors, spacing, typography)
- **CSS Modules:** All components use local CSS modules for styling
- **Design Tokens:** All colors, spacing, and typography use CSS custom properties from `tokens.css`
- **Framer Motion:** For reveal and premium interaction animation

## 🚀 Getting Started

1. **Install dependencies**:
```bash
npm install
```
2. **Configure Environment**:
Create a `.env.local` file for local development (see [.env.example](.env.example)):
```bash
cp .env.example .env.local
```
3. **Run development server**:
```bash
npm run dev
```

## 🌐 Environment Variables

The application uses Vite's environment variable system. For local development, use `.env.local`.

| Variable | Description | Default |
| :------------------ | :--------------------------------------------------------------------- | :---------- |
| `VITE_API_BASE_URL` | The target backend for the dev proxy (e.g., `https://dev.capyrpi.org`) | `undefined` |
| `VITE_API_VERSION` | The API version prefix | `/api/v1` |

> [!NOTE]
> If `VITE_API_BASE_URL` is set, Vite will automatically proxy all `/api` requests to that target. This avoids CORS issues and allows for testing against remote backends.

Production build:

```bash
npm run build
```

## 🐳 Docker

Build and run the production image locally:

```bash
docker build -t capy-lander:local .
docker run --rm -p 8080:80 capy-lander:local
```

Open [http://localhost:8080](http://localhost:8080).

## 🧩 Docker Compose

This repo supports both Compose modes:

- `image:` mode for reproducible runs (default in `docker-compose.yml`)
- `build:` mode for local development iteration (in `docker-compose.override.yml`)

By default, Docker Compose loads `docker-compose.override.yml`, so a local run builds from source:

```bash
docker compose up --build
```

To run a published registry image instead, disable overrides and set the image tag:

```bash
CAPY_IMAGE=ghcr.io/<owner>/<repo>:latest docker compose -f docker-compose.yml up
```

## 🛠️ Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md) for full guidelines.

- **Feature-based folders:** Place new features/sections in their own folder under `src/sections/` or `src/components/`.
- **CSS Modules:** Use local CSS modules for all new components.
- **Design Tokens:** Reference all colors, spacing, and typography via `src/theme/tokens.css`.
- **JSDoc Comments:** Add clear JSDoc comments to all hooks and complex logic blocks, explaining _why_ the logic exists.

## 🏭 GitHub Actions

Workflow: `.github/workflows/docker-image.yml`

- PRs to `main`: lint, build, and container build validation (no push)
- Push to `main`: lint, build, build and push image to GHCR
- Version tags (`v*`): lint, build, build and push versioned image tags

---

For questions, open an issue or start a discussion.

Published image name:

```text
ghcr.io/<owner>/<repo>
```

Tags include branch/PR refs, commit SHA, semver (for `v*` tags), and `latest` on the default branch.

## Architecture

- `src/App.tsx`: app shell + panel composition + horizontal scroll container
- `src/hooks/useHorizontalWheelScroll.ts`: maps vertical wheel intent to horizontal scrolling
- `src/components/*`: reusable primitives (`GlassCard`, `TopNav`, `AspectImage`)
- `src/sections/*`: page-level sections matching Figma panel structure
- `src/data/content.ts`: static content and asset URLs
- `src/theme/tokens.css`: global design tokens (colors, spacing, radii, fonts, glass effects)

## Design Tokens

Core tokens live in `src/theme/tokens.css` and are consumed by all sections:

- Global colors (`--c-bg`, `--c-surface`, `--c-accent`, text tones)
- Glassmorphism (`--glass-blur`, `--glass-highlight`, `--glass-shadow`)
- Type system (`--font-display`, `--font-body`)
- Spacing/radius system (`--space-*`, `--radius-*`)

This keeps visual updates centralized and safe.

## Horizontal Scrolling Behavior

- Vertical page scroll is disabled at document level.
- Main scroller (`.horizontalScroller`) has x-overflow only.
- Wheel events are intercepted and converted to horizontal movement.
- Touchpad/mouse wheel deltas both work by choosing dominant intent (`deltaY` or `deltaX`).

## SVG And Aspect Ratio Safety

- All logo/icon/illustration image nodes use `AspectImage`.
- `AspectImage` enforces `object-fit: contain` and centered positioning.
- Containers define the intended dimensions; image content is never stretched.

## Fidelity Checklist

When iterating:

- Verify panel widths/heights against Figma track
- Verify card padding and inter-card gaps
- Verify font sizes: 16, 18, 20, 24, 36, 40, 96, 160
- Verify CTA dimensions and corner radii
- Verify no vertical scrolling on desktop
- Verify all SVGs/icons remain non-distorted

## Public Assets

- `public/assets/brand`: logo and brand marks
- `public/assets/illustrations`: larger decorative illustrations
- `public/assets/ui`: UI chrome shapes (pills and controls)
- `public/assets/social`: social platform icons

Canonical brand filenames:

- `public/assets/brand/capy-full-white.svg`
- `public/assets/brand/capy-full-primary.svg`

Asset mapping is centralized in `src/data/content.ts`.
36 changes: 36 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Contributing to Capy Lander

Thank you for considering contributing! To keep the codebase clean and maintainable, please follow these guidelines:

## Feature-Based Folder Structure

- Place new features or sections in their own folder under `src/sections/` or `src/components/` as appropriate.
- Shared hooks go in `src/hooks/`.
- Shared data and utilities go in `src/data/` or `src/utils/`.

## CSS Modules & Styling

- Use CSS modules for all new components (e.g., `ComponentName.module.css`).
- Avoid global styles except for tokens and resets in `src/theme/tokens.css` and `index.css`.
- Reference design tokens via the `tokens.css` custom properties for all colors, spacing, and typography.

## Design Tokens

- Always use the CSS variables defined in `src/theme/tokens.css` for colors, spacing, and font sizes.
- Do not hardcode values; update tokens if new design values are needed.

## Code Style

- Use TypeScript for all files.
- Write clear JSDoc comments for all hooks and complex logic blocks, explaining both what and why.
- Run `npm run lint` before submitting a PR.

## Pull Requests

- Keep PRs focused and small. One feature or fix per PR.
- Add or update documentation as needed.
- Ensure all tests and builds pass before requesting review.

---

For questions, open an issue or ask in discussions. Happy coding!
87 changes: 65 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,57 @@
# Capy Lander

Premium, horizontal-first React landing page implementation based on Figma design `8:426`.

## Stack

- React 19 + TypeScript + Vite
- Framer Motion for reveal and premium interaction animation
- CSS tokens + componentized sections for maintainability

## Run

```bash
npm install
npm run dev
```
Premium, horizontal-first React landing page based on Figma design `8:426`.

---

## 🏗️ Architecture

- **React 19 + TypeScript + Vite**
- **Feature-based folders:**
- `src/sections/` — Page sections (feature-based)
- `src/components/` — Shared UI components
- `src/hooks/` — Custom React hooks
- `src/data/` — Static content/data
- `src/theme/tokens.css` — Design tokens (colors, spacing, typography)
- **CSS Modules:** All components use local CSS modules for styling
- **Design Tokens:** All colors, spacing, and typography use CSS custom properties from `tokens.css`
- **Framer Motion:** For reveal and premium interaction animation

## 🚀 Getting Started

1. **Install dependencies**:
```bash
npm install
```
2. **Configure Environment**:
Create a `.env.local` file for local development (see [.env.example](.env.example)):
```bash
cp .env.example .env.local
```
3. **Run development server**:
```bash
npm run dev
```

## 🌐 Environment Variables

The application uses Vite's environment variable system. For local development, use `.env.local`.

| Variable | Description | Default |
| :------------------ | :--------------------------------------------------------------------- | :---------- |
| `VITE_API_BASE_URL` | The target backend for the dev proxy (e.g., `https://dev.capyrpi.org`) | `undefined` |
| `VITE_API_VERSION` | The API version prefix | `/api/v1` |

> [!NOTE]
> If `VITE_API_BASE_URL` is set, Vite will automatically proxy all `/api` requests to that target. This avoids CORS issues and allows for testing against remote backends.

Production build:

```bash
npm run build
```

## Docker
## 🐳 Docker

Build and run the production image locally:

Expand All @@ -30,16 +60,16 @@ docker build -t capy-lander:local .
docker run --rm -p 8080:80 capy-lander:local
```

Open `http://localhost:8080`.
Open [http://localhost:8080](http://localhost:8080).

## Docker Compose
## 🧩 Docker Compose

This repo supports both common Compose modes:
This repo supports both Compose modes:

- `image:` mode for reproducible runs (default in `docker-compose.yml`)
- `build:` mode for local development iteration (in `docker-compose.override.yml`)

By default, Docker Compose automatically loads `docker-compose.override.yml`, so a local run builds from source:
By default, Docker Compose loads `docker-compose.override.yml`, so a local run builds from source:

```bash
docker compose up --build
Expand All @@ -51,14 +81,27 @@ To run a published registry image instead, disable overrides and set the image t
CAPY_IMAGE=ghcr.io/<owner>/<repo>:latest docker compose -f docker-compose.yml up
```

## GitHub Image Builder
## 🛠️ Contributing

GitHub Actions workflow: `.github/workflows/docker-image.yml`
See [CONTRIBUTING.md](CONTRIBUTING.md) for full guidelines.

- Pull requests to `main`: lint, build, and container build validation (no push)
- **Feature-based folders:** Place new features/sections in their own folder under `src/sections/` or `src/components/`.
- **CSS Modules:** Use local CSS modules for all new components.
- **Design Tokens:** Reference all colors, spacing, and typography via `src/theme/tokens.css`.
- **JSDoc Comments:** Add clear JSDoc comments to all hooks and complex logic blocks, explaining _why_ the logic exists.

## 🏭 GitHub Actions

Workflow: `.github/workflows/docker-image.yml`

- PRs to `main`: lint, build, and container build validation (no push)
- Push to `main`: lint, build, build and push image to GHCR
- Version tags (`v*`): lint, build, build and push versioned image tags

---

For questions, open an issue or start a discussion.

Published image name:

```text
Expand Down
1 change: 1 addition & 0 deletions __mocks__/styleMock.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = {}
Loading
Loading