Brand and design

SpellWare style guide.

The authoritative reference for SpellWare brand and design standards, for anyone featuring our logo or mascot and for anyone building on our web platform.

Who this guide is for

Brand use

Featuring our logo or mascot

For anyone using our brand assets in advertisements, shoutouts, fan content or other external materials. Start with brand assets and the colour palette.

Developers

Building for SpellWare

For anyone creating or contributing to web applications in the SpellWare ecosystem. Start with layout and the components.

All use of SpellWare brand assets must comply with our Code of Conduct. Each section below is labelled with the audience it applies to.

Brand assets

Brand use Developers

SpellWare has two primary brand assets: our logo and our mascot, Hikari. Both are available for use under the rules below.

SpellWare logo

Logo

Download

Hikari, the SpellWare mascot

Hikari (mascot)

Download

Logo files

The logo has two approved colourways. Use the light files on light backgrounds and the reversed files on dark backgrounds. Each file is a vector SVG with a PNG alongside it. The crescent and rose symbol is also supplied on its own, as a light SVG and a reversed SVG.

SpellWare horizontal logo, light colourway

Horizontal, light

SVG · PNG

SpellWare horizontal logo, reversed colourway

Horizontal, reversed

SVG · PNG

SpellWare stacked logo, light colourway

Stacked, light

SVG · PNG

SpellWare stacked logo, reversed colourway

Stacked, reversed

SVG · PNG

Usage rules

  • Use the light logo files on light backgrounds and the reversed files on dark backgrounds. The square logo carries its own background, and Hikari may be placed on any colour.
  • The square logo and Hikari must be displayed at a minimum size of 512×512 pixels. The horizontal and stacked logos must be at least 512 pixels wide.
  • Every use of the logo or Hikari must link back to spellware.dev whenever used.
  • Hikari may only be used when the SpellWare logo is also present and visible in the same area.
  • All use must comply with our Code of Conduct.

Prohibited uses

Both assets must be used exactly as provided. No modifications of any kind are permitted. The following examples illustrate common prohibited alterations:

Do not recolour

Example of prohibited recolouring

Do not apply colour filters, tints, or overlays to either asset.

Do not rotate

Example of prohibited rotation

Do not rotate either asset at any angle.

Do not stretch

Example of prohibited stretching

Do not stretch, squash, or distort the proportions of either asset.

Do not crop

Example of prohibited cropping

Do not crop, clip, or partially obscure either asset.

Do not invert

Example of prohibited inversion

Do not invert, desaturate, or otherwise alter the colours of either asset. On a dark background, use the supplied reversed logo instead.

Hikari without logo

Example of Hikari used without the logo

Do not use Hikari unless the SpellWare logo is also visible in the same area.

Tagline

Our tagline is Thoughtfully built. Wonderfully human. It leads our brand line: it is the first line of the footer on every page, and the opening line of the homepage. It sits above our descriptor, Software engineering and community management for developer-facing companies, which stays in page titles and descriptions so that search results and link previews still say what we do.

On the homepage hero only, a supporting principle sits directly beneath the tagline: Exceptional work comes from people who are given the room, trust, and opportunity to do their best. It states how we work. It is not part of the tagline, and it does not appear in the footer, in structured data or on the social card.

  • Use the exact wording, with both full stops.
  • Set it in our brand typeface, Fraunces, when it is displayed on its own.
  • Keep the descriptor in page titles and meta descriptions.
  • Do not shorten it, reorder it, translate it or add words.
  • Do not use it in place of a page title or a description.

Colour palette

Brand use Developers

These are the official SpellWare brand colours. Use them for any SpellWare-adjacent content to maintain visual consistency. Developers should reference the CSS custom property names rather than hard-coding hex values, so that a page stays in step with the rest of the site if a value changes.

