Skip to content

sync: merge 21 commits from upstream go-vikunja/vikunja - #10

Merged
kigiela merged 22 commits into
mainfrom
sync/upstream-main-2026-07-19
Jul 19, 2026
Merged

sync: merge 21 commits from upstream go-vikunja/vikunja#10
kigiela merged 22 commits into
mainfrom
sync/upstream-main-2026-07-19

Conversation

@kigiela

@kigiela kigiela commented Jul 19, 2026

Copy link
Copy Markdown

Summary

Merges upstream's latest 21 commits (mostly accessibility fixes, a few bugfixes, dependency bumps) into this fork's main. One conflict, resolved:

  • colors.scss: both sides added new tokens near the same lines. Kept our --brand-pink/--brand-navy reference swatches and ported upstream's new --text-muted token (same saturation/lightness upstream computed for 4.5:1 contrast, hue moved from their 220deg to our 331deg brand hue). Everything else (their --switch-view-active-background, dark-mode tokens) auto-merged cleanly since they reference --primary/--grey-* variables, which already resolve to our brand colors.

What's incoming

  • A batch of fix(a11y) commits: editor toolbar tab stops, comment/attachment count announcements, bucket selector labeling, auth hero contrast, kanban bucket structure, expanded/sort/toggle state exposure, login tab order/errors/dialogs.
  • fix(search): subtask parent search condition mirrored into ParadeDB BM25 matching.
  • fix(user): stop double-encoding FrontendSettings on UpdateUser.
  • fix(tasks): NULL-safe, search-aware subtask root condition.
  • feat(editor): alt-text prompt on image insert.
  • Dependency bumps (TipTap, Font Awesome, dev deps, devenv).

Verification

  • go build ./... clean (only the pre-existing, unrelated examples/plugins/example issue).
  • pnpm install --frozen-lockfile + pnpm run build clean.

Not auto-merging this one - wanted eyes on it given the scope (21 commits) before it lands.

tink-bot and others added 22 commits July 19, 2026 10:59
…ssistive technology

Add disclosure semantics to dropdown/popup triggers (aria-expanded, Escape to
close with focus return, drop the incorrect role=menu), aria-sort plus
per-column labels on the table view, a debounced polite live region announcing
quick-actions result counts, aria-pressed on editor toggle buttons, and an
aria-label on the rich-text editing region.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
The add-task footer renders inside ul.tasks via the draggable footer
slot; as a div it was the one remaining invalid child of the kanban
lists converted in go-vikunja#3234.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
…arch condition

The parent root-membership mirror always used the ILIKE fallback, so on
ParadeDB a parent matching the search only via fuzzy/token matching kept
its child as a duplicate root, and a substring-only ILIKE match could
hide a child under a parent absent from the results. The assumed
limitation no longer holds: pg_search plans ||| against the aliased
parent_tasks inside the correlated NOT EXISTS as a regular BM25 scan
(verified on 0.24.1), and score-free predicates never triggered the
"unsupported query shape" error on older versions either.

Part of go-vikunja#2954
…rent scopes

The fuzzy mirror test is ParadeDB-only and fails without the previous
commit (child returned as a second root). The multi-parent test pins the
NOT EXISTS semantics from go-vikunja#3197: one in-scope and one out-of-scope
parent must still nest the child.

Part of go-vikunja#2954
Each attachment row was a button containing the download, copy-URL,
delete and set-cover buttons — interactive elements nested inside an
interactive element, which is invalid and confuses assistive-technology
focus (axe: nested-interactive). The row is now a non-interactive
container: the filename (and thumbnail) is the trigger that opens or
downloads the attachment, and the action buttons are its siblings.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
Opens the existing alt-text prompt right after an image is inserted
(upload, paste and URL flows) so every new image gets a description.
Cancelling leaves the image without alt text, and the node is deselected
afterwards so the next insert appends instead of replacing.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
The white hero heading sat directly on the photo, where its contrast
depends on the image content. A bottom-weighted gradient scrim keeps it
readable across the whole picture.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
The trigger announced only the bare bucket name ("To-Do, button");
it now announces "Kanban bucket: To-Do".

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
The bare count badges read as just a number to screen readers; they now
carry an accessible name like "2 comments" / "1 attachment".

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
role=toolbar with a roving tabindex: Arrow keys move between buttons,
one Tab stop, Tab leaves the toolbar, and the tab stop stays valid when
buttons become disabled. Covered by an e2e keyboard-navigation spec.

Also fixes the table-edit :disabled bindings, which referenced
editor.can().X as a property (always truthy) so those buttons never
actually disabled — surfaced by review while testing the roving focus.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
…2026-07-19

# Conflicts:
#	frontend/src/styles/custom-properties/colors.scss
@github-actions

Copy link
Copy Markdown

📊 Dependency Size Changes

Warning

This PR adds 165.4 kB of new dependencies, which exceeds the threshold of 100 kB.

