Typography on NLDD's base, and the scale of our own that hid it #196

Merged
robbertbos merged 11 commits from typography-on-nldd-base into main 2026-07-26 09:47:28 +00:00
Owner

Sluit #181, en neemt #169 mee omdat dat het vangnet is waar de rest op leunt.

Wat er aan de hand was

"Base" noemde geen getal in deze codebase. --text-base was 16px, maar <body>
erfde 18px van NLDD's body-md. De conventie in CLAUDE.md sprak zichzelf dus
tegen: "the default is base" wees naar 16, "let the stylesheet do the
default"
naar 18. font-size: var(--text-base) op lopende tekst was een
verkleining.

Daaronder zat iets groters: Waggle draaide een eigen typeschaal naast die van
NLDD. Een Tailwind-achtige reeks tegenover NLDD's modulaire schaal met ratio
1.125. Ze vielen op twee van de zeven stappen samen en liepen daarna uiteen. De
16-vs-14-mismatch uit #181 was daar een symptoom van, geen uitschieter.

Wat er nu staat

Waggle heeft geen eigen typeschaal meer. --text-* en --line-height-* zijn
weg; NLDD's presets nemen het over, in drie lagen die NLDD zelf ook hanteert:
inhoud erft (18px/1.5, wat nldd-rich-text doet), compacte zwevende panelen
staan op 16px (input-fields-sm), meta op 14,2 en 12,6px (body-xs/xxs).

Gemeten op één inbox-scherm: elke lettergrootte is nu een NLDD-stap. Daarvoor
stonden er negen, twaalf, veertien, zestien, achttien en twintig pixels door
elkaar, uit vier verschillende bronnen.

Wat er onderweg uit viel

Los van de typografie, allemaal gevonden bij het opruimen:

  • 91 stille typefouten. NLDD's gegenereerde template-types (#169) vingen ze.
    76 zaten op nldd-icon size="sm": sinds 0.8.70 heeft dat component een echte
    size-prop met pixelwaarden, en onze t-shirt-waarden deden niets. Ze werkten
    alleen dankzij een shim in base.css.
  • 19 foutmeldingen renderden in bodykleur. --semantics-content-error-color
    bestaat niet en is ook nooit door ons gedefinieerd, dus elke verwijzing was
    ongeldig en viel terug op de geërfde kleur. De rode banner-achtergrond viel
    helemaal weg.
  • Het datumveld in de plan-popover was 32px hoog. size="sm" in #178 ruilde
    ongemerkt 44px toetsdoel in voor 32px. De aanname eronder (dat de
    lettergrootte vastligt) klopt niet; die is stuurbaar via een publiek token.
  • # Kop in een bericht rendeerde op de UA-default van 2em, want
    CardRow .message had geen h1-h6-blok.
  • Een flaky test met een echte oorzaak. happy-dom 20.11.1 slaat bij bubbling
    soms de listeners van een custom element over. Gemeten: 2 van 6 runs met koude
    cache, listener aantoonbaar aanwezig, custom element aantoonbaar voorouder.
  • Dode CSS, vier niet-bestaande tokens, en een --_menu-*-blok dat namen zette
    die NLDD niet kent.

Verificatie

Er is geen visuele regressietest in de repo, dus elke commit heeft een klein,
benoembaar verificatie-oppervlak en de wijzigingen zijn opzettelijk niet
samengevoegd. Handmatig nagelopen in de preview met dev-seed op 1440, 720
(≈200% zoom) en 390px: geen horizontale scroll, geen overlopende elementen,
geen afgeknipte tekstvakken.

Poorten groen na elke commit: npm run typecheck, npm run build,
npm run test (533), npm run lint, uvx pre-commit run --all-files.

