Add side panels, task selection, graph animation, and project docs

- Foldable left panel (user profile) and right panel (task details)
- Clicking a task in the list or graph node selects it and shows details
- Both views (task list + graph) always mounted via absolute inset-0 for
  correct canvas dimensions; tabs toggle visibility with opacity
- Graph node selection animation: other nodes repel outward (charge -600),
  then selected node smoothly slides to center (500ms cubic ease-out),
  then charge restores to -120 and graph stabilizes
- Graph re-fits on tab switch and panel resize via ResizeObserver
- Fix UUID string IDs throughout (backend returns UUIDs, not integers)
- Add TaskDetailPanel, UserPanel components
- Add CLAUDE.md project documentation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Alvis
2026-04-08 11:23:06 +00:00
parent 5c7edd4bbc
commit f1d51b8cc8
23998 changed files with 3242708 additions and 0 deletions

View File

@@ -0,0 +1,27 @@
// Synchronous mock for next/dynamic — resolves modules immediately in test env
function dynamic(importFn, _options) {
let Component = null;
// Call the import function to get the promise, then extract synchronously
// In tests modules are already loaded, so we can do a trick:
// Return a wrapper that calls the import lazily on first render
const Wrapper = (props) => {
if (!Component) {
throw new Error(
'next/dynamic mock: module not yet resolved. Use jest.mock for the specific module instead.',
);
}
const React = require('react');
return React.createElement(Component, props);
};
// Resolve immediately (modules are synchronous in jest)
importFn().then((mod) => {
Component = mod.default || mod;
});
return Wrapper;
}
module.exports = dynamic;
module.exports.default = dynamic;

View File

@@ -0,0 +1,12 @@
module.exports = {
useRouter: () => ({
push: jest.fn(),
replace: jest.fn(),
prefetch: jest.fn(),
back: jest.fn(),
pathname: '/',
query: {},
}),
usePathname: () => '/',
useSearchParams: () => new URLSearchParams(),
};

View File

@@ -0,0 +1,9 @@
const React = require('react');
// Stub for react-force-graph-2d — canvas APIs not available in jsdom
function ForceGraph2D(props) {
return React.createElement('div', { 'data-testid': 'force-graph-2d' }, 'ForceGraph2D stub');
}
module.exports = ForceGraph2D;
module.exports.default = ForceGraph2D;

View File

@@ -0,0 +1 @@
module.exports = {};