Signature, favicon and app icon
Read when: you place the signature, draw it on screen, set a favicon or app icon, or put other logos near it. Owns: the signature files and their rules (colour, size, clear space, misuse), the drawing animation and its stroke data, the favicon and app icon, and how other logos and avatars sit beside the signature.
The logo is Haytham's handwritten signature: personal, a little imperfect on purpose, written once and used
everywhere. Checked 2026-11-03 against the site and its brand kit. All files are in ../assets/.
TL;DR
- White on dark, black on light, one colour in every interface, hover and focus included.
- The gradient file is for artwork (covers, thumbnails, posters, title slides), never for a header or a control.
- 56 px minimum; below 120 px use a
-smallfile; keep a quarter of its width empty on every side. - Never retype, redraw, stretch, recolour, rotate, or add glows or shadows.
- On a page, the header signature draws itself from the stroke data; reduced motion shows it finished.
Files
| File | Use |
|---|---|
haythamasalama-signature-white.svg |
on dark, 120 px wide and up (stroke #EDEDEF, width 2) |
haythamasalama-signature-white-small.svg |
on dark, under 120 px (stroke width 3.2) |
haythamasalama-signature-black.svg |
on light, 120 px and up (stroke #0B0B0C) |
haythamasalama-signature-black-small.svg |
on light, under 120 px |
haythamasalama-signature-gradient.svg |
artwork only |
haythamasalama-signature-gradient-small.svg |
artwork only, under 120 px |
haythamasalama-signature-strokes.json |
the 12 strokes in writing order, with length, duration and delay for the animation |
haythamasalama-favicon.svg |
browser tab icon, 32 px and up |
haythamasalama-favicon-16.svg |
16 px tab icon: the big "H" stroke only |
haythamasalama-app-icon.svg |
home screens and video-platform avatars, 192 px source |
favicon.ico |
16 and 32 px fallback for old browsers |
apple-touch-icon.png |
180 px home-screen icon for iOS |
- Every signature file uses
viewBox="-2 -2 156 79", about 1.97 : 1. Keep that ratio: 220 × 112, 120 × 61, 80 × 41, 56 × 28. In code:height = round(width × 79 / 156). - Strokes are
stroke-linecap="round",stroke-linejoin="round",stroke-miterlimit="2.6131", no fill. - The gradient file runs Iris 500 →
#6C8CF9→ Azure 500 along the diagonal (x1=0 y1=0 x2=152 y2=75). - The public kit at
haythamasalama.me/brand-kit/has the same SVGs under the shorterhaytham-prefix, plus a 256 px portrait.
Colour
- White on dark, black on light. That is the whole rule for any interface.
- It keeps that one colour on hover and focus. The site's header link does not change the signature on hover.
- The gradient version is a picture, not a control: use it where the signature is artwork.
- Never another colour, never a tint of the background, never below 90% opacity.
Size and clear space
- Minimum: 56 px wide on screen, 18 mm in print. The site header uses 72 px on phones and 80 px from 768 px.
- Clear space: a quarter of the signature's width on every side, empty of text, edges and other marks.
- Background: a calm, solid area: Ink,
raised#0F0F11,surfaceor Paper. On a photo, only where the photo is flat and dark (or light) behind it.
Don't
- Stretch or squash it.
- Recolour it, or fill it with a pattern or a photo.
- Add glows, drop shadows, outlines or 3D effects.
- Place it on a busy background (stripes, patterns, a detailed photo).
- Retype the name in a script font as a stand-in.
- Redraw, trace or "clean up" the strokes.
- Rotate it or set it on a curve.
As an image
One file per theme:
<img src="/haythamasalama-signature-white.svg" alt="Haytham's handwritten signature" width="220" height="112" class="sig-dark">
<img src="/haythamasalama-signature-black.svg" alt="Haytham's handwritten signature" width="220" height="112" class="sig-light">
.sig-light { display: none; }
.light .sig-dark { display: none; }
.light .sig-light { display: block; }
With Tailwind and the light variant: class="light:hidden" on the white file, class="hidden light:block" on the
black one.
alt="Haytham's handwritten signature"when it stands alone;alt=""when the name is written next to it.fetchpriority="high"when it is the hero image.
Drawn on screen
The site's header renders the signature inline from haythamasalama-signature-strokes.json and lets it draw
itself, stroke by stroke, in the order the hand wrote it. It draws again on every page change (the component is
keyed by the route). The Vue component is in components.md; the CSS is in the tokens file.
- Inline, each path takes
stroke: var(--fg)from.signature path, so it follows the theme and stays one colour. - Use stroke width 3.2 at header sizes (72–80 px), 2 from 120 px up.
- Each path starts with
stroke-dasharrayandstroke-dashoffsetset to itslength, then animates the offset to 0 with its owndurationanddelay. The curve iscubic-bezier(0.55, 0, 0.35, 1), fill modeforwards. The whole signature takes about 2.9 s. - The path order inside the SVG files is not the writing order; always take the order from the JSON.
- Under
prefers-reduced-motion: reducethe strokes appear finished, with no animation. - The link around it carries the name:
aria-label="Haytham A. Salama, home", and the SVG isaria-hidden.
Without a framework:
<svg class="signature" width="80" height="41" viewBox="-2 -2 156 79" fill="none" stroke-width="3.2"
stroke-miterlimit="2.6131" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"></svg>
<script type="module">
const { strokes } = await fetch('/haythamasalama-signature-strokes.json').then(r => r.json());
const svg = document.querySelector('svg.signature');
for (const s of strokes) {
const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
path.setAttribute('d', s.d);
Object.assign(path.style, {
strokeDasharray: s.length, strokeDashoffset: s.length,
animationDuration: `${s.duration}s`, animationDelay: `${s.delay}s`,
});
svg.append(path);
}
</script>
Favicon and app icon
- The same signature, white, on an Ink tile (
#0B0B0C) with an inner border in#26262B. - Favicon: 64 px canvas, radius 14 (about 22%), 1.5 px border. App icon: 192 px canvas, radius 44 (about 23%), 2 px border.
- Below 32 px only the big "H" stroke survives, so the 16 px favicon keeps just that stroke.
- No colour at any size.
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/x-icon" href="/favicon.ico" sizes="32x32">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<meta name="theme-color" content="#0B0B0C">
Copy haythamasalama-favicon.svg to public/favicon.svg, and favicon.ico and apple-touch-icon.png as they
are. For a web app manifest, export PNGs from haythamasalama-app-icon.svg at 192 and 512 px.
Other marks near the signature
- Companies, tools and technologies appear in one colour (
mark) on asurfacetile with anedgeborder, in both themes and on hover. Tile radius is a quarter of its size; the glyph is 18–22 px. - Photos of logos (GitHub avatars) use
.avatar-mono: greyscale with a 1 pxedgering, so a dark logo keeps its edge on a dark page. - No full-colour logos beside the signature, and no framework icon chips on project cards.