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

63
frontend/node_modules/ts-jest/dist/cli/index.js generated vendored Normal file
View File

@@ -0,0 +1,63 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.processArgv = processArgv;
const bs_logger_1 = require("bs-logger");
const yargs_parser_1 = __importDefault(require("yargs-parser"));
const utils_1 = require("../utils");
const VALID_COMMANDS = ['help', 'config:migrate', 'config:init'];
const logger = utils_1.rootLogger.child({ [bs_logger_1.LogContexts.namespace]: 'cli', [bs_logger_1.LogContexts.application]: 'ts-jest' });
async function cli(args) {
const parsedArgv = (0, yargs_parser_1.default)(args, {
boolean: ['dry-run', 'jest-preset', 'allow-js', 'diff', 'babel', 'force', 'jsdom'],
string: ['tsconfig', 'js'],
count: ['verbose'],
alias: { verbose: ['v'] },
default: { jestPreset: true, verbose: 0 },
coerce: {
js(val) {
const res = val.trim().toLowerCase();
if (!['babel', 'ts'].includes(res))
throw new Error(`The 'js' option must be 'babel' or 'ts', given: '${val}'.`);
return res;
},
},
});
// deprecated
if (parsedArgv.allowJs != null) {
if (parsedArgv.js)
throw new Error("The 'allowJs' and 'js' options cannot be set together.");
parsedArgv.js = parsedArgv.allowJs ? 'ts' : undefined;
}
let command = parsedArgv._.shift();
const isHelp = command === 'help';
if (isHelp)
command = parsedArgv._.shift();
if (!VALID_COMMANDS.includes(command))
command = 'help';
const { run, help } = require(`./${command.replace(/:/g, '/')}`);
const cmd = isHelp && command !== 'help' ? help : run;
return cmd(parsedArgv, logger);
}
const errorHasMessage = (err) => {
if (typeof err !== 'object' || err === null)
return false;
return 'message' in err;
};
/**
* @internal
*/
async function processArgv() {
try {
await cli(process.argv.slice(2));
process.exit(0);
}
catch (err) {
if (errorHasMessage(err)) {
logger.fatal(err.message);
process.exit(1);
}
}
}