Islands on a ground
Work lives on distinct surfaces over a tinted canvas. Structure comes from placement and weight.
THE SHARED SYSTEM
Meridian is the Flutter design system behind Northspline, CrossProton, Mimameidr, Nibluma, ShotLama, and VaultLama. A common set of tokens and controls, tuned to each app's character.
A calm surface for the work that matters.
01 / PRINCIPLES
Meridian began with Northspline's desktop interface. The shared system keeps its underlying decisions consistent while letting each product set its own tone.
Work lives on distinct surfaces over a tinted canvas. Structure comes from placement and weight.
One accent marks the active choice, the main action, and keyboard focus.
Pointer, keyboard, and touch states are part of each control, with touch targets sized for fingers.
Hierarchy comes from weight and colour. Desktop text stays between 11 and 17 pixels, so dense screens remain calm.
The token generator fails when text, an icon, a control edge, or the focus ring drops below its contrast floor in any brand or theme.
Durations, curves, and springs are tokens. Every animation has a reduced-motion fallback.
02 / THE LIBRARY
Buttons, inputs, navigation, feedback, containers, data, and document controls share the same token system. Open Widgetbook to inspect live states across brands, themes, and densities.
A few familiar controls, with Meridian's quieter rhythm.
03 / LIVE
This is the Flutter library itself, running in your browser. Pick a component, a brand, and a theme. In Widgetbook, knobs expose each property.
The preview downloads the Flutter engine, a few megabytes.
Open it in Widgetbook04 / TOKENS
Colour, type, spacing, shape, and motion live in one token file. A generator writes the Dart constants and the design documentation from it.
Light values shown. Each token has a dark counterpart.
#E8ECEE#FFFFFF#F6F8F9#DCE2E5#0F1B21#52616A#8795A0#C3CCD1Shared by every brand, so a warning looks the same in each app.
#16733A#9A5B00#B03A08#B42318Eight categorical colours for charts, labels, and avatars.
Desktop sizes. Touch density uses a larger scale.
display 26 / 600Open a mailboxtitle 17 / 600Delete 3 notebooksheading 15 / 600Quarterly report draftbody 13 / 400Recover the connection after a disconnectlabel 12 / 500Display namecaption 11 / 500Edited 2 hours agoA brand picks its density. Row height in pixels:
2428324805 / BRANDS
Each brand brings its own accent, typography, and density. The same components follow along without a second widget library.
Desktop Git with a calm, clear focus.
Private mail with a violet accent.
A process explorer where data leads.
Notebooks with paper, ink, and petrol.
Capture pixels with quiet desktop chrome.
Passwords that stay hidden until asked.
06 / IN CODE
An app chooses its brand once. Widgets read colours, type, and spacing from the theme, so no screen names a colour itself.
MaterialApp(
theme: buildMeridianTheme(
brand: MeridianBrands.northspline,
brightness: Brightness.light,
),
darkTheme: buildMeridianTheme(
brand: MeridianBrands.northspline,
brightness: Brightness.dark,
),
home: const MeridianGround(
child: InboxScreen(),
),
);MeridianIsland(
title: 'Inbox',
child: MeridianListRow(
title: 'Quarterly report draft',
subtitle: 'Anna Berg',
meta: '09:41',
selected: true,
onTap: open,
),
);final m = context.meridian;
Text('Inbox', style: m.text.bodyStrong);
ColoredBox(color: m.colors.paneAlt);
BorderRadius.circular(m.radius.lg);
const SizedBox(width: MeridianSpace.space4);SEE IT IN CONTEXT
Browse isolated Flutter components, switch brands and themes, and try the controls yourself.
Open Widgetbook