Vervolg, bewust niet in deze PR

  • De markdown-CSS ontdubbelen: 110 :global(...)-selectors over 5 componenten.
    Geen enkele wijziging bovenstrooms haalt die weg, zie MinBZK/storybook#158.
  • Koppen naar nldd-title (7 plekken staan nog op ruwe primitives).
  • De resterende handgebouwde avatars (#167/#130). CardRow is om; de 10px in
    CardDetailsModal is de laatste hardgecodeerde lettergrootte in de app.
Sluit #181, en neemt #169 mee omdat dat het vangnet is waar de rest op leunt. ## Wat er aan de hand was "Base" noemde geen getal in deze codebase. `--text-base` was 16px, maar `<body>` erfde 18px van NLDD's `body-md`. De conventie in CLAUDE.md sprak zichzelf dus tegen: *"the default is base"* wees naar 16, *"let the stylesheet do the default"* naar 18. `font-size: var(--text-base)` op lopende tekst was een verkleining. Daaronder zat iets groters: Waggle draaide een eigen typeschaal naast die van NLDD. Een Tailwind-achtige reeks tegenover NLDD's modulaire schaal met ratio 1.125. Ze vielen op twee van de zeven stappen samen en liepen daarna uiteen. De 16-vs-14-mismatch uit #181 was daar een symptoom van, geen uitschieter. ## Wat er nu staat Waggle heeft geen eigen typeschaal meer. `--text-*` en `--line-height-*` zijn weg; NLDD's presets nemen het over, in drie lagen die NLDD zelf ook hanteert: inhoud erft (18px/1.5, wat `nldd-rich-text` doet), compacte zwevende panelen staan op 16px (`input-fields-sm`), meta op 14,2 en 12,6px (`body-xs`/`xxs`). Gemeten op één inbox-scherm: elke lettergrootte is nu een NLDD-stap. Daarvoor stonden er negen, twaalf, veertien, zestien, achttien en twintig pixels door elkaar, uit vier verschillende bronnen. ## Wat er onderweg uit viel Los van de typografie, allemaal gevonden bij het opruimen: - **91 stille typefouten.** NLDD's gegenereerde template-types (#169) vingen ze. 76 zaten op `nldd-icon size="sm"`: sinds 0.8.70 heeft dat component een echte `size`-prop met pixelwaarden, en onze t-shirt-waarden deden niets. Ze werkten alleen dankzij een shim in `base.css`. - **19 foutmeldingen renderden in bodykleur.** `--semantics-content-error-color` bestaat niet en is ook nooit door ons gedefinieerd, dus elke verwijzing was ongeldig en viel terug op de geërfde kleur. De rode banner-achtergrond viel helemaal weg. - **Het datumveld in de plan-popover was 32px hoog.** `size="sm"` in #178 ruilde ongemerkt 44px toetsdoel in voor 32px. De aanname eronder (dat de lettergrootte vastligt) klopt niet; die is stuurbaar via een publiek token. - **`# Kop` in een bericht rendeerde op de UA-default van 2em**, want `CardRow .message` had geen `h1`-`h6`-blok. - **Een flaky test met een echte oorzaak.** happy-dom 20.11.1 slaat bij bubbling soms de listeners van een custom element over. Gemeten: 2 van 6 runs met koude cache, listener aantoonbaar aanwezig, custom element aantoonbaar voorouder. - Dode CSS, vier niet-bestaande tokens, en een `--_menu-*`-blok dat namen zette die NLDD niet kent. ## Verificatie Er is geen visuele regressietest in de repo, dus elke commit heeft een klein, benoembaar verificatie-oppervlak en de wijzigingen zijn opzettelijk niet samengevoegd. Handmatig nagelopen in de preview met dev-seed op 1440, 720 (≈200% zoom) en 390px: geen horizontale scroll, geen overlopende elementen, geen afgeknipte tekstvakken. Poorten groen na elke commit: `npm run typecheck`, `npm run build`, `npm run test` (533), `npm run lint`, `uvx pre-commit run --all-files`. ## Vervolg, bewust niet in deze PR - De markdown-CSS ontdubbelen: 110 `:global(...)`-selectors over 5 componenten. Geen enkele wijziging bovenstrooms haalt die weg, zie MinBZK/storybook#158. - Koppen naar `nldd-title` (7 plekken staan nog op ruwe primitives). - De resterende handgebouwde avatars (#167/#130). `CardRow` is om; de 10px in `CardDetailsModal` is de laatste hardgecodeerde lettergrootte in de app.
NLDD 0.8.70 ships generated Vue template types. Swapping our hand-written
permissive declarations for them surfaced 91 type errors that had been
rendering silently wrong:

- 76 on <nldd-icon size="xs|sm|md|lg|xl|2xl|3xl">. NLDD gave nldd-icon a real
  size prop taking pixel strings (16..96, spacer-aligned, nothing below 16).
  Our t-shirt values were never valid; they only rendered because base.css
  carried a nldd-icon[size="sm"] { width: 14px } shim. Migrated to the real
  scale and dropped the shim. Smallest icons go 12/14px -> 16px;
  nldd-icon-button and nldd-button keep their own xs/sm/md/lg scale.
- 11 on <nldd-title size="4">. Size is 1..6 (number), so it needs :size="4".
- 4 on FormatToolbar's variantFor(), whose ": string" return annotation
  widened the literal union away.

Also fixes the testing note in CLAUDE.md: plain `tsc --noEmit` does not look
inside .vue templates, so it reported success on all 91. The real gate is
`npm run typecheck` (vue-tsc), which `npm run build` already runs.

Groundwork for #181 (typography pass): the type errors are the same class of
silent drift the font-size audit found, and this makes the next pass fail loudly
instead.

Refs #169
Cleanup found while auditing font sizes for #181. None of it depends on the
typography decision, and all of it was actively misleading.

Four tokens that are referenced but never defined, so the declaration is
invalid at computed-value time and silently does nothing:

- --color-danger-fg and --semantics-content-error-color, together on the error
  pill in NotesEditor and SavedIndicator. Both are wrong, so a role="alert"
  that was meant to be a red pill rendered as inherited-colour text on no
  background. Replaced with NLDD's critical-tinted pair, the same one
  nldd-tag color="critical" uses.
- --font-weight-regular in CardDetailsModal (the token is -normal).

Dead rules:

- BubbleMenuButton .menu/.item/.custom* - 95 lines left behind when the picker
  moved to TimePresetPicker.vue.
- ReplyComposer .attachBtn/.sendBtn - the markup switched to NLDD buttons.
- tokens.css --content-max-width: 53rem, shadowed by base.css's 58rem on import
  order. Kept the effective value; which of the two is right at 18px body text
  is a typography question for #181, not cleanup.
- base.css's nldd-menu block set --_menu-item-size/-padding/-width. NLDD's menu
  has no such variables (they are --_item-size/--_padding/--_width), so the
  block never applied. Not renamed: --_* is component-internal and off-limits
  per the NLDD guidance, and NLDD's own pointer:fine density is a deliberate
  choice. Only the corner-radius line, which uses a public token, survives.

Refs #181
base.css set the document font to --primitives-font-body-md-regular-flat.
"flat" is line-height 1.125, and NLDD uses that variant for single-line input
fields (--semantics-input-fields-md-text-font). Running text was therefore set
at 18px/20.25px app-wide.

NLDD's own choice for prose is body-md-regular-snug (18px/1.5), set on
nldd-rich-text in dist/css/rich-text.css. Adopting it makes "write no
font-size / no line-height rule" the correct default for content.

Measured in the running preview: body line-height 20.25px -> 27px, font-size
unchanged at 18px.

The comment claimed 18px/1.5 while the code did 1.125, which is why the
discrepancy survived this long.

Refs #181
--semantics-content-error-color is not an NLDD token and is defined nowhere in
Waggle either. Every reference to it was invalid at computed-value time, so the
declaration was dropped: red error text fell back to the inherited body colour,
and the two color-mix() banner backgrounds collapsed entirely.

Measured in the running preview before the change: the "Fout: ..." line in
Verzendproblemen computed to oklch(0.348 0.02 257.4) - byte-identical to the
body colour. After: oklch(0.513 0.177 29.5), and the banner regains its border
and tinted background.

Replaced with --semantics-content-critical-color, NLDD's real token, in all 19
places (banners, toasts, form errors, failed attachments, mention popover,
login and onboarding).

Refs #181
The audit for #181 found 52 declarations holding body text, form labels and
buttons below the document's own 18px, plus a parallel scale that only agrees
with NLDD's on two of its seven steps.

This removes the sub-base rules so the affected text inherits, which is what
the convention asks for ("in doubt: let the stylesheet do the default"):

- Settings copy: token help, caveats, alert boxes, export/import intro,
  recovery-key warning and its consent label (10 rules).
- Chrome: both status banners and the search input the user types into.
- Cards: action buttons, thread toggle, expand/collapse, the failure strip and
  its "Opnieuw proberen" button (which sat at 10px), the CardShell host.
- Composer and scheduling: send button, attachment status, drop overlay,
  queued rows, strip modal, schedule popover, Verzendproblemen header.
- Message bodies: inbox card, reading-list card, modal, thread reply, quoted
  original, reply preview, markdown editor, notes editor. 16px -> 18px.

Compact control surfaces deliberately do NOT follow the 18px base. The emoji
picker, mention autocomplete, link bar and plan popover go to NLDD's sm tier
(16px, --primitives-font-size-90) - the size NLDD itself uses for
input-fields-sm and size="sm" controls.

Two structural fixes ride along:

- base.css set font-size on every native input at (0,1,1) specificity, which
  beat the (0,1,0) CSS-module rules in EmojiPicker and LinkBar. Their declared
  13px and 16px never rendered; both computed to 14px. Removing the global rule
  without those two would have made the emoji search *smaller*, so they change
  together. The emoji search box also grows to NLDD's 44px control height.
- FormatToolbar redefined --primitives-font-body-md-regular-tight, an NLDD
  primitive, to drag its menu down to the composer's old 16px. Deleted: the
  composer is on the base now, and remapping a primitive is the thing the
  design system explicitly asks you not to do.

Verified in the running preview: on one inbox screen the number of distinct
font sizes drops and 18px goes from 4 to 9 of the 28 distinct text elements;
no clipping or overflow at 1440px.

Refs #181
This is #181's literal complaint. The premise in the issue turns out to be
wrong: nldd-date-field's font is NOT fixed by its size attribute.
date-field.styles.js maps size to --_text-font, which reads the public
--semantics-input-fields-{sm,md}-text-font token, and custom properties
inherit into shadow DOM. So the font is steerable; only the control height
follows the size attribute.

PR #178 worked around the apparent constraint with size="sm", which silently
traded --semantics-controls-md-min-size (44px) for -sm- (32px).

Now: size="md" for the 44px box, with the popover scoping
--semantics-input-fields-md-text-font to body-sm-regular-flat so the text stays
on the 16px tier the rest of the popover uses. The time input beside it gets
the same min-height.

Measured in the running preview, "Zelf kiezen…" open:
  before  date 16px/32px   time 16px/46px
  after   date 16px/44px   time 16px/46px

Also widened the label column to minmax(60px, max-content); at 16px "Tijd"
and "Datum" fit, but a fixed 60px track has no headroom.

Refs #181
CardRow's inbox-card .message declared p, code, pre, a, lists and blockquote
but no h1-h6 at all, so a `# Kop` in a Mattermost message fell through to the
UA default of 2em - 36px on the 18px base, the loudest text on the card.

Added the block there, and switched the existing scales in CardDetailsModal,
ThreadView and the composer preview from rem to em so a heading is sized
relative to the surface it sits on rather than to the root. The reading-list
preview keeps every level at 1em: it is a clamped 12-line excerpt, where a
heading should read as one emphasised line, and it now covers h5/h6 too
(previously h1-h4 only).

This scale is now written out in five components. Extracting one shared prose
stylesheet is the real fix - NLDD ships exactly this as dist/css/rich-text.css -
but that is a refactor of the markdown pipeline, not a typography change.

Refs #181
The last two hardcoded font sizes in the app were both initials discs:
CardRow's at 9px and CardDetailsModal's at 10px. Neither can be fixed by
deleting the rule the way the rest of the pass was - initials in a 20px circle
need a size proportional to the circle, and inheriting 18px would overflow it.
nldd-avatar is the only exit, and it is what the design system ships for
exactly this.

This does CardRow (both render sites). It replaces the <img v-if> / <span
v-else> pair, the avatarError ref and its @error handlers, and 21 CSS
declarations - nldd-avatar owns the image -> initials -> icon chain, including
the dead-src fallback Waggle was reimplementing.

Also drops CardRowConfig.avatarSizeAttrs, which existed only to put width/height
on that <img> and has no equivalent (nor need) on the component.

Initials stay Waggle's: we pass :initials from cardViewUtils.initials() rather
than letting NLDD derive them, because the two differ - NLDD takes first and
last word, ours takes the first letter of the first two. Verified in the running
preview: 45 avatars render at 20x20, "Pim de Vries" -> PV, "Amira El Idrissi"
-> AI, unchanged from before.

The five avatar tests asserted on Waggle's own fallback logic, which is now the
design system's. Rewritten to assert the contract that remains ours: a src only
when both author_id and account_id exist, and initials that survive its absence.

CardDetailsModal, ThreadView, ReactorPopover and MentionProfilePopover have the
same pattern and are left for #167/#130 - they need their own visual check and
MentionProfilePopover has a deliberate three-step type hierarchy to preserve.

Refs #181, #167, #130
The "close button emits close without bubbling to an ancestor backdrop" test
failed intermittently - 2 of 6 runs against a cold vitest cache, never against
a warm one, which is why it looked like noise.

Root cause, measured rather than guessed. Instrumented runs recorded, for the
failing case:

  stopPropagation calls while bubbling from the button   0
  stopPropagation calls when dispatching on the popover  1   <- listener IS attached
  popover.contains(closeButton)                          true

So the handler exists and the custom element is a genuine ancestor, but
happy-dom 20.11.1 sometimes skips a custom element's own listeners while
bubbling up from a light-DOM descendant. Not Vue, not our code: a plain
two-node repro (button inside a defined custom element) bubbles correctly
10/10, so it needs the deeper tree to show up. Ruled out along the way:
custom-element upgrade dropping listeners (6/6 keeps them), DOM pollution from
the two preceding tests, and the avatar <img> error triggering a re-render
(the img is still present in both outcomes).

Split into two tests that each assert one thing at the element that owns it:
the button emits close, and a click on the popover root does not reach the
backdrop. The second keeps a containment assertion so it still fails if the
button ever escapes the popover.

12 cold-cache runs, 12 green.

Refs #181
The remaining 76 --text-* and 16 --line-height-* references were the last of
the parallel scale. They are now NLDD primitives, and the tokens are deleted -
there is no second scale left to drift.

The meta tier keeps its two steps rather than collapsing, because NLDD has two:

  --text-xs   12px    -> --primitives-font-size-70   12.64px  (body-xxs)
  --text-sm   14px    -> --primitives-font-size-80   14.22px  (body-xs)
  --text-base 16px    -> --primitives-font-size-90   16px
  --text-lg   18px    -> --primitives-font-size-100  18px
  --text-xl   20px    -> --primitives-font-size-200  20.26px
  --text-2xl  24px    -> --primitives-font-size-300  22.78px

  --line-height-tight  1.25 -> --primitives-line-height-tight   1.25
  --line-height-normal 1.5  -> --primitives-line-height-snug    1.5

The largest delta is --text-2xl, which shrinks 1.2px: Waggle's scale was
Tailwind-shaped (1 / 1.125 / 1.25 / 1.5 / 1.875) while NLDD's is a strict
1.125 ratio, so they agreed only at 16 and 18 and diverged above.

Measured on one inbox screen: every distinct size is now an NLDD step
(12.64 / 14.22 / 16 / 18 / 20.26, plus 0.9em inline code). Before this branch
that same screen carried 9, 12, 14, 16, 18 and 20px from four different
sources.

Headings still use raw size primitives rather than nldd-title; converting them
is a component change, not a token change, and is left for its own pass.

Refs #181
The typography spec was swept into 44eb972 by a `git add -A`. Design documents
under docs/superpowers/specs/ and their rendered artifacts/ counterparts stay on
disk: they are working documents for the change, not something the repo carries.

Untracked here and added to .gitignore so it cannot happen again. The file
itself is untouched on disk. Note it still exists in 44eb972..b0855a7 on this
unpushed branch - worth scrubbing before this goes anywhere.
The two inputs sit side by side in the plan popover. nldd-date-field takes its
radius from --semantics-controls-md-corner-radius (8px); the native time input
next to it used our own --radius-md (6px). Two boxes, two corners.

NLDD has no time-field, so this chrome is hand-copied - which is exactly why it
drifted. Noted as evidence on MinBZK/storybook#157.

Refs #181
Replaces "default base, not sm", which argued from --text-* tokens that no
longer exist and named a base that was ambiguous between 16 and 18px.

Records what #181 actually decided: Waggle has no type scale, NLDD's presets
are the scale, and the three tiers with where each one applies. Adds the
"compact control surfaces" tier a definition, because "16px for UI" is the
obvious misreading - it means a floating panel outside the page flow, not
"chrome is smaller than content".

Also documents two rules that read as removable and are not: the body font in
base.css (NLDD ships no document typography, so deleting it drops the app to
the UA default) and the 0.85em on inline code.
vite-env.d.ts declared '@nldd/design-system/styles/rich-text'. The package's
exports map has three CSS entries - ./styles, ./styles/tokens and ./styles/fouc -
and that is not one of them, so the declaration covered an import that could
never resolve.
Separate the shell measure from the reading measure
Some checks failed
CI / release-scripts (pull_request) Successful in 5s
security-scan / SBOM (trivy) (pull_request) Successful in 10s
security-scan / Filesystem scan (trivy fs) (pull_request) Successful in 13s
security-scan / JS SCA (npm audit) (pull_request) Successful in 17s
security-scan / Python SAST (bandit) (pull_request) Successful in 17s
security-scan / Python SCA (pip-audit) (pull_request) Successful in 39s
test-build / build (frontend) (pull_request) Successful in 57s
test-build / build (backend) (pull_request) Successful in 1m3s
test-build / build (pull_request) Successful in 0s
CI / pre-commit (pull_request) Successful in 1m21s
CI / e2e (pull_request) Successful in 3m42s
CI / frontend-test (pull_request) Successful in 4m0s
CI / backend-test-postgres (pull_request) Has been cancelled
CI / backend-test (pull_request) Has been cancelled
31f8fbceb0
NLDD keeps two constraints apart: --semantics-page-sections-body-max-width
(1280px) caps a page shell, --components-rich-text-main-max-width (720px) caps
a column of prose. Waggle had one --content-max-width doing both jobs at 58rem,
which is the same conflation this branch has been unpicking elsewhere.

Split them:

- --content-max-width stays 58rem and keeps its job, capping the card list,
  search row and modal. Deliberately narrower than NLDD's 1280px: an inbox is
  not a dashboard.
- --reading-measure is new, at NLDD's own 720px, and caps rendered message
  prose inside that shell: inbox card, reading-list card, modal, thread reply.

Measured at 1440px: the card is 880px, the prose in it now 720px. Line length
drops from roughly 106 characters to 91.

Also retiers three rules that ended up on the 16px control tier through the
mechanical token migration and do not belong there: AccountPanel .meta (a
subtitle slot) to the meta tier, ImportPanel .summaryHeading (an <h4>) and
EmptyState .subtitle (page content, not a floating panel) to inherit.

Refs #181
robbertbos force-pushed typography-on-nldd-base from 734241004f
All checks were successful
CI / release-scripts (pull_request) Successful in 6s
security-scan / SBOM (trivy) (pull_request) Successful in 10s
security-scan / Filesystem scan (trivy fs) (pull_request) Successful in 14s
security-scan / JS SCA (npm audit) (pull_request) Successful in 19s
security-scan / Python SAST (bandit) (pull_request) Successful in 20s
CI / pre-commit (pull_request) Successful in 28s
security-scan / Python SCA (pip-audit) (pull_request) Successful in 40s
CI / backend-test (pull_request) Successful in 49s
test-build / build (backend) (pull_request) Successful in 58s
test-build / build (frontend) (pull_request) Successful in 1m1s
test-build / build (pull_request) Successful in 0s
CI / frontend-test (pull_request) Successful in 1m7s
CI / e2e (pull_request) Successful in 2m56s
CI / backend-test-postgres (pull_request) Successful in 3m54s
to ce69117083
Some checks failed
CI / pre-commit (pull_request) Successful in 56s
CI / frontend-test (pull_request) Successful in 4m52s
CI / release-scripts (pull_request) Successful in 9s
security-scan / Python SCA (pip-audit) (pull_request) Successful in 59s
CI / backend-test (pull_request) Successful in 6m30s
security-scan / Python SAST (bandit) (pull_request) Successful in 36s
security-scan / SBOM (trivy) (pull_request) Has been cancelled
test-build / build (pull_request) Has been cancelled
test-build / build (backend) (pull_request) Has been cancelled
test-build / build (frontend) (pull_request) Has been cancelled
CI / backend-test-postgres (pull_request) Has been cancelled
CI / e2e (pull_request) Has been cancelled
security-scan / JS SCA (npm audit) (pull_request) Has been cancelled
security-scan / Filesystem scan (trivy fs) (pull_request) Has been cancelled
2026-07-26 09:30:22 +00:00
Compare
robbertbos force-pushed typography-on-nldd-base from ce69117083
Some checks failed
CI / pre-commit (pull_request) Successful in 56s
CI / frontend-test (pull_request) Successful in 4m52s
CI / release-scripts (pull_request) Successful in 9s
security-scan / Python SCA (pip-audit) (pull_request) Successful in 59s
CI / backend-test (pull_request) Successful in 6m30s
security-scan / Python SAST (bandit) (pull_request) Successful in 36s
security-scan / SBOM (trivy) (pull_request) Has been cancelled
test-build / build (pull_request) Has been cancelled
test-build / build (backend) (pull_request) Has been cancelled
test-build / build (frontend) (pull_request) Has been cancelled
CI / backend-test-postgres (pull_request) Has been cancelled
CI / e2e (pull_request) Has been cancelled
security-scan / JS SCA (npm audit) (pull_request) Has been cancelled
security-scan / Filesystem scan (trivy fs) (pull_request) Has been cancelled
to b0ceade47a
Some checks failed
CI / pre-commit (pull_request) Successful in 1m22s
CI / release-scripts (pull_request) Successful in 24s
security-scan / Filesystem scan (trivy fs) (pull_request) Successful in 28s
security-scan / SBOM (trivy) (pull_request) Successful in 28s
security-scan / Python SAST (bandit) (pull_request) Successful in 33s
security-scan / JS SCA (npm audit) (pull_request) Successful in 34s
security-scan / Python SCA (pip-audit) (pull_request) Successful in 51s
test-build / build (frontend) (pull_request) Successful in 1m14s
test-build / build (backend) (pull_request) Successful in 1m23s
test-build / build (pull_request) Successful in 0s
CI / frontend-test (pull_request) Successful in 6m19s
CI / backend-test (pull_request) Successful in 8m8s
CI / e2e (pull_request) Successful in 8m8s
CI / backend-test-postgres (pull_request) Successful in 10m12s
security-scan / SBOM (trivy) (push) Successful in 10s
CI / release-scripts (push) Successful in 7s
security-scan / Filesystem scan (trivy fs) (push) Successful in 16s
security-scan / JS SCA (npm audit) (push) Successful in 19s
security-scan / Python SAST (bandit) (push) Successful in 20s
security-scan / Python SCA (pip-audit) (push) Successful in 42s
CI / backend-test (push) Successful in 59s
CI / frontend-test (push) Successful in 1m11s
publish-main / build (backend) (push) Successful in 1m6s
CI / pre-commit (push) Successful in 1m13s
publish-main / build (frontend) (push) Successful in 1m14s
publish-main / build (push) Successful in 0s
CI / e2e (push) Failing after 17m7s
CI / backend-test-postgres (push) Failing after 17m12s
2026-07-26 09:37:05 +00:00
Compare
robbertbos deleted branch typography-on-nldd-base 2026-07-26 09:47:28 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
robbertbos/waggle!196
No description provided.