Skip to content

feat(web): 3D board view — spatial kanban with camera controls - #1565

Open
neo37 wants to merge 7 commits into
usekaneo:mainfrom
neo37:feat/3d-board-view
Open

feat(web): 3D board view — spatial kanban with camera controls#1565
neo37 wants to merge 7 commits into
usekaneo:mainfrom
neo37:feat/3d-board-view

Conversation

@neo37

@neo37 neo37 commented Aug 11, 2026

Copy link
Copy Markdown

✨ 3D Board View

This PR adds a third way to look at a project board: a spatial 3D scene, sitting right next to the existing Board and List modes in the board toolbar.

🎥 Live demo (opens straight in 3D): https://neo37.github.io/kaneo/

What it looks like

Columns are laid out in perspective with a subtle arc — outer columns recede and turn toward the camera — so a wide board reads like a landscape you can fly over rather than a strip you scroll. The camera is fully in the user's hands:

Action Input
Pan drag
Rotate right-drag or Ctrl/Shift + drag
Zoom mouse wheel (clamped)
Reset Reset button

Cards are not decorations: every task card stays fully interactive and opens the regular task details sheet via the taskId search param, exactly like in 2D. Switching back and forth loses nothing, and the chosen view mode is persisted in user preferences like the existing modes.

Why CSS 3D and not WebGL

The whole scene is ordinary DOM under a perspective viewport: a preserve-3d "world" transformed by a tiny camera state (x, y, z, rx, ry) and columns positioned with translate3d/rotateY. That means:

  • zero new dependencies — no three.js, no canvas, ~250 lines total;
  • native text rendering, theme tokens and Tailwind classes keep working, so the 3D view automatically matches light/dark themes and the existing design language;
  • accessibility stays intact — cards are real <button> elements.

One subtle bug was found and fixed along the way: the full-screen world plane participates in 3D hit-testing and can swallow clicks meant for coplanar child cards. The plane is now pointer-events: none with pointer-events: auto restored on columns, so clicks always land where the user sees them.

Changes

  • apps/web/src/components/kanban-board-3d/ — the new view (+ tests)
  • apps/web/src/components/board/board-toolbar.tsx — Board / 3D / List switch
  • apps/web/src/store/user-preferences.tsviewMode union extended with "board3d"
  • board route — renders the 3D view for the new mode
  • README.md — a short section documenting the view

Testing

  • 11 unit tests (vitest + Testing Library): rendering, column layout math, camera pan/rotate/zoom with clamping, drag lifecycle, card-click isolation, task navigation, reset.
  • Verified end-to-end in a headless browser against a live instance: mode switch, camera controls, opening the task sheet from a 3D card, switching back to 2D.
  • biome check clean; the two test files failing on main (use-project-websocket, members-table) fail without this change as well.

The label on the toggle is a literal "3D" (language-neutral), so no i18n keys were added — happy to wire it through the i18n schema instead if you prefer, and generally happy to adjust anything about the layout or scope.

Summary by CodeRabbit

  • New Features
    • Added a 3D board view with curved columns and task cards.
    • Users can pan, rotate, zoom, reset the view, and navigate tasks.
    • Added 3D board selection in board controls and display preferences.
  • Localization
    • Added translated labels, usage guidance, and reset controls across supported languages.
  • Tests
    • Added coverage for 3D board rendering, navigation, camera controls, zooming, panning, rotation, and task interactions.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 9b9f1c60-933a-4cf2-8a36-35544a4704fc

📥 Commits

Reviewing files that changed from the base of the PR and between 351a971 and ce2b286.

📒 Files selected for processing (17)
  • i18n/de-DE.json
  • i18n/el-GR.json
  • i18n/en-US.json
  • i18n/es-ES.json
  • i18n/fr-FR.json
  • i18n/hi-IN.json
  • i18n/id-ID.json
  • i18n/it-IT.json
  • i18n/ko-KR.json
  • i18n/mk-MK.json
  • i18n/nl-NL.json
  • i18n/pt-BR.json
  • i18n/ru-RU.json
  • i18n/tr-TR.json
  • i18n/uk-UA.json
  • i18n/vi-VN.json
  • i18n/zh-CN.json
