mirror of
https://github.com/multica-ai/multica.git
synced 2026-07-14 13:49:18 +02:00
* feat(views): unify avatar upload with crop editing across web/desktop Add a shared AvatarUploadControl + AvatarCropDialog used by the user, workspace, agent, and squad avatar entry points. Cropping (pan/zoom, fixed 1:1) and compression run client-side on canvas; the existing /api/upload-file + avatar_url chain is reused unchanged (no backend/API/DB changes). This collapses four hand-rolled upload buttons into one control and removes AvatarPicker. Also make the shared display avatar treat all non-human actors (agent, squad, system) as rounded squares — completing the "circles are for humans" convention the editors already assumed, so display and editors agree. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai> * feat(views): rebuild avatar cropper to the "Edit avatar" reference form Replace the hand-rolled canvas cropper with react-easy-crop to match the requested design: full-bleed image with a dimmed overlay outside a bright crop window, a rotate control, a zoom slider flanked by −/+, and a Reset / Cancel / Save footer. Round window for people, rounded-square for non-human actors; output stays a 512px square (webp, jpeg fallback) through the same upload/avatar_url chain. avatar-crop.ts keeps the encode pipeline and gains rotation-aware getCroppedAvatarBlob; the interactive geometry now lives in react-easy-crop. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai> * fix(views): round square avatar crop frame --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
134 lines
4.8 KiB
JSON
134 lines
4.8 KiB
JSON
{
|
|
"name": "@multica/views",
|
|
"version": "0.0.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"typecheck": "tsc --noEmit",
|
|
"lint": "eslint .",
|
|
"test": "vitest run"
|
|
},
|
|
"exports": {
|
|
"./navigation": "./navigation/index.ts",
|
|
"./common/actor-avatar": "./common/actor-avatar.tsx",
|
|
"./common/markdown": "./common/markdown.tsx",
|
|
"./editor": "./editor/index.ts",
|
|
"./issues/components": "./issues/components/index.ts",
|
|
"./issues/hooks": "./issues/hooks/index.ts",
|
|
"./issues/utils/filter": "./issues/utils/filter.ts",
|
|
"./issues/utils/sort": "./issues/utils/sort.ts",
|
|
"./common/task-transcript": "./common/task-transcript/index.ts",
|
|
"./projects/components": "./projects/components/index.ts",
|
|
"./autopilots/components": "./autopilots/components/index.ts",
|
|
"./modals/registry": "./modals/registry.tsx",
|
|
"./modals/create-issue": "./modals/create-issue.tsx",
|
|
"./my-issues": "./my-issues/index.ts",
|
|
"./skills": "./skills/index.ts",
|
|
"./agents": "./agents/index.ts",
|
|
"./members": "./members/index.ts",
|
|
"./inbox": "./inbox/index.ts",
|
|
"./runtimes": "./runtimes/index.ts",
|
|
"./billing": "./billing/index.ts",
|
|
"./dashboard": "./dashboard/index.ts",
|
|
"./squads": "./squads/index.ts",
|
|
"./squads/components": "./squads/components/index.ts",
|
|
"./workspace/workspace-avatar": "./workspace/workspace-avatar.tsx",
|
|
"./workspace/create-workspace-form": "./workspace/create-workspace-form.tsx",
|
|
"./workspace/no-access-page": "./workspace/no-access-page.tsx",
|
|
"./workspace/new-workspace-page": "./workspace/new-workspace-page.tsx",
|
|
"./workspace/welcome-after-onboarding": "./workspace/welcome-after-onboarding.tsx",
|
|
"./workspace/use-workspace-seen": "./workspace/use-workspace-seen.ts",
|
|
"./layout": "./layout/index.ts",
|
|
"./auth": "./auth/index.ts",
|
|
"./search": "./search/index.ts",
|
|
"./chat": "./chat/index.ts",
|
|
"./settings": "./settings/index.ts",
|
|
"./settings/lark-tab": "./settings/components/lark-tab.tsx",
|
|
"./lark": "./lark/index.ts",
|
|
"./slack": "./slack/index.ts",
|
|
"./invite": "./invite/index.ts",
|
|
"./invitations": "./invitations/index.ts",
|
|
"./onboarding": "./onboarding/index.ts",
|
|
"./platform": "./platform/index.ts",
|
|
"./i18n": "./i18n/index.ts",
|
|
"./attachments": "./attachments/index.ts",
|
|
"./locales": "./locales/index.ts",
|
|
"./locales/*": "./locales/*"
|
|
},
|
|
"dependencies": {
|
|
"@base-ui/react": "^1.3.0",
|
|
"@dnd-kit/core": "^6.3.1",
|
|
"@dnd-kit/sortable": "^10.0.0",
|
|
"@dnd-kit/utilities": "^3.2.2",
|
|
"@floating-ui/dom": "^1.7.6",
|
|
"@multica/core": "workspace:*",
|
|
"@multica/ui": "workspace:*",
|
|
"@tanstack/react-virtual": "catalog:",
|
|
"@tiptap/core": "3.27.1",
|
|
"@tiptap/extension-code-block-lowlight": "3.27.1",
|
|
"@tiptap/extension-document": "3.27.1",
|
|
"@tiptap/extension-highlight": "3.27.1",
|
|
"@tiptap/extension-image": "3.27.1",
|
|
"@tiptap/extension-link": "3.27.1",
|
|
"@tiptap/extension-list": "3.27.1",
|
|
"@tiptap/extension-mention": "3.27.1",
|
|
"@tiptap/extension-paragraph": "3.27.1",
|
|
"@tiptap/extension-placeholder": "3.27.1",
|
|
"@tiptap/extension-table": "3.27.1",
|
|
"@tiptap/extension-table-cell": "3.27.1",
|
|
"@tiptap/extension-table-header": "3.27.1",
|
|
"@tiptap/extension-table-row": "3.27.1",
|
|
"@tiptap/extension-text": "3.27.1",
|
|
"@tiptap/extension-typography": "3.27.1",
|
|
"@tiptap/markdown": "3.27.1",
|
|
"@tiptap/pm": "3.27.1",
|
|
"@tiptap/react": "3.27.1",
|
|
"@tiptap/starter-kit": "3.27.1",
|
|
"@tiptap/suggestion": "3.27.1",
|
|
"cmdk": "^1.1.1",
|
|
"hast-util-to-html": "^9.0.5",
|
|
"katex": "catalog:",
|
|
"lowlight": "^3.3.0",
|
|
"mermaid": "catalog:",
|
|
"motion": "^12.38.0",
|
|
"pinyin-pro": "3.26.0",
|
|
"react-easy-crop": "^6.2.0",
|
|
"react-markdown": "^10.1.0",
|
|
"react-qr-code": "catalog:",
|
|
"react-resizable-panels": "^4.7.5",
|
|
"react-virtuoso": "catalog:",
|
|
"recharts": "3.8.0",
|
|
"rehype-katex": "catalog:",
|
|
"rehype-raw": "^7.0.0",
|
|
"rehype-sanitize": "^6.0.0",
|
|
"remark-breaks": "^4.0.0",
|
|
"remark-gfm": "^4.0.1",
|
|
"remark-math": "catalog:",
|
|
"sonner": "^2.0.7"
|
|
},
|
|
"peerDependencies": {
|
|
"@tanstack/react-query": "catalog:",
|
|
"@tanstack/react-table": "catalog:",
|
|
"i18next": "catalog:",
|
|
"lucide-react": "catalog:",
|
|
"react": "catalog:",
|
|
"react-dom": "catalog:",
|
|
"react-i18next": "catalog:",
|
|
"zustand": "catalog:"
|
|
},
|
|
"devDependencies": {
|
|
"@multica/eslint-config": "workspace:*",
|
|
"@multica/tsconfig": "workspace:*",
|
|
"@testing-library/jest-dom": "catalog:",
|
|
"@testing-library/react": "catalog:",
|
|
"@testing-library/user-event": "catalog:",
|
|
"@types/react": "catalog:",
|
|
"@types/react-dom": "catalog:",
|
|
"@vitejs/plugin-react": "catalog:",
|
|
"eslint-plugin-i18next": "catalog:",
|
|
"jsdom": "catalog:",
|
|
"typescript": "catalog:",
|
|
"vitest": "catalog:"
|
|
}
|
|
}
|