Witch Purple #2B1B3D --witch-purple
Witch Plum #44275A --witch-plum
Witch Rose #A8577E --witch-rose
Witch Rose Deep New #8E4268 --witch-rose-deep
Witch Mauve #D4A5C7 --witch-mauve
Witch Lavender #E8D5E8 --witch-lavender
Witch Black #0A0009 --witch-black
Witch Silver #C0C0C0 --witch-silver
Witch Moon #F5F5F5 --witch-moon

Choosing text colours

Meet WCAG AA contrast (4.5:1 for normal text) for all text. The pairings below are the ones we use. Witch Rose is a fill colour, not a text colour on light backgrounds: it fails AA there, which is why Witch Rose Deep exists. White text on a Witch Rose button passes.

PairingContrastResultUse
Witch Purple on Witch Moon 14.52:1 AAA Body text on pages
Witch Plum on Witch Moon 11.44:1 AAA Links and secondary text
Witch Rose Deep on Witch Moon 6.16:1 AA Accent text and eyebrows on light
White on Witch Rose 4.85:1 AA Button label on a Rose button
Witch Mauve on Witch Purple 7.54:1 AAA Accent text on dark surfaces
Witch Lavender on Witch Black 14.86:1 AAA Body text on dark surfaces
Witch Rose on Witch Moon 4.45:1 Large text only Decoration and large text only
Witch Rose on Witch Purple 3.26:1 Large text only Decoration and large text only

Semantic theme variables

Use these in preference to the raw palette colours. The site is light only, so each has a single value. See dark mode for why.

VariableValuePurpose
--foreground--witch-purplePrimary text
--foreground-muted--witch-plumSecondary text, quotes
--heading--witch-purpleHeadings
--background--witch-moonPage colour
--surface#FFFFFFPlain white surfaces, such as inputs and fallbacks
--lit-surfaceWhite in the upper right, shading to pinkCards, the main container and dialogs
--lit-borderrgba(168, 87, 126, 0.38)Rose borders on lit surfaces
--lit-shadow, --lit-shadow-hoverRim light plus a rose glow thrown towards the lightThe edge glow on lit surfaces, and its stronger hover form
--accent--witch-rose-deepHighlights and marker colour
--witch-rose-light#F2B6D3Lighter Witch Rose, for glowing accents on dark surfaces only
--link--witch-plumLink colour
--link-hover--witch-rose-deepLink hover colour
--border--witch-plumStrong borders
--border-subtlergba(68, 39, 90, 0.16)Dividers and outlines
--highlight--witch-mauveHover and highlight fills
--nhc-header-height68pxHeight of the shared header
:root {
  --foreground: var(--witch-purple);   /* Primary text */
  --surface: #FFFFFF;                  /* Cards and containers */
  --accent: var(--witch-rose-deep);    /* Highlights and markers */
  --link: var(--witch-plum);           /* Links */
  --border-subtle: rgba(68, 39, 90, 0.16);
}

Typography

Developers

Text is set in the system font stack, which is fast, accessible and familiar to readers. Fraunces, our wordmark typeface, is reserved for the SpellWare wordmark.

Fraunces · wordmark only

SpellWare

Use for the SpellWare wordmark and nothing else. It is the only web font we load. Set it at weight 600 with the optical size at 72 and softness at 50, so that the letterforms match the logo.

System UI · headings, body text and interface

The quick brown fox jumps over the lazy dog

Applied automatically. Headings are bold (700) with slightly tightened letter-spacing.

System monospace · code

const greeting = "Hello, world!";

Applied automatically to code and pre.

/* Only needed if you build a wordmark yourself */
@import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght,SOFT@72,600,50&display=swap');

:root {
  --font-brand: 'Fraunces', Georgia, 'Times New Roman', serif;
  --font-brand-variation: 'opsz' 72, 'SOFT' 50, 'WONK' 0;
  --font-body: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
  --font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace;
}

Type scale

Sizes used by pages on the shared layout, at a 16px root. Hero headings on the company homepage use larger display sizes.

ElementSizeWeightLine height
h12.6rem, scaling down to 1.9rem on narrow screens7001.2
h22.1rem, scaling down to 1.55rem on narrow screens7001.2
h31.5rem7001.2
h41.2rem7001.2
Body text1rem4001.65 to 1.7