🚧 Files skipped from review as they are similar to previous changes (17)
  • i18n/pt-BR.json
  • i18n/vi-VN.json
  • i18n/en-US.json
  • i18n/ru-RU.json
  • i18n/tr-TR.json
  • i18n/uk-UA.json
  • i18n/id-ID.json
  • i18n/mk-MK.json
  • i18n/fr-FR.json
  • i18n/hi-IN.json
  • i18n/it-IT.json
  • i18n/ko-KR.json
  • i18n/zh-CN.json
  • i18n/es-ES.json
  • i18n/nl-NL.json
  • i18n/de-DE.json
  • i18n/el-GR.json

📝 Walkthrough

Walkthrough

The PR adds a 3D Kanban view. It updates view-mode state, toolbar and settings controls, board routing, interaction behavior, tests, and localization.

Changes

3D board view

Layer / File(s) Summary
View mode contract and selection
apps/web/src/store/*, apps/web/src/components/board/board-toolbar.tsx, apps/web/src/routes/.../preferences.tsx
The preference store, toolbar, preferences selector, and tests support the board3d mode.
3D board rendering and controls
apps/web/src/components/kanban-board-3d/*
KanbanBoard3D renders columns and tasks. It supports camera movement, bounded zoom, navigation, scrolling, drag handling, and reset behavior.
Board route integration
apps/web/src/routes/.../board.tsx
The board route displays the 3D title and renders KanbanBoard3D for the board3d mode.
3D board localization
i18n/schema.json, i18n/*
The schema and locale files add 3D board labels, interaction hints, reset text, and required Gitea toast messages.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant BoardToolbar
  participant PreferencesStore
  participant BoardRoute
  participant KanbanBoard3D
  participant Router
  User->>BoardToolbar: Selects the 3D view
  BoardToolbar->>PreferencesStore: Sets viewMode to board3d
  BoardRoute->>KanbanBoard3D: Passes sorted project data
  User->>KanbanBoard3D: Selects a task card
  KanbanBoard3D->>Router: Updates the taskId parameter
Loading

Possibly related PRs

  • usekaneo/kaneo#1447: Both PRs modify the board view flow and shared BoardToolbar and useUserPreferencesStore interfaces.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the new 3D board view and its camera controls.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@qodo-free-for-open-source-projects

Copy link
Copy Markdown

PR Summary by Qodo

Add CSS 3D Kanban board view with camera controls

✨ Enhancement 🧪 Tests 📝 Documentation 🕐 40+ Minutes

Grey Divider

AI Description

• Add a CSS-3D Kanban board view with pan/rotate/zoom and reset controls.
• Integrate "3D" view mode into toolbar, routing, and persisted user preferences.
• Add unit tests and README docs covering layout math and interactions.
Diagram

graph TD
  A["Board route (board.tsx)"] --> B["BoardToolbar"] --> C[("UserPreferencesStore / localStorage")]
  A --> D{"View mode"} --> E["KanbanBoard (2D)"]
  D --> F["KanbanBoard3D"] --> G["Router navigate (taskId search)"]
  D --> H["ListView"]
  subgraph Legend
    direction LR
    _cmp["Component"] ~~~ _dec{"Decision"} ~~~ _db[("Storage")]
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. WebGL/three.js scene (canvas-based)
  • ➕ Enables richer visuals (lighting, shadows, inertia) and advanced camera controls
  • ➕ Potentially smoother for very large boards if DOM becomes heavy
  • ➖ Adds a heavy dependency and non-trivial rendering complexity
  • ➖ Harder theming/text clarity; accessibility becomes more complex than real DOM buttons
2. Use a gesture/input abstraction (e.g., pointer/gesture hook)
  • ➕ Less bespoke event wiring; easier to test and maintain interaction state
  • ➕ Can standardize pan/rotate/zoom behavior across devices
  • ➖ Adds dependency or introduces a new internal abstraction
  • ➖ Current implementation is already small and readable for the limited control set

Recommendation: The PR’s CSS 3D approach is a strong fit for a Kanban UI: it preserves native text rendering, theming, and accessibility while keeping complexity and dependencies low. If interaction complexity grows (inertia, touch pinch-zoom, multi-select), consider introducing a small gesture abstraction, but staying DOM-based still seems optimal for this feature set.

Files changed (7) +548 / -6

Enhancement (4) +266 / -6
board-toolbar.tsxAdd Board / 3D / List view toggle option +15/-3

Add Board / 3D / List view toggle option

• Extends the toolbar viewMode types to include "board3d" and adds a new toggle button labeled "3D" with an icon. Keeps existing Board/List behavior unchanged while enabling switching into the new mode.

apps/web/src/components/board/board-toolbar.tsx

index.tsxImplement CSS 3D Kanban board with camera controls +245/-0

Implement CSS 3D Kanban board with camera controls

• Introduces a new DOM-based 3D board renderer using perspective + preserve-3d transforms and per-column 3D placement with a subtle arc. Implements camera pan/rotate/zoom (with clamping), a reset action, and pointer-events isolation so cards remain reliably clickable and navigate via taskId search param.

apps/web/src/components/kanban-board-3d/index.tsx

board.tsxRender 3D board view when viewMode is board3d +4/-1

Render 3D board view when viewMode is board3d

• Wires the new KanbanBoard3D component into the board route and updates the page title to reflect the 3D mode. Adds conditional rendering so board3d sits alongside existing board and list views.

apps/web/src/routes/_layout/_authenticated/dashboard/workspace/$workspaceId/project/$projectId/board.tsx

user-preferences.tsPersist new board3d viewMode in user preferences store +2/-2

Persist new board3d viewMode in user preferences store

• Extends the viewMode union type and setter to include "board3d" so the new view can be selected and persisted like existing modes.

apps/web/src/store/user-preferences.ts

Tests (2) +265 / -0
index.test.tsxAdd unit tests for 3D layout, camera interactions, and navigation +243/-0

Add unit tests for 3D layout, camera interactions, and navigation

• Adds Testing Library/Vitest coverage for rendering, column transform math, camera defaults, pan/rotate/zoom behavior (including clamping), drag lifecycle, click-vs-drag isolation, task navigation, and reset behavior.

apps/web/src/components/kanban-board-3d/index.test.tsx

user-preferences.test.tsTest viewMode switching supports board3d +22/-0

Test viewMode switching supports board3d

• Adds a small store-level unit test ensuring the preferences store accepts and persists switching between board, board3d, and list.

apps/web/src/store/user-preferences.test.ts

Documentation (1) +17 / -0
README.mdDocument the new 3D Board View and controls +17/-0

Document the new 3D Board View and controls

• Adds a README section describing the 3D board mode, its input controls, and the CSS-3D/no-dependency approach. Includes a link to a live demo.

README.md

@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Aug 11, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Action required

1. Wheel blocks column scroll ⊘ Outdated 🐞 Bug ≡ Correctness
Description
KanbanBoard3D cancels every wheel event at the viewport and uses it for zoom, which prevents
wheel/trackpad scrolling inside the per-column task list even though it’s rendered as
overflow-y-auto. In columns with more tasks than the visible max height, users can’t scroll down
to reach hidden cards.
Code

apps/web/src/components/kanban-board-3d/index.tsx[R103-106]

+    const onWheel = (event: WheelEvent) => {
+      event.preventDefault();
+      const camera = cameraRef.current;
+      camera.z += event.deltaY * 2;
Evidence
The viewport-level wheel handler always calls preventDefault, which cancels the default scroll
behavior for wheel events originating in the nested overflow-y-auto task list, so columns with
overflowing content can’t be scrolled with the wheel.

apps/web/src/components/kanban-board-3d/index.tsx[103-118]
apps/web/src/components/kanban-board-3d/index.tsx[171-221]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The 3D board attaches a non-passive `wheel` handler to the viewport and unconditionally calls `event.preventDefault()`, using the wheel to zoom. Because wheel events bubble, this blocks native scrolling inside the per-column task list (`overflow-y-auto`), making overflowing task lists unreachable.
## Issue Context
- `onWheel` is registered on the viewport with `{ passive: false }` and always prevents default.
- Each column task container is `overflow-y-auto`, implying wheel scrolling is intended/necessary when tasks overflow.
## Fix Focus Areas
- apps/web/src/components/kanban-board-3d/index.tsx[103-127]
- apps/web/src/components/kanban-board-3d/index.tsx[171-221]
## Expected changes
- Only zoom when the wheel event is not targeting a scrollable task list (or when a modifier key is held).
- Practical approach:
- Add a `data-board3d-scroll` attribute to the scrollable task list container.
- In `onWheel`, detect `const scroller = (event.target as Element).closest('[data-board3d-scroll]') as HTMLElement | null`.
- If `scroller` exists and can scroll in the wheel direction (e.g., `scroller.scrollHeight > scroller.clientHeight` and not at bounds), then return without calling `preventDefault()` so the browser scrolls the list.
- Otherwise, `preventDefault()` and perform camera zoom as today.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

2. Preferences lacks board3d ✓ Resolved 🐞 Bug ≡ Correctness
Description
The PR introduces a persisted viewMode value "board3d", but the Account Preferences “Default view”
Select only defines labels/options for "board" and "list", so a stored "board3d" cannot be
represented correctly and may display as blank or inconsistent. This is triggered as soon as a user
switches to 3D and then visits Preferences (or sets it as default).
Code

apps/web/src/store/user-preferences.ts[R18-19]

+  viewMode: "board" | "board3d" | "list";
+  setViewMode: (mode: "board" | "board3d" | "list") => void;
Evidence
The store now allows and persists viewMode: "board3d", but the preferences UI’s label map and
select items omit board3d, so viewLabels[viewMode] won’t have a real entry and the current value
won’t be present in the dropdown list.

apps/web/src/store/user-preferences.ts[18-81]
apps/web/src/routes/_layout/_authenticated/dashboard/settings/account/preferences.tsx[77-80]
apps/web/src/routes/_layout/_authenticated/dashboard/settings/account/preferences.tsx[237-255]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`viewMode` now supports `"board3d"`, but the Account Preferences “Default view” selector only supports `"board"` and `"list"`. When `viewMode` is persisted as `"board3d"`, the preferences selector cannot render a proper label/option for the current value.
## Issue Context
- `useUserPreferencesStore` persists `viewMode` in localStorage.
- The board toolbar can set `viewMode` to `"board3d"`.
- The preferences page maps `viewMode` to labels and renders `<SelectItem>` options; it currently omits `board3d`.
## Fix Focus Areas
- apps/web/src/routes/_layout/_authenticated/dashboard/settings/account/preferences.tsx[77-255]
- apps/web/src/store/user-preferences.ts[18-81]
## Expected changes
- Add a label for `board3d` (e.g., literal `"3D"` to match the toolbar, or a new i18n key).
- Add `<SelectItem value="board3d">…</SelectItem>` so the current value exists in the dropdown.
- (Optional hardening) Validate rehydrated `viewMode` similarly to `weekStartsOn` and reset to `"board"` if an unknown value is found.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Tip of the day
💡 Did you know, you can show, collapse, or hide each part of a finding: code, evidence, and all

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread apps/web/src/store/user-preferences.ts
Comment thread apps/web/src/components/kanban-board-3d/KanbanBoard3D.tsx

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
apps/web/src/components/kanban-board-3d/index.tsx (2)

1-1: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use a PascalCase component filename.

apps/web/src/components/kanban-board-3d/index.tsx defines KanbanBoard3D. Rename the component file to KanbanBoard3D.tsx. Update the route and test imports.

As per coding guidelines, apps/web/src/components/**/*.{ts,tsx} requires “Use PascalCase file names for frontend components.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/components/kanban-board-3d/index.tsx` at line 1, Rename the
component file defining KanbanBoard3D from index.tsx to KanbanBoard3D.tsx, then
update all route and test imports or references to use the new PascalCase path
without changing component behavior.

Source: Coding guidelines


34-34: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Declare the component return type.

KanbanBoard3D has typed props but an inferred return type. Add an explicit component return type.

As per coding guidelines, apps/web/src/components/**/*.{ts,tsx} requires “Always type props and component return types in React components.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/components/kanban-board-3d/index.tsx` at line 34, Update the
KanbanBoard3D component declaration to include an explicit React component
return type, while preserving its existing typed KanbanBoard3DProps parameter
and implementation.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/web/src/components/kanban-board-3d/index.tsx`:
- Around line 228-240: Update the 3D board component around the reset button and
gesture hint to use useTranslation instead of hardcoded “Reset” and instruction
text. Add the corresponding translation keys to the project’s existing locale
resources, then render both labels through the translation function while
preserving the current controls and layout.
- Around line 103-108: Update the kanban viewport’s onWheel handler to ignore
camera zoom when the event target is inside the task-list scroll container,
allowing its native scrolling. Remove touch-none from ancestors of that
container, and add coverage verifying wheel and touch scrolling for overflowing
task columns.

---

Nitpick comments:
In `@apps/web/src/components/kanban-board-3d/index.tsx`:
- Line 1: Rename the component file defining KanbanBoard3D from index.tsx to
KanbanBoard3D.tsx, then update all route and test imports or references to use
the new PascalCase path without changing component behavior.
- Line 34: Update the KanbanBoard3D component declaration to include an explicit
React component return type, while preserving its existing typed
KanbanBoard3DProps parameter and implementation.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 4fdb1c9c-d692-476e-bdfa-5281b0244054

📥 Commits

Reviewing files that changed from the base of the PR and between df53c68 and d0e8d05.

⛔ Files ignored due to path filters (1)
  • README.md is excluded by !**/*.md
📒 Files selected for processing (6)
  • apps/web/src/components/board/board-toolbar.tsx
  • apps/web/src/components/kanban-board-3d/index.test.tsx
  • apps/web/src/components/kanban-board-3d/index.tsx
  • apps/web/src/routes/_layout/_authenticated/dashboard/workspace/$workspaceId/project/$projectId/board.tsx
  • apps/web/src/store/user-preferences.test.ts
  • apps/web/src/store/user-preferences.ts

Comment thread apps/web/src/components/kanban-board-3d/KanbanBoard3D.tsx
Comment thread apps/web/src/components/kanban-board-3d/KanbanBoard3D.tsx

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@i18n/de-DE.json`:
- Line 481: Translate the new 3D control strings instead of leaving English
fallback values: update settings.preferencesPage.board3d and
tasks.board3d.hint/reset in i18n/de-DE.json at lines 481 and 1923-1925,
i18n/el-GR.json at lines 481 and 1923-1925, and i18n/es-ES.json at lines 378 and
1923-1925 with accurate German, Greek, and Spanish translations respectively.

