Design library
Styleguide.
The living reference for the Adelt website. Tokens are generated from design/tokens/*.json (W3C DTCG) by Style Dictionary into src/styles/tokens.css. Components live in src/components/ui/. Rules and rationale are in design/README.md.
Brand
Mark and wordmark.
The mark is the search pattern the aircraft flies: lanes joined at the ends, with the aircraft as a point in the accent at the end of the last lane. It is the one place the accent appears in the brand. The earlier delta mark is retained at /brand/adelt-mark-delta.svg. The wordmark is Archivo at 125% width, weight 800, capitals. Minimum size for the lockup is 20 px high; below that use the mark alone.
Alternatives under review: ten logo explorations. Files: /brand/adelt-mark.svg, /brand/adelt-mark-reverse.svg, favicon.svg. Never rotate the mark. The lanes take ink or slate-ink; the point is always beacon.
Colour
Thirteen colours, one accent.
Components never use a raw colour. They use role variables (--bg --surface --ink --muted --line --line-2 --accent) which the .slate and .cover contexts remap. Beacon is for links, focus and markers, never for backgrounds.
Dark mode follows the system by default. One small contrast glyph in the header flips it; picking what the system already prefers returns the site to automatic. The choice is remembered in this browser only. It is a second set of role values, not a second stylesheet: the ground becomes slate, text becomes slate-ink, the accent becomes beacon-soft, and the sections that were dark step one tone lighter than the ground so the page keeps its rhythm. Photographs are untouched. Every component already works in both because it only ever used the roles.
paper
Page ground
paper-2
Raised surface
ink
Text
ink-2
Secondary text
line
Hairlines
line-2
Strong hairlines
slate
Dark ground
slate-2
Dark surface
slate-ink
Text on slate
slate-ink-2
Secondary on slate
beacon
Accent
beacon-soft
Accent on slate
amber
Status only
Type
Four voices, strict roles.
Archivo (display, 105% width) for h1 and h2 and the wordmark. Familjen Grotesk (Stockholm) for body, navigation and h3 down. JetBrains Mono for data only: coordinates, timestamps, values that line up in columns. Labels and captions are sentence-case Familjen. Newsreader italic for quotes and the opening statement only. All self-hosted. Sizes are fluid between 360 px and 1440 px viewports. Labels are sentence case; nothing on the site is set in tracked capitals except the wordmark.
--text-xs
Eyes over the coast
--text-sm
Eyes over the coast
--text-0
Eyes over the coast
--text-1
Eyes over the coast
--text-2
Eyes over the coast
--text-3
Eyes over the coast
--text-4
Eyes over the coast
--text-5
Eyes over the coast
--text-6
Eyes over the coast
label
Fig. 1 Vinga, climb-out 57°41′N 11°41′E
serif
“We stopped sending a boat to look at every radar return.”
Space and layout
A twelve-column grid and a fluid space scale.
Place children with style="--c: start / span n". Below 880 px everything stacks. The left three columns are the rail for markers and metadata; content starts at column four. Rules replace boxes: .ruled for columns, .rows for lists. .bleed-right lets an image run to the viewport edge; .cover is a full-bleed photograph with a gradient for text.
- --space-3xs
- --space-2xs
- --space-xs
- --space-s
- --space-m
- --space-l
- --space-xl
- --space-2xl
- --space-3xl
Components
What exists, and when to use it.
Button
one primary per view
Readiness
a track, not a badge
In service since March 2025
Flight testing since August 2026
Prototype since January 2026
Stat
value, unit, condition
90 min
Endurance
Sea level, 10 m/s wind, EO/IR payload
<3 min
Time to launch
Vehicle stop to airborne
Figure
crop marks, mono caption, coordinates

Quote
serif italic, role not name
“The first time the thermal picture came up on the radio operator's screen, the whole crew went quiet.”
Aircraft drawing
placeholder for renders
Figures
drawn from data, mono for values only
Contact band
one offer after proof
Section head
marker in the rail
Projects
What happened on the last flight.
Header
A bar that stays, compacts, and gets out of the way on a phone.
The announcement strip scrolls away; the header is sticky. Its layout height never changes: a 16 px strip above a 56 px bar. It sticks at −16 px, so after the first scroll only the bar remains and nothing below it shifts. The lockup eases from 21 to 18 px and a hairline shadow appears; the scrolled state engages past 24 px and releases under 4 px, so it never flickers. The ground is translucent paper with a backdrop blur, so photographs read through it. On desktop it never hides: the way back to the rest of the site should not move. Under 960 px the links collapse into a full-height sheet with large links and one call to action; the header hides on scroll down and returns on scroll up. The header's measured height is written to --header-h, which anchors and sticky sidebars use.
At rest
72 px tall including the reveal strip, lockup 21 px, links in Familjen 500 at the small size, current page underlined in ink, "Talk to us" as a bordered button. One filled button per view, and that one belongs to the hero.
Scrolled
56 px visible, lockup 18 px, hairline shadow. 220 ms on the ease-out curve; the page content does not move by a pixel.
Phone
"Menu" with a two-line glyph that becomes a cross. The sheet fills the viewport below the bar, lists pages in the display face at the third size, and ends with the contact button and the sales address. Closes on navigation.
Later
Product pages get a local bar when the hero scrolls out: system name on the left, "Request the brief" on the right. Not built yet.
Motion
Seven behaviours, each with a reason.
All of them stop under prefers-reduced-motion. Nothing counts up, nothing bounces, no section fades in because it is a section. The page never scrolls on its own and never snaps to sections: usability studies on scrolljacking find most people disoriented and some reading it as a bug. Smooth scrolling applies to anchor links only, and anchors land below the sticky header.
1
Entrance. The home hero rises once on first load, four elements 70 ms apart. Nowhere else.
2
Reveal. Photographs and figures fade in 8 px as they enter the viewport, once. Without JavaScript nothing is hidden.
3
Draw. Diagram strokes draw themselves when the figure comes into view. The diagrams are about process; the motion shows it.
4
Cover drift. Scroll-driven parallax on cover photographs with CSS
animation-timeline: view(). No scroll listener; unsupported browsers see a still.5
Video. Poster first, fades to motion on
playing, plays only in view.6
Header. Compacts on scroll without moving the page; hides and returns on phones only.
8
Readiness fill. The programme segments fill left to right when the track comes into view.
9
Searching together. Three aircraft fly their lanes on one 16-second timeline; relays flash, the operator confirms, the hand-over lands, and a ground-station log beneath prints each event as it happens. Still under reduced motion.
7
Page transitions. Links are prefetched on hover, a 180 ms cross-fade swaps the page, the header and announcement persist, and a project's or system's photograph and title morph from the list into the detail hero, and between sections the page title shapes into the next page's title. New pages open at the top; back restores position.
Viewport
Fluid first, one breakpoint, containers for the rest.
Type and space scale with the viewport between 360 and 1440 px. The grid stacks at 880 px; the header collapses at 960 px. Everything else adapts by container query. Covers use svh. Images ship as WebP and JPEG at 640, 960 and 1400 with a sizes hint. The page never scrolls sideways; a probe checks every route at 1280 and 390.
Rules
What this system refuses to do.
These came out of the survey of 27 defence and drone sites and the research on AI-generated design tells. Each one is a thing we saw and chose against.
No cards, no shadows.
Rules and whitespace separate things. A 3 px radius on photographs, video and buttons is the only softening, so the page is not newsprint either.
No gradients, no glass.
The one gradient is the darkening over a cover photograph, and it exists so text can be read.
No centred hero with three cards.
Content sits in a left rail and a right field. Asymmetry is the default.
No intro animation, no scroll-triggered fades.
Motion is limited to hover on links and the arrow. Reduced-motion is honoured.
No black with amber.
That is the uniform of our competitors. Our dark is slate, our accent is beacon blue, used sparingly.
No badges, no coloured status words, no tracked uppercase mono.
Programme status is a four-stage track with the stage and date in words. Labels are sentence case in the body face. Mono appears only where digits line up.
No arrows welded to buttons.
A link is underlined. A button says what happens.
No icons.
Numbers, labels and photographs do the work. The only pictograms are the mark and the aircraft drawing.
No meta strings joined with dots.
"Vinga · autumn campaign" becomes a sentence or a comma. Dots between fragments are template chrome.
No “Get started”, “Seamless”, “Elevate”.
Copy names what happens: “Talk to us”, “Request the brief”, “System details”.
No invented numbers after launch.
Every figure carries its condition. Placeholders are flagged in the content files until measured.