Icons

Developers

Pages that use the shared header script get Font Awesome automatically, so you do not add a separate import. Use standard i tags:

<!-- Solid icon -->
<i class="fas fa-heart"></i>
<!-- Brand icon -->
<i class="fab fa-github"></i>
<!-- Regular icon -->
<i class="far fa-star"></i>

Our own pages use small inline SVG icons instead, drawn on a 24-pixel grid with a 1.75 stroke, round caps and joins, no fill, and currentColor. Mark decorative icons with aria-hidden="true".

Layout

Developers

All SpellWare pages share a common foundation delivered by the shared header script. Include it in every page's head:

<script src="https://cdn.spellware.dev/headers/index.js" async defer></script>

The script injects the design tokens, Font Awesome, the header, the footer, consent, analytics, HubSpot and the community popup. By default it also applies the shared layout, so your page only needs to provide a main element. It looks the same as the company site, because the company site is built from the same standards.

Shared layout

  • Header: a floating glass bar with the SpellWare logo and the same links as the company site. The text beside the logo is the page title, as described under header text.
  • Background: a fixed full-viewport artwork layer, frosted over by the same rose and lavender light as the rest of the site. The wash is about 40% opaque with a 14 pixel blur, so the artwork shows softly through it.
  • main: a centred, lit card, max-width: 1080px, padding: 40px, border-radius: 16px, with a rose edge, a rose glow thrown up and to the right, and a 16 pixel frost over the background.
  • Long articles: text inside main is centred, except on HubSpot blog posts, which are left aligned because long articles read better that way. Headings scale down on narrow screens, so a long word never breaks across lines.
  • Footer: a replica of the company site footer, in the normal flow at the end of the page, with the same columns, links, address and the Tree-Nation badge.
  • Community popup: a lit dialog with a rose glow and a glowing Discord button, shown at most once a week.
Responsive breakpoints
Max widthChanges
860pxThe header collapses to a Menu button, the footer drops to two columns, and main padding reduces to 24px and 20px.
700pxThe large surfaces drop their blur, because blur is costly on low-end devices. The background wash becomes 84% opaque and main uses a firmer white.
480pxThe footer drops to a single column.

Header text

The header shows the full SpellWare wordmark. A page title appears beside it, after a divider. Set it with a data-nhcarrigan-title attribute on the html element. If you leave it out, the script takes the page's title without the SpellWare name or its separators. When nothing is left, or the title is just SpellWare, no title is shown and the wordmark stands alone. Long titles are cut short with an ellipsis, and on screens narrower than 480 pixels the title is hidden to make room for the menu button.

<html lang="en-GB" data-nhcarrigan-title="Tarot">

Opting out

Bespoke pages, such as the company site, can opt out of parts of the script by listing features in a space-separated data-nhcarrigan-exclude attribute on the html element:

<html lang="en-GB" data-nhcarrigan-exclude="layout footer cta ads">
FeatureEffect
layoutSkips the shared page chrome, header and element styles. Design tokens still load.
headerSkips the shared header.
footerSkips the shared footer.
ctaSkips the community popup.
adsSkips the advertising script.

Metadata, icons, consent, analytics and HubSpot always load. Anything your page already declares, such as meta tags and icons, is left alone. A page that already has its own header.site-header never gets a second header.

Pages with their own layout

The company site builds the same look itself, with full-width sections inside a 1120px container and shared styles in assets/styles.css, so it opts out of the script's layout, header, footer and popup. Sections alternate between the page colour, white and a lavender tint, with dark hero and call-to-action bands. The header floats above the page as a translucent glass bar, and every page starts with a hero, so that nothing sits underneath it. Its class names are unprefixed (.btn, .card). The script's equivalents are prefixed nhc-, so they can never collide with an app's own styles.

Components

Developers

