a design language · web, native and the desktop

Straight lines, live tiles, sideways motion.

one token source · two independent themes · four status fills · no framework

Rekta Design is a design language for software that shows a lot and stays calm. Its name is Latin recta, the straight line: sharp edges, a strict grid, nothing rounded off. It is defined once, as tokens and rules, and comes three ways: CSS and a script for the web, rekta-core, a C library for native desktop apps, and a theme for the whole KDE Plasma desktop.

Move sideways with the mouse wheel, a trackpad swipe, or ← → once the panorama has focus; on a phone, scroll down. A tile that opens something nudges back where you press it, and the place turns.

Nothing is decoration.

  1. content over chromeNo cards, no boxed panels. Information sits right on the ground, grouped by hairlines and whitespace.
  2. motion as guidanceEvery transition answers one question: where am I, which facet, what just happened. None of them is there to look nice.
  3. information-dense live tilesA tile's size follows importance; its fill is its status. It opens something, or it only informs.
  4. panorama and pivotOne place, wider than the screen, moved through sideways; its facets in a fixed order. You are inside one.
  5. refined precisionHairlines, tabular figures, calm large areas, vivid small accents.

roots

Rekta takes up the ideas of Microsoft's Metro, from Zune and Windows Phone 7 to Windows 8, in its own form: its own tokens, type and components. Type as structure comes from the Swiss International Typographic Style and the signage of public transport: large, plain, readable at a glance.

Status is a fill, not an accent.

The ground is neutral and has no brand hue. Four status colours carry meaning, and only meaning: a tile's whole area is one fill, and the fill is its status. The word is always there too, so nothing depends on seeing colour. Primary text clears AA on every fill, in both themes.

active3running
waiting1needs you
failed1stopped
done12finished
idle0nothing on

three levels, one bold title

A quiet kicker, one semibold title per screen, a fact line. Navigation titles, like the strip above, are large and light: they name a place, not a thing. UI words are lowercase; content keeps its own case. The type is Barlow.

Every transition means one thing.

  • place changeA page turned in a book: you are somewhere else. Light parts go first, heavy ones later. Press a tile on the first section to see it.
  • pressThe tile tilts back where you press it: this heard you.
  • build-inTiles rise a few pixels, one after another: this view is assembling itself.
  • peek and flipA new number comes up from below; a new status turns the tile over.
  • reduced motionEvery step becomes instant, and none is skipped.
active1builds today

One source, three ways out.

Every colour, size, radius, duration and curve is a token, in one file. Each platform feeds the same numbers into its own drawing: nothing is invented twice.

  • tokensrekta.tokens.json, resolved for any platform: WinUI, Qt, SwiftUI, Compose, Flutter or a terminal.
  • the webrekta.css and rekta.js: components and behaviour, no framework, any framework.
  • native appsrekta-core: a C99 library for Windows, macOS and Linux, drawn the same everywhere.
  • the desktopKDE Plasma 6: colour schemes, Plasma Style, title bar, Kvantum style, splash, wallpaper and login screen.

Take it.

  1. read the sourcegithub.com/DerDaehne/Rekta-Design: tokens, docs, the web build, rekta-core and the KDE theme.
  2. try the native demoWith Nix: nix run github:DerDaehne/Rekta-Design
  3. walk through every componentthe showcase, built in Rekta itself.

Code, tokens, CSS and script: MIT. Docs and images: CC BY 4.0. Barlow: SIL Open Font License 1.1. Some token values derive from the Porsche Design System (Apache-2.0), values only. Rekta Design is independent and not affiliated with or endorsed by Microsoft or Porsche.

Rekta Design

the web

CSS and a script, no framework.

rekta.tokens.css · rekta.css · rekta.js · 51 icons · light and dark · compact and comfortable

The Rekta showcase in light: a panorama of sections, status tiles, rows on hairlines The Rekta showcase in dark: a panorama of sections, status tiles, rows on hairlines
The showcase: one panorama whose sections explain a part of the system by being it.
  • tokensEvery token as a --rk- custom property, with theme, density and reduced motion switching.
  • componentsTiles, rows, tags, buttons, fields and every input, pivots, panoramas, the app bar, sheets, toasts, menus, tables, trees, long lists, splits, charts. Classes .rk-*, nothing global.
  • behaviourPress, the turnstile, places and back, the panorama's wheel and keys, pivots, toasts and undo, menus, selection, forms. State lives in data-rk-*, never in classes, so a framework that owns className keeps working.

this page is built with it

A 1px edge; with focus, ink and a focus ring.
  • Nightly importfailed
  • Release noteswaiting
  • Contrast in darkdone
tokens resolved100%

start

<link rel="stylesheet" href="rekta.tokens.css">
<link rel="stylesheet" href="rekta.fonts.css">
<link rel="stylesheet" href="rekta.css">
<script type="module">
  import * as Rekta from './rekta.js';
  Rekta.start();
  Rekta.places({ home: 'home' });
  Rekta.panorama(document.querySelector('.rk-panorama'),
    { pivot: document.querySelector('.rk-pivot') });