📦 Package 📏 Size
ws@8.21.1 150.8 kB
@typescript-eslint/types@8.64.0 113.5 kB
@tiptap/extension-code-block@3.27.4 -85.4 kB
@rolldown/binding-linux-x64-gnu@1.1.4 → @rolldown/binding-linux-x64-gnu@1.1.5 -44.9 kB
rolldown@1.1.4 → rolldown@1.1.5 14.2 kB
@typescript-eslint/tsconfig-utils@8.64.0 9.3 kB
@typescript-eslint/typescript-estree@8.63.0 → @typescript-eslint/typescript-estree@8.64.0 3.3 kB
vite@8.1.4 → vite@8.1.5 2.3 kB
@vitejs/plugin-vue@6.0.7 → @vitejs/plugin-vue@6.0.8 1.9 kB
@tiptap/extension-list@3.27.4 → @tiptap/extension-list@3.28.0 -295 B
autoprefixer@10.5.2 → autoprefixer@10.5.3 295 B
@typescript-eslint/eslint-plugin@8.63.0 → @typescript-eslint/eslint-plugin@8.64.0 170 B
@fortawesome/fontawesome-common-types@7.3.0 → @fortawesome/fontawesome-common-types@7.3.1 103 B
@oxc-project/types@0.138.0 → @oxc-project/types@0.139.0 76 B
caniuse-lite@1.0.30001803 → caniuse-lite@1.0.30001806 59 B
@fortawesome/fontawesome-svg-core@7.3.0 → @fortawesome/fontawesome-svg-core@7.3.1 0 B
@fortawesome/free-regular-svg-icons@7.3.0 → @fortawesome/free-regular-svg-icons@7.3.1 0 B
@fortawesome/free-solid-svg-icons@7.3.0 → @fortawesome/free-solid-svg-icons@7.3.1 0 B
@tiptap/core@3.27.4 → @tiptap/core@3.28.0 0 B
@tiptap/extension-blockquote@3.27.4 → @tiptap/extension-blockquote@3.28.0 0 B
@tiptap/extension-code-block-lowlight@3.27.4 → @tiptap/extension-code-block-lowlight@3.28.0 0 B
@tiptap/extension-hard-break@3.27.4 → @tiptap/extension-hard-break@3.28.0 0 B
@tiptap/extension-image@3.27.4 → @tiptap/extension-image@3.28.0 0 B
@tiptap/extension-link@3.27.4 → @tiptap/extension-link@3.28.0 0 B
@tiptap/extension-mention@3.27.4 → @tiptap/extension-mention@3.28.0 0 B
@tiptap/extension-table@3.27.4 → @tiptap/extension-table@3.28.0 0 B
@tiptap/extension-typography@3.27.4 → @tiptap/extension-typography@3.28.0 0 B
@tiptap/extension-underline@3.27.4 → @tiptap/extension-underline@3.28.0 0 B
@tiptap/extensions@3.27.4 → @tiptap/extensions@3.28.0 0 B
@tiptap/pm@3.27.4 → @tiptap/pm@3.28.0 0 B
@tiptap/starter-kit@3.27.4 → @tiptap/starter-kit@3.28.0 0 B
@tiptap/suggestion@3.27.4 → @tiptap/suggestion@3.28.0 0 B
@tiptap/vue-3@3.27.4 → @tiptap/vue-3@3.28.0 0 B
@typescript-eslint/parser@8.63.0 → @typescript-eslint/parser@8.64.0 0 B
@typescript-eslint/scope-manager@8.63.0 → @typescript-eslint/scope-manager@8.64.0 0 B
@typescript-eslint/type-utils@8.63.0 → @typescript-eslint/type-utils@8.64.0 0 B
@typescript-eslint/utils@8.63.0 → @typescript-eslint/utils@8.64.0 0 B
@typescript-eslint/visitor-keys@8.63.0 → @typescript-eslint/visitor-keys@8.64.0 0 B
@typescript-eslint/project-service@8.63.0 → @typescript-eslint/project-service@8.64.0 0 B

Total size change: 165.4 kB

@github-actions

Copy link
Copy Markdown

Preview Deployment

Preview deployments for this PR are available at:

URL Tag Commit
https://pr-10.preview.vikunja.dev ghcr.io/docsales/vikunja:pr-10 latest
https://sha-6192b750a20494b108155c3551d0fdf09c3fcd24.preview.vikunja.dev ghcr.io/docsales/vikunja:sha-6192b750a20494b108155c3551d0fdf09c3fcd24 6192b75

The preview environment will start automatically on first visit. Subsequent pushes to this PR will update the pr-10 image — the preview picks up the new version on restart. The per-commit URLs point to a specific version and will not change.

Run locally with Docker
docker pull ghcr.io/docsales/vikunja:pr-10
docker run -p 3456:3456 ghcr.io/docsales/vikunja:pr-10

Last updated for commit 6192b75

@kigiela
kigiela merged commit 876e7ca into main Jul 19, 2026
50 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.

5 participants