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,7 @@
type AccessorFn = (item: any) => any;
declare function accessor(
accessorParam: string | AccessorFn | any
): AccessorFn;
export { accessor as default };

21
frontend/node_modules/accessor-fn/dist/accessor-fn.js generated vendored Normal file
View File

@@ -0,0 +1,21 @@
// Version 1.5.3 accessor-fn - https://github.com/vasturiano/accessor-fn
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.accessorFn = factory());
})(this, (function () { 'use strict';
var index = (function (p) {
return typeof p === 'function' ? p // fn
: typeof p === 'string' ? function (obj) {
return obj[p];
} // property name
: function (obj) {
return p;
};
}); // constant
return index;
}));
//# sourceMappingURL=accessor-fn.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"accessor-fn.js","sources":["../src/index.js"],"sourcesContent":["export default p => typeof p === 'function'\n ? p // fn\n : typeof p === 'string'\n ? obj => obj[p] // property name\n : obj => p; // constant\n"],"names":["p","obj"],"mappings":";;;;;;;AAAA,gBAAA,CAAe,UAAAA,CAAC,EAAA;IAAA,EAAA,OAAI,OAAOA,CAAC,KAAK,UAAU,GACrCA,CAAC;IAAqB,IACtB,OAAOA,CAAC,KAAK,QAAQ,GACjB,UAAAC,GAAG,EAAA;QAAA,OAAIA,GAAG,CAACD,CAAC,CAAC;OAAK;IAAA,IAClB,UAAAC,GAAG,EAAA;IAAA,IAAA,OAAID,CAAC;IAAA,GAAA;IAAA,CAAA,EAAC;;;;;;;;"}

View File

@@ -0,0 +1,2 @@
// Version 1.5.3 accessor-fn - https://github.com/vasturiano/accessor-fn
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).accessorFn=n()}(this,(function(){"use strict";return function(e){return"function"==typeof e?e:"string"==typeof e?function(n){return n[e]}:function(n){return e}}}));

11
frontend/node_modules/accessor-fn/dist/accessor-fn.mjs generated vendored Normal file
View File

@@ -0,0 +1,11 @@
var index = (function (p) {
return typeof p === 'function' ? p // fn
: typeof p === 'string' ? function (obj) {
return obj[p];
} // property name
: function (obj) {
return p;
};
}); // constant
export { index as default };