In `@i18n/fr-FR.json`:
- Line 481: Localize the new 3D-board strings in all listed locale files:
translate settings.preferencesPage.board3d and tasks.editor.board3d.hint/reset
in i18n/fr-FR.json (481-481, 1924-1925), i18n/hi-IN.json (481-481, 1924-1925),
and i18n/id-ID.json (481-481, 1924-1925), replacing the English fallback values
with approved translations.

In `@i18n/it-IT.json`:
- Around line 480-481: Translate the new 3D-board localization values instead of
leaving English fallbacks: update settings.preferencesPage.board3d and the
camera hint/reset label in i18n/it-IT.json at lines 480-481 and 1922-1925 with
Italian text, and make the corresponding translations in i18n/ko-KR.json at
lines 480-481 and 1922-1925 with Korean text.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 006cc39b-2bc1-422a-abf3-f24e6b1c2f5e

📥 Commits

Reviewing files that changed from the base of the PR and between d0e8d05 and 34da8b8.

📒 Files selected for processing (23)
  • apps/web/src/components/board/board-toolbar.tsx
  • apps/web/src/components/kanban-board-3d/KanbanBoard3D.test.tsx
  • apps/web/src/components/kanban-board-3d/KanbanBoard3D.tsx
  • apps/web/src/routes/_layout/_authenticated/dashboard/settings/account/preferences.tsx
  • apps/web/src/routes/_layout/_authenticated/dashboard/workspace/$workspaceId/project/$projectId/board.tsx
  • i18n/de-DE.json
  • i18n/el-GR.json
  • i18n/en-US.json
  • i18n/es-ES.json
  • i18n/fr-FR.json
  • i18n/hi-IN.json
  • i18n/id-ID.json
  • i18n/it-IT.json
  • i18n/ko-KR.json
  • i18n/mk-MK.json
  • i18n/nl-NL.json
  • i18n/pt-BR.json
  • i18n/ru-RU.json
  • i18n/schema.json
  • i18n/tr-TR.json
  • i18n/uk-UA.json
  • i18n/vi-VN.json
  • i18n/zh-CN.json
