Durusu UI Preview

Theme
Density

A preview of the Durusu UI design system while the Angular library is being built. All 56 components with their appearances, sizes and states. Switch the theme and the density in the bar: every component on the page is recalculated from the same tokens. Plain HTML and CSS, no scripts.

Fonts

font-sans

Figtree

ABCDEFGHIJKLM abcdefghijklm 0123456789 & ?!

Every component and all five type categories

font-serif

Merriweather

ABCDEFGHIJKLM abcdefghijklm 0123456789 & ?!

Editorial content only; no component uses it

font-mono

Roboto Mono

ABCDEFGHIJKLM abcdefghijklm 0123456789 & ?!

Code and technical tabular data

Weights

Light 300Normal 400Medium 500Semibold 600Bold 700
display-large6rem / 6.5rem · 700 · -0.02em
Clear water
display-medium4.5rem / 5rem · 700 · -0.015em
Clear water
display-small3.75rem / 4.25rem · 600 · -0.01em
Clear water
headline-large3rem / 3.5rem · 600 · -0.01em
Sixty components, one system
headline-medium2.25rem / 2.75rem · 600 · -0.005em
Sixty components, one system
headline-small1.875rem / 2.375rem · 600 · 0em
Sixty components, one system
title-large1.5rem / 2rem · 600 · 0em
Invite your team
title-medium1.25rem / 1.75rem · 600 · 0em
Invite your team
title-small1.125rem / 1.625rem · 500 · 0.005em
Invite your team
body-large1.125rem / 1.75rem · 400 · 0.01em
Changes are saved as you type and synced to every device.
body-medium1rem / 1.5rem · 400 · 0.015em
Changes are saved as you type and synced to every device.
body-small0.875rem / 1.25rem · 400 · 0.02em
Changes are saved as you type and synced to every device.
label-large1rem / 1.5rem · 500 · 0.01em
Save changes
label-medium0.875rem / 1.25rem · 500 · 0.015em
Save changes
label-small0.75rem / 1rem · 500 · 0.02em
Save changes

Spacing, sizing and shape

Sizing tokens · live: change the density above and these move

control-height-sm32px at 0 · 28 at −1 · 24 at −2
control-height-md40px at 0 · 36 at −1 · 32 at −2
control-height-lg48px at 0 · 44 at −1 · 40 at −2
item-height36px at 0 · 32 at −1 · 28 at −2
row-height48px at 0 · 40 at −1 · 32 at −2
bar-height56px at 0 · 48 at −1 · 40 at −2
control-inset8px at 0 · 6 at −1 · 4 at −2
cell-padding-inline16px at 0 · 12 at −1 · 8 at −2
surface-padding24px at 0 · 16 at −1 · 8 at −2
surface-padding-sm16px at 0 · 12 at −1 · 8 at −2
stack-gap24px at 0 · 16 at −1 · 8 at −2
target-min24px at 0 · 24 at −1 · 24 at −2
target-min-coarse44px at 0 · 44 at −1 · 44 at −2

Spacing scale · n × 0.25rem · density never changes it

spacing-00rem
spacing-px1px
spacing-0.50.125rem
spacing-10.25rem
spacing-1.50.375rem
spacing-20.5rem
spacing-2.50.625rem
spacing-30.75rem
spacing-3.50.875rem
spacing-41rem
spacing-51.25rem
spacing-61.5rem
spacing-71.75rem
spacing-82rem
spacing-92.25rem
spacing-102.5rem
spacing-112.75rem
spacing-123rem
spacing-143.5rem
spacing-164rem
spacing-205rem
spacing-246rem
spacing-287rem
spacing-328rem
spacing-369rem
spacing-4010rem
spacing-4411rem
spacing-4812rem
spacing-5213rem
spacing-5614rem
spacing-6015rem
spacing-6416rem
spacing-7218rem
spacing-8020rem
spacing-9624rem

Radius · follows size

none0rem
xs0.125rem
sm0.25rem
md0.375rem
lg0.5rem
xl0.75rem
2xl1rem
3xl1.5rem
4xl2rem
5xl2.5rem
6xl3rem
full9999px

Colour roles

surface
surface-subtle
surface-container
surface-container-high
surface-raised
surface-inverse
on-surface
on-surface-muted
on-surface-inverse
border-subtle
outline
primary
on-primary
primary-container
on-primary-container
primary-text
focus-ring
success
on-success
success-container
on-success-container
success-text
warning
on-warning
warning-container
on-warning-container
warning-text
danger
on-danger
danger-container
on-danger-container
danger-text
info
on-info
info-container
on-info-container
info-text
scrim
shadow-color

Actions

button

Starts an action. One component covers the text button, the icon button and the FAB.

Size: small, medium, large; the FAB is medium or smallDensity: follows control-height-sm/md/lg; the FAB is fixed

