diff --git a/.gitignore b/.gitignore index cc717af46..df6ac8e63 100644 --- a/.gitignore +++ b/.gitignore @@ -57,3 +57,7 @@ chromatic.log # playwright /test-results/ /playwright-report/ + +# local performance measurement output +scripts/perf/lh/ +scripts/perf/reports/ diff --git a/.storybook/preview.css b/.storybook/preview.css index a6942d212..cf593925f 100644 --- a/.storybook/preview.css +++ b/.storybook/preview.css @@ -1,10 +1,10 @@ /* * Snapshot stability for Chromatic. * - * src/app/globals.css applies a 200ms transition to *every* element - * (`*, *::before, *::after`) and several components animate on mount. A visual - * regression service screenshots at an arbitrary moment, so those in-flight - * transitions produce diffs that have nothing to do with a real change. + * Components use short, targeted transitions (globals.css no longer transitions + * every element) and a few animate on mount. A visual regression service + * screenshots at an arbitrary moment, so any in-flight transition produces a + * diff that has nothing to do with a real change. * * Freezing them here makes every story render at its settled end state. This * only affects the Storybook preview iframe — the app itself still animates. diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 8a5782538..3bf2b3993 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -79,7 +79,7 @@ Reframe uses FFmpeg.wasm to process videos entirely in the browser. The processi - **Fill mode**: Video is scaled to fill the target dimensions and cropped 5. **Speed Adjustment** — Playback speed is adjusted using `setpts` (video) and `atempo` (audio) filters 6. **Audio Processing** — Audio is either kept (with speed adjustment) or removed based on user preference -7. **Encoding** — Final video is encoded to MP4 (H.264) or WebM (VP9) format +7. **Encoding** — Final video is encoded to MP4 (H.264) or WebM (VP8 + Vorbis) format 8. **Download** — Processed video is made available as a Blob URL for download --- diff --git a/docs/assets/ui-redesign/after-editor-desktop.jpg b/docs/assets/ui-redesign/after-editor-desktop.jpg new file mode 100644 index 000000000..35154cf98 Binary files /dev/null and b/docs/assets/ui-redesign/after-editor-desktop.jpg differ diff --git a/docs/assets/ui-redesign/after-editor-mobile.jpg b/docs/assets/ui-redesign/after-editor-mobile.jpg new file mode 100644 index 000000000..d33cb3263 Binary files /dev/null and b/docs/assets/ui-redesign/after-editor-mobile.jpg differ diff --git a/docs/assets/ui-redesign/after-exporting-desktop.jpg b/docs/assets/ui-redesign/after-exporting-desktop.jpg new file mode 100644 index 000000000..affb53d8f Binary files /dev/null and b/docs/assets/ui-redesign/after-exporting-desktop.jpg differ diff --git a/docs/assets/ui-redesign/before-editor-desktop.jpg b/docs/assets/ui-redesign/before-editor-desktop.jpg new file mode 100644 index 000000000..4aa5a4baf Binary files /dev/null and b/docs/assets/ui-redesign/before-editor-desktop.jpg differ diff --git a/docs/assets/ui-redesign/before-editor-mobile.jpg b/docs/assets/ui-redesign/before-editor-mobile.jpg new file mode 100644 index 000000000..0da1a818d Binary files /dev/null and b/docs/assets/ui-redesign/before-editor-mobile.jpg differ diff --git a/docs/assets/ui-redesign/before-exporting-desktop.jpg b/docs/assets/ui-redesign/before-exporting-desktop.jpg new file mode 100644 index 000000000..a5e68e222 Binary files /dev/null and b/docs/assets/ui-redesign/before-exporting-desktop.jpg differ diff --git a/scripts/fonts/build-cormorant.sh b/scripts/fonts/build-cormorant.sh new file mode 100755 index 000000000..19858fca3 --- /dev/null +++ b/scripts/fonts/build-cormorant.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +# Rebuilds the self-hosted Cormorant Garamond files in src/app/fonts/. +# +# The UI sets the serif at three styles only (upright 400 for .display, +# upright 500 for .serif, italic 400 for .marker) and only for its own English +# copy, so the full Google Fonts variable files (300-700, Latin-1 and more, +# ~75 KB for the two Latin slices) are cut down to: +# - upright: variable, wght limited to 400-500 +# - italic: static 400 +# each subset to printable ASCII plus the typographic punctuation the copy may +# use. Characters outside the subset fall back per glyph to the size-adjusted +# fallback serif, so nothing renders as a missing-glyph box. +# +# Needs fonttools and brotli (dev only, not a project dependency): +# python3 -m venv /tmp/fontenv && /tmp/fontenv/bin/pip install fonttools brotli +# PYTHON=/tmp/fontenv/bin/python scripts/fonts/build-cormorant.sh +set -euo pipefail + +PYTHON="${PYTHON:-python3}" +# google/fonts commit that last touched ofl/cormorantgaramond (pinned so the +# output is reproducible). +REV=3dd78844021e948ceb633d1dcee3f7885561b5d9 +BASE="https://raw.githubusercontent.com/google/fonts/$REV/ofl/cormorantgaramond" +OUT="$(cd "$(dirname "$0")/../.." && pwd)/src/app/fonts" +WORK="$(mktemp -d)" +trap 'rm -rf "$WORK"' EXIT + +curl -fsSL -o "$WORK/upright.ttf" "$BASE/CormorantGaramond%5Bwght%5D.ttf" +curl -fsSL -o "$WORK/italic.ttf" "$BASE/CormorantGaramond-Italic%5Bwght%5D.ttf" +curl -fsSL -o "$OUT/OFL.txt" "$BASE/OFL.txt" + +# ASCII, nbsp, middle dot, multiplication sign, en/em dash, curly quotes, ellipsis. +UNICODES="U+0020-007E,U+00A0,U+00B7,U+00D7,U+2013-2014,U+2018-2019,U+201C-201D,U+2026" +# kern/liga for text, lnum/tnum/pnum for the figures (Cormorant defaults to +# old-style numerals; .display and .marker switch to lining). +FEATURES="kern,liga,calt,lnum,tnum,pnum" + +"$PYTHON" -m fontTools.varLib.instancer "$WORK/upright.ttf" wght=400:500 -o "$WORK/upright-400-500.ttf" +"$PYTHON" -m fontTools.varLib.instancer "$WORK/italic.ttf" wght=400 -o "$WORK/italic-400.ttf" + +for name in upright-400-500 italic-400; do + "$PYTHON" -m fontTools.subset "$WORK/$name.ttf" \ + --unicodes="$UNICODES" --layout-features="$FEATURES" \ + --flavor=woff2 --output-file="$OUT/cormorant-garamond-$name.woff2" +done + +ls -l "$OUT" diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx index 5fb57cb36..4f7fdc524 100644 --- a/src/app/contact/page.tsx +++ b/src/app/contact/page.tsx @@ -85,7 +85,7 @@ export default function ContactClient() { }; return ( -
+
- {errors.name &&

{errors.name}

} + {errors.name &&

{errors.name}

} - {errors.email &&

{errors.email}

} + {errors.email &&

{errors.email}

}