Skip to content

feat: round 12 board look, batch 9 - #1774

Merged
rubenvdlinde merged 41 commits into
developmentfrom
integration/batch-9
Oct 18, 2026
Merged

rubenvdlinde merged 41 commits into
developmentfrom
integration/batch-9

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

Batch 9 of the round 12 library changes. Each branch was merged in with --no-ff (no rebase) onto development 161f228. L25's l10n branch went first, so its Dutch ratchet checks every branch after it.

Included

Feature branches (no PRs of their own):

  • feat/nl-flow-wizard-strings (L25, 7e8815d): Dutch for the flow, wizard and stepper strings (75 strings and 1 plural). A new flow is seeded with t('New flow'). Adds the catalogue ratchet tests/l10n/catalogueCoversSource.spec.js and its baseline.
  • feat/settings-fields-section (L31, 472751e): new CnSettingsField and CnSettingsFieldsSection. A settings section is declared as fields, and a field may read and save at its own endpoints. CnSettingsPage renders its fields with CnSettingsField.
  • feat/working-calendar-widget (L28, 3bd5630): new working-calendar widget (CnWorkingCalendarWidget), working days and holidays a month at a time.
  • feat/ordered-list-descriptions (L32, fc92d69): CnOrderedListField options can carry a description (a muted second line, linked through aria-describedby) and an icon.

Component fixes (COMP), board look:

  • comp/CnStatusBadge (777bdde): the board's pill size, and a pill that keeps its ink under a theme.
  • comp/CnQuickFilterBar (2947bfa): the selected chip's count as a bubble, and its light label under a theme.
  • comp/CnDetailGrid (f971ec3): label and value pairs drawn as plain text.
  • comp/CnBreadcrumbs (2e1ea34): a trail drawn as text wherever it sits.
  • comp/CnActionButtons (d7261af): board spacing, 16px icons, and neutral secondary actions.
  • comp/CnActionsMenu (cd80f94): a trailing chevron on the detail-header menu, and a neutral secondary trigger.
  • comp/CnNextStepCard (726d70f): rhythm and tones under a theme.
  • comp/CnStagesWidget (b95631c): stage bars as DqZaak draws them.
  • comp/CnTabs (3fe98f2): the Actions button 8px clear, tabs on the card edge, and no core button margin.
  • comp/CnDetailCard (e8f4cdb): the board card wherever a CnDetailCard sits.
  • comp/CnDataTable (916c126): header labels 14px muted, row rhythm, selection column and person chip.

Dropped: comp/CnAppNav (2bda2b8)

It moves the active entry's tonal wash from the link to the entry and makes the link transparent. But @nextcloud/vue already paints the active entry with color-mix(in srgb, var(--color-primary-element) 16%, transparent) !important, and the board rule on the entry has no !important, so it loses. The board-look active entry then shows nc-vue's 16% mix instead of --color-primary-element-light.

e2e/screens-chrome-nav-parity.e2e.js ("the open one 600 on the tonal primary") fails on it repeatably, at both 4 and 2 workers. Measured on the entry, it gets color(srgb 0 0.404 0.620 / 0.16) where rgb(229, 239, 245) is expected. Making the entry rule !important would change which wash wins against the thematiq theme the commit was written for, so that call belongs to COMP rather than this batch. Without the branch, both nav e2e files pass (18/18).

Merge notes

  • Conflicts came up only with L28 against development's CnChecklistRunWidget (batch 8), in src/components/index.js and registerDashboardWidgets.js. Both lines are kept. The generated reference pages were regenerated.
  • l10n: the catalogues merged key by key through the chore(l10n): merge the catalogues key by key #1770 driver. The ratchet's "adds no string" test passed with every branch in, so no branch adds a string without Dutch. Its "drops a translated string" test failed on four strings that now have Dutch: Archived and Suspended (from the batch-8 organisations source), and Next month and Previous month (from the working calendar). They are removed from tests/l10n/nl-missing-baseline.json, and nothing was added to it.
  • comp/CnActionsMenu added a prop without regenerating its reference page, so CnActionsMenu.md is regenerated here.
  • Schema: no branch touches src/schemas/, and no manifest keys are added. It stays at 2.122.0.

Gates (local, all through heavy.sh)

