Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
155 commits
Select commit Hold shift + click to select a range
c037555
feat: setup project
fire332 Jun 16, 2026
47cd1f1
Merge pull request #1 from sfu-gdc/fire332-setup
fire332 Jun 25, 2026
f33d441
build: remove useless `.npmrc`
fire332 Jun 26, 2026
c48a6fa
build: add missing `import 'unfonts.css' in storybook preview`
fire332 Jun 26, 2026
5443f03
docs: enable autodocs for all stories
fire332 Jun 26, 2026
eed6199
build: center storybook preview
fire332 Jun 26, 2026
29034c7
build: warn when icons specified aren't installed
fire332 Jun 26, 2026
c2da868
refactor: improve naming of classes for brand colors
fire332 Jun 26, 2026
da5f2d0
build: workaround wrangler running build when generating types
fire332 Jun 26, 2026
5f285ad
build: bump deps
fire332 Jun 26, 2026
dcb569f
build: add peer dep override for `vite-plugin-devtools-json`
fire332 Jun 26, 2026
71ba6e5
build: fix autodocs+vitest complaining about unresolved deps
fire332 Jun 26, 2026
0f85fc1
chore: enable figma claude-code plugin
fire332 Jun 26, 2026
bdb4ba1
ci: add chromatic workflow
fire332 Jun 27, 2026
84cb487
chore: don't auto-open browser with `pnpm run storybook`
fire332 Jun 27, 2026
0f6fdcf
ci: fix node version file specified incorrectly in `setup-env` action
fire332 Jun 27, 2026
bbe4d6d
Merge pull request #2 from sfu-gdc/fire332-chromatic-setup
fire332 Jun 27, 2026
d0c419a
build(storybook): add storybook-addon-pseudo-states
fire332 Jun 27, 2026
af8864b
refactor: move design tokens out of build config so other tooling can…
fire332 Jun 28, 2026
17d6826
feat: interpolate full color ramps from a few anchor stops
fire332 Jun 28, 2026
dc0c0fa
feat: expose the Wind4 text scale as a token
fire332 Jun 28, 2026
0f5ec63
docs: add Storybook pages for the color and type tokens
fire332 Jun 28, 2026
f97debe
build(storybook): integrate with visual test addon
fire332 Jun 29, 2026
36e64aa
build(lint): use same `extraFileExtensions` across all files for perf…
fire332 Jun 29, 2026
3fbc9b1
build(lint): fix svelte eslint parser not loading config
fire332 Jun 29, 2026
cf9d26c
ci: add test workflow
fire332 Jun 29, 2026
1eb711f
chore: add claude hook to auto-deny `npx *` and `npm *` usage
fire332 Jun 29, 2026
f93969c
build: support inline tests
fire332 Jun 29, 2026
6fc4169
test: test `generateColors()`
fire332 Jun 29, 2026
bf4ca64
chore: prettify all
fire332 Jun 29, 2026
2cd9cb7
Merge pull request #4 from sfu-gdc/fire332-improve-storybook
fire332 Jun 30, 2026
938e608
build(storybook): add PaddingDecorator to prevent clipping of visuals…
fire332 Jun 30, 2026
bc84b61
chore: add `.gitattributes` to ensure correct line endings
fire332 Jun 30, 2026
690aa7c
build: refactor `tsconfig`s into solution style
fire332 Jun 30, 2026
0e1990c
feat: impl button
fire332 Jun 26, 2026
276a76c
Merge pull request #3 from sfu-gdc/fire332-button
fire332 Jun 30, 2026
72437f5
build: bump `pnpm`
fire332 Jul 5, 2026
a99d09f
chore: add more eslint rules
fire332 Jul 5, 2026
24ef2c3
chore: fix lint error in `svelte.config.ts`
fire332 Jul 5, 2026
9978414
chore: add import sorting with eslint
fire332 Jul 5, 2026
55ea734
chore: sort imports
fire332 Jul 11, 2026
91bf62e
Merge pull request #5 from sfu-gdc/fire332-chore
fire332 Jul 11, 2026
7d1ec54
chore: bump deps
fire332 Jul 11, 2026
fc82823
chore(deps): bump dev tooling within semver ranges
fire332 Jul 15, 2026
bccd5fa
chore(deps): add runed
fire332 Jul 15, 2026
554ea34
feat(design-tokens): reshape ramp shadows with a per-scale gamma curve
fire332 Jul 15, 2026
1920087
test: pin the vitest browser server to a fixed port
fire332 Jul 15, 2026
277ade4
build: add commit-message linter
fire332 Jul 15, 2026
8421932
Merge pull request #7 from sfu-gdc/fire332-dev-ux
fire332 Jul 18, 2026
e6041a2
feat(ui-components): add SprayBorder WebGL spray-paint border component
fire332 Jul 15, 2026
50d12cf
feat(ui-components): round the button focus outline
fire332 Jul 19, 2026
cdead04
Merge pull request #8 from sfu-gdc/fire332-button
fire332 Jul 20, 2026
94ea5ca
feat(theme): add brand color fallbacks
fire332 Jul 22, 2026
7f0dc63
feat: add configurable brand color palettes
fire332 Jul 22, 2026
20b7821
docs: remove obsolete color palette page
fire332 Jul 22, 2026
b9fda44
Merge pull request #10 from sfu-gdc/fire332-brand-color-fallbacks
fire332 Jul 22, 2026
7d06d46
feat(theme): add brand font families
fire332 Jul 22, 2026
f820c58
Merge pull request #11 from sfu-gdc/fire332-fonts
fire332 Jul 23, 2026
2643888
fix(commitlint): resolve local branch range
fire332 Jul 23, 2026
27629c7
Merge pull request #12 from sfu-gdc/fire332-commitlint
fire332 Jul 23, 2026
c606197
feat: add Puddle water simulation
fire332 Jul 21, 2026
c09c124
feat: add device gravity to Puddle
fire332 Jul 21, 2026
5643304
test(puddle): guard against momentum checkerboarding
fire332 Jul 21, 2026
ab81ecd
refactor(puddle): split implementation by concern
fire332 Jul 21, 2026
124a00e
chore: refine puddle drift amplitude control
fire332 Jul 21, 2026
919698f
feat(puddle): support wide-gamut colors
fire332 Jul 21, 2026
9ffb540
refactor(puddle): expose readonly height view
fire332 Jul 21, 2026
688a1e0
perf(puddle): streamline mass calculations
fire332 Jul 21, 2026
d0eb949
test(puddle): capture one-frame momentum reversals
fire332 Jul 21, 2026
c00acd0
fix(puddle): smooth default momentum
fire332 Jul 21, 2026
9387646
feat(puddle): render reusable SVG silhouette
fire332 Jul 21, 2026
20716dc
refactor(puddle): separate runtime responsibilities
fire332 Jul 21, 2026
fa17a51
feat(puddle): clip hero text colors to silhouette
fire332 Jul 22, 2026
96faf8e
feat(storybook): add puddle color controls
fire332 Jul 22, 2026
136ea95
chore(puddle): expand story control ranges
fire332 Jul 22, 2026
83cf1bd
refactor(puddle): remove redundant gamut split
fire332 Jul 23, 2026
bf59f20
refactor(puddle): remove waterSim import shim
fire332 Jul 23, 2026
f6e9dd3
feat(theme): add shade color palette
fire332 Jul 23, 2026
8b5cd31
fix(unocss): quote web font families
fire332 Jul 23, 2026
25677ac
refactor(puddle): migrate component and stories to UnoCSS
fire332 Jul 23, 2026
6cd62e6
refactor(puddle): use tokens for story colors
fire332 Jul 23, 2026
1ea26aa
fix(puddle): drive device slosh from rotation
fire332 Jul 23, 2026
59feef8
fix(fonts): rebase inlined font assets
fire332 Jul 23, 2026
c330114
feat(checkerboard): add eroded background
fire332 Jul 23, 2026
03227fa
fix(puddle): align story default args with design
fire332 Jul 23, 2026
5ee166e
feat(puddle): make stories fullscreen
fire332 Jul 24, 2026
fd32e63
refactor(hero): extract component from puddle story
fire332 Jul 24, 2026
c6c9dac
feat(puddle): size terrain bowl in pixels
fire332 Jul 24, 2026
9b18c20
refactor(puddle): centralize default props
fire332 Jul 24, 2026
a40807c
fix(checkerboard): preserve dark checks
fire332 Jul 24, 2026
74f333e
fix(theme): align primary palette with design; fix `ColorPalette` sto…
fire332 Jul 24, 2026
2767a51
refactor(checkerboard): replace component styles with utilities
fire332 Jul 24, 2026
67f725a
refactor(puddle): simplify fallback sizing
fire332 Jul 24, 2026
8cee37b
refactor(hero): own visual defaults
fire332 Jul 24, 2026
5815b28
fix(hero): make responsive
fire332 Jul 24, 2026
1cb7e80
fix(checkerboard): composite opacity in CSS
fire332 Jul 24, 2026
0afa2d9
refactor(puddle): remove governor extension point
fire332 Jul 24, 2026
a176a64
feat(puddle): expose terrain bowl shape
fire332 Jul 24, 2026
06b30ec
fix(puddle): tune terrain defaults
fire332 Jul 24, 2026
a04eaab
feat(hero): support custom content
fire332 Jul 24, 2026
1d42ae9
feat(puddle): add terrain depth debug story
fire332 Jul 24, 2026
11a5fb5
Merge pull request #9 from sfu-gdc/fire332-puddle
fire332 Jul 24, 2026
43dbe3b
chore: add commit lint script
fire332 Jul 24, 2026
88b14ff
chore: update development dependencies
fire332 Jul 24, 2026
6752864
Merge pull request #13 from sfu-gdc/fire332-dev-misc
fire332 Jul 24, 2026
cf4db52
fix(spray-border): reduce outline waviness
fire332 Jul 24, 2026
0a6e139
feat(button): align design with Figma
fire332 Jul 24, 2026
64ecb35
feat(button): add large CTA variant
fire332 Jul 24, 2026
e500e57
feat(tokens): add semantic hero colors
fire332 Jul 25, 2026
cde1553
refactor(button): support clip-aware surfaces
fire332 Jul 25, 2026
bc47c75
feat(hero): add clip-aware content layers
fire332 Jul 25, 2026
eae3a40
feat(landing): implement responsive hero
fire332 Jul 25, 2026
0b0c645
chore(landing): tweak texture opacity & font size
fire332 Jul 25, 2026
7a3a5dc
fix(landing): align 3rd row text
fire332 Jul 25, 2026
884b837
test(landing): remove low-value test
fire332 Jul 25, 2026
9a8c7ec
chore(landing): reduce gap between text and CTA
fire332 Jul 25, 2026
f2ce9ae
refactor(landing): rearchitect for better clip path handling
fire332 Jul 25, 2026
f15b512
feat(landing): make hero text color secondary on primrary
fire332 Jul 25, 2026
3d9c391
test(tokens): remove low-value tests
fire332 Jul 25, 2026
bc08755
feat(landing): align detail row to title slopes
fire332 Jul 25, 2026
bf2151c
fix(button): render icons after labels
fire332 Jul 25, 2026
167827c
feat(button): add animated underline variant
fire332 Jul 25, 2026
9406395
test(landing): fix storybook tests
fire332 Jul 25, 2026
b3bc6f9
refactor(styles): migrate routine CSS to UnoCSS
fire332 Jul 25, 2026
430836b
fix(unocss): pre-scan component utilities
fire332 Jul 25, 2026
84879a6
feat(button): add primary appearance
fire332 Jul 26, 2026
e920e10
test(button): change background of underscore to shade-900
fire332 Jul 26, 2026
9cf63ca
chore(deps): add pixel icon sets
fire332 Jul 26, 2026
8f5d7ff
feat(landing): add responsive event CTAs
fire332 Jul 26, 2026
b82c364
fix(landing): correct underline CTA contrast
fire332 Jul 26, 2026
6f54d65
fix(button): match spray border target size
fire332 Jul 26, 2026
42efd07
fix(landing): align compact CTA to title
fire332 Jul 26, 2026
458fa42
fix(button): align button metrics with design
fire332 Jul 26, 2026
7586e6c
feat(button): enlarge spray variant on hover
fire332 Jul 26, 2026
719529d
test(storybook): focus assertions on behavior
fire332 Jul 26, 2026
57ab3bf
feat(button): secondary-500 on hover for spray variant
fire332 Jul 26, 2026
e08474d
style(landing): remove triangle layout; align CTA row with 2nd row
fire332 Jul 27, 2026
e078a81
style(landing): reduce vertical margin between 2nd and CTA row
fire332 Jul 27, 2026
67793b7
refactor(landing): simplify clip-aware CTA composition
fire332 Jul 27, 2026
8819f16
style(landing): tighten whitespace around CTA
fire332 Jul 27, 2026
f4069e0
style(landing): don't swap CTA button order on medium breakpoint
fire332 Jul 27, 2026
cdfb409
test(landing): remove useless SB interaction test
fire332 Jul 27, 2026
44cc7b8
build(unocss): only extract classes from fs during `vite serve`
fire332 Jul 27, 2026
410c959
Merge pull request #14 from sfu-gdc/fire332-homepage
fire332 Jul 27, 2026
4e176e6
feat: add favicons
fire332 Jul 27, 2026
77e9c20
feat: add `<Head>` component
fire332 Jul 27, 2026
f56455c
feat(landing): optimize event mark image
fire332 Jul 27, 2026
1c13f7f
feat(puddle): generate portable settled snapshots
fire332 Jul 27, 2026
5f2a090
perf(puddle): move live rendering off the main thread
fire332 Jul 27, 2026
f427455
perf(checkerboard): don't supersample
fire332 Jul 27, 2026
5c62d14
perf: inline styles <= 10000 UTF-16 code units
fire332 Jul 27, 2026
cbbaaea
chore: bump deps
fire332 Jul 27, 2026
5c122d0
fix(puddle): restore Safari-safe HTML clipping
fire332 Jul 27, 2026
40fc948
feat: add `color-scheme` meta tag
fire332 Jul 27, 2026
14c9f68
Merge pull request #15 from sfu-gdc/fire332-seo
fire332 Jul 27, 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
26 changes: 26 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"enabledPlugins": {
"svelte@svelte": true,
"figma@claude-plugins-official": true
},
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"if": "Bash(npm *)",
"type": "command",
"command": "echo '{ \"hookSpecificOutput\": { \"hookEventName\": \"PreToolUse\", \"permissionDecision\": \"deny\", \"permissionDecisionReason\": \"Use pnpm instead\" } }'"
},
{
"if": "Bash(npx *)",
"type": "command",
"command": "echo '{ \"hookSpecificOutput\": { \"hookEventName\": \"PreToolUse\", \"permissionDecision\": \"deny\", \"permissionDecisionReason\": \"Use pnpm dlx instead\" } }'"
}
]
}
]
}
}
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* text=auto eol=lf
23 changes: 23 additions & 0 deletions .github/actions/setup-env/action.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Setup Environment
description: Sets up development environment.

# Required Permissions:
# - contents: read

runs:
using: 'composite'

steps:
- name: Install pnpm
uses: pnpm/action-setup@v6
with:
cache: true

- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version-file: 'package.json'

- name: Install dependencies
run: pnpm install
shell: bash
36 changes: 36 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
version: 2

updates:
- package-ecosystem: 'github-actions'
directory: '/'
schedule:
interval: 'weekly'
commit-message:
prefix: 'ci'
open-pull-requests-limit: 2
groups:
security:
applies-to: security-updates
patterns:
- '*'
version:
applies-to: version-updates
patterns:
- '*'
- package-ecosystem: 'npm'
directory: '/'
versioning-strategy: 'increase'
schedule:
interval: 'weekly'
open-pull-requests-limit: 0
commit-message:
prefix: 'build(deps)'
groups:
security:
applies-to: security-updates
patterns:
- '*'
version:
applies-to: version-updates
patterns:
- '*'
24 changes: 24 additions & 0 deletions .github/workflows/chromatic.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: 'Chromatic'

on: push

jobs:
chromatic:
name: Run Chromatic
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v7
with:
fetch-depth: 0

- name: Setup Environment
uses: ./.github/actions/setup-env

- name: Run Chromatic
uses: chromaui/action@latest
with:
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
autoAcceptChanges: 'main'
exitOnceUploaded: true
skip: 'production'
35 changes: 35 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: 'Test'