</script>
Rekta Design

native apps · rekta-core

Desktop apps in C, without a browser.

C99 · Windows, macOS, Linux · no dependency beyond the system · the same pixels everywhere

rekta-core: status tiles, a sparkline and a progress linerekta-core: status tiles in dark, a sparkline and a progress line
tiles, drawn by rekta-core
rekta-core: buttons, rows with status tags and a progress linerekta-core: buttons, rows with status tags and a progress line, in dark
controls
rekta-core: a table with sorted columns and a selected row
a table that sorts, resizes and edits
rekta-core: a menu on the ground with a 1px edge
a menu

rekta-core is Rekta Design for apps that do not run in a browser. An app declares what a window shows from its state; the library keeps the views and changes only what differs, with the design's motion: a new number peeks in, a new status flips the tile, a place turns. Underneath, views and controllers compose as in UIKit, and a small software renderer draws every platform pixel for pixel the same, so one set of reference images checks them all.

#include "rekta.h"

static int finished = 312;                 /* the state: the window shows what is here */

static void build_one(rk_view *button, void *user) { finished++; }   /* the new number peeks in */

static void today(void *user) {            /* what the window shows, built again after every handler */
  RK_PANORAMA() RK_SECTION("today") {
    RK_LABEL("Today", .style = RK_TEXT_GROUP);
    RK_TILES() {
      RK_TILE(rk_ui_fmt("%d", finished), .label = "finished today",
              .status = RK_STATUS_SUCCESS, .span = { 2, 1 });
    }
    RK_BUTTON("build one", .on_press = build_one);
  }
}
  • few dependenciesThe operating system and a C compiler. Win32 and GDI on Windows, Cocoa on macOS, Wayland (X11 as fallback) on Linux.
  • a clean ABIC99, opaque handles, size-prefixed descriptors: any language with a C FFI can use it.
  • tested544 checks and 36 reference images, AddressSanitizer and UBSan clean; Win32 and Cocoa built and tested in CI.
  • buildmake -C core on Linux and macOS, core\build.bat on Windows, or nix run github:DerDaehne/Rekta-Design for the demo.
Rekta Design

the desktop · KDE Plasma 6

The whole desktop in Rekta.

two global themes · Plasma Style · title bar · Kvantum style · splash · wallpaper · login screen

KDE Plasma in Rekta Light: a flush panel with a hairline, Dolphin and the volume applet with 6px sliders and ink thumbs KDE Plasma in Rekta Dark: a flush panel with a hairline, Dolphin and the volume applet with 6px sliders and ink thumbs
Rekta Light and Rekta Dark follow the theme of this page.
  • colour schemeThe ground, the ink, hairlines and the status colours, for every KDE app.
  • Plasma StylePanels flush to the edge with a hairline towards the desktop, popups on the ground with a 1px edge and no shadow, task buttons with a 2px line, the 6px slider with an ink bar, switches as Metro drew them, tabs underlined in ink.
  • title barrekta-core's: 36px on the ground, a hairline below, the title on the left, the icons of the set; a 1px edge around the window.
  • application styleEvery Qt app through Kvantum: 2px ink buttons, fields with a focus ring, checkboxes filled in ink, rows that take the hover, menus with a check and no box.
  • splash, wallpaper, loginThe mark of the app icon as the splash, one straight line as the wallpaper, and a login screen that is a Rekta place.
Qt widgets in Rekta Light through Kvantum: buttons, fields, checkboxes, tabs, a list, a table and a tree Qt widgets in Rekta Dark through Kvantum: buttons, fields, checkboxes, tabs, a list, a table and a tree
every Qt widget, through Kvantum
The Rekta login screen in light: the date, the time large and light, the people as a pivot, one field and the sign-in button The Rekta login screen in dark: the date, the time large and light, the people as a pivot, one field and the sign-in button
the login screen (SDDM): the people as a pivot, one field
The splash in three steps: the line fills as Plasma starts, then the success square appears over its end
the splash: the line fills as Plasma starts; the square over its end says done

install with Nix

# flake inputs (the theme is on the kde-plasma-theme branch for now)
rekta-design.url = "github:DerDaehne/Rekta-Design/kde-plasma-theme";

# NixOS
environment.systemPackages = [ inputs.rekta-design.packages.${pkgs.system}.rekta-kde ];
services.displayManager.sddm.theme = "rekta";

# home-manager with plasma-manager; rekta = inputs.rekta-design.packages.${pkgs.system}.rekta-kde
programs.plasma.workspace.lookAndFeel = "design.rekta.dark";   # or design.rekta.light
xdg.configFile."Kvantum/Rekta".source = "${rekta}/share/Kvantum/Rekta";
xdg.configFile."Kvantum/kvantum.kvconfig".text = "[General]\ntheme=Rekta\n";

Without Nix: node scripts/build-kde.mjs writes the same files into dist/kde/share. The details are in kde/README.md.

rekta design source