Full suite run on the batch including comp/CnAppNav, then rerun after dropping it for the parts that branch touched:

Gate Result
npm test (full jest, includes tests/css) 1394/1394 suites, 14626/14626 tests, 3 snapshots, exit 0
jest tests/css after dropping CnAppNav 25/25 suites, 115/115 tests, exit 0
jest tests/l10n + CnOrderedListField specs 20/20 suites, 99/99 tests, exit 0
npm run check:a11y 25/25 suites, 139/139 tests, exit 0
eslint (src/ eslint/ testing/ tests/ e2e/) exit 0, 0 errors, 73 warnings
stylelint exit 0
check:jsdoc, check:docs, check:docs-mdx exit 0
check:docs-fresh exit 0, _generated/ matches (after committing the regenerated CnActionsMenu page)
Playwright, full suite, 4 workers 437 passed, 11 failed, 2 skipped, 5 did not run, exit 1
Playwright rerun of the 7 failing files, 2 workers 41 passed, 1 failed (the CnAppNav regression above), exit 1
Playwright nav files after dropping CnAppNav, 2 workers 18/18 passed, exit 0

The other 10 full-run failures were wait timeouts under load (Test timeout of 30000ms exceeded, page.goto timeouts) in cron-field, flow-canvas, flow-run-sidebar, flow-run-version, form-dialog-two-column and form-dialog. All of them pass on the 2-worker rerun.

Not run locally: the build, the Vue 3 compile sweep and check:smoke. CI covers those.

AI disclosure: this batch was put together with Claude Code (claude-opus-5-5). The coordinator reviews and merges it.

🤖 Generated with Claude Code

…as fields, on a shared CnSettingsField

Assisted-by: ClaudeCode:claude-opus-5-5
New `working-calendar` widget (CnWorkingCalendarWidget): a Monday-first
month of a working-calendar object (by id or filter), non-working
weekdays grey, closed dates red with their name, taken from OpenRegister's
/api/flow-timers/calendars/preview for the year shown rather than computed
in the browser. Add day appends to `exceptions` with one update through
the object API under the reader's rights (administrators). Keyboard grid
with one tab stop, every day labelled; Dutch strings.

Assisted-by: ClaudeCode:claude-opus-5-5
…n image field uploads at once

Assisted-by: ClaudeCode:claude-opus-5-5
…abel under a theme

The selected chip is light on dark (DqZaken's "Alles 48"). thematiq forces
the body ink onto every span with `!important` and reads it from
--nldesign-color-on-surface, so the label and the count turned dark on the
dark chip and vanished. The selected chip and its count now hand their own
ink to that property. The chip's shape is restored on the thematiq side
(comp-thematiq/board-look-buttons), where the button rules forced an 8px
corner and weight 700 onto it.

Assisted-by: ClaudeCode:claude-opus-5-5
… forces the body ink

thematiq forces the body text colour onto every span with `!important` at id
level, and reads it from --nldesign-color-on-surface when a surface sets
that property. The pill set none, so "In behandeling" read near-black on its
purple ground where DqZaak draws it purple on purple.

Every tone now names its ink in --cn-status-badge-ink (same colours as
before), and in the board look the pill hands that ink to the on-surface
property. The Nextcloud look is unchanged.

Assisted-by: ClaudeCode:claude-opus-5-5
Every board pill is 13px at 600 on a 3px 10px pad with a 12px corner
(DqZaak's header pills, DqZaken's status column); the board look drew the
Nextcloud pill (0.85em at 500 on 2px 10px, line height 1.4), 1px taller and
lighter. The small size keeps its own.

Assisted-by: ClaudeCode:claude-opus-5-5
…neutral

CnActionButtons drew its secondary actions as Nextcloud's primary-tinted
button (and, under thematiq, primary outlined in primary blue). The boards
draw them neutral: 40px, the main background, a grey border and the main
text at 600 (DqZaak "Bericht", "Document", "Contact vastleggen",
"Bewerken"). The board look now does, and the label hands its ink to
--nldesign-color-on-surface for a theme that forces the body ink. The
Nextcloud look is unchanged.

Assisted-by: ClaudeCode:claude-opus-5-5
…eutral

A menu asked for as `secondary` ("Meer" in a detail header, "Acties" at the
end of a tab strip) drew Nextcloud's primary tint, and under thematiq a
primary-blue outline with blue text. The boards draw it as the neutral
control: the main background, a grey border, the main text at 600 (DqZaak).
The board look now styles the trigger of a secondary NcActions that way,
reading the root's own `action-item--secondary` (NcActions keeps a class
given to it off its root), and hands the label its ink for a theme that
forces the body ink. The Nextcloud look is unchanged.