on: pull_request

permissions:
contents: read

jobs:
test:
name: Run Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v7
with:
fetch-depth: 0

- name: Setup Environment
uses: ./.github/actions/setup-env

- parallel:
- name: Svelte Check
run: pnpm run check --fail-on-warnings

- name: ESLint
run: pnpm run lint:eslint

- name: Prettier
run: pnpm run lint:prettier

- name: Vitest
run: pnpm exec playwright install --with-deps && pnpm run test --project client --project server

- name: Commit Message
run: pnpm exec commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose
34 changes: 34 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
node_modules

# Output
.output
.vercel
.netlify
.wrangler
/.svelte-kit
/build
/static/assets/fonts
worker-configuration.d.ts
*.tsbuildinfo

# OS
.DS_Store
Thumbs.db

# Env
.env
.env.*
!.env.example
!.env.test

# Vite
vite.config.js.timestamp-*
vite.config.ts.timestamp-*

*storybook.log
storybook-static
chromatic.log
chromatic-build-*.xml
chromatic-diagnostics.json

.claude/settings.local.json
9 changes: 9 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Package Managers
package-lock.json
pnpm-lock.yaml
yarn.lock
bun.lock
bun.lockb

# Miscellaneous
/static/
14 changes: 14 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"useTabs": true,
"singleQuote": true,
"printWidth": 100,
"plugins": ["prettier-plugin-svelte"],
"overrides": [
{
"files": "*.svelte",
"options": {
"parser": "svelte"
}
}
]
}
19 changes: 19 additions & 0 deletions .storybook/PaddingDecorator.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<script lang="ts">
import type { Snippet } from 'svelte';