🚧 Files skipped from review as they are similar to previous changes (2)
  • apps/web/src/components/board/board-toolbar.tsx
  • apps/web/src/routes/_layout/_authenticated/dashboard/workspace/$workspaceId/project/$projectId/board.tsx

Comment thread i18n/de-DE.json Outdated
Comment thread i18n/fr-FR.json Outdated
Comment thread i18n/it-IT.json Outdated
v.kiselev added 2 commits August 11, 2026 23:35
Add a third view mode to the project board: a spatial 3D scene rendered
with pure CSS 3D transforms (no WebGL, no new dependencies).

- Board / 3D / List switch in the board toolbar
- Columns laid out in perspective with a subtle arc toward the camera
- Camera: drag to pan, right/ctrl-drag to rotate (tilt clamped), wheel
  to zoom (clamped), Reset button restores the default view
- Task cards stay interactive: click opens the task details sheet via
  the taskId search param
- pointer-events isolation so the full-screen world plane never
  swallows clicks meant for cards under preserve-3d
- View mode persisted in user preferences
- Unit tests: rendering, column layout math, camera pan/rotate/zoom
  clamping, drag lifecycle, task navigation, reset
- Wheel over an overflowing task list scrolls the list; the camera only
  zooms once the list is at the edge of its scroll range. Drop touch-none
  from the viewport and mark task lists touch-pan-y so touch scrolling
  works too.
