Kagels Trading

CORPORATE DESIGN

How this site is built to look

Colours, type, spacing and the components they live in. Everything here is read from the files, so it stays true when the files change.

Start here

This is the English site, kagels-trading.com, built new in Astro. Pages are plain files in this repository and the whole site is generated at build time, so there is no theme, no page builder and no database.

Colour

Five colour variables, declared once in src/layouts/Base.astro, used everywhere. The chips fill from the variables themselves.

Colours that are not variables yet

Four more colours are written directly into the components that use them. They are part of the look, so they belong here even though they do not have a name yet. Two more sit outside the stylesheet altogether: the logo blue above, which lives in the logo file, and the chart background #0d1b33, which lives in TradingView and is baked into every exported chart.

ValueWhereWhat it does
#b9ccffHomepage and forecast heroThe small label above the headline, on dark blue
#dbe4ffForecast heroThe date line under the headline, on dark blue
#e6ecffHomepage buttonHover state of the white button on dark blue
#f4f6faTables in forecasts and postsHeader row background

Contrast

Text has to stay readable, so these are the pairs the site actually uses, measured against the WCAG rule of 4.5:1 for normal text.

PairRatioVerdict
#111111 on white18.88:1Body text, passes
#555555 on white7.46:1Secondary text, passes
White on #0f2a5c13.94:1Hero copy, passes
#b9ccff on #0f2a5c8.73:1Hero label, passes
#dbe4ff on #0f2a5c10.99:1Hero date line, passes
#0f2a5c on white13.94:1Figures and links on light, passes

Type

One family, the system stack: system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif. Body text is 1.125rem with a line height of 1.6.

Sizes are set per page rather than in one scale, so the same level can differ between a text page and a forecast. These are the sizes in use.

WhereLevelSize
Homepage heroh1clamp(2.1rem, 5vw, 3.4rem), line height 1.15
Forecast heroh1clamp(2rem, 5vw, 3rem), line height 1.15
Text pagesh1clamp(2rem, 5vw, 2.8rem), line height 1.15
Homepage and forecastSection h21.9rem
Text pagesh21.4rem
Cards and tables of contentsh31.2rem, homepage cards 1.25rem
Lead paragraphp1.3rem, forecast hero 1.25rem
Label above a headlinep0.95rem, weight 600, letter spacing 0.08em
Captions, meta, breadcrumbsp0.95rem to 1rem

Prices and price levels always use font-variant-numeric: tabular-nums, so the digits line up in a column. How a price is written (decimals, currency sign, points) is decided in src/lib/prices.ts, not in the markup.

Layout and spacing

ValueWhat it does
1100px--content-width, the width of the page, centred
2rem 1.5remPadding around the main column, 2.5rem on top from 1024px up
70chReading column for running text
60chLead paragraph under a headline
22ch to 24chHeadline in a hero box, so it breaks into two or three lines
1remGap in every card grid
1px solid #e5e5e5Every border on the site

Corners

Four radii are in use, and they are not interchangeable: 12px for a hero box and the author box, 10px for cards, images and the level list, 8px for buttons and range rows, 6px for the small hint on a chart.

Grids

Card rows are repeat(auto-fit, minmax(...)) with a minimum between 200px and 260px, so they fold from three columns to two to one without a media query. Only the layouts that carry a photo or a sidebar switch at 1024px and 700px.

Components

Nine components and two layouts. Build with these before writing anything new.

FileWhat it is
Base.astroThe frame of every page: head, structured data, header, footer. Title and description are required
Page.astroSimple text pages: about, contact, imprint, privacy
Header.astroLogo and navigation, one hairline underneath
Footer.astroLegal links and the year, set automatically
Breadcrumbs.astroThe trail above the headline, also reported to Google
ChartFigure.astroEvery chart on the site. Image, caption, and the click that opens it larger
Lightbox.astroThe enlarged chart: a <dialog> that closes on click, Escape or the round button
LevelList.astroSupport and resistance levels, with the current price highlighted in dark blue
ForecastCards.astroThe row of forecast cards, on the homepage and the hub
AuthorBox.astroPhoto, name, role and profile links under an article
ExternalLink.astroA link that leaves the site. Opens in a new tab and carries rel="noopener"

Patterns

Six shapes carry almost every page. They are shown here as they are built, not as pictures of themselves.

Hero box

GOLD FORECAST

Gold holds above its March range

What the levels say, and what would change the picture.

Dark blue, 12px corners, white text, a label in #b9ccff above the headline. It opens the homepage and every forecast.

Figure tiles

  • 1980First shares bought
  • 1986Trading actively
  • 2015Forecasts published

The number is 2.2rem in dark blue, the label sits underneath in the soft grey. Used for facts a reader should remember.

Card

  • Silver price forecast

    Updated twice a day, with six charts from hour to year.

  • Copper price forecast

    Three charts, the contango explained in plain words.

1px border, 10px corners, heading and one soft grey line. On hover the border turns dark blue. Nothing else moves.

Price levels

Now$3,642

Resistance

  • $3,700
  • $3,790

Support

  • $3,560
  • $3,480

The current price sits in the dark blue row at the top, the levels underneath in tabular figures.

Range row

  • This week$3,560 to $3,700
  • This month$3,480 to $3,790

A thin border with a 4px dark blue edge on the left. Used for forecast ranges.

Table

PeriodLowHigh
Week3,5603,700
Month3,4803,790

Header row on #f4f6fa, every cell framed, and the whole table scrolls sideways on a phone instead of breaking the page.

Charts

Charts are the most valuable thing on this site, so they get their own rule. Karsten draws them in TradingView and exports them as images, which means the background colour is baked into every file. It is decided once and then left alone.

The chart background is #0d1b33, a near black with a blue cast. Not the hero blue and not plain black: it sits at the brightness of a black background, which is what hours of chart reading need, and it still belongs to the blue family the rest of the site is built from. Black backgrounds are no longer used.

It was weighed, not picked. The same setting produces the charts Karsten works in all day and the charts a reader sees for half a minute, so daily comfort counted for more than branding. Against the hero blue, this background gains three points of contrast on white bars and about a point on every coloured marker, which is what a long session notices. Do not change it for looks.

What can be drawn on it

Measured against the chart background, so nothing is chosen by eye.

ElementColourRatioVerdict
Bars and candleswhite17.19:1The default. Direction is carried by shape, not colour
Axis labels, dates, prices#dbe4ff13.55:1Reads clearly without shouting
Secondary labels#b9ccff10.76:1For anything below the main scale
Up marker#26a69a5.73:1Works, and it holds as a thin line too
Down marker#ef53504.93:1Works. Still worth drawing thick on a busy chart
Indicator lines#ffd814 or #ffa50012.35:1, 8.70:1Yellow and orange. White works too
Any blue line#2962ff3.51:1Never. TradingView's default blue for moving averages sits too close to the background, so indicators are recoloured instead
Logo blue#084ec52.38:1Never. It disappears on this background

Line colours for levels

Horizontal levels are the one thing drawn on almost every chart, so they get a small fixed set. All three clear 8:1 on the background, which means a one pixel line still reads.

ColourRatioUse
#ffd814 yellow12.35:1The level that matters most on this chart
#9be870 light green11.60:1Support, and levels that held
#ffa500 orange8.70:1Resistance, and levels still to be tested

Three colours are enough. A fourth and a fifth turn a chart into a colour code the reader has to learn, and the price action stops being the loudest thing on the screen.

How to keep them identical

Rules

Decisions that are already made. They are in AGENTS.md in full, with the date and the reason.

Design direction
The current look is the starting point and gets developed in small steps, not reinvented. Modern touches sparingly: no gradients, no glow, no dot or grid backgrounds, no generic icons, no "Get started".
Charts
Every chart goes through ChartFigure.astro and can be opened larger by clicking it. Charts carry German and English labels for now.
External links
Always a new tab, always through ExternalLink.astro or the markdown plugin, always rel="noopener" without noreferrer, so a linked provider can see where the visitor came from.
No affiliate links
Providers are linked directly, never through the German redirects.
Copy
English, plain, no dashes as punctuation. Write two sentences instead of one with an insert.
Prices
Formatted by src/lib/prices.ts, which knows dollars, points and exchange rates. Never formatted by hand in a page.
Addresses
Forecasts keep the addresses the old WordPress site used, so their rankings survive without a redirect.
Internal links
A new article links to the ones it belongs with, and they link back to it. A dead internal link breaks the build.
Translations
Every translation from the German site follows docs/translation-checklist.md. Where it disagrees with AGENTS.md, AGENTS.md wins.

Where things live

PathWhat is in it
src/layouts/Base.astroThe colour variables, the page width, the global styles
src/components/The nine components, each with its own styles
src/pages/One file per page, styles included
src/content/Blog posts and forecasts as markdown
src/data/site.tsCompany facts, team, dates. Edited by hand, never guessed
src/lib/prices.tsHow every price on the site is written
src/assets/charts/Karsten's chart images, one folder per market
AGENTS.mdEvery decision, with its date
docs/translation-checklist.mdWhat a translation has to clear before it goes live

Not settled yet

An honest list, so nobody designs into a gap that is already known.