interface Props {
children?: Snippet | undefined;
}

let { children }: Props = $props();
</script>

<div>
{@render children?.()}
</div>

<style>
div {
padding: 16px;
}
</style>
15 changes: 15 additions & 0 deletions .storybook/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import type { StorybookConfig } from '@storybook/sveltekit';

const config = {
stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|ts|svelte)'],
addons: [
'@storybook/addon-svelte-csf',
'@chromatic-com/storybook',
'@storybook/addon-vitest',
'@storybook/addon-a11y',
'@storybook/addon-docs',
'storybook-addon-pseudo-states',
],
framework: '@storybook/sveltekit',
} satisfies StorybookConfig;
export default config;
28 changes: 28 additions & 0 deletions .storybook/preview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import type { Preview } from '@storybook/sveltekit';

import 'unfonts.css';
import 'virtual:uno.css';

const preview: Preview = {
tags: ['autodocs'],

parameters: {
layout: 'centered',

controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
},

a11y: {
// 'todo' - show a11y violations in the test UI only
// 'error' - fail CI on a11y violations
// 'off' - skip a11y checks entirely
test: 'todo',
},
},
};

export default preview;
8 changes: 8 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"recommendations": [
"svelte.svelte-vscode",
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint",
"antfu.unocss"
]
}
14 changes: 14 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"svelte.plugin.svelte.defaultScriptLanguage": "ts",
"[svelte]": {
"editor.defaultFormatter": "svelte.svelte-vscode"
},
"debug.javascript.terminalOptions": {
"resolveSourceMapLocations": [
"${workspaceFolder}/**",
"!**/node_modules/**",
"**/node_modules/.vite-temp/**"
]
},
"js/ts.experimental.useTsgo": false
}
Empty file added @types/.gitkeep
Empty file.
42 changes: 42 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# sv

Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli).

## Creating a project

If you're seeing this, you've probably already done this step. Congrats!

```sh
# create a new project
npx sv create my-app
```

To recreate this project with the same configuration:

```sh
# recreate this project
pnpm dlx sv@0.16.1 create --template minimal --types ts --add prettier eslint vitest="usages:unit,component" sveltekit-adapter="adapter:cloudflare+cfTarget:workers" storybook --install pnpm summer-summit
```

## Developing

Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:

```sh
npm run dev

# or start the server and open the app in a new browser tab
npm run dev -- --open
```

## Building

To create a production version of your app:

```sh
npm run build
```

You can preview the production build with `npm run preview`.

> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment.
6 changes: 6 additions & 0 deletions chromatic.config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"$schema": "https://www.chromatic.com/config-file.schema.json",
"onlyChanged": true,
"projectId": "Project:6a32172276e4b7b57bdf6b4e",
"zip": true
}
5 changes: 5 additions & 0 deletions commitlint.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import type { UserConfig } from '@commitlint/types';

const config: UserConfig = { extends: ['@commitlint/config-conventional'] };

export default config;
Loading
Loading