Repository navigation
feat: round 12 board look, batch 9 - #1774
Merged
Merged
Conversation
…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
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
rubenvdlinde
requested review from
Rem-Dam,
SudoThijn,
WilcoLouwerse,
bbrands02,
remko48 and
rjzondervan
as code owners
October 17, 2026 15:21
Contributor
Quality Report — ConductionNL/nextcloud-vue @
|
| 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.
This was referenced Oct 18, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 witht('New flow'). Adds the catalogue ratchettests/l10n/catalogueCoversSource.spec.jsand its baseline.feat/settings-fields-section(L31, 472751e): newCnSettingsFieldandCnSettingsFieldsSection. A settings section is declared as fields, and a field may read and save at its own endpoints.CnSettingsPagerenders its fields withCnSettingsField.feat/working-calendar-widget(L28, 3bd5630): newworking-calendarwidget (CnWorkingCalendarWidget), working days and holidays a month at a time.feat/ordered-list-descriptions(L32, fc92d69):CnOrderedListFieldoptions can carry adescription(a muted second line, linked througharia-describedby) and anicon.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 getscolor(srgb 0 0.404 0.620 / 0.16)wherergb(229, 239, 245)is expected. Making the entry rule!importantwould 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
CnChecklistRunWidget(batch 8), insrc/components/index.jsandregisterDashboardWidgets.js. Both lines are kept. The generated reference pages were regenerated.tests/l10n/nl-missing-baseline.json, and nothing was added to it.comp/CnActionsMenuadded a prop without regenerating its reference page, soCnActionsMenu.mdis regenerated here.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:
npm test(full jest, includes tests/css)jest tests/cssafter dropping CnAppNavjest tests/l10n+ CnOrderedListField specsnpm run check:a11ysrc/ eslint/ testing/ tests/ e2e/)_generated/matches (after committing the regenerated CnActionsMenu page)The other 10 full-run failures were wait timeouts under load (
Test timeout of 30000ms exceeded,page.gototimeouts) 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