Quick Start
- Copy the whole folder to your web host (or open
index.htmllocally). - Replace the studio name, address, hours and prices - search
index.htmlfor "Gallows Hill", "Fossgate" and the£amounts. - Point the two booking links at your own inbox: search for
mailto:bookings@gallowshill.tattoo. - Swap the photos in
assets/img/for your own (details below).
The page keeps working as you cut it down: every section (#flash, #artists, #studio, #aftercare, #book) can be deleted wholesale and the script skips what it can't find.
Files
Code snippet omitted: it ships with the download.
The flash-sheet picker
Each design exists twice in index.html: a small copy inside its sheet button, and a large copy inside its detail panel. Both are plain inline SVG.
To change a design's details (name, artist, placement, sizes, prices) edit its panel - everything is ordinary markup.
To add a design of your own:
- Copy an existing
<button class="flash-tab">and<div class="flash-panel">pair, give them freshid/aria-controlsvalues that match each other. - Replace the SVG paths. Rules the inking relies on: stroke-only paths (
fill="none"comes from CSS), keepdata-inkon every path that should draw, and author red accent paths (class="p-red") after the black ones so the red goes in last, the way it would in the chair. - Filled shapes can't draw stroke-by-stroke; give them
data-fillinstead (see the dagger's blood drop) and they fade in after the linework.
Draw speed: each stroke's duration is its measured length divided by 560 (clamped 0.16-1.0s), in draw() in script.js. Raise the divisor for faster inking.
The picker is a real tablist: click or tap any design, or focus the sheet and use the arrow keys, Home and End. Selecting the design that is already selected re-inks it.
Per-section options
- Hero - the big rose is decorative (
aria-hidden) and draws itself on load. Swap its paths for any of the other designs, or delete.hero-artentirely; the copy column takes over. - Flash - see above. Prices sit in each panel's
.flash-sizeslist; the sheet caption and footer lines are in.sheet-head/.sheet-foot. - Artists - three cards; add or remove
<article class="artist-card">blocks freely. The books-open line is just text. - Studio - rates in
.studio-rates; the wide band image and the two tiles are ordinary<img>tags. - Aftercare - the four steps are real advice, but they are yours to edit; the numbered structure is a real healing sequence, so keep them in order.
- Book - no form by design: studios triage by email. The steps and the deposit policy are plain markup; the CTA is a
mailto:link with a subject line.
Photography
The images are bundled, optimised WebP derivatives - Unsplash sources with this template's high-contrast black and white grade baked into the pixels (fully desaturated, gamma lifted, brightness matched per image). They are not the original files and should not be treated as a photo library.
To swap in your own photos, just replace the files in assets/img/ (same names), or change the <img> tags. A background-color sits behind every photo, so a missing image never leaves a hole.
To re-run the grade (GSAP Vault repo tooling): edit assets/img-manifest.json (source URL, size, per-image brightness) and run:
Code snippet omitted: it ships with the download.
Image credits (Unsplash sources)
band-shop.webp- Kristian Angelo, https://unsplash.com/photos/xyJZvUL4_TYstation.webp- Maxim Hopman, https://unsplash.com/photos/52Kf36w124Ydoorway.webp- Sherman Yang, https://unsplash.com/photos/zOyOWsANHXoartist-edie.webp- Thomas Despeyroux, https://unsplash.com/photos/879s_FY4254artist-marek.webp- Allef Vinicius, https://unsplash.com/photos/hxNiXP498UIartist-fen.webp- Allef Vinicius, https://unsplash.com/photos/9_EknAv_9Hw
Palette
There is deliberately no palette switcher: this palette is the identity. A reskin is still a small edit, because every colour on the page resolves from five tokens (plus their RGB triples, which feed every translucent value) at the top of assets/style.css:
Code snippet omitted: it ships with the download.
Change a hex and its triple together. The stylesheet header records the measured contrast of every pair as used - re-measure yours against those floors before shipping, especially the two standing bans: red is never type on brick, and gold never touches bone paper.
--brick-deep and --brick-lift are the same brick pushed darker and lighter; move them with the ground.
Accessibility
- Keyboard: the flash sheet is a tablist with roving tabindex and arrow-key/Home/End support; every interactive element is a real
<button>or<a>; focus rings are always visible and flip colour per surface. - Reduced motion: honoured twice - a CSS media query removes all reveal start states, and the script's matchMedia reduce branch shows designs fully drawn instantly, never creates Lenis, and keeps the picker fully functional.
- No JavaScript: the whole page reads. SVG strokes are drawn by default (the script prepares the undrawn state; CSS never hides a stroke), and all six flash panels stack in order.
- Screen readers: the flash artwork and hero rose are
aria-hiddendecoration; the panels' text carries all the information; tab/panel wiring usesaria-controls/aria-labelledby/aria-selected.
Dependencies
Loaded from CDN at the end of index.html:
- GSAP core, ScrollTrigger, DrawSVGPlugin (3.15.0)
- Lenis smooth scroll (1.3.17) - optional; delete its tag and the page falls back to native scrolling
Fonts: Pirata One, Libre Franklin, Cousine via Google Fonts.
Worked examples, the events and programmatic API, and the class reference ship with the download, alongside the full source.