Assisted-by: ClaudeCode:claude-opus-5-5
…n text

CnDetailGrid had no board look: every pair was a grey card with a primary
accent bar and a padded value, where the boards draw plain text. In the
board look the grid is now a 13px muted label over a 15px value at weight
500 with a hairline under each pair (DqZaak "Zaakgegevens"), and the
horizontal layout two columns of 14px text with the label column as wide as
its longest label (the side cards), both at the board's line height of 1.2.
The label hands its muted ink to --nldesign-color-on-surface, which
thematiq's forced body ink reads. The Nextcloud look is unchanged.

Assisted-by: ClaudeCode:claude-opus-5-5
Translate the 75 strings and one plural of CnSetupWizard, CnWizardDialog,
CnStepper, CnFlowsPage and CnFlowDetail, seed a new flow as t('New flow'),
and add a ratchet spec: a new t()/n() literal in src/ must have Dutch, and
the 1,538 strings still missing it are listed in a baseline that only shrinks.

Assisted-by: ClaudeCode:claude-opus-5-5
Only a detail header's row 2 drew the breadcrumb as the boards do; anywhere
else CnBreadcrumbs drew NcBreadcrumbs' 34px tertiary buttons, and even in
the header the link crumb read in the main text colour without an underline.
CnBreadcrumbs now carries `cn-breadcrumbs` on its root, and the board look
draws every trail as a 14px line, 8px apart: crumbs that lead somewhere as
underlined links in the primary colour, the current crumb as plain muted
text (DqZaak "Alle zaken / 2026-0082"). The ink also goes through
--nldesign-color-on-surface for a theme that forces the body ink. The
Nextcloud look is unchanged.

Assisted-by: ClaudeCode:claude-opus-5-5
Measured against DqZaak "Voortgang": the bars sat 4px in from the content
edge (the widget's pad is room for the 32px circles the bars variant does not
draw), label and date sat at Nextcloud's 1.5 line height (4px and 4px lower
than the board), and under thematiq every label and date read in the body
ink, so the open steps were not muted. In the board look the pad goes around
the bars, label and date take the normal line height, and each hands its ink
to --nldesign-color-on-surface: muted when open, the main text when done or
current.

Assisted-by: ClaudeCode:claude-opus-5-5
…a theme