These elements are styled automatically on pages that use the shared layout. No extra classes are needed. Buttons are rose pills with a soft glow, and tables, blockquotes and code blocks carry the same lit edge as cards. The previews below reproduce that styling.

Buttons

<button type="button">Click me</button>
<input type="submit" value="Submit">
<button type="button" disabled>Disabled</button>

Links

An example link in body text, underlined so it is never colour alone.

<a href="https://spellware.dev">An example link</a>

Form inputs

<input type="text" placeholder="Text input">
<input type="email" placeholder="Email input">
<textarea rows="3"></textarea>
<select><option>Option one</option></select>

Tables

NameRoleStatus
NaomiFounderActive
HikariMascotAlways here
ContributorDeveloperWelcome
<table>
  <thead><tr><th>Column</th></tr></thead>
  <tbody><tr><td>Value</td></tr></tbody>
</table>

Blockquotes

Technology works better when the people using it are looked after.
<blockquote>Your quote here.</blockquote>

Code

Use inline code within body text.

const greeting = "Hello, world!";
console.log(greeting);
<code>inline code</code>

<pre><code>// your code here</code></pre>

Lists

  • First item
  • Second item
  • Third item
  1. One
  2. Two
<ul>
  <li>First item</li>
  <li>Second item</li>
</ul>

Opt-in components and glow

Developers

Beyond the automatic element styling, there is a set of named components. The company site defines them in assets/styles.css. Pages that load the shared header script get the same components, with an nhc- prefix. The previews below use the company site classes.

ComponentCompany site classShared script class
Buttons.btn, .btn-primary, .btn-ghost, .btn-dark, .btn-outline, .btn-small.nhc-btn, .nhc-btn-primary, .nhc-btn-ghost, .nhc-btn-dark, .nhc-btn-outline, .nhc-btn-small
Section heading.section-head, .eyebrow.nhc-section-head, .nhc-eyebrow
Card, quote and notice.card, .quote, .notice.nhc-card, .nhc-quote, .nhc-notice
Grids.grid-2, .grid-3.nhc-grid-2, .nhc-grid-3
Availability pill.availability.nhc-pill
Accent phrase.accent.nhc-accent
Featured card.feature-card.nhc-feature
FAQ question cards.faq-grid, .faq-card.nhc-faq-grid, .nhc-faq-card
Topic chip.faq-topic.nhc-chip

Buttons

<!-- On the company site. In an app that loads the shared script, use nhc-btn nhc-btn-primary and so on. -->
<a class="btn btn-primary" href="/">Primary</a>   <!-- on dark bands -->
<a class="btn btn-ghost" href="/">Ghost</a>       <!-- on dark bands -->
<a class="btn btn-dark" href="/">Dark</a>         <!-- on light backgrounds -->
<a class="btn btn-outline" href="/">Outline</a>   <!-- on light backgrounds -->

Section heading

Eyebrow

A section heading.

Supporting copy that introduces the section.

<div class="section-head">
  <p class="eyebrow">Eyebrow</p>
  <h2>A section heading.</h2>
  <p>Supporting copy that introduces the section.</p>
</div>

Card and notice

Card title

Cards group related content on a frosted surface.

<article class="card"><h3>Card title</h3><p>Content.</p></article>
<aside class="notice"><h2>Notice</h2><p>Content.</p></aside>

Glass and glow

Frosted glass and a soft rose glow are the SpellWare look on every page. The company site builds them itself, and the shared header script applies the same treatment to every app that loads it.

