From 44c78f80fb40e0639855f3ca820c139a2f29ccad Mon Sep 17 00:00:00 2001 From: Harsh Singh Date: Sat, 3 Oct 2026 18:14:16 +0530 Subject: [PATCH] Add Weft, the first of the portfolio pack --- README.md | 4 +- public/template-previews/weft.jpg | Bin 0 -> 12554 bytes src/lib/templates.ts | 65 ++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 public/template-previews/weft.jpg diff --git a/README.md b/README.md index 5782457..75fe84a 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ A scroll-scrubbed site plays through a sequence of frames as the reader scrolls, background moves with them instead of sitting still behind the text. ScrollCraft builds those sites without WebGL, an animation library, or a render farm. -1. **Start from a template.** 22 finished sites, each with its own palette, +1. **Start from a template.** 23 finished sites, each with its own palette, typography, pacing and copy. Or upload a video and use your own footage. 2. **Get frames.** The engine draws the frame sequence on a canvas in your browser and maps it to scroll position. @@ -37,7 +37,7 @@ one exception is the copy assistant below, which is off unless you configure a k palette. Frames are drawn on canvas locally, with no API key and nothing to install. - **Scroll engine.** Smooth canvas scrubbing with separate desktop and portrait frame sets, so a phone gets a background shaped for it rather than a letterboxed one. -- **Template library** — 22 finished scroll sites across 17 categories, each with its own +- **Template library** — 23 finished scroll sites across 17 categories, each with its own Google Fonts pairing and palette. - **Plain HTML export.** No dependencies and no lock-in. The exported page scores 100 on Lighthouse for performance, accessibility, best practices and SEO. diff --git a/public/template-previews/weft.jpg b/public/template-previews/weft.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c93d03eb409e78a075c1a5e275f33e684faac10c GIT binary patch literal 12554 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 literal 0 HcmV?d00001 diff --git a/src/lib/templates.ts b/src/lib/templates.ts index 2b1a8d5..38b389f 100644 --- a/src/lib/templates.ts +++ b/src/lib/templates.ts @@ -1498,4 +1498,69 @@ export const TEMPLATES: Template[] = [ }, ], }, + { + slug: "weft", + name: "Weft", + tagline: "A documentary photographer who shoots the last water-powered mills", + category: "Portfolio", + tags: ["Indigo", "Documentary", "Quiet"], + style: "wave", + colors: ["#28407e", "#6b2f2a", "#0a0d18"], + gradient: "from-indigo-900 via-rose-950 to-slate-950", + theme: { fontDisplay: "Instrument Serif", fontBody: "Inter Tight", scale: "editorial", displayWeight: 400, displayTracking: -0.01, ink: "#f2ebdd", muted: "rgba(242,235,221,0.74)", accent: "#8c2f2a", accentText: "#e8b4a0", radius: 2 }, + sections: [ + { + kind: "statement", layout: "center", reveal: "mask", + eyebrow: "Photographs, 2019 to now", + heading: "The looms still run on the river.", + ctaLabel: "See the work", ctaHref: "#section-2", + scrollHeight: 1400, + }, + { + layout: "left", reveal: "stagger", + eyebrow: "The series", + heading: "Eleven mills, four of them still turning", + body: "I have been photographing water-driven weaving sheds since a foreman in Nadiad let me stand on the walkway for an afternoon. Seven of the eleven have closed since. The work is a record of rooms that will not be there in ten years.", + scrollHeight: 1500, + }, + { + layout: "right", reveal: "fade", + eyebrow: "How I shoot", + heading: "Available light, and a tripod nobody trips over", + body: "No flash near running machinery, no asking anyone to pose, and nothing moved. A shed at six in the morning gives about forty minutes of usable light coming through the roof vents, so I plan around that and wait.", + scrollHeight: 1400, + }, + { kind: "spacer", scrollHeight: 700 }, + { + layout: "left", reveal: "stagger", + eyebrow: "Prints", + heading: "Printed in Ahmedabad, signed, editioned to twelve", + body: "Archival pigment on cotton rag, 16 by 20 inches, from the scanned negative rather than a file. Twelve of each, numbered on the back, and when the twelve are gone the image is retired rather than reprinted at another size.", + scrollHeight: 1400, + }, + { + layout: "right", reveal: "fade", + eyebrow: "Licensing", + heading: "Editorial use, with the mill named", + body: "Magazines and books can license single frames. The one condition is that the caption names the mill and the year, because an unattributed photograph of a working shed becomes decoration the moment it loses its address.", + scrollHeight: 1400, + }, + { + layout: "left", reveal: "stagger", + eyebrow: "What I do not take on", + heading: "No weddings, and no restaging", + body: "I am asked about both every month. Weddings are somebody else's craft, and a shed cleared of people and lit for the camera is an illustration, not a document. Saying so early saves us both a meeting.", + scrollHeight: 1300, + }, + { kind: "spacer", scrollHeight: 600 }, + { + layout: "center", reveal: "fade", + eyebrow: "Enquiries", + heading: "Prints, licensing, or a shed I should see.", + body: "If you know a mill still running on water, I would rather hear about that than anything else. Replies in a few days, from me, not an assistant.", + ctaLabel: "Send a note", ctaHref: "#contact", + scrollHeight: 1200, + }, + ], + }, ];