Commit Graph
2938 Commits
Author SHA1 Message Date
kolaenteandkolaente 37c35c64fb fix(a11y): make the editor toolbar a single tab stop with roving focus
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 15:36:05 +00:00
kolaenteandkolaente ad6884fb72 fix(a11y): announce comment and attachment counts on task cards and rows
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
2026-07-19 15:36:05 +00:00
kolaenteandkolaente 2a823836ee fix(a11y): label the bucket selector with its purpose and current bucket
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
2026-07-19 15:36:05 +00:00
kolaenteandkolaente eb164f8ce9 fix(a11y): keep the auth hero heading readable with a gradient scrim
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
2026-07-19 15:36:05 +00:00
kolaenteandkolaente 5495043861 feat(editor): prompt for alt text when inserting an image
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
2026-07-19 15:36:05 +00:00
kolaenteandkolaente 878d389587 fix(a11y): un-nest the attachment rows
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
2026-07-19 15:36:05 +00:00
kolaenteandkolaente d3d69c76ce fix(a11y): render the kanban bucket footer as a list item
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 #3234.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 13:43:18 +00:00
TinkandGitHub 60a09f2088 fix(a11y): contrast tokens, empty-title feedback, structure and landmarks (#3234) 2026-07-19 15:15:10 +02:00
TinkandGitHub b5f34ff7da fix(labels): explain why link-share users can't create labels (#3233) 2026-07-19 14:45:37 +02:00
TinkandGitHub 5c2bb6bd2d fix(quick-add): don't abort task creation when a label can't be created (#3232) 2026-07-19 14:45:24 +02:00
kolaenteandkolaente 4ccf5ac4ae fix(a11y): expose expanded, sort, result-count and toggle states to assistive 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
2026-07-19 11:36:25 +00:00
TinkandGitHub 7afbf86467 fix(a11y): login tab order, announced errors, combobox pattern, named dialogs and selects (#3228) 2026-07-19 12:39:47 +02:00
renovate[bot]andkolaente f462187544 chore(deps): update dev-dependencies 2026-07-19 09:06:25 +00:00
renovate[bot]andkolaente 7826aa4bba fix(deps): update tiptap to v3.28.0 2026-07-19 09:00:23 +00:00
renovate[bot]andkolaente 3d501969a4 fix(deps): update font awesome to v7.3.1 2026-07-19 09:00:16 +00:00
renovate[bot]andkolaente e10b1fcbb8 fix(deps): update dependency pinia to v4 2026-07-18 16:55:47 +00:00
kolaenteandkolaente fd2815cf73 fix(a11y): add accessible names to all icon-only buttons
Adds translated aria-labels to the 42 icon-only BaseButton/XButton
usages the new lint rule found — attachment actions, assignee/label
remove buttons, multiselect clear buttons, table sort triggers, the
TipTap bubble menu (which only had v-tooltip, which sets no accessible
name), datepicker toggles, and more. Labels reuse the existing tooltip
translation keys where present and interpolate item names where
available (e.g. "Remove {user} as assignee").

With zero remaining violations the rule is raised from warn to error.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-18 14:05:36 +00:00
kolaenteandkolaente 1d17e4cacc chore(a11y): add lint rule flagging icon-only buttons without accessible name
BaseButton renders a bare button and does not enforce a name, so icon-only
usages without aria-label are announced as just "button" — the a11y audit
found this pattern regenerating across the codebase (42 current instances,
including the TipTap bubble menu where v-tooltip provides no accessible
name). The new vikunja/icon-button-accessible-name rule flags icon-only
BaseButton/XButton usages that have no aria-label, aria-labelledby, title,
visible text, or sr-only text; unknown child components are assumed to
render text to avoid false positives.

Set to 'warn' until the existing instances get aria-labels, then raise to
'error'.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-18 14:05:36 +00:00
kolaenteandkolaente f405fc5a78 test: cover getErrorText interpolation of i18n_params
Address pr-swarm finding: design (the fixed line itself was untested).
2026-07-18 13:41:15 +00:00
kolaenteandkolaente f388015dda fix: interpolate dynamic values into translated error toasts
Parametrised error translations (invalid api token permission, invalid
timezone, invalid claim data) rendered their placeholders as empty text
because the backend only baked the values into the English message and
the frontend translated the error code without any interpolation params.

Carry the values as i18n_params on error responses, keyed by the
placeholder names of the frontend's error translations, on both v1 and
the v2 problem+json body, and pass them through when translating the
toast. A 14002 toast now reads e.g. "The permission time_entries of
group tasks is invalid." instead of "The permission of group is
invalid."
2026-07-18 13:41:15 +00:00
kolaenteandkolaente 0c3b63c6ee fix(a11y): move focus to main content when the skip link is activated
the target main element was not programmatically focusable, so activation only set the URL hash and screen readers never announced the jump
2026-07-18 12:24:20 +00:00
kolaenteandkolaente 54829da649 fix(a11y): show a keyboard-only focus ring on text inputs and editable titles
The .input:focus reset left text fields and the contenteditable task
title without any focus indication. Because :focus-visible matches mouse
clicks on text fields, keyboard modality is tracked via a user-is-tabbing
class on the root element instead.
2026-07-18 12:24:20 +00:00
kolaenteandkolaente e824657fcd fix(a11y): make kanban cards reachable and openable by keyboard 2026-07-18 12:24:20 +00:00
kolaenteandkolaente f428ab9e00 fix(a11y): fix light theme contrast of success and danger text 2026-07-18 12:24:20 +00:00
kolaenteandkolaente c12757127f fix(a11y): pick label text color by actual WCAG contrast ratio 2026-07-18 12:24:20 +00:00
kolaenteandkolaente 14f2a2947e fix(a11y): make task title keyboard editable 2026-07-18 12:24:20 +00:00
kolaenteandkolaente 84593438eb fix(a11y): show a visible focus ring on checkboxes and other focusable controls 2026-07-18 12:24:20 +00:00
kolaenteandkolaente 8a7e388229 fix(a11y): make list view task links keyboard focusable and openable with Enter
The task link had tabindex="-1" and the document-level list navigation
handler prevented default on every Enter press, so keyboard users could
not open a task from the list view at all.
2026-07-18 12:24:20 +00:00
TinkandGitHub 45fada10d6 feat(editor): allow setting image alt text (#3206) 2026-07-18 14:39:51 +02:00
kolaenteandkolaente ab8486c258 fix(frontend): zero seconds on api token custom expiry date
On touch devices flatpickr swaps in a native datetime-local input and
writes the pre-filled date including wall-clock seconds as its default
value. With no step attribute and a date-only (thus ignored) min, those
seconds become the step base, so every value picked through the native
UI (always :00 seconds) fails validation as a stepMismatch and the
browser blocks the form submit.

Zeroing seconds on the initial date puts the step base on the :00 grid
where native picker values land.

Fixes go-vikunja/vikunja#3175
2026-07-18 09:44:53 +00:00
renovate[bot]andTink cd6331122d fix(deps): update dependency vue to v3.5.40 2026-07-18 09:30:55 +00:00
renovate[bot]andTink c8e598a1f7 fix(deps): update dependency nanoid to v6 2026-07-18 09:05:47 +00:00
renovate[bot]andTink b7ceb0e2a8 fix(deps): update dependency marked to v18.0.6 2026-07-18 07:20:51 +00:00
renovate[bot]andTink 17f4f1b12c fix(deps): update dependency @fortawesome/vue-fontawesome to v3.3.2 2026-07-18 07:20:47 +00:00
renovate[bot]andTink 5a4dae6df2 fix(deps): update tiptap to v3.27.4 2026-07-18 04:44:35 +00:00
renovate[bot]andTink 3023b536b3 chore(deps): update pnpm to v11.13.1 2026-07-17 22:59:05 +00:00
renovate[bot]andTink ebcc9aad9b fix(deps): update dependency vue-router to v5.2.0 2026-07-17 22:40:37 +00:00
renovate[bot]andTink 384c536cb5 fix(deps): update dependency @sentry/vue to v10.66.0 2026-07-17 22:24:32 +00:00
renovate[bot]andkolaente 314a3fc94e chore(deps): update pnpm to v11.11.0 2026-07-17 10:53:28 +00:00
renovate[bot]andkolaente 143611c227 chore(deps): update dependency postcss to v8.5.19 2026-07-17 10:53:16 +00:00
renovate[bot]andkolaente fc6119a109 fix(deps): update dependency @floating-ui/dom to v1.8.0 2026-07-15 15:53:01 +00:00
renovate[bot]andkolaente 5d6e429899 fix(deps): update dependency @sentry/vue to v10.65.0 2026-07-15 15:51:46 +00:00
renovate[bot]andkolaente 524b9289ba fix(deps): update dependency dompurify to v3.4.12 2026-07-15 11:13:06 +00:00
renovate[bot]andkolaente 294f90093c chore(deps): update dependency postcss to v8.5.17 2026-07-15 10:24:19 +00:00
renovate[bot]andkolaente f013314050 chore(deps): update dev-dependencies 2026-07-15 09:18:23 +00:00
renovate[bot]andkolaente da9f239d95 chore(deps): update dependency vite to v8.1.4 2026-07-13 07:48:46 +00:00
renovate[bot]andkolaente b5a7f68502 fix(deps): update dependency @fortawesome/vue-fontawesome to v3.3.1 2026-07-13 07:48:32 +00:00
TinkandGitHub 4425e0d146 fix(attachments): keep blob mime type so pdf previews open inline (#3157) 2026-07-11 18:53:09 +02:00
renovate[bot]andkolaente 8b4cda2203 chore(deps): update dev-dependencies 2026-07-11 12:21:26 +00:00
renovate[bot]andkolaente b6f6ac354a fix(deps): update dependency @sentry/vue to v10.64.0 2026-07-10 19:13:00 +00:00