toggle-button

A button that stays on. Alone it toggles one setting; in a group it picks one or several of a few options.

Size: small, medium, largeDensity: follows control-height-sm/md/lg

dropdown

The menu: a list of actions that opens from a trigger.

Size: noneDensity: items follow item-height

toolbar

A bar that groups a title and the actions that belong to one surface.

Size: noneDensity: follows bar-height

3 selected

ripple

A directive that draws a wave from the point of contact, for hosts that opt in to a stronger press.

Size: noneDensity: not applicable

Mid-expansion: a 16% wave in the content colour, clipped by the host.

Form controls

form-field

The wrapper that draws the box, label and message for every text-like control.

Size: noneDensity: control follows control-height-md; rows of fields are stack-gap apart

input

The native text input and textarea. It has no styling of its own; the form field draws it.

Size: noneDensity: through the form field

checkbox

Turns one option on or off, or picks several from a list.

Size: noneDensity: fixed mark; the row keeps a target-min hit area

UncheckedHoverCheckedIndeterminateFocusDisabledDisabled

radio

Picks exactly one of a short list.

Size: noneDensity: fixed mark; rows keep a target-min hit area

MonthlyHoverYearlyFocusDisabledDisabled

toggle-switch

Turns a setting on or off with immediate effect.

Size: noneDensity: fixed track; the row keeps a target-min hit area

OffOnFocusDisabledDisabled on

slider

Picks a number, or a range, by dragging along a track.

Size: noneDensity: fixed; the thumb keeps a target-min hit area

Volume

Price range · dragging

$140

Disabled

knob

A rotary control for a bounded number, where a slider has no room.

Size: small, medium, large (a graphic size)Density: fixed

64%
Gain
21°C
Focus
50%
Disabled

rating

Captures or shows a score out of a small number of stars.

Size: small, medium (a graphic size)Density: fixed

4.0 · 128 reviews

select

Picks one value, or several, from a closed list.

Size: noneDensity: trigger through the form field; options follow item-height

combobox

A select you can type in: filters a closed list as you type.

Size: noneDensity: trigger through the form field; options follow item-height

No results for "zzq"

autocomplete

A text input that offers suggestions. The value is whatever is typed.

Size: noneDensity: trigger through the form field; options follow item-height

Projects
Files

listbox

A list of options that is always visible, for one or several choices.

Size: noneDensity: options follow item-height

Notify me about

option

One row in a select, combobox, autocomplete or listbox. Shared by all four.

Size: noneDensity: follows item-height

chips

Compact pills that filter, choose, or hold the entries of a multi-value field.

Size: noneDensity: follows control-height-sm; chips inside a field are fixed

AllActiveDraftArchivedFocusDisabled

datepicker

Picks a date or a date range from a calendar, or by typing.

Size: noneDensity: days follow item-height

November 2026

MoTuWeThFrSaSu

timepicker

Picks a time of day from columns of hours and minutes, or by typing.

Size: noneDensity: cells follow item-height

picklist

Moves items between an available list and a chosen list, and orders the chosen ones.

Size: noneDensity: options follow item-height

Available columns
Selected columns

Layout and containers

card

A static surface that groups related content.

Size: none; the card image is small, medium or largeDensity: padding follows surface-padding

Raised

surface-raised, a border-subtle hairline and shadow-1.

Outlined

surface with a border-subtle hairline. The default on a plain page.

Filled

surface-container, no edge. For groups inside another surface.

accordion

A stack of headers that each reveal a panel.

Size: noneDensity: headers follow row-height

Send items back within 30 days for a full refund. Return shipping is free on orders over $50.

collapsible

The headless primitive that shows and hides one region.

Size: noneDensity: not applicable

divider

A hairline that separates content.

Size: noneDensity: fixed


or continue with

grid-list

Lays out tiles of equal weight in a responsive grid.

Size: noneDensity: fixed

North quay

48 files

Reef mapping

312 files

Estuary

7 files

splitter

Divides an area into panes that can be resized by dragging the gutter between them.

Size: noneDensity: fixed; the gutter keeps a target-min hit area

Files
Editor
Inspector · dragging

scroll-area

A scroll container with thin, themed scrollbars.

Size: noneDensity: fixed

Depth soundings were taken at low water on the north quay between the fuel berth and the slipway. Readings are corrected to chart datum and averaged over three passes. Outliers above two standard deviations were removed before plotting the contours shown in the attached sheets.

pnpm add @durusu/ui @durusu/theming @durusu/cdk

virtual-list

Renders only the visible rows of a very long list.

Size: noneDensity: the default item size follows control-height-md

Sounding 4,8123.4 m
Sounding 4,8133.6 m
Sounding 4,8143.1 m
Sounding 4,8152.9 m
Sounding 4,8163.0 m