SurfaceTreatmentRule
Page backgroundThe artwork, frosted over by a rose and lavender gradient wash about 40% opaque, with a 14 pixel blurThe artwork must still show softly through. On phones the blur is dropped and the wash is 84% opaque
Main content cardA lit white surface with a rose edge, a rose glow thrown up and to the right, and a 16 pixel frostAll page text sits on this card, so check contrast over the artwork behind it
Community popupA lit dialog with a rose glow, a glowing logo and a glowing primary button, over a rose-tinted frosted backdropShown at most once a week. The close button keeps its focus ring
HeaderDark glass at 72% opacity with an 18 pixel blur, floating 12 pixels from the top, with the same links and logo on every pageKeep it at 72% or more, so that the navigation links keep AA contrast over anything scrolling beneath
Cards and noticesWhite glass at 58% opacity with a 16 pixel blurText on them must still meet AA over the strongest colour wash behind them. On phones they use 82% white with no blur
Process stepsWhite glass at 6% opacity over a dark section with a colour washUse it on dark sections only
Primary and ghost buttons, key figures on dark bandsA soft rose or mauve halo, with a lit top edge on the primary buttonStatic, in brand colours, and never on body text
Light sectionsA Witch Rose and mauve wash from the upper right, a mauve bounce light at the lower left, a pale shaft of light across the section, and light spilling over from any dark band aboveThe cores of the washes sit away from the text. Cards are lit white on the side facing the light and shade to pink on the other
Edge glows on cards, steps and section seamsA rose rim inside each card, a rose glow thrown towards the light (up and to the right), and a glowing rose line along the top of each sectionBuilt from shadows, so it needs no extra elements. Stronger on hover. Quotes and notices keep their rose left edge
Availability pillA rose glass pill above the hero headline, with a glowing rose dot, stating that we are taking on new engagementsOn the company site the dot pulses gently, and stays still for readers who ask for reduced motion. It is the only animated glow on the site. In the shared script the dot is static. Keep the wording true: change or remove the pill when it stops being so
Accent phraseA lighter Witch Rose tint with a rose glow, set on the .accent class, used for the key phrase of the homepage headlineLarge type on dark backgrounds only. It is too light to read on a light background. Use it for one phrase, not whole headings
Featured testimonial cardA dark, rose-lit card on a light section, with a large glowing opening line, a rose edge glow and a glowing quote markUse it once per page, for the single testimonial that matters most. Light text on dark, so check contrast over the brightest part of the light
FAQ cardsLit white question cards with a glowing rose question mark and a rose edge glow that strengthens on hoverEach card is a link to the full answer on the FAQ page. They show only the question, never the answer
FooterA rose key light, faint rays and a glowing top edge. Each link has a rose dash that lengthens on hover, with a rose underline that draws in, and external links carry an arrowLink text stays at AA contrast on the strongest part of the light, and the keyboard focus ring is kept
Hero, process section, community band and footerOne Witch Rose key light from the upper right, fading into plum and black, with faint diagonal rays on the heroKeep the bright part away from the text, so the left stays in shadow. On narrow screens the light is smaller and in the corner
  • Glass needs colour behind it to show, so light sections carry soft rose and mauve washes. Do not add glass to a plain background.
  • Always provide a solid fallback. The stylesheet turns the blur off and uses solid surfaces when the browser lacks backdrop-filter or the reader asks for reduced transparency.
  • Glow never replaces the keyboard focus ring, and it is never animated or pulsed, with one exception: the dot in the availability pill.
  • Do not blur long lists. Testimonials and résumé entries stay on plain white, and cards drop the blur on phones, because blur is costly on low-end devices.
  • Printed pages use plain surfaces with no glow.
  • The lighting comes from one hue, Witch Rose, set against plum and black. The drama comes from light against dark and from a single consistent direction, not from a second colour. Do not add a contrasting accent colour to the light.
  • The logo is never filtered, tinted or overlaid. The glow sits on its container behind it.
  • Check contrast against the rendered background, at phone, tablet and desktop widths, whenever the light is moved or made brighter. Contrast is measured behind each piece of text, at its brightest and darkest point, and decorative lines, underlines and screen-reader-only text are left out of the measurement.
  • On light backgrounds light cannot glow as it does on dark, so it shows as colour bleeding in, a sheen and rim on each surface, a rose edge glow, and tinted shadows. Do not put a glow behind body text on a light background.

Dark mode is retired

Developers

