Template · Instructions

Make Nordlys your own.

Ten short chapters, from your first duplicate to launch: Variables, fonts, the shader, GSAP motion, CMS and forms.

Chapters10
Read time14 min
HostingAny static host
Build26.10.05

Nordlys is built from one shared system: Variables, native classes, six components (Navbar, Footer, CTA Section, FAQ Section, Button Primary and Button Secondary) and one GSAP script. Change the system and every page follows. Read chapter 1, then jump to what you need.

01Getting started

The template ships 24 pages. Most are variants, so pick the layout you like and delete the rest.

Group
Pages
Notes
Home
Home 01 – 04
Four layouts. Keep one as your home page.
Pricing
Pricing 01 – 03
Three ways to present the same rates.
Contact
Contact 01 – 03
Working forms on 01 and 03.
Company
Company · Careers · Career
Careers is a CMS list with a template page.
Customers
Case studies · Case study
CMS list with a template page.
News
News · Article
CMS list with a template page.
Utility
404 · Password · Style guide · Licenses · Changelog · Instructions · Overview
See chapter 9.
  1. 02Duplicate the template into your workspace. Leave the original untouched as a reference.
  2. 03Choose a home layout. Open its page settings and use Set as home page, then delete the other three or keep them as drafts.
  3. 04Open the Style guide page and change your Variables there first (chapter 2). It shows every part, so you see the effect straight away.
  4. 05Replace the logo, then the content, then the CMS items. Set up form notifications last.

Components and props

Repeated parts are components in three groups. Select an instance and edit its text and links in the Props panel on the right; that changes this page only. To change the Navbar or Footer on every page, open the component and edit the default values of its props.

Component

Group

Props

Navbar

Global

Logo, tagline, header links, Plan capacity button, Menu/Close labels, the seven menu links with their notes, All pages link

Footer

Global

Email line and address, both link columns, station names, wordmark, copyright, status, legal and credit lines, Back to top

CTA Section

Sections

Number, eyebrow, tagline, two-tone heading, body, button label and link

FAQ Section

Sections

Eyebrow, intro, button, five questions and answers; switch Show Item 5 off for four

Button Primary

Buttons

Label, Link, Variant: Base, Full Width, Card Bottom, Top Space, Hide on Mobile

Button Secondary

Buttons

Label, Link, Variant: Base, Full Width, Card Bottom, Top Space

06Colours & fonts

Every colour and font is a Variable. Class styles are linked to them, so recolouring the whole site means editing a handful of values in the Variables panel.

Variable
Value
Used for
Background / Primary
#000000
Page background, button text
Background / Ink
#0A0A0A
Image frames, cards
Text / Primary
#F3F3F3
Headings and body text
Text / Secondary
#A6A6A6
Muted copy, labels
Text / Muted
#5E5E5E
Numbers, captions
Border / Primary
rgba(243,243,243,.12)
Hairlines
Accent / Violet · Lilac · Plum
#6E4BFF · #C9BDFF · #1A1033
Light only: glows, hover lines, the shader
Font / Primary · Mono
Inter Tight · Geist Mono
All text

Fonts

  1. 07Fonts are self-hosted with the theme (src/styles/fonts.ts): Inter Tight (300, 400, 500) and Geist Mono (400), from Fontsource. Both are free (see Licenses).
  2. 08To use a different sans, add it there and change the Font / Primary variable. The footer wordmark measures the font by name, so also change '500 100px "Inter Tight"' in block N5 of the site footer code.

Type scale

Every font size, line height, letter spacing and weight is a Variable in the Layout and Primitives collections. Change one value and every heading or label that uses it follows. Display and Mobile sizes are fluid: edit the clamp() value to change the smallest and largest size together.

Variable

Value

Used for

Font Size / 7 – 84

Fixed rem sizes

Labels, mono text, body copy

Font Size / Text Tiny · Small · Regular · Medium

12 · 13 · 15 · 16 px

Body text and tag styles

Font Size / Display 18 – 245

Fluid clamp()

Headings: the number is the size at 1440 px

Font Size / Mobile 40 – 140

Fluid clamp()

Headings that get their own size below 768 px

Line Height / 0 – 1.9 · Body

Unitless

Every class that sets a font size

Letter Spacing / Tight 1–8 · None · Wide 2–14

em

Tight = −0.01 to −0.08 em, Wide = 0.02 to 0.14 em

Font Weight / Light · Regular · Medium · Bold

300 · 400 · 500 · 700

Weights used across the site

The logo is an image inside the Navbar and Footer components, so you replace it once and every page updates.

  1. 10Open the Navbar component, select the logo image and choose your own file in the Assets panel. Keep a descriptive alt text. Do the same in the Footer component.
  2. 11The preloader draws the split-N mark from three shapes. To switch the preloader off, set SHOW_LOADER = false in block N1, or delete the Loader div inside the Navbar component.
  3. 12The footer wordmark is live text inside the element with the ID wmk. Change the word; the script sizes it to span the full width. Keep the IDs wmk and glWm.

The wordmark, the email address and every footer link are props of the Footer component; edit the prop defaults inside the component to change every page at once. Type the address once in Email Address and Email Link: block N5 splits it into the rolling letters when the page loads. If you change the wordmark word, re-measure WM_INK at the top of block N5 so it still spans the full width.

13Shader

The violet light is a live SVG silk, animated with GSAP. In the markup it is a div holding a rendered still image and two custom attributes; when the page loads, the site script draws the moving light over the still.