Rows 4,812–4,816 of 10,000. Nine rows are in the DOM.

timeline

Shows events in order along a line.

Size: noneDensity: fixed

Survey published

Today, 09:12

Version 2.4 is live for all members.

Review approved

Yesterday, 16:40

Soundings uploaded

11 Nov, 08:05

48 files added by Amina Yusuf.

Final sign-off

Pending

Overlays

dialog

A modal surface that asks for a decision or a short task.

Size: none; width is small, medium or largeDensity: padding follows surface-padding

drawer

A panel that slides in from an edge, as an overlay or pushing the content beside it.

Size: noneDensity: padding follows surface-padding

Filters

Only my projects

popover

A small non-modal surface anchored to a trigger, for content richer than a tooltip.

Size: noneDensity: padding follows surface-padding-sm

Share "Harbour survey"

Anyone in the workspace with the link can view.

tooltip

A short text label that appears on hover or focus.

Size: noneDensity: fixed

Copy linkArchived projects stay searchable for 30 days.Bold ⌘B

toast

A brief message about something that just happened, shown at the edge of the screen.

Size: noneDensity: padding follows surface-padding-sm

Project published

Version 2.4 is live for all members.

Upload failed

tide-gauge.csv is larger than 50 MB.

Feedback and status

alert

A message in the page about the state of a task or a section.

Size: noneDensity: padding follows surface-padding-sm

Changes published

Version 2.4 is live for all members.

Sync in progress

Large files can take a few minutes to appear.

badge

A small label for status, category or count.

Size: noneDensity: fixed

DraftBetaNewActiveExpiringFailedSyncing83

progress-bar

Shows how far a task has got, or that it is running.

Size: none; thickness is regular or thickDensity: fixed

Uploading soundings.zip64%
Preparing export
Upload completeDone

progress-spinner

A circular indicator that something is loading or progressing.

Size: small, medium, large (a graphic size)Density: fixed

skeleton

A placeholder in the shape of content that is loading.

Size: noneDensity: takes the size of what it stands in for

meter

Shows a measurement within a known range: storage used, password strength, a score.

Size: noneDensity: fixed

Storage24 of 100 GB
Password strengthStrong
API quota78% · high
Disk96% · almost full

meter-group

One bar split into segments that add up to a whole.

Size: noneDensity: fixed

Storage68 of 100 GB
Surveys32 GBImagery18 GBExports12 GBOther6 GB

radial-meter

A meter drawn as a ring, for a single headline percentage.

Size: small, medium, large (a graphic size)Density: fixed

72%
Coverage
94score
18%
Battery · low

gauge

A half-ring that shows where a reading sits on a scale, optionally against coloured bands.

Size: noneDensity: fixed

58%CPU load
62km/h · caution

Data display

table

Rows and columns of data that can be sorted, selected and paged.

Size: noneDensity: rows follow row-height, the header control-height-md, cells cell-padding-inline

ProjectOwnerStatusFiles
Estuary sensorsKofi MensahDraft7
Harbour surveyAmina YusufActive48
Reef mappingLucía OrtegaSyncing312
Tide tables 2027Jonas WeberExpiring1,204

chart

The shared look for charts: series colours, axes, grid, legend and tooltip.

Size: noneDensity: fixed

UploadsExportsActive members
0255075100JunJulAugSepOctNov

avatar

Represents a person or a team with an image, initials or an icon.

Size: small, medium, large, extra-large (a graphic size)Density: fixed

AYJWLOKMDUAYAYJWLO+5

icon

Renders one glyph from the icon set at a text-relative or fixed size.

Size: 16, 20, 24 or 32px when not beside textDensity: fixed

16202432userbellgearheartfoldercalclockfilterIcon at 110% beside text

Foundations in use

State layers

One rule for every interactive part: state is an overlay in the colour of the content, never a new colour.

Rest
Hover 8%
Focus 12%
Press 16%
Drag 16%
Selected 8%
Current 12%
Rest
Hover 8%
Focus 12%
Press 16%
Drag 16%
Sel. + hover
Disabled
Rest
Hover 8%
Focus 12%
Press 16%
Drag 16%

Elevation

Six levels, each tied to a kind of surface. Pick the level by what the thing is, never by taste.

0Flat
1Raised card
2Hover, sticky
3Menu, tooltip
4Drawer, sheet
5Dialog

Motion

Motion says where something came from and that the interface heard you. Pick the easing by what is happening, the duration by how far it travels.

easing-linear
State layers, loopseasing-move
Tab indicator, slidereasing-enter
Menu, tooltip ineasing-exit
Menu, tooltip outeasing-enter-emphasized
Dialog, drawer ineasing-exit-emphasized
Dialog, drawer outeasing-overshoot
Tick, switch thumb