Version 6 of the shared header script removed the dark theme, the footer's theme toggle and the is-dark class. SpellWare is light only, lit from the upper right, so every page looks the same for every reader and stays consistent with the company site.

  • The semantic theme variables still exist and keep their light values, so existing pages keep working. Nothing adds is-dark any more, and any .is-dark overrides in your own styles will simply never apply.
  • Do not build a dark theme on top. If a surface needs to be dark, use one of the dark bands or the featured card, which are designed for it.
  • Keep using the variables rather than hard-coded colours, so that your page stays in step with the rest of the site.
.your-custom-element {
  background: var(--lit-surface);
  color: var(--foreground);
  border: 1px solid var(--lit-border);
  box-shadow: var(--lit-shadow);
}

Scrollbar and selection

Developers

The shared stylesheet styles the scrollbar and text selection. These apply automatically, so do not override them in page stylesheets.

  • Scrollbar: in Chrome, Edge and Safari the thumb is Witch Plum on a Witch Lavender track. Firefox uses the same colours through scrollbar-color.
  • Selection: selected text is highlighted in Witch Rose with white text, in all browsers. Try selecting this sentence.
::selection { background: var(--witch-rose); color: #FFFFFF; }

Motion

Developers

Motion is subtle and never decorative on its own. Interface changes should feel responsive, not playful.

  • Use short transitions of about 0.2 seconds for colour, border and shadow changes.
  • Buttons lift by 1 pixel on hover. Cards may lift by 2 pixels and gain a stronger shadow.
  • Do not add looping or attention-seeking animations. The glow on buttons is static, so do not animate, pulse or fade it in a loop. The only exception is the dot in the availability pill, which pulses slowly and stops when reduced motion is requested.
  • Respect prefers-reduced-motion: the shared stylesheet turns transitions off for readers who ask for less motion, and your own animations should do the same.

Deprecated classes

Developers

Three decorative classes from the previous look still exist so that older pages keep working. They now simply use the Fraunces wordmark face, with no shadows, skew or gradient. Do not use them in new work.

ClassNowInstead
.witchy-accentFraunces, semibold (600)Normal text, or strong
.mystical-textFraunces, semibold (600)A heading element
.spooky-titleFraunces, semibold (600)A heading element

Moving from the previous look

Developers

Version 5 of the shared header script replaced the earlier, more whimsical look. If you built on the old guide, these are the changes:

PreviouslyNow
Kalam body text and Griffy headings, plus Creepster and Henny PennySystem fonts everywhere. The wordmark face only is a web font: Griffy until version 6.1, and Fraunces since.
Four custom SVG cursorsThe browser's standard cursors. Remove any custom cursor styles.
Wiggling, rotated h1 and rotating buttonsStatic headings and buttons that lift by 1 pixel on hover.
Purple gradient overlay and glowing container shadowsA translucent wash in the page colour over the background artwork, and a soft neutral shadow.
Fixed 75-pixel footerA footer at the end of the page, so it never covers content.
14pt root font size and star list markersA 16px root and standard markers in the accent colour.
--accent was Witch Rose--accent is Witch Rose Deep, which passes contrast on light backgrounds.

Moving to version 6

Version 6 of the shared header script brings every app in line with the company site. The "glowing container shadows" in the table above are back, in a restrained form: a soft rose glow and a lit edge, described under glass and glow.

Version 5Version 6
No header. Pages supplied their own.A floating glass header with the company site's logo and links. The text beside the logo is the page title.
A small footer with legal links, the address and a theme toggleA replica of the company site footer. There is no theme toggle.
Dark mode through the is-dark classLight only. See dark mode.
A neutral wash over the artwork, controlled by --page-overlayA rose and lavender gradient wash, frosted over the artwork. The --page-overlay variable is removed.
main as a plain white card with a neutral shadowmain as a lit, frosted card with a rose edge glow
Flat buttons and a plain popupRose pills with a glow, and a lit popup with a glowing button
No named componentsOpt-in nhc- components for cards, notices, pills, FAQ cards and more. See opt-in components.

Contact

Have a question this guide does not cover? We are happy to help.