Custom attributes on the shader div
data-silk = 1 data-shader = {'light':[.64,.74],'seed':31}
Option
Default
Effect
light
[.6, .5]
[x, y] of the light from the bottom-left corner, 0 to 1. It drifts gently around this point.
fill
.8
How much of the block the light covers, 0 to 1. Use .5 for cards, 1 for wide bands.
rib
10
Height of one horizontal flute in pixels.
tone
#6E4BFF
Violet of the light. Change it to recolour one block; every page uses the default.
seed
0
Start position, so two blocks never fold the same way.
glow · cursor
.95 · .55
Overall strength, and the small light that follows the pointer (0 turns it off).
  • One shader off: delete the div, or remove its data-silk attribute. The rendered still image stays in its place.
  • Performance: the silk pauses off screen and holds one still frame for visitors who prefer reduced motion. Defaults for every block are in SILK, block N3b of the footer code.

14How to edit GSAP animations

All motion uses GSAP with ScrollTrigger and SplitText, installed from npm and loaded by src/components/CustomCode.astro. src/custom-code/site-head.html only hides the page until the first frame is ready (with a 3-second safety fallback). The motion script is in public/assets/js/nordlys.js, split into numbered blocks:

Block
Name
What to edit
N1
Setup
EASE (default easing) and SHOW_LOADER (preloader on/off).
N2
State engine
Applies hover, active and selected looks that need a parent or sibling (tabs, chips, term switches). No edits needed.
N3
Silk light
SILK defaults (rib, fill, tone, glow, cursor) in N3b. N3 only drifts the still image on blocks without data-silk).
N4
Navigation
Menu panel open and close, Escape to close, nav background after scrolling.
N5
Footer
Clock time zone, power price text, scroll rail, back to top, wordmark font.
N6
Helpers
Count-up and decode effects, icon hover, marquee and blink loops, FAQ accordion.
N7
Motion
Preloader timeline, headline blur-in, scroll reveals, framed quotes, image parallax. Durations and offsets live here.

Pages with their own motion (the four homes, pricing switches, list filters) carry a short GSAP script in Page settings › Custom code › Before </body>. Home scripts are labelled by block (H1-01, H1-02 … on Home 01, H2-… on Home 02, and so on), so you can delete a block together with its section.

To animate an element, add a custom attribute in its section component. No timelines to build:

Attribute
Value
What it does
data-animate
bh
Hero headline: letters blur in after the preloader.
data-animate
bs
Section headline: letters blur in on scroll.
data-animate
rv
Block rises and fades in on scroll.
data-animate
clipin
Image frame opens from an inset, scrubbed with scroll.
data-animate
lit
Dot-matrix icons inside light up on hover.
data-in
(empty)
Hero items fade up after the preloader, in order.
data-stagger
(empty)
Children reveal one after another on scroll.
data-count
(empty)
Number counts up from 0, keeping prefix, suffix and decimals.
data-loop
blink · tk
Blinking live dot, or a looping marquee track.

To remove an animation, delete the attribute; the element simply shows. Visitors who prefer reduced motion get no preloader and no GSAP animation, and every element stays fully visible.

15CMS

Three collections drive the News, Customers and Careers sections. Each list page uses Collection Lists; each detail page is a Collection Template. Every field has help text in the CMS panel.

Collection
URL
Main fields
News
/article/…
Category, Date, Read time, Excerpt, Cover image, Author name, role and photo, Body, Featured
Case studies
/case-study/…
Logo, Industry, Headline, Summary, Cover and portrait images, Quote, three metrics, GPUs, Site, Live since, Body, Featured
Careers
/career/…
Department, Location, Type, Salary range, Summary, Body, Featured, Open
  1. 16Turn on Featured for one item in each collection; the featured block is a Collection List filtered by Featured = true, limit 1.
  2. 17Careers lists only items with Open on, featured roles first.
  3. 18The filter tags on News, Case studies and Careers are plain links. The page script shows only the rows whose category, industry or department matches the clicked tag. No plugins are needed.

19Forms

Every form shows the design's success message; to receive submissions, set its action to your form service (README › Forms).

  1. 20Set the form action to your form service's endpoint in src/components/.
  2. 21Choice chips are native radio buttons and checkboxes; the selected look is applied by the state engine (block N2).
  3. 22The success message is an H2 styled in mono lilac; edit its text in the form's success block. The error message uses the same style.

23Icons

The eight icons are inline dot-matrix SVGs: circles of radius 0.9 on a 3px grid inside a 33 × 21 viewBox. Copy one from the Style guide.

  • Hover: put data-animate="lit" on the parent card, chip or link. On hover the dots turn lilac with a violet glow, one after another.
  • Colour: the dots follow the text colour of their parent.

24Utility pages

Page
In the theme
Before launch
404
Built-in 404 page
Keep. It is set to noindex.
Password
Built-in Password page
Keep as a static page (no password check on a static host).
Style guide
Static page, noindex
Keep as a working page.
Licenses
Static page, noindex
Delete, or keep for your own credits.
Changelog · Instructions · Overview
Static pages
Delete.

When you delete the template pages, remove the Template column from the Footer component as well.

25Support

Template support covers setup questions and anything that does not work as described here. Write to hello@example.com and include:

  • The build number from the footer, for example 26.10.05.
  • A link to your repository or demo and the page in question.
  • What you expected, what happened, and a screenshot.

We reply within two working days. Customisation work is outside template support.

The same placeholder address is used as the demo company's email in the footer and the contact pages. Replace hello@example.com everywhere before you publish.
26
Next
See every class at once

Start with the
style guide.

Change a Variable there and watch every specimen update before you touch a page.

Open the style guide