- Add the 3D option to the Default view select in account preferences.
- Localize the Reset button, camera hint, view labels (i18n keys
  tasks:view.board3d, tasks:board3d.*, settings:preferencesPage.board3d).
- Rename component file to PascalCase, add explicit return type.
- Tests for wheel-over-scrollable behavior (14 total).
@neo37
neo37 force-pushed the feat/3d-board-view branch from 34da8b8 to e2e7281 Compare August 11, 2026 20:39
v.kiselev and others added 3 commits August 11, 2026 23:47
The board3d settings label, camera hint and reset label were filled
with the English fallback; provide proper translations for every
supported locale.
@tinsever

Copy link
Copy Markdown
Member

I must admit it looks nice, but I am quite certainly unsure if that fits to Kaneo itself. lol.

@neo37

neo37 commented Aug 12, 2026

Copy link
Copy Markdown
Author

I must admit it looks nice, but I am quite certainly unsure if that fits to Kaneo itself. lol.

I understand you perfectly. Moreover, your rules say to discuss new features first, then implement them—which is generally considered good etiquette. However, to discuss anything, you need something to discuss—which is precisely what my pull request is.

Your project is a Kanban board on which agents work—and the more AI develops, the more we humans will need visualization tools to understand what's happening. 3D is a way to convey information more succinctly—there's really no need for it right now, but I sincerely believe that "this is the way."

I suggest hiding the 3D visualization button somewhere in the profile settings so that it's not available by default, but the user can enable it if they want (your expertise is needed here). I'll implement it. Thanks for the feedback. I await your reply. Vasily Kiselev.

@andrejsshell

Copy link
Copy Markdown
Member

Wow, this is one of the most creative ideas I've seen. I love it haha. I do agree with @tinsever regarding if it fits the product and I'd like to think about configuring if you wanna see this view. It's too cool to leave it unmerged, give me a few days to think about this!

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.

3 participants