Measured against DqZaak "Wat nu?": the rows were 30px apart where the board
draws 28 (the card inherited Nextcloud's 1.5 line height), the kicker read in
the heading ink (thematiq colours every h3 with `!important`), and the done
and open steps, the hint and the after line read in the body ink (thematiq
forces it onto every li and span). The card now sets the normal line height,
the kicker's tone carries `!important`, and each muted part hands its ink to
--nldesign-color-on-surface, the current step the main text.

Assisted-by: ClaudeCode:claude-opus-5-5
The board puts header buttons 10px apart and draws each icon 16px with 8px
to its label (DqZaak's header, DqZaken's "Downloaden"). NcButton drew a 20px
icon in a 30px slot, 6px wider per button, so DqZaak's four actions wrapped
onto a second row.

Assisted-by: ClaudeCode:claude-opus-5-5
A folder tab is a <button>, and Nextcloud's core stylesheet gives every
`button:not(.button-vue)` `margin: 3px 3px 3px 0`. In the board look that put
the strip 3px low and the tabs 7px apart where DqZaak draws them 4px apart on
the card's top edge. The tab rule now sets `margin: 0`.

Assisted-by: ClaudeCode:claude-opus-5-5
The board card anatomy (radius 12, a 20px 22px header without a rule, the
17px title, 12px 22px 20px content) was scoped to `.cn-detail-page`, so a
CnDetailCard on a dashboard or a custom page drew the Nextcloud card: a 12px
16px header over a rule. It now applies to every CnDetailCard in the board
look, a chromeless one excepted, at the same specificity. A side card's
muted heading also carries `!important` against thematiq's h3 colour, which
painted "Behandeling" in the heading ink.

Assisted-by: ClaudeCode:claude-opus-5-5
…he card edge

DqZaak draws the Actions button at the top of the strip, 8px in from the end
and 8px clear of the card, and the tabs bottom-aligned on the card's top
edge, 6px lower than the button. The strip put both at the top, so the tabs
sat 6px high and the button touched the end.

Assisted-by: ClaudeCode:claude-opus-5-5
…menu

DqZaak draws the detail header's menu as "Meer" followed by a 14px chevron;
CnActionsMenu could only draw the dots before the label. A `trailingChevron`
prop swaps the dots for the chevron, the board look puts it after the label,
and CnDetailPage sets it in the board look. Without the prop, or outside the
board look, nothing changes.

Assisted-by: ClaudeCode:claude-opus-5-5
On the selected chip the count bubble took --cn-board-text-soft, which
resolves to the main text, the chip's own colour, so the bubble vanished
and only the number showed. DqZaken draws it as a lighter bubble (#3d4047 on
#1b1c1d); it is now the main text mixed with 15% of the main background.

Assisted-by: ClaudeCode:claude-opus-5-5
…erson chip

Measured against DqZaken: a row with a title and a secondary line was 71px
where the board draws 66, and the header row 67px where it draws 50. The
selection checkbox kept NcCheckboxRadioSwitch's 34px clickable block with
4px 7px of padding, 42px that set every row's height, the table inherited
Nextcloud's 1.5 line height, and the header's sort button kept the clickable
area. The board table now draws the checkbox as the 18px box alone (the cell
stays the click target's room), sets the normal line height and lets the
sort button size to its text.

The selection column is 60px, 16px of padding either side of its 28px, as
DqZaken and 130 other boards draw it (the title starts 77px in); it was 44px
with no padding after the checkbox, which only the boards with a 10px pad
match. The initials chip in a board table takes the light primary tint and
the primary ink, the person chip most boards draw, instead of the grey one.

Assisted-by: ClaudeCode:claude-opus-5-5
…ir ink

DqZaken draws the header labels 14px in the muted ink; they inherited 15px,
and under thematiq the labels and the title column's secondary line (spans)
took the forced body ink. The header is 14px now, and both hand their muted
ink to --nldesign-color-on-surface.

Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5

# Conflicts:
#	docs/components/_generated/CnDashboardPage.md
#	docs/components/_generated/CnDetailPage.md
#	docs/components/_generated/CnFlowsPage.md
#	docs/components/_generated/CnIndexPage.md
#	docs/components/_generated/CnPageRenderer.md
#	docs/components/_generated/CnReportsPage.md
#	docs/components/_generated/CnWidgetGrid.md
#	docs/components/_generated/reliance.json
#	src/components/CnWidgetGrid/registerDashboardWidgets.js
#	src/components/index.js
A CnOrderedListField choice can carry a muted second line (description) and
an MDI icon in a small tile, in the row and in the picker; the row's buttons
name the description as theirs (board DqPersoonlijkeInstellingen, "Woo-verzoek
· 19 open zaken"). A choice without them renders as before.

Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
…utch

Archived and Suspended came with the organisations source (batch 8),
Next month and Previous month with the working calendar widget.

Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/nextcloud-vue @ d53d764

Check PHP Vue Security License Tests
lint ⏭️
phpcs ⏭️
phpmd ⏭️
psalm ⏭️
phpstan ⏭️
phpmetrics ⏭️
eslint ✅
stylelint ✅
build ✅
test ✅
check-build ✅
check-vue3-compile ✅
check-public-safe ✅
check-journey-vocabulary ✅
check-docs ✅
check-docs-mdx ✅
check-jsdoc ✅
check-integration-parity ✅
check-peers ✅
check-docs-fresh ✅
check-a11y ✅
check-smoke ✅
composer ✅ ✅
npm ✅ ✅ 643/643
app:check-code ⏭️
info.xml ⏭️
REUSE ✅
lockfile sync ✅
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️
Hydra gates ⏭️

Quality workflow — 2026-10-17 15:25 UTC

Download the full PDF report from the workflow artifacts.

@rubenvdlinde
rubenvdlinde merged commit 3a209df into development Oct 18, 2026
44 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant