Skip to content
CodeAtlas UI

Foundation

Typography

Font families and the type scale for headings, body text and UI labels.

Type sizes are rem tokens multiplied by --ca-font-scale, so they follow the user’s browser font size. Fonts are stacks: the defaults name Inter and JetBrains Mono but the kit does not load them, so load them yourself (for example with @fontsource-variable) or replace them in your theme. --ca-font-display defaults to --ca-font-sans.

import { defineTheme } from "@codeatlasdev/ui";

export const theme = defineTheme({
  fonts: { body: "Geist, system-ui, sans-serif", mono: "Geist Mono, monospace", display: "Fraunces, serif" },
});

fonts.body, fonts.mono and fonts.display set --ca-font-sans, --ca-font-mono and --ca-font-display. See Theming.

Text-entry controls use --ca-input-font-size, which is raised to at least 16px on touch devices and below 900px so iOS Safari does not zoom into focused fields. See Mobile.

Font families

--ca-font-sans

The quick brown fox jumps over the lazy dog

--ca-font-display

Headings use the display family

--ca-font-mono

const answer = 42;

Code
svelte
<div class="families">
	<div>
		<p class="label">--ca-font-sans</p>
		<p class="sample sample--sans">The quick brown fox jumps over the lazy dog</p>
	</div>
	<div>
		<p class="label">--ca-font-display</p>
		<p class="sample sample--display">Headings use the display family</p>
	</div>
	<div>
		<p class="label">--ca-font-mono</p>
		<p class="sample sample--mono">const answer = 42;</p>
	</div>
</div>

<style>
	.families {
		display: flex;
		flex-direction: column;
		gap: var(--ca-space-5);
		width: 100%;
	}
	.label {
		margin: 0 0 var(--ca-space-1);
		font-family: var(--ca-font-mono);
		font-size: var(--ca-font-size-caption);
		color: var(--ca-text-hint);
	}
	.sample {
		margin: 0;
		font-size: var(--ca-font-size-body1);
		color: var(--ca-text-primary);
	}
	.sample--sans { font-family: var(--ca-font-sans); }
	.sample--display { font-family: var(--ca-font-display); }
	.sample--mono { font-family: var(--ca-font-mono); }
</style>

Heading scale

--ca-font-size-h1 to h6.

--ca-font-size-h1 Heading 1: The quick brown fox
--ca-font-size-h2 Heading 2: The quick brown fox
--ca-font-size-h3 Heading 3: The quick brown fox
--ca-font-size-h4 Heading 4: The quick brown fox
--ca-font-size-h5 Heading 5: The quick brown fox
--ca-font-size-h6 Heading 6: The quick brown fox
Code
svelte
<script lang="ts">
	import TypeRows from "./TypeRows.svelte";
	const rows = [1, 2, 3, 4, 5, 6].map((n) => ({ label: `Heading ${n}`, token: `--ca-font-size-h${n}` }));
</script>

<TypeRows {rows} heading />

Body and UI scale

Body, caption, label and button sizes, plus the micro and nano steps used by badges.

--ca-font-size-body1 Body 1: The quick brown fox jumps over the lazy dog
--ca-font-size-body2 Body 2: The quick brown fox jumps over the lazy dog
--ca-font-size-caption Caption: The quick brown fox jumps over the lazy dog
--ca-font-size-label Label: The quick brown fox jumps over the lazy dog
--ca-font-size-button Button: The quick brown fox jumps over the lazy dog
--ca-font-size-micro Micro: The quick brown fox jumps over the lazy dog
--ca-font-size-nano Nano: The quick brown fox jumps over the lazy dog
Code
svelte
<script lang="ts">
	import TypeRows from "./TypeRows.svelte";
	const rows = [
		{ label: "Body 1", token: "--ca-font-size-body1" },
		{ label: "Body 2", token: "--ca-font-size-body2" },
		{ label: "Caption", token: "--ca-font-size-caption" },
		{ label: "Label", token: "--ca-font-size-label" },
		{ label: "Button", token: "--ca-font-size-button" },
		{ label: "Micro", token: "--ca-font-size-micro" },
		{ label: "Nano", token: "--ca-font-size-nano" },
	];
</script>

<TypeRows {rows} />