@allbluecn/web-app 0.9.4 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (684) hide show
  1. package/package.json +12 -10
  2. package/public/favicon.ico +0 -0
  3. package/src/__tests__/paraglide.test.ts +43 -0
  4. package/src/__tests__/setup.ts +27 -9
  5. package/src/assets/illustrations/empty-states/workspace-empty.svg +5 -0
  6. package/src/assets/illustrations/knowledge/law-card-illustration.svg +5 -0
  7. package/src/assets/logo/logo.tsx +53 -36
  8. package/src/components/agents/agent-card.tsx +7 -7
  9. package/src/components/agents/agent-form-dialog.tsx +41 -42
  10. package/src/components/agents/agent-selector.tsx +6 -8
  11. package/src/components/agents/agents-page.tsx +26 -28
  12. package/src/components/agents/skill-card.tsx +1 -4
  13. package/src/components/agents/skill-form-dialog.tsx +19 -21
  14. package/src/components/agents/slash-skill-menu.tsx +5 -7
  15. package/src/components/agents/use-agent-handlers.ts +5 -8
  16. package/src/components/ai/ai-chat-prompt.tsx +26 -33
  17. package/src/components/ai/global-chat-panel.tsx +10 -11
  18. package/src/components/ai/use-knowledge-bases.ts +2 -2
  19. package/src/components/anyhub/anyhub-app-card.tsx +13 -15
  20. package/src/components/anyhub/anyhub-app-runner.tsx +5 -7
  21. package/src/components/anyhub/anyhub-install-dialog.tsx +16 -18
  22. package/src/components/anyhub/anyhub-management-view.tsx +9 -11
  23. package/src/components/anyhub/anyhub-marketplace-view.tsx +14 -17
  24. package/src/components/anyhub/anyhub-permission-panel.tsx +8 -11
  25. package/src/components/anyhub/anyhub-provider.tsx +0 -1
  26. package/src/components/anyhub/anyhub-top-nav.tsx +5 -8
  27. package/src/components/auth/auth-header.tsx +2 -2
  28. package/src/components/auth/icon-input.tsx +0 -1
  29. package/src/components/auth/oauth-section.tsx +3 -5
  30. package/src/components/auth/password-input.tsx +2 -4
  31. package/src/components/auth/session-guard.tsx +0 -1
  32. package/src/components/auth/sso-section.tsx +3 -4
  33. package/src/components/billing/__tests__/seats-manager.test.tsx +5 -9
  34. package/src/components/billing/billing-panel.tsx +5 -6
  35. package/src/components/billing/checkout-redirect.ts +6 -10
  36. package/src/components/billing/feature-gate.tsx +2 -3
  37. package/src/components/billing/invoice-history.tsx +9 -11
  38. package/src/components/billing/login-prompt-dialog.tsx +10 -11
  39. package/src/components/billing/pricing-card.tsx +6 -7
  40. package/src/components/billing/pricing-page.tsx +4 -5
  41. package/src/components/billing/seats-manager.tsx +19 -20
  42. package/src/components/billing/subscription-card.tsx +13 -14
  43. package/src/components/billing/upgrade-prompt.tsx +11 -13
  44. package/src/components/changelog/changelog-page.tsx +36 -26
  45. package/src/components/chat/ai-chat-history/components/conversation-header.tsx +4 -5
  46. package/src/components/chat/ai-chat-history/components/conversation-item.tsx +15 -17
  47. package/src/components/chat/ai-chat-history/components/conversation-search.tsx +3 -4
  48. package/src/components/chat/ai-chat-history/components/empty-state.tsx +5 -6
  49. package/src/components/chat/ai-chat-history/index.tsx +11 -15
  50. package/src/components/chat/ai-chat-history/utils/group-conversations.ts +9 -2
  51. package/src/components/chat/ai-citations/components/citation-item.tsx +3 -5
  52. package/src/components/chat/ai-citations/components/citations-list.tsx +4 -6
  53. package/src/components/chat/ai-citations/components/inline-citation.tsx +2 -4
  54. package/src/components/chat/ai-citations/components/source-components.tsx +6 -10
  55. package/src/components/chat/ai-citations/index.tsx +3 -4
  56. package/src/components/chat/ai-citations/utils.ts +15 -3
  57. package/src/components/chat/ai-conversation.tsx +10 -12
  58. package/src/components/chat/ai-message/components/message-actions.tsx +7 -9
  59. package/src/components/chat/ai-message/components/streaming-indicator.tsx +3 -4
  60. package/src/components/chat/ai-message/index.tsx +5 -5
  61. package/src/components/chat/ai-message/utils/dom-utils.ts +1 -1
  62. package/src/components/chat/ai-prompt-input/components/action-buttons.tsx +14 -16
  63. package/src/components/chat/ai-prompt-input/components/agent-mode-select.tsx +10 -5
  64. package/src/components/chat/ai-prompt-input/components/context-badge.tsx +2 -3
  65. package/src/components/chat/ai-prompt-input/components/kb-context-selector.tsx +6 -8
  66. package/src/components/chat/ai-prompt-input/components/model-select.tsx +14 -7
  67. package/src/components/chat/ai-prompt-input/components/page-user-context-selector.tsx +6 -8
  68. package/src/components/chat/ai-prompt-input/index.tsx +18 -11
  69. package/src/components/chat/ai-prompt-input/types.ts +6 -5
  70. package/src/components/chat/ai-thinking.tsx +6 -9
  71. package/src/components/chat/chat-thread-page.tsx +4 -5
  72. package/src/components/chat/interrupt-approval.tsx +6 -8
  73. package/src/components/command/command-palette.tsx +7 -10
  74. package/src/components/design/project-card.tsx +2 -3
  75. package/src/components/design/sketch/code-preview.tsx +3 -4
  76. package/src/components/design/sketch/export-panel.tsx +3 -4
  77. package/src/components/design/sketch/property-panel.tsx +16 -17
  78. package/src/components/error/global-error-boundary.tsx +65 -0
  79. package/src/components/forms/app-array-field.tsx +3 -4
  80. package/src/components/forms/app-combobox.tsx +2 -3
  81. package/src/components/forms/app-date-picker.tsx +2 -3
  82. package/src/components/forms/app-form-dialog.tsx +3 -4
  83. package/src/components/forms/app-select.tsx +2 -3
  84. package/src/components/forms/hooks/use-form-submit.ts +2 -2
  85. package/src/components/forms/schemas/common.ts +4 -6
  86. package/src/components/hotkeys/shortcuts-panel.tsx +2 -3
  87. package/src/components/iteration/auto-schedule-dialog.tsx +12 -13
  88. package/src/components/iteration/burndown-chart.tsx +6 -8
  89. package/src/components/iteration/constants.ts +5 -4
  90. package/src/components/iteration/create-iteration-dialog.tsx +14 -15
  91. package/src/components/iteration/iteration-card.tsx +3 -4
  92. package/src/components/iteration/iteration-editor.tsx +7 -8
  93. package/src/components/iteration/iteration-progress-bar.tsx +3 -5
  94. package/src/components/iteration/iteration-status-badge.tsx +1 -3
  95. package/src/components/kibo-ui/contribution-graph/index.tsx +37 -9
  96. package/src/components/knowledge/dialog/knowledge-form-dialog.tsx +8 -9
  97. package/src/components/knowledge/doc-properties.tsx +12 -13
  98. package/src/components/knowledge/editor/doc-header.tsx +7 -8
  99. package/src/components/knowledge/editor/knowledge-doc-editor.tsx +9 -9
  100. package/src/components/knowledge/knowledge-homepage.tsx +6 -7
  101. package/src/components/knowledge/knowledge-tag-input.tsx +3 -4
  102. package/src/components/knowledge/knowledge-toolbar.tsx +38 -40
  103. package/src/components/knowledge/knowledge-tree-item.tsx +21 -22
  104. package/src/components/knowledge/knowledge-tree.tsx +15 -16
  105. package/src/components/knowledge-public/bookmark-card.tsx +13 -14
  106. package/src/components/knowledge-public/bookmark-form-dialog.tsx +25 -26
  107. package/src/components/knowledge-public/knowledge-card-grid.tsx +3 -3
  108. package/src/components/knowledge-public/knowledge-filters.tsx +9 -10
  109. package/src/components/knowledge-public/knowledge-form-dialog.tsx +62 -63
  110. package/src/components/knowledge-public/knowledge-search-bar.tsx +3 -4
  111. package/src/components/knowledge-public/legal-compliance-editor.tsx +30 -31
  112. package/src/components/knowledge-public/markdown-editor.tsx +3 -4
  113. package/src/components/knowledge-public/markdown-view.tsx +2 -3
  114. package/src/components/knowledge-public/sharers-avatar-group.tsx +3 -4
  115. package/src/components/knowledge-public/tag-filter.tsx +3 -4
  116. package/src/components/layout/sidebar-03/__tests__/nav-workspace.test.tsx +42 -79
  117. package/src/components/layout/sidebar-03/__tests__/user-menu-anonymous.test.tsx +51 -0
  118. package/src/components/layout/sidebar-03/app-sidebar.tsx +3 -4
  119. package/src/components/layout/sidebar-03/index.tsx +0 -1
  120. package/src/components/layout/sidebar-03/nav-anyhub.tsx +4 -5
  121. package/src/components/layout/sidebar-03/nav-knowledge.tsx +80 -37
  122. package/src/components/layout/sidebar-03/nav-main.tsx +10 -12
  123. package/src/components/layout/sidebar-03/nav-notifications.tsx +19 -28
  124. package/src/components/layout/sidebar-03/nav-search-trigger.tsx +3 -5
  125. package/src/components/layout/sidebar-03/nav-workspace.tsx +32 -12
  126. package/src/components/layout/sidebar-03/team-switcher.tsx +0 -1
  127. package/src/components/layout/sidebar-03/user-menu.tsx +33 -13
  128. package/src/components/magicui/components/animate/avatar-group.tsx +0 -1
  129. package/src/components/magicui/primitives/animate/avatar-group.tsx +0 -1
  130. package/src/components/magicui/primitives/animate/slot.tsx +0 -1
  131. package/src/components/magicui/primitives/animate/tooltip.tsx +0 -1
  132. package/src/components/magicui/sparkles-text.tsx +0 -1
  133. package/src/components/mindmap/mindmap-doc-editor.tsx +15 -15
  134. package/src/components/notifications/settings-notifications.tsx +22 -23
  135. package/src/components/notifications/team-notifications.tsx +27 -29
  136. package/src/components/plugin-slots/__tests__/plugin-settings-tabs.test.tsx +4 -4
  137. package/src/components/plugin-slots/plugin-settings-tabs.tsx +15 -11
  138. package/src/components/project/create-project-dialog.tsx +60 -34
  139. package/src/components/project/invite-member-dialog.tsx +20 -21
  140. package/src/components/project/project-activity-list.tsx +19 -24
  141. package/src/components/project/project-member-manager.tsx +27 -28
  142. package/src/components/project/project-module-card.tsx +5 -6
  143. package/src/components/project/schemas/create-project.ts +3 -5
  144. package/src/components/prototype/component/GenericPrototype.tsx +0 -1
  145. package/src/components/prototype/component-preview.tsx +0 -1
  146. package/src/components/settings/ai/api-key-field.tsx +8 -10
  147. package/src/components/settings/ai/create-custom-model-dialog.tsx +28 -21
  148. package/src/components/settings/ai/create-custom-provider-dialog.tsx +15 -16
  149. package/src/components/settings/ai/model-card.tsx +25 -10
  150. package/src/components/settings/ai/model-manager.tsx +24 -16
  151. package/src/components/settings/ai/provider-card.tsx +9 -11
  152. package/src/components/settings/ai/provider-detail-form.tsx +24 -26
  153. package/src/components/settings/ai/provider-grid.tsx +23 -13
  154. package/src/components/settings/language-selector.tsx +13 -15
  155. package/src/components/settings/personal-team/account/account-client.tsx +14 -16
  156. package/src/components/settings/personal-team/account/avatar/notion-avatar-editor.tsx +36 -28
  157. package/src/components/settings/personal-team/account/settings-profile.tsx +39 -40
  158. package/src/components/settings/personal-team/team/team-client.tsx +45 -50
  159. package/src/components/settings/personal-team/team/team-invitations.tsx +89 -95
  160. package/src/components/settings/personal-team/team/team-member-list.tsx +50 -47
  161. package/src/components/shadcn-space/blocks/pricing-01/pricing.tsx +170 -172
  162. package/src/components/shared-kit/data-viz/contribution-graph-tooltip.tsx +128 -15
  163. package/src/components/shared-kit/dialogs/name-confirm-dialog.tsx +16 -16
  164. package/src/components/shared-kit/i18n/language-switcher.tsx +6 -9
  165. package/src/components/shared-kit/i18n/translator-text.tsx +2 -4
  166. package/src/components/shared-kit/icons/lucide-icon-picker/panel.tsx +7 -8
  167. package/src/components/shared-kit/logos/logo-icon.tsx +64 -0
  168. package/src/components/shared-kit/navigation/nav-float-button.tsx +3 -5
  169. package/src/components/shared-kit/pages/placeholder-page.tsx +2 -4
  170. package/src/components/shared-kit/theme/animated-theme-toggler.tsx +0 -1
  171. package/src/components/shared-kit/theme/theme-toggle.tsx +0 -1
  172. package/src/components/shared-kit/timezone/timezone-select.tsx +6 -7
  173. package/src/components/story/__tests__/constants.test.ts +7 -7
  174. package/src/components/story/__tests__/dependency-type-badge.test.ts +5 -5
  175. package/src/components/story/ai/action-registry.ts +12 -11
  176. package/src/components/story/ai/handlers/more-popover.tsx +5 -6
  177. package/src/components/story/ai/prototype-dialog.tsx +9 -10
  178. package/src/components/story/ai/split-dialog.tsx +22 -23
  179. package/src/components/story/ai/story-ai-panel.tsx +29 -30
  180. package/src/components/story/ai/story-ai-preview-list.tsx +16 -9
  181. package/src/components/story/ai/story-ai-toolbar.tsx +12 -13
  182. package/src/components/story/columns.tsx +33 -17
  183. package/src/components/story/constants.ts +73 -69
  184. package/src/components/story/create-story-dialog.tsx +13 -14
  185. package/src/components/story/detail/__tests__/categories.test.tsx +8 -10
  186. package/src/components/story/detail/__tests__/dependencies-button.test.tsx +3 -5
  187. package/src/components/story/detail/activity-tabs.tsx +6 -7
  188. package/src/components/story/detail/activity-timeline.tsx +33 -35
  189. package/src/components/story/detail/comment-input.tsx +7 -8
  190. package/src/components/story/detail/comment-item.tsx +15 -16
  191. package/src/components/story/detail/comment-thread.tsx +6 -7
  192. package/src/components/story/detail/reaction-bar.tsx +2 -3
  193. package/src/components/story/detail/story-detail-body.tsx +26 -28
  194. package/src/components/story/detail/story-detail-toolbar/associated-attachments-panel.tsx +42 -45
  195. package/src/components/story/detail/story-detail-toolbar/categories.tsx +13 -14
  196. package/src/components/story/detail/story-detail-toolbar/children.tsx +19 -22
  197. package/src/components/story/detail/story-detail-toolbar/dependencies.tsx +3 -5
  198. package/src/components/story/detail/story-detail-toolbar/dependency-panel.tsx +30 -20
  199. package/src/components/story/detail/story-detail-toolbar.tsx +16 -11
  200. package/src/components/story/detail/story-properties.tsx +7 -8
  201. package/src/components/story/display/__tests__/display-dropdown.test.tsx +3 -5
  202. package/src/components/story/display/__tests__/use-paged-story-groups.test.ts +2 -0
  203. package/src/components/story/display/constants.ts +27 -26
  204. package/src/components/story/display/display-dropdown.tsx +20 -26
  205. package/src/components/story/display/group-resolver.tsx +12 -14
  206. package/src/components/story/display/use-grouped-stories.ts +3 -5
  207. package/src/components/story/display/use-paged-story-groups.ts +12 -13
  208. package/src/components/story/filters/add-filter-dropdown.tsx +4 -5
  209. package/src/components/story/filters/applied-filters.tsx +7 -9
  210. package/src/components/story/filters/filter-condition.tsx +9 -12
  211. package/src/components/story/filters/filter-row.tsx +5 -6
  212. package/src/components/story/filters/filter-toggle.tsx +2 -3
  213. package/src/components/story/filters/filter-types.ts +24 -23
  214. package/src/components/story/filters/filter-value-input.tsx +3 -4
  215. package/src/components/story/infinite-scroll-sentinel.tsx +2 -3
  216. package/src/components/story/inline-editors/__tests__/dependency-type-select.test.tsx +18 -23
  217. package/src/components/story/inline-editors/__tests__/labels-editor.test.tsx +9 -11
  218. package/src/components/story/inline-editors/__tests__/priority-editor.test.tsx +21 -25
  219. package/src/components/story/inline-editors/__tests__/state-editor.test.tsx +21 -25
  220. package/src/components/story/inline-editors/assignee-editor.tsx +8 -9
  221. package/src/components/story/inline-editors/date-editor.tsx +4 -5
  222. package/src/components/story/inline-editors/dependency-type-select.tsx +15 -12
  223. package/src/components/story/inline-editors/inline-trigger.tsx +2 -3
  224. package/src/components/story/inline-editors/labels-editor.tsx +16 -17
  225. package/src/components/story/inline-editors/parent-story-editor.tsx +3 -4
  226. package/src/components/story/inline-editors/priority-editor.tsx +6 -8
  227. package/src/components/story/inline-editors/state-editor.tsx +6 -7
  228. package/src/components/story/inline-editors/story-select-dialog.tsx +25 -26
  229. package/src/components/story/inline-editors/title-editor.tsx +2 -3
  230. package/src/components/story/peek-panel.tsx +6 -7
  231. package/src/components/story/relations/__tests__/knowledge-select-dialog.test.tsx +2 -0
  232. package/src/components/story/relations/__tests__/link-manage-dialog.test.tsx +2 -0
  233. package/src/components/story/relations/attachment-manage-dialog.tsx +23 -24
  234. package/src/components/story/relations/general-groups.ts +12 -29
  235. package/src/components/story/relations/knowledge-select-dialog.tsx +21 -22
  236. package/src/components/story/relations/link-manage-dialog.tsx +12 -13
  237. package/src/components/story/relations/story-ref-row.tsx +20 -21
  238. package/src/components/story/schemas/story-create.ts +3 -5
  239. package/src/components/story/search-popover.tsx +5 -6
  240. package/src/components/story/story-list-table.tsx +3 -4
  241. package/src/components/story/story-list-view.tsx +9 -10
  242. package/src/components/story/story-panel-header.tsx +27 -28
  243. package/src/components/story/story-toolbar.tsx +11 -12
  244. package/src/components/story/transfer-story-popover.tsx +15 -16
  245. package/src/components/story/views/calendar-view.tsx +12 -14
  246. package/src/components/story/views/create-view-dialog.tsx +19 -52
  247. package/src/components/story/views/kanban-board.tsx +9 -12
  248. package/src/components/story/views/kanban-card.tsx +1 -3
  249. package/src/components/story/views/story-list/__tests__/batch-toolbar.test.tsx +9 -2
  250. package/src/components/story/views/story-list/__tests__/group-header.test.tsx +15 -17
  251. package/src/components/story/views/story-list/batch-preview-dialog.tsx +26 -28
  252. package/src/components/story/views/story-list/batch-toolbar.tsx +12 -13
  253. package/src/components/story/views/story-list/group.tsx +9 -11
  254. package/src/components/story/views/story-list/index.tsx +13 -14
  255. package/src/components/story/views/story-list/inline-story-creator.tsx +6 -7
  256. package/src/components/story/views/story-list/row.tsx +6 -7
  257. package/src/components/story/views/timeline-view.tsx +7 -8
  258. package/src/components/story/views/view-list-section.tsx +14 -16
  259. package/src/components/story/views/view-selector-button.tsx +6 -7
  260. package/src/components/story/views/view-switcher.tsx +9 -10
  261. package/src/components/story/views/view-types.ts +15 -15
  262. package/src/components/tiptap/extension/code-block-ellipsis-input-extension.ts +0 -1
  263. package/src/components/tiptap/hooks/use-composed-ref.ts +0 -1
  264. package/src/components/tiptap/hooks/use-cursor-visibility.ts +0 -1
  265. package/src/components/tiptap/hooks/use-floating-element.ts +0 -1
  266. package/src/components/tiptap/hooks/use-is-breakpoint.ts +0 -1
  267. package/src/components/tiptap/hooks/use-isomorphic-layout-effect.ts +0 -1
  268. package/src/components/tiptap/hooks/use-menu-navigation.ts +0 -1
  269. package/src/components/tiptap/hooks/use-on-click-outside.ts +0 -1
  270. package/src/components/tiptap/hooks/use-tiptap-editor.ts +0 -1
  271. package/src/components/tiptap/hooks/use-ui-editor-state.ts +0 -1
  272. package/src/components/tiptap/mindmap/lib/__tests__/default-mindmap-data.test.ts +3 -2
  273. package/src/components/tiptap/mindmap/lib/default-mindmap-data.ts +2 -2
  274. package/src/components/tiptap/mindmap/mind-map.tsx +36 -39
  275. package/src/components/tiptap/mindmap/mindmap-fullscreen-dialog.tsx +2 -3
  276. package/src/components/tiptap/node/annotation-node/annotation-node-view.tsx +11 -12
  277. package/src/components/tiptap/node/doc-card-extension.tsx +8 -10
  278. package/src/components/tiptap/node/image-node/image-node-floating.tsx +2 -3
  279. package/src/components/tiptap/node/image-upload-node/image-upload-node.tsx +0 -1
  280. package/src/components/tiptap/node/mention-extension.ts +5 -5
  281. package/src/components/tiptap/node/table-node/hooks/use-table-handle-state.ts +0 -1
  282. package/src/components/tiptap/node/table-node/ui/table-add-row-column-button/table-add-row-column-button.tsx +0 -1
  283. package/src/components/tiptap/node/table-node/ui/table-add-row-column-button/use-table-add-row-column.ts +5 -6
  284. package/src/components/tiptap/node/table-node/ui/table-align-cell-button/table-align-cell-button.tsx +0 -1
  285. package/src/components/tiptap/node/table-node/ui/table-align-cell-button/use-table-align-cell.ts +8 -9
  286. package/src/components/tiptap/node/table-node/ui/table-alignment-menu/table-alignment-menu.tsx +2 -4
  287. package/src/components/tiptap/node/table-node/ui/table-cell-handle-menu/table-cell-handle-menu.tsx +2 -5
  288. package/src/components/tiptap/node/table-node/ui/table-clear-row-column-content-button/table-clear-row-column-content-button.tsx +0 -1
  289. package/src/components/tiptap/node/table-node/ui/table-clear-row-column-content-button/use-table-clear-row-column-content.ts +4 -5
  290. package/src/components/tiptap/node/table-node/ui/table-delete-row-column-button/table-delete-row-column-button.tsx +0 -1
  291. package/src/components/tiptap/node/table-node/ui/table-delete-row-column-button/use-table-delete-row-column.ts +3 -4
  292. package/src/components/tiptap/node/table-node/ui/table-duplicate-row-column-button/table-duplicate-row-column-button.tsx +0 -1
  293. package/src/components/tiptap/node/table-node/ui/table-duplicate-row-column-button/use-table-duplicate-row-column.ts +3 -4
  294. package/src/components/tiptap/node/table-node/ui/table-extend-row-column-button/table-extend-row-column-button.tsx +2 -4
  295. package/src/components/tiptap/node/table-node/ui/table-fit-to-width-button/table-fit-to-width-button.tsx +0 -1
  296. package/src/components/tiptap/node/table-node/ui/table-fit-to-width-button/use-table-fit-to-width.ts +3 -4
  297. package/src/components/tiptap/node/table-node/ui/table-handle/table-handle.tsx +0 -1
  298. package/src/components/tiptap/node/table-node/ui/table-handle-menu/table-handle-menu.tsx +3 -5
  299. package/src/components/tiptap/node/table-node/ui/table-header-row-column-button/table-header-row-column-button.tsx +0 -1
  300. package/src/components/tiptap/node/table-node/ui/table-header-row-column-button/use-table-header-row-column.ts +3 -4
  301. package/src/components/tiptap/node/table-node/ui/table-merge-split-cell-button/table-merge-split-cell-button.tsx +0 -1
  302. package/src/components/tiptap/node/table-node/ui/table-merge-split-cell-button/use-table-merge-split-cell.ts +3 -4
  303. package/src/components/tiptap/node/table-node/ui/table-move-row-column-button/table-move-row-column-button.tsx +0 -1
  304. package/src/components/tiptap/node/table-node/ui/table-move-row-column-button/use-table-move-row-column.ts +9 -10
  305. package/src/components/tiptap/node/table-node/ui/table-selection-overlay/table-selection-overlay.tsx +0 -1
  306. package/src/components/tiptap/node/table-node/ui/table-selection-overlay/use-resize-overlay.ts +0 -1
  307. package/src/components/tiptap/node/table-node/ui/table-sort-row-column-button/table-sort-row-column-button.tsx +0 -1
  308. package/src/components/tiptap/node/table-node/ui/table-sort-row-column-button/use-table-sort-row-column.ts +5 -6
  309. package/src/components/tiptap/node/table-node/ui/table-trigger-button/table-grid-selector.tsx +2 -3
  310. package/src/components/tiptap/node/table-node/ui/table-trigger-button/table-trigger-button.tsx +0 -1
  311. package/src/components/tiptap/node/table-node/ui/table-trigger-button/use-table-trigger.ts +3 -4
  312. package/src/components/tiptap/node/toc-node/toc-node.tsx +2 -4
  313. package/src/components/tiptap/node/toc-node/ui/toc-show-title-button/toc-show-title-button.tsx +0 -1
  314. package/src/components/tiptap/node/toc-node/ui/toc-show-title-button/toc-show-title.ts +2 -3
  315. package/src/components/tiptap/node/toc-node/ui/toc-sidebar/toc-sidebar.tsx +2 -5
  316. package/src/components/tiptap/notion-like/notion-like-editor-header.tsx +2 -4
  317. package/src/components/tiptap/notion-like/notion-like-editor-mobile-toolbar.tsx +17 -23
  318. package/src/components/tiptap/notion-like/notion-like-editor-theme-toggle.tsx +2 -5
  319. package/src/components/tiptap/notion-like/notion-like-editor-toolbar-floating.tsx +16 -12
  320. package/src/components/tiptap/notion-like/notion-like-editor.tsx +2 -7
  321. package/src/components/tiptap/notion-like/setup-error-message/setup-error-message.tsx +0 -1
  322. package/src/components/tiptap/ui/ai-ask-button/ai-ask-button.tsx +0 -1
  323. package/src/components/tiptap/ui/ai-ask-button/use-ai-ask.ts +2 -3
  324. package/src/components/tiptap/ui/ai-menu/ai-menu-actions/ai-menu-actions.tsx +4 -6
  325. package/src/components/tiptap/ui/ai-menu/ai-menu-input/ai-menu-input.tsx +6 -10
  326. package/src/components/tiptap/ui/ai-menu/ai-menu-items/ai-menu-items-constants.ts +36 -36
  327. package/src/components/tiptap/ui/ai-menu/ai-menu-items/ai-menu-items.tsx +13 -16
  328. package/src/components/tiptap/ui/ai-menu/ai-menu-items/language-selection-submenu.tsx +3 -4
  329. package/src/components/tiptap/ui/ai-menu/ai-menu-items/tone-selection-submenu.tsx +2 -3
  330. package/src/components/tiptap/ui/ai-menu/ai-menu-utils.ts +3 -3
  331. package/src/components/tiptap/ui/ai-menu/ai-menu.tsx +3 -5
  332. package/src/components/tiptap/ui/blockquote-button/blockquote-button.tsx +2 -6
  333. package/src/components/tiptap/ui/blockquote-button/use-blockquote.ts +2 -3
  334. package/src/components/tiptap/ui/code-block-button/code-block-button.tsx +2 -6
  335. package/src/components/tiptap/ui/code-block-button/use-code-block.ts +2 -3
  336. package/src/components/tiptap/ui/color-highlight-button/color-highlight-button.tsx +0 -1
  337. package/src/components/tiptap/ui/color-highlight-button/use-color-highlight.ts +14 -14
  338. package/src/components/tiptap/ui/color-highlight-popover/color-highlight-popover.tsx +9 -11
  339. package/src/components/tiptap/ui/color-menu/color-menu.tsx +5 -11
  340. package/src/components/tiptap/ui/color-text-button/color-text-button.tsx +2 -3
  341. package/src/components/tiptap/ui/color-text-button/use-color-text.ts +12 -13
  342. package/src/components/tiptap/ui/color-text-popover/color-text-popover.tsx +6 -10
  343. package/src/components/tiptap/ui/color-text-popover/use-color-text-popover.ts +2 -3
  344. package/src/components/tiptap/ui/copy-anchor-link-button/copy-anchor-link-button.tsx +2 -6
  345. package/src/components/tiptap/ui/copy-anchor-link-button/use-copy-anchor-link.ts +2 -3
  346. package/src/components/tiptap/ui/copy-anchor-link-button/use-scroll-to-hash.ts +0 -1
  347. package/src/components/tiptap/ui/copy-to-clipboard-button/copy-to-clipboard-button.tsx +2 -6
  348. package/src/components/tiptap/ui/copy-to-clipboard-button/use-copy-to-clipboard.ts +2 -3
  349. package/src/components/tiptap/ui/delete-node-button/delete-node-button.tsx +2 -6
  350. package/src/components/tiptap/ui/delete-node-button/use-delete-node.ts +2 -3
  351. package/src/components/tiptap/ui/doc-reference-floating/doc-reference-floating.tsx +10 -11
  352. package/src/components/tiptap/ui/doc-reference-interaction/doc-reference-interaction.tsx +10 -11
  353. package/src/components/tiptap/ui/drag-context-menu/drag-context-menu.tsx +7 -9
  354. package/src/components/tiptap/ui/duplicate-button/duplicate-button.tsx +2 -6
  355. package/src/components/tiptap/ui/duplicate-button/use-duplicate.ts +2 -3
  356. package/src/components/tiptap/ui/emoji-dropdown-menu/emoji-dropdown-menu.tsx +0 -1
  357. package/src/components/tiptap/ui/emoji-menu/emoji-menu.tsx +2 -5
  358. package/src/components/tiptap/ui/emoji-trigger-button/emoji-trigger-button.tsx +2 -6
  359. package/src/components/tiptap/ui/emoji-trigger-button/use-emoji-trigger.ts +2 -3
  360. package/src/components/tiptap/ui/heading-button/heading-button.tsx +0 -1
  361. package/src/components/tiptap/ui/heading-button/use-heading.ts +7 -8
  362. package/src/components/tiptap/ui/image-align-button/image-align-button.tsx +0 -1
  363. package/src/components/tiptap/ui/image-align-button/use-image-align.ts +4 -5
  364. package/src/components/tiptap/ui/image-caption-button/image-caption-button.tsx +0 -1
  365. package/src/components/tiptap/ui/image-caption-button/use-image-caption.ts +2 -3
  366. package/src/components/tiptap/ui/image-download-button/image-download-button.tsx +0 -1
  367. package/src/components/tiptap/ui/image-download-button/use-image-download.ts +2 -3
  368. package/src/components/tiptap/ui/image-upload-button/image-upload-button.tsx +0 -1
  369. package/src/components/tiptap/ui/image-upload-button/use-image-upload.ts +2 -3
  370. package/src/components/tiptap/ui/improve-dropdown/improve-dropdown.tsx +14 -17
  371. package/src/components/tiptap/ui/improve-dropdown/use-improve-dropdown.ts +2 -3
  372. package/src/components/tiptap/ui/indent-button/indent-button.tsx +0 -1
  373. package/src/components/tiptap/ui/indent-button/use-indent.ts +3 -4
  374. package/src/components/tiptap/ui/link-popover/link-popover.tsx +7 -12
  375. package/src/components/tiptap/ui/link-popover/use-link-popover.ts +2 -3
  376. package/src/components/tiptap/ui/list-button/list-button.tsx +0 -1
  377. package/src/components/tiptap/ui/list-button/use-list.ts +4 -5
  378. package/src/components/tiptap/ui/mark-button/mark-button.tsx +0 -1
  379. package/src/components/tiptap/ui/mark-button/use-mark.ts +8 -9
  380. package/src/components/tiptap/ui/mention-dropdown-menu/mention-dropdown-menu.tsx +0 -2
  381. package/src/components/tiptap/ui/mention-trigger-button/mention-trigger-button.tsx +0 -1
  382. package/src/components/tiptap/ui/mention-trigger-button/use-mention-trigger.ts +2 -3
  383. package/src/components/tiptap/ui/move-node-button/move-node-button.tsx +2 -6
  384. package/src/components/tiptap/ui/move-node-button/use-move-node.ts +2 -3
  385. package/src/components/tiptap/ui/reference-dropdown-menu/reference-dropdown-menu.tsx +6 -10
  386. package/src/components/tiptap/ui/reset-all-formatting-button/reset-all-formatting-button.tsx +2 -6
  387. package/src/components/tiptap/ui/reset-all-formatting-button/use-reset-all-formatting.ts +2 -3
  388. package/src/components/tiptap/ui/slash-command-trigger-button/slash-command-trigger-button.tsx +0 -1
  389. package/src/components/tiptap/ui/slash-command-trigger-button/use-slash-command-trigger.ts +2 -3
  390. package/src/components/tiptap/ui/slash-dropdown-menu/slash-dropdown-menu.tsx +2 -5
  391. package/src/components/tiptap/ui/slash-dropdown-menu/use-slash-dropdown-menu.ts +78 -79
  392. package/src/components/tiptap/ui/text-align-button/text-align-button.tsx +0 -1
  393. package/src/components/tiptap/ui/text-align-button/use-text-align.ts +5 -6
  394. package/src/components/tiptap/ui/text-button/text-button.tsx +2 -6
  395. package/src/components/tiptap/ui/text-button/use-text.ts +2 -3
  396. package/src/components/tiptap/ui/turn-into-dropdown/turn-into-dropdown.tsx +4 -7
  397. package/src/components/tiptap/ui/turn-into-dropdown/use-turn-into-dropdown.ts +11 -12
  398. package/src/components/tiptap/ui/undo-redo-button/undo-redo-button.tsx +0 -1
  399. package/src/components/tiptap/ui/undo-redo-button/use-undo-redo.ts +3 -4
  400. package/src/components/tiptap/ui-primitive/avatar/avatar.tsx +0 -1
  401. package/src/components/tiptap/ui-primitive/badge/badge.tsx +0 -1
  402. package/src/components/tiptap/ui-primitive/button/button.tsx +0 -1
  403. package/src/components/tiptap/ui-primitive/card/card.tsx +0 -1
  404. package/src/components/tiptap/ui-primitive/combobox/combobox.tsx +0 -1
  405. package/src/components/tiptap/ui-primitive/dropdown-menu/dropdown-menu.tsx +0 -1
  406. package/src/components/tiptap/ui-primitive/input/input.tsx +0 -1
  407. package/src/components/tiptap/ui-primitive/input-group/input-group.tsx +0 -1
  408. package/src/components/tiptap/ui-primitive/label/label.tsx +0 -1
  409. package/src/components/tiptap/ui-primitive/menu/menu-context.ts +0 -1
  410. package/src/components/tiptap/ui-primitive/menu/menu-hooks.ts +0 -1
  411. package/src/components/tiptap/ui-primitive/menu/menu-types.ts +0 -1
  412. package/src/components/tiptap/ui-primitive/menu/menu-utils.ts +0 -1
  413. package/src/components/tiptap/ui-primitive/menu/menu.tsx +0 -1
  414. package/src/components/tiptap/ui-primitive/popover/popover.tsx +0 -1
  415. package/src/components/tiptap/ui-primitive/separator/separator.tsx +0 -1
  416. package/src/components/tiptap/ui-primitive/sidebar/sidebar.tsx +0 -1
  417. package/src/components/tiptap/ui-primitive/spacer/spacer.tsx +0 -1
  418. package/src/components/tiptap/ui-primitive/textarea/textarea.tsx +0 -1
  419. package/src/components/tiptap/ui-primitive/textarea-autosize/textarea-autosize.tsx +0 -1
  420. package/src/components/tiptap/ui-primitive/toolbar/toolbar.tsx +0 -1
  421. package/src/components/tiptap/ui-primitive/tooltip/tooltip.tsx +0 -1
  422. package/src/components/tiptap/ui-utils/floating-element/floating-element.tsx +0 -1
  423. package/src/components/tiptap/ui-utils/suggestion-menu/suggestion-menu.tsx +0 -1
  424. package/src/components/ui/field.tsx +1 -1
  425. package/src/components/ui/radio-group.tsx +2 -3
  426. package/src/components/ui/spinner.tsx +2 -2
  427. package/src/components/workspace/create-workspace-dialog.tsx +12 -13
  428. package/src/components/workspace/delete-workspace-options.tsx +177 -0
  429. package/src/components/workspace/edit-workspace-dialog.tsx +153 -0
  430. package/src/components/workspace/schemas/create-workspace.ts +2 -2
  431. package/src/components/workspace/workspace-activity-card.tsx +60 -0
  432. package/src/components/workspace/workspace-contribution-card.tsx +37 -0
  433. package/src/components/workspace/workspace-header.tsx +100 -0
  434. package/src/components/workspace/workspace-kb-card.tsx +31 -0
  435. package/src/components/workspace/workspace-member-item.tsx +80 -0
  436. package/src/components/workspace/workspace-members-manager.tsx +291 -0
  437. package/src/components/workspace/workspace-project-list.tsx +129 -0
  438. package/src/config/sidebar-routes.tsx +25 -24
  439. package/src/config/sidebar-teams.ts +4 -4
  440. package/src/hooks/__tests__/use-commands.test.tsx +0 -10
  441. package/src/hooks/use-commands.ts +3 -7
  442. package/src/hooks/use-entity-subscription.ts +0 -1
  443. package/src/hooks/use-notifications.ts +5 -6
  444. package/src/hooks/useTranslator.ts +0 -1
  445. package/src/lib/__tests__/edition.test.ts +9 -0
  446. package/src/lib/analytics.ts +0 -1
  447. package/src/lib/anyhub/anyhub-message-bridge.ts +1 -1
  448. package/src/lib/auth/__tests__/anonymous-safe.test.ts +89 -0
  449. package/src/lib/auth/__tests__/page-gate.test.ts +29 -0
  450. package/src/lib/auth/anonymous-safe.ts +39 -0
  451. package/src/lib/auth/page-gate.ts +18 -0
  452. package/src/lib/changelog/sdk-versions.ts +19 -19
  453. package/src/lib/collections/knowledge/knowledge-bases-collection.ts +1 -1
  454. package/src/lib/collections/reference/bookmark-categories-collection.ts +1 -1
  455. package/src/lib/collections/reference/labels-collection.ts +1 -1
  456. package/src/lib/collections/reference/projects-collection.ts +1 -1
  457. package/src/lib/collections/reference/users-brief-collection.ts +1 -1
  458. package/src/lib/collections/reference/workspaces-collection.ts +3 -3
  459. package/src/lib/commands/__tests__/registry.test.ts +3 -3
  460. package/src/lib/commands/registry.ts +22 -21
  461. package/src/lib/commands/types.ts +1 -1
  462. package/src/lib/edition.ts +7 -0
  463. package/src/lib/router-context.ts +1 -2
  464. package/src/plugins/.gen-manifest.json +13 -0
  465. package/src/plugins/core/inspiration/pages/inspiration-page.tsx +2 -3
  466. package/src/plugins/core/inspiration/ui.tsx +2 -3
  467. package/src/plugins/core/prd/components/agent-input.tsx +7 -8
  468. package/src/plugins/core/prd/components/component-editor/content-section.tsx +3 -3
  469. package/src/plugins/core/prd/components/component-editor/position-section.tsx +3 -4
  470. package/src/plugins/core/prd/components/component-editor/style-fields.tsx +13 -16
  471. package/src/plugins/core/prd/components/dialog/create-prd-dialog.tsx +11 -12
  472. package/src/plugins/core/prd/components/dialog/prd-detail-client.tsx +7 -9
  473. package/src/plugins/core/prd/components/page-version-panel/components/create-version-dialog.tsx +7 -8
  474. package/src/plugins/core/prd/components/page-version-panel/components/delete-version-dialog.tsx +5 -6
  475. package/src/plugins/core/prd/components/page-version-panel/components/edit-version-dialog.tsx +7 -8
  476. package/src/plugins/core/prd/components/page-version-panel/constants.tsx +3 -2
  477. package/src/plugins/core/prd/components/page-version-panel.tsx +43 -45
  478. package/src/plugins/core/prd/components/page-version-tree.tsx +6 -8
  479. package/src/plugins/core/prd/components/prd-agent-panel.tsx +29 -23
  480. package/src/plugins/core/prd/components/prd-comment-review-panel.tsx +21 -23
  481. package/src/plugins/core/prd/components/prd-component-editor-content.tsx +6 -7
  482. package/src/plugins/core/prd/components/prd-dashboard.tsx +28 -23
  483. package/src/plugins/core/prd/components/prd-doc-panel.tsx +6 -9
  484. package/src/plugins/core/prd/components/prd-editor-layout.tsx +11 -13
  485. package/src/plugins/core/prd/components/prd-filter-bar.tsx +2 -3
  486. package/src/plugins/core/prd/components/prd-left-sidebar.tsx +19 -20
  487. package/src/plugins/core/prd/components/prd-navigation.tsx +12 -14
  488. package/src/plugins/core/prd/components/prd-outline-tab.tsx +3 -4
  489. package/src/plugins/core/prd/components/prd-prototype-panel.tsx +8 -10
  490. package/src/plugins/core/prd/components/prd-right-sidebar.tsx +10 -12
  491. package/src/plugins/core/prd/components/prd-share-panel/components/single-version-share-card.tsx +13 -14
  492. package/src/plugins/core/prd/components/prd-share-panel/constants.ts +5 -3
  493. package/src/plugins/core/prd/components/prd-share-panel.tsx +58 -60
  494. package/src/plugins/core/prd/components/prd-tree-page-tab.tsx +20 -22
  495. package/src/plugins/core/prd/components/prototype/PrototypeCanvas.tsx +2 -4
  496. package/src/plugins/core/prd/components/prototype/PrototypeElement.tsx +3 -5
  497. package/src/plugins/core/prd/components/prototype/ResizeHandles.tsx +0 -1
  498. package/src/plugins/core/prd/components/prototype/icon-components.ts +19 -21
  499. package/src/plugins/core/prd/components/prototype/index.ts +3 -0
  500. package/src/plugins/core/prd/components/restore-version-dialog.tsx +5 -7
  501. package/src/plugins/core/prd/components/share/prd-share-client.tsx +7 -9
  502. package/src/plugins/core/prd/components/share/share-annotation-overlay.tsx +0 -1
  503. package/src/plugins/core/prd/components/share/share-comment-panel.tsx +15 -16
  504. package/src/plugins/core/prd/components/share/share-comment-review-panel.tsx +7 -9
  505. package/src/plugins/core/prd/components/share/share-directory-tree.tsx +3 -5
  506. package/src/plugins/core/prd/components/share/share-doc-view.tsx +3 -5
  507. package/src/plugins/core/prd/components/share/share-layout.tsx +3 -5
  508. package/src/plugins/core/prd/components/share/share-nav-bar.tsx +3 -5
  509. package/src/plugins/core/prd/components/share/share-password-gate.tsx +8 -9
  510. package/src/plugins/core/prd/components/share/share-prototype-view.tsx +3 -5
  511. package/src/plugins/core/prd/components/share/share-review-panel.tsx +9 -11
  512. package/src/plugins/core/prd/components/share/share-sse-listener.tsx +0 -1
  513. package/src/plugins/core/prd/components/share/version-share-client.tsx +3 -5
  514. package/src/plugins/core/prd/pages/prd-detail-page.tsx +9 -21
  515. package/src/plugins/core/prd/pages/share-prd-page.tsx +6 -16
  516. package/src/plugins/core/prd/prd-nav.tsx +2 -3
  517. package/src/plugins/core/tags/nav-tag.tsx +14 -15
  518. package/src/plugins/core/tags/pages/tag-detail-page.tsx +3 -5
  519. package/src/plugins/core/tags/pages/tag-settings-page.tsx +3 -5
  520. package/src/plugins/core/tags/pages/tags-index-page.tsx +3 -5
  521. package/src/plugins/core/tags/tag-badge.tsx +2 -3
  522. package/src/plugins/core/tags/tag-color-picker.tsx +2 -4
  523. package/src/plugins/core/tags/tag-manager.tsx +23 -25
  524. package/src/plugins/core/tags/tag-selector.tsx +4 -5
  525. package/src/plugins/modules.gen.ts +21 -0
  526. package/src/plugins/plugins.gen.ts +20 -0
  527. package/src/plugins/ui.gen.ts +8 -0
  528. package/src/providers/index.tsx +3 -14
  529. package/src/routeTree.gen.ts +27 -0
  530. package/src/router.tsx +16 -6
  531. package/src/routes/__desktop/onboarding/route.lazy.tsx +22 -23
  532. package/src/routes/__root.tsx +13 -36
  533. package/src/routes/__tests__/-edition-routing.test.tsx +151 -0
  534. package/src/routes/_login/forgot-password/route.lazy.tsx +14 -15
  535. package/src/routes/_login/login/route.lazy.tsx +26 -25
  536. package/src/routes/_login/register/route.lazy.tsx +23 -24
  537. package/src/routes/_login/reset-password/route.lazy.tsx +16 -17
  538. package/src/routes/_login/schemas/-auth.ts +11 -13
  539. package/src/routes/_nav/acceptance-criteria/route.tsx +2 -3
  540. package/src/routes/_nav/apps/anyhub/$id/route.tsx +2 -3
  541. package/src/routes/_nav/chat/route.lazy.tsx +9 -10
  542. package/src/routes/_nav/dashboard/-components/activity-feed.tsx +3 -4
  543. package/src/routes/_nav/dashboard/-components/quick-actions.tsx +3 -4
  544. package/src/routes/_nav/dashboard/-components/stats-grid.tsx +5 -6
  545. package/src/routes/_nav/dashboard/route.lazy.tsx +7 -8
  546. package/src/routes/_nav/design/$projectId/$artboardId/route.lazy.tsx +7 -9
  547. package/src/routes/_nav/design/$projectId/route.lazy.tsx +3 -5
  548. package/src/routes/_nav/design/index.lazy.tsx +26 -27
  549. package/src/routes/_nav/inspiration/route.tsx +8 -0
  550. package/src/routes/_nav/knowledge/$kbId/doc/$docId/route.lazy.tsx +4 -5
  551. package/src/routes/_nav/knowledge/$kbId/route.lazy.tsx +3 -4
  552. package/src/routes/_nav/knowledge/bookmarks/$id.lazy.tsx +29 -30
  553. package/src/routes/_nav/knowledge/bookmarks/index.lazy.tsx +12 -13
  554. package/src/routes/_nav/knowledge/compliance/$id.lazy.tsx +22 -23
  555. package/src/routes/_nav/knowledge/compliance/index.lazy.tsx +18 -19
  556. package/src/routes/_nav/knowledge/dictionaries/$id.lazy.tsx +5 -6
  557. package/src/routes/_nav/knowledge/dictionaries/index.lazy.tsx +17 -18
  558. package/src/routes/_nav/knowledge/index.lazy.tsx +248 -40
  559. package/src/routes/_nav/knowledge/laws/$id.lazy.tsx +22 -23
  560. package/src/routes/_nav/knowledge/laws/index.lazy.tsx +14 -15
  561. package/src/routes/_nav/knowledge/summary/index.lazy.tsx +31 -32
  562. package/src/routes/_nav/notifications/route.lazy.tsx +3 -4
  563. package/src/routes/_nav/notifications/route.tsx +2 -0
  564. package/src/routes/_nav/notion-like/route.tsx +2 -3
  565. package/src/routes/_nav/prd/$id/route.tsx +9 -0
  566. package/src/routes/_nav/prd/index.tsx +9 -0
  567. package/src/routes/_nav/prd/route.tsx +8 -0
  568. package/src/routes/_nav/pricing-02/route.tsx +2 -3
  569. package/src/routes/_nav/projects/$projectId/$storyId/route.lazy.tsx +23 -24
  570. package/src/routes/_nav/projects/$projectId/index.lazy.tsx +54 -74
  571. package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy.tsx +27 -30
  572. package/src/routes/_nav/projects/$projectId/iterations/index.lazy.tsx +9 -10
  573. package/src/routes/_nav/projects/$projectId/route.tsx +4 -2
  574. package/src/routes/_nav/projects/$projectId/settings/route.lazy.tsx +40 -41
  575. package/src/routes/_nav/route.tsx +13 -16
  576. package/src/routes/_nav/settings/-settings-tabs.tsx +24 -51
  577. package/src/routes/_nav/settings/account/route.lazy.tsx +1 -9
  578. package/src/routes/_nav/settings/ai/index/route.lazy.tsx +5 -6
  579. package/src/routes/_nav/settings/billing/route.lazy.tsx +4 -5
  580. package/src/routes/_nav/settings/connection/route.lazy.tsx +14 -10
  581. package/src/routes/_nav/settings/design/route.lazy.tsx +21 -22
  582. package/src/routes/_nav/settings/general/route.lazy.tsx +10 -11
  583. package/src/routes/_nav/settings/notifications/route.lazy.tsx +3 -5
  584. package/src/routes/_nav/settings/privacy/route.lazy.tsx +15 -16
  585. package/src/routes/_nav/settings/route.lazy.tsx +2 -3
  586. package/src/routes/_nav/settings/route.tsx +10 -15
  587. package/src/routes/_nav/settings/team/route.lazy.tsx +1 -9
  588. package/src/routes/_nav/tags/$id/route.tsx +8 -0
  589. package/src/routes/_nav/tags/index.tsx +8 -0
  590. package/src/routes/_nav/tags/route.tsx +8 -0
  591. package/src/routes/_nav/tags/settings/route.tsx +9 -0
  592. package/src/routes/_nav/test-cases/route.tsx +2 -3
  593. package/src/routes/_nav/workspaces/$workspaceId/activities/route.lazy.tsx +69 -0
  594. package/src/routes/_nav/workspaces/$workspaceId/activities/route.tsx +28 -0
  595. package/src/routes/_nav/workspaces/$workspaceId/route.lazy.tsx +194 -99
  596. package/src/routes/_nav/workspaces/$workspaceId/route.tsx +12 -3
  597. package/src/routes/_nav/workspaces/$workspaceId/settings/route.lazy.tsx +75 -61
  598. package/src/routes/_nav/workspaces/index.lazy.tsx +196 -22
  599. package/src/routes/_nav/workspaces/route.tsx +2 -0
  600. package/src/routes/_public/index/route.tsx +5 -1
  601. package/src/routes/invite/$token/route.lazy.tsx +36 -37
  602. package/src/routes/share/$versionId/route.lazy.tsx +4 -11
  603. package/src/routes/share/compliance/$id/route.lazy.tsx +6 -8
  604. package/src/routes/share/law/$id/route.lazy.tsx +6 -8
  605. package/src/routes/share/prd/$prdId/route.tsx +10 -0
  606. package/src/server/__tests__/agent-client-graph.test.ts +4 -8
  607. package/src/server/ai-ports.ts +7 -6
  608. package/src/server/builtin-project.ts +43 -0
  609. package/src/server/design/sketch/file-storage.ts +1 -1
  610. package/src/server/pro-services.ts +1 -1
  611. package/src/server/serverFns/__tests__/workspace.test.ts +101 -0
  612. package/src/server/serverFns/activity.ts +15 -9
  613. package/src/server/serverFns/knowledge-public/bookmarks/list.ts +1 -1
  614. package/src/server/serverFns/knowledge-public/bookmarks/share.ts +3 -3
  615. package/src/server/serverFns/knowledge-public/compliance/share.ts +3 -3
  616. package/src/server/serverFns/knowledge-public/dictionary/share.ts +3 -3
  617. package/src/server/serverFns/knowledge-public/legal/share.ts +3 -3
  618. package/src/server/serverFns/knowledge.ts +27 -2
  619. package/src/server/serverFns/notifications.ts +3 -0
  620. package/src/server/serverFns/project.ts +48 -35
  621. package/src/server/serverFns/story/story-crud/bulk.ts +2 -2
  622. package/src/server/serverFns/story/story-crud.ts +9 -7
  623. package/src/server/serverFns/story/story-groups.ts +6 -6
  624. package/src/server/serverFns/workspace.ts +334 -13
  625. package/src/server-entry.ts +29 -0
  626. package/vite.shared.ts +4 -1
  627. package/src/components/layout/sidebar-03/logo.tsx +0 -41
  628. package/src/i18n/__tests__/detect.test.ts +0 -48
  629. package/src/i18n/__tests__/integration.test.tsx +0 -32
  630. package/src/i18n/__tests__/server.test.ts +0 -33
  631. package/src/i18n/client.ts +0 -32
  632. package/src/i18n/config.ts +0 -116
  633. package/src/i18n/detect.ts +0 -43
  634. package/src/i18n/locales/en/agents.json +0 -134
  635. package/src/i18n/locales/en/apps.json +0 -6
  636. package/src/i18n/locales/en/auth.json +0 -90
  637. package/src/i18n/locales/en/billing.json +0 -78
  638. package/src/i18n/locales/en/chat.json +0 -194
  639. package/src/i18n/locales/en/common.json +0 -242
  640. package/src/i18n/locales/en/dashboard.json +0 -38
  641. package/src/i18n/locales/en/design.json +0 -70
  642. package/src/i18n/locales/en/desktop.json +0 -35
  643. package/src/i18n/locales/en/display.json +0 -37
  644. package/src/i18n/locales/en/editor.json +0 -304
  645. package/src/i18n/locales/en/enterprise.json +0 -1
  646. package/src/i18n/locales/en/invite.json +0 -56
  647. package/src/i18n/locales/en/iterations.json +0 -92
  648. package/src/i18n/locales/en/knowledge.json +0 -462
  649. package/src/i18n/locales/en/mindmap.json +0 -28
  650. package/src/i18n/locales/en/notifications.json +0 -79
  651. package/src/i18n/locales/en/prd.json +0 -51
  652. package/src/i18n/locales/en/projects.json +0 -140
  653. package/src/i18n/locales/en/settings.json +0 -428
  654. package/src/i18n/locales/en/share.json +0 -20
  655. package/src/i18n/locales/en/story.json +0 -923
  656. package/src/i18n/locales/en/tags.json +0 -42
  657. package/src/i18n/locales/en/workspace.json +0 -90
  658. package/src/i18n/locales/zh/agents.json +0 -134
  659. package/src/i18n/locales/zh/apps.json +0 -6
  660. package/src/i18n/locales/zh/auth.json +0 -90
  661. package/src/i18n/locales/zh/billing.json +0 -78
  662. package/src/i18n/locales/zh/chat.json +0 -194
  663. package/src/i18n/locales/zh/common.json +0 -242
  664. package/src/i18n/locales/zh/dashboard.json +0 -38
  665. package/src/i18n/locales/zh/design.json +0 -70
  666. package/src/i18n/locales/zh/desktop.json +0 -35
  667. package/src/i18n/locales/zh/display.json +0 -37
  668. package/src/i18n/locales/zh/editor.json +0 -304
  669. package/src/i18n/locales/zh/enterprise.json +0 -1
  670. package/src/i18n/locales/zh/invite.json +0 -56
  671. package/src/i18n/locales/zh/iterations.json +0 -92
  672. package/src/i18n/locales/zh/knowledge.json +0 -462
  673. package/src/i18n/locales/zh/mindmap.json +0 -28
  674. package/src/i18n/locales/zh/notifications.json +0 -79
  675. package/src/i18n/locales/zh/prd.json +0 -51
  676. package/src/i18n/locales/zh/projects.json +0 -140
  677. package/src/i18n/locales/zh/settings.json +0 -428
  678. package/src/i18n/locales/zh/share.json +0 -20
  679. package/src/i18n/locales/zh/story.json +0 -923
  680. package/src/i18n/locales/zh/tags.json +0 -42
  681. package/src/i18n/locales/zh/workspace.json +0 -90
  682. package/src/i18n/server.ts +0 -18
  683. package/src/i18n/types.ts +0 -5
  684. package/src/server/serverFns/locale.ts +0 -20
@@ -15,9 +15,8 @@
15
15
  // You should have received a copy of the GNU Affero General Public License
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
-
19
18
  import React, { useState, useMemo, useEffect } from "react";
20
- import { useTranslation } from "react-i18next";
19
+ import { m } from '@/paraglide/messages.js'
21
20
  import { cn } from "@/lib/utils";
22
21
  import { Button } from "@/components/ui/button";
23
22
  import { Badge } from "@/components/ui/badge";
@@ -83,7 +82,6 @@ interface PageVersionTreeProps {
83
82
  }
84
83
 
85
84
  export function PageVersionTree({ versions, onRestore }: PageVersionTreeProps) {
86
- const { t } = useTranslation("prd");
87
85
  const [expandedVersionId, setExpandedVersionId] = useState<string | null>(null);
88
86
  const [expandedNodes, setExpandedNodes] = useState<Set<string>>(new Set());
89
87
  const timezone = useTimezone();
@@ -149,7 +147,7 @@ export function PageVersionTree({ versions, onRestore }: PageVersionTreeProps) {
149
147
  <span className="flex-1 truncate">
150
148
  {node.name}
151
149
  {isPlaceholder && (
152
- <span className="text-[10px] text-muted-foreground/40 ml-1">{t("version.unpublished")}</span>
150
+ <span className="text-[10px] text-muted-foreground/40 ml-1">{m.version_unpublished()}</span>
153
151
  )}
154
152
  </span>
155
153
 
@@ -170,7 +168,7 @@ export function PageVersionTree({ versions, onRestore }: PageVersionTreeProps) {
170
168
  </Button>
171
169
  </TooltipTrigger>
172
170
  <TooltipContent>
173
- <p>{t("version.restoreToCurrent")}</p>
171
+ <p>{m.version_restoreToCurrent()}</p>
174
172
  </TooltipContent>
175
173
  </Tooltip>
176
174
  </>
@@ -255,11 +253,11 @@ export function PageVersionTree({ versions, onRestore }: PageVersionTreeProps) {
255
253
  )}
256
254
  <span className="font-medium">{v.versionLabel}</span>
257
255
  {v.id === latestUpdatedVersionId && (
258
- <Badge variant="secondary" className="text-[10px] h-4 px-1.5 leading-none font-normal">{t("version.recentlyUpdated")}</Badge>
256
+ <Badge variant="secondary" className="text-[10px] h-4 px-1.5 leading-none font-normal">{m.version_recentlyUpdated()}</Badge>
259
257
  )}
260
258
  <span className="text-muted-foreground ml-auto text-[10px] flex items-center gap-1">
261
259
  {v.updatedAt ? (
262
- <span>{t("version.updatedAt")} {formatDate(new Date(v.updatedAt), timezone, 'yyyy-MM-dd')}</span>
260
+ <span>{m.version_updatedAt()} {formatDate(new Date(v.updatedAt), timezone, 'yyyy-MM-dd')}</span>
263
261
  ) : (
264
262
  formatDate(new Date(v.createdAt), timezone, 'yyyy-MM-dd')
265
263
  )}
@@ -293,7 +291,7 @@ export function PageVersionTree({ versions, onRestore }: PageVersionTreeProps) {
293
291
  </Button>
294
292
  </TooltipTrigger>
295
293
  <TooltipContent>
296
- <p>{t("version.restoreToCurrent")}</p>
294
+ <p>{m.version_restoreToCurrent()}</p>
297
295
  </TooltipContent>
298
296
  </Tooltip>
299
297
  </div>
@@ -1,3 +1,4 @@
1
+ import { m } from '@/paraglide/messages.js'
1
2
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
3
  // AllBlue - 理想之海
3
4
  // Copyright (C) 2026 AllBlue Contributors
@@ -16,11 +17,11 @@
16
17
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
18
 
18
19
  import { useState, useRef, useEffect, useCallback } from "react"
19
- import { useTranslation } from "react-i18next"
20
20
  import { Bot, Loader2, User, Plus, Trash2, ChevronDown, MessageSquare } from "lucide-react"
21
21
  import { cn } from "@/lib/utils"
22
22
  import { toast } from '@/components/ui/sonner'
23
23
  import type { CanvasElement } from "@allbluecn/kernel"
24
+ import type { PrototypeComponentConfig } from "@/components/prototype"
24
25
  import { getAllComponents } from "@/lib/prototype-registry"
25
26
  import { generatePrototypeFn, type GeneratedComponent } from "@/plugins/core/prd/serverFns/ai/generate-prototype"
26
27
  import { computeStackPositions } from "@/lib/prd/stack-layout"
@@ -67,13 +68,13 @@ interface PRDAgentPanelProps {
67
68
  }
68
69
 
69
70
  /** 将会话按 updatedAt 分组(今天/昨天/本周/更早) */
70
- function groupConversations(conversations: ConversationItem[], t: (key: string) => string): Array<{ label: string; items: ConversationItem[] }> {
71
+ function groupConversations(conversations: ConversationItem[]): Array<{ label: string; items: ConversationItem[] }> {
71
72
  const now = new Date()
72
73
  const today = new Date(now.getFullYear(), now.getMonth(), now.getDate())
73
74
  const yesterday = new Date(today.getTime() - 86400000)
74
75
  const weekAgo = new Date(today.getTime() - 7 * 86400000)
75
76
 
76
- const groupKeys = ["agent.today", "agent.yesterday", "agent.thisWeek", "agent.earlier"]
77
+ const groupKeys = ["today", "yesterday", "thisWeek", "earlier"]
77
78
  const groups: Record<string, ConversationItem[]> = {
78
79
  [groupKeys[0]]: [],
79
80
  [groupKeys[1]]: [],
@@ -87,7 +88,13 @@ function groupConversations(conversations: ConversationItem[], t: (key: string)
87
88
  else if (d >= weekAgo) groups[groupKeys[2]].push(conv)
88
89
  else groups[groupKeys[3]].push(conv)
89
90
  }
90
- return groupKeys.map((key) => ({ label: t(key), items: groups[key] }))
91
+ const LABELS: Record<string, () => string> = {
92
+ today: m.chat_groups_today,
93
+ yesterday: m.chat_groups_yesterday,
94
+ thisWeek: m.chat_groups_thisWeek,
95
+ earlier: m.chat_groups_earlier,
96
+ }
97
+ return groupKeys.map((key) => ({ label: LABELS[key]?.() ?? key, items: groups[key] }))
91
98
  }
92
99
 
93
100
  /** 将 AI 生成的组件规格转换为 CanvasElement[] */
@@ -99,7 +106,7 @@ function generatedToElements(
99
106
 
100
107
  // 先确定每个组件最终采用的尺寸,再按实际高度纵向堆叠
101
108
  const resolved = components.map((comp) => {
102
- const config = allComponents.find((c) => c.type === comp.type)
109
+ const config = allComponents.find((c: PrototypeComponentConfig) => c.type === comp.type)
103
110
  const width = comp.width ?? config?.defaultWidth ?? 160
104
111
  // 未注册的自定义组件(如表格)通常内容较多,给更大的默认高度避免被压缩到不可见
105
112
  const height = comp.height ?? config?.defaultHeight ?? (config ? 48 : 120)
@@ -137,7 +144,6 @@ function generatedToElements(
137
144
  }
138
145
 
139
146
  export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel, onModelChange }: PRDAgentPanelProps) {
140
- const { t } = useTranslation("prd")
141
147
  const [messages, setMessages] = useState<ChatMessage[]>([])
142
148
  const [input, setInput] = useState("")
143
149
  const [loading, setLoading] = useState(false)
@@ -176,7 +182,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
176
182
  return
177
183
  }
178
184
  getAgentMessagesFn({ data: { conversationId } })
179
- .then((msgs) => {
185
+ .then((msgs: unknown[]) => {
180
186
  setMessages(
181
187
  (msgs as Array<{ id: string; role: string; content: string; isError: boolean }>).map((m) => ({
182
188
  id: m.id,
@@ -197,7 +203,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
197
203
 
198
204
  useEffect(() => {
199
205
  listEnabledModelsFn()
200
- .then((data) => {
206
+ .then((data: ModelOption[]) => {
201
207
  const typed = data as ModelOption[]
202
208
  setModels(typed)
203
209
  if (typed.length > 0 && !selectedModel) onModelChange(typed[0].model)
@@ -220,8 +226,8 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
220
226
  setConversationId(convId)
221
227
  refreshConversations()
222
228
  } catch (err) {
223
- const errMsg = err instanceof Error ? err.message : t("agent.createFailed")
224
- toast.error(t("agent.createFailed"), { description: errMsg })
229
+ const errMsg = err instanceof Error ? err.message : m.agent_createFailed()
230
+ toast.error(m.agent_createFailed(), { description: errMsg })
225
231
  return
226
232
  }
227
233
  }
@@ -240,7 +246,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
240
246
  data: { conversationId: convId, role: "user", content: trimmed },
241
247
  })
242
248
 
243
- const catalog = getAllComponents().map((c) => ({
249
+ const catalog = getAllComponents().map((c: PrototypeComponentConfig) => ({
244
250
  type: c.type,
245
251
  name: c.name,
246
252
  category: c.category,
@@ -255,7 +261,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
255
261
  onElementsChange([...elements, ...newElements])
256
262
  }
257
263
 
258
- const assistantContent = `${result.message}${t("agent.addedToCanvas", { count: newElements.length })}`
264
+ const assistantContent = `${result.message}${m.agent_addedToCanvas({ count: newElements.length })}`
259
265
  const assistantMsg: ChatMessage = {
260
266
  id: `a_${Date.now()}`,
261
267
  role: "assistant",
@@ -273,8 +279,8 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
273
279
  })
274
280
  refreshConversations()
275
281
  } catch (err) {
276
- const errMsg = err instanceof Error ? err.message : t("agent.generateFailed")
277
- const errorContent = `${t("agent.generateFailed")}:${errMsg}`
282
+ const errMsg = err instanceof Error ? err.message : m.agent_generateFailed()
283
+ const errorContent = `${m.agent_generateFailed()}:${errMsg}`
278
284
  const errorMsg: ChatMessage = {
279
285
  id: `e_${Date.now()}`,
280
286
  role: "assistant",
@@ -285,7 +291,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
285
291
  await saveAgentMessageFn({
286
292
  data: { conversationId: convId, role: "assistant", content: errorContent, isError: true },
287
293
  }).catch(() => {})
288
- toast.error(t("agent.prototypeFailed"), { description: errMsg })
294
+ toast.error(m.agent_prototypeFailed(), { description: errMsg })
289
295
  } finally {
290
296
  setLoading(false)
291
297
  }
@@ -301,14 +307,14 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
301
307
  <MessageSquare className="size-3 shrink-0" />
302
308
  <span className="truncate">
303
309
  {conversationId
304
- ? conversations.find((c) => c.id === conversationId)?.title ?? t("agent.unknownConv")
305
- : t("agent.newConv")}
310
+ ? conversations.find((c) => c.id === conversationId)?.title ?? m.agent_unknownConv()
311
+ : m.agent_newConv()}
306
312
  </span>
307
313
  <ChevronDown className="size-3 shrink-0" />
308
314
  </button>
309
315
  </DropdownMenuTrigger>
310
316
  <DropdownMenuContent align="start" className="min-w-56 max-h-80 overflow-y-auto rounded-lg p-1">
311
- {groupConversations(conversations, t).map(({ label, items }) => (
317
+ {groupConversations(conversations).map(({ label, items }) => (
312
318
  items.length > 0 && (
313
319
  <DropdownMenuGroup key={label}>
314
320
  <DropdownMenuLabel className="text-[10px] text-muted-foreground/60">{label}</DropdownMenuLabel>
@@ -338,7 +344,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
338
344
  )
339
345
  ))}
340
346
  {conversations.length === 0 && (
341
- <div className="px-2 py-3 text-center text-xs text-muted-foreground">{t("agent.noConversations")}</div>
347
+ <div className="px-2 py-3 text-center text-xs text-muted-foreground">{m.agent_noConversations()}</div>
342
348
  )}
343
349
  <DropdownMenuSeparator />
344
350
  <DropdownMenuItem
@@ -348,7 +354,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
348
354
  setMessages([])
349
355
  }}
350
356
  >
351
- <Plus className="size-3" /> {t("agent.newConversation")}
357
+ <Plus className="size-3" /> {m.agent_newConversation()}
352
358
  </DropdownMenuItem>
353
359
  {conversations.length > 0 && (
354
360
  <DropdownMenuItem
@@ -361,7 +367,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
361
367
  })
362
368
  }}
363
369
  >
364
- <Trash2 className="size-3" /> {t("agent.clearAll")}
370
+ <Trash2 className="size-3" /> {m.agent_clearAll()}
365
371
  </DropdownMenuItem>
366
372
  )}
367
373
  </DropdownMenuContent>
@@ -372,8 +378,8 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
372
378
  {messages.length === 0 ? (
373
379
  <div className="flex flex-col items-center justify-center h-full text-center gap-2 text-muted-foreground">
374
380
  <Bot className="size-8 opacity-40" />
375
- <p className="text-xs">{t("agent.emptyHint")}</p>
376
- <p className="text-[10px] opacity-60">{t("agent.emptyExample")}</p>
381
+ <p className="text-xs">{m.agent_emptyHint()}</p>
382
+ <p className="text-[10px] opacity-60">{m.agent_emptyExample()}</p>
377
383
  </div>
378
384
  ) : (
379
385
  messages.map((msg) => (
@@ -15,9 +15,7 @@
15
15
  // You should have received a copy of the GNU Affero General Public License
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
-
19
18
  import { useState, useEffect } from "react";
20
- import { useTranslation } from "react-i18next";
21
19
  import { cn } from "@/lib/utils";
22
20
  import { Badge } from "@/components/ui/badge";
23
21
  import { Button } from "@/components/ui/button";
@@ -29,10 +27,11 @@ import { maskEmail, formatTime, formatEditedTime } from "@/lib/comment-utils";
29
27
  import { UserAvatar } from "@/components/shared-kit";
30
28
  import type { AvatarConfig, ShapeType } from "@allbluecn/kernel";
31
29
  import { listCommentsFn, ignoreCommentFn } from "@/plugins/core/prd/serverFns/comments";
30
+ import { m } from "@/paraglide/messages.js";
32
31
 
33
32
  const SUBTABS = [
34
- { key: "comment", label: "comment.subtabComment", icon: <MessageSquare className="size-3.5" /> },
35
- { key: "review", label: "comment.subtabReview", icon: <ClipboardCheck className="size-3.5" /> },
33
+ { key: "comment", label: m.comment_subtabComment, icon: <MessageSquare className="size-3.5" /> },
34
+ { key: "review", label: m.comment_subtabReview, icon: <ClipboardCheck className="size-3.5" /> },
36
35
  ] as const;
37
36
 
38
37
  interface CommentUser {
@@ -57,7 +56,6 @@ interface PRDCommentReviewPanelProps {
57
56
  }
58
57
 
59
58
  export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
60
- const { t } = useTranslation("prd");
61
59
  const { data: session } = useSession();
62
60
  const [activeSubTab, setActiveSubTab] = useState("comment");
63
61
  const [comments, setComments] = useState<Comment[]>([]);
@@ -67,15 +65,15 @@ export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
67
65
  useEffect(() => {
68
66
  if (!session?.user?.id) {
69
67
  listCommentsFn({ data: { prdId } })
70
- .then((all) => setComments(all.map((c) => ({ ...c, createdAt: c.createdAt.toISOString(), updatedAt: c.updatedAt?.toISOString() ?? '', user: { ...c.user, avatarConfig: c.user.avatarConfig as AvatarConfig | null, bgShape: c.user.bgShape as ShapeType | null, bgColor: c.user.bgColor } }))))
68
+ .then((all: Awaited<ReturnType<typeof listCommentsFn>>) => setComments(all.map((c: any) => ({ ...c, createdAt: c.createdAt.toISOString(), updatedAt: c.updatedAt?.toISOString() ?? '', user: { ...c.user, avatarConfig: c.user.avatarConfig as AvatarConfig | null, bgShape: c.user.bgShape as ShapeType | null, bgColor: c.user.bgColor } }))))
71
69
  .catch(() => {});
72
70
  return;
73
71
  }
74
72
  listCommentsFn({ data: { prdId, includeResolved: true } })
75
- .then((all) => {
76
- const mapped = all.map((c) => ({ ...c, createdAt: c.createdAt.toISOString(), updatedAt: c.updatedAt?.toISOString() ?? '', user: { ...c.user, avatarConfig: c.user.avatarConfig as AvatarConfig | null, bgShape: c.user.bgShape as ShapeType | null, bgColor: c.user.bgColor } }));
77
- setComments(mapped.filter((c) => !c.resolved));
78
- setIgnoredIds(new Set(mapped.filter((c) => c.resolved).map((c) => c.id)));
73
+ .then((all: Awaited<ReturnType<typeof listCommentsFn>>) => {
74
+ const mapped = all.map((c: any) => ({ ...c, createdAt: c.createdAt.toISOString(), updatedAt: c.updatedAt?.toISOString() ?? '', user: { ...c.user, avatarConfig: c.user.avatarConfig as AvatarConfig | null, bgShape: c.user.bgShape as ShapeType | null, bgColor: c.user.bgColor } }));
75
+ setComments(mapped.filter((c: any) => !c.resolved));
76
+ setIgnoredIds(new Set(mapped.filter((c: any) => c.resolved).map((c: any) => c.id)));
79
77
  })
80
78
  .catch(() => {});
81
79
  }, [prdId, session?.user?.id]);
@@ -130,12 +128,12 @@ export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
130
128
  : "text-muted-foreground hover:text-foreground"
131
129
  )}
132
130
  >
133
- {tab.icon} {t(tab.label)}{tab.key === "comment" && commentCount > 0 && (
131
+ {tab.icon} {tab.label()}{tab.key === "comment" && commentCount > 0 && (
134
132
  <Tooltip>
135
133
  <TooltipTrigger asChild>
136
134
  <span className="text-[10px] text-muted-foreground ml-0.5">({commentCount})</span>
137
135
  </TooltipTrigger>
138
- <TooltipContent side="top" className="text-xs">{t("comment.countTooltip")}</TooltipContent>
136
+ <TooltipContent side="top" className="text-xs">{m.comment_countTooltip({ count: commentCount })}</TooltipContent>
139
137
  </Tooltip>
140
138
  )}
141
139
  </button>
@@ -146,7 +144,7 @@ export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
146
144
  <div className="flex-1 overflow-y-auto p-3 space-y-3">
147
145
  {/* <span className="text-xs font-medium text-muted-foreground">评论</span> */}
148
146
  {comments.length === 0 ? (
149
- <p className="text-xs text-muted-foreground text-center py-4">{t("comment.noComments")}</p>
147
+ <p className="text-xs text-muted-foreground text-center py-4">{m.comment_noComments()}</p>
150
148
  ) : (
151
149
  <div className="space-y-3">
152
150
  {comments.map((c) => {
@@ -167,7 +165,7 @@ export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
167
165
  <button onClick={() => toggleExpand(c.id)} className="flex-1 min-w-0 flex items-center gap-1.5 text-left cursor-pointer hover:bg-muted/30 rounded px-1 -mx-1 py-0.5 transition-colors">
168
166
  <span className="text-sm font-medium">{c.user.username}</span>
169
167
  <span className="text-[10px] text-muted-foreground">{maskEmail(c.user.email)}</span>
170
- <Badge variant="outline" className="text-[9px] h-3.5 px-1 leading-none font-normal text-muted-foreground">{t("comment.ignored")}</Badge>
168
+ <Badge variant="outline" className="text-[9px] h-3.5 px-1 leading-none font-normal text-muted-foreground">{m.prd_comment_ignored()}</Badge>
171
169
  <span className="text-[10px] text-muted-foreground ml-auto">
172
170
  {isEdited ? formatEditedTime(c.updatedAt) : formatTime(c.createdAt)}
173
171
  </span>
@@ -177,10 +175,10 @@ export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
177
175
  <div className="flex items-center gap-1.5 flex-wrap">
178
176
  <span className="text-sm font-medium">{c.user.username}</span>
179
177
  {isEdited && (
180
- <Badge variant="secondary" className="text-[9px] h-3.5 px-1 leading-none font-normal">{t("comment.modified")}</Badge>
178
+ <Badge variant="secondary" className="text-[9px] h-3.5 px-1 leading-none font-normal">{m.comment_modified()}</Badge>
181
179
  )}
182
180
  {isIgnored && (
183
- <Badge variant="outline" className="text-[9px] h-3.5 px-1 leading-none font-normal text-muted-foreground">{t("comment.ignored")}</Badge>
181
+ <Badge variant="outline" className="text-[9px] h-3.5 px-1 leading-none font-normal text-muted-foreground">{m.prd_comment_ignored()}</Badge>
184
182
  )}
185
183
  <span className="text-[10px] text-muted-foreground ml-auto">
186
184
  {isEdited ? formatEditedTime(c.updatedAt) : formatTime(c.createdAt)}
@@ -189,22 +187,22 @@ export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
189
187
  <span className="text-[10px] text-muted-foreground block">{maskEmail(c.user.email)}</span>
190
188
  <p className=" break-words">{c.content}</p>
191
189
  <div className="flex items-center gap-1 pt-0.5">
192
- <Button variant="ghost" size="sm" className="h-5 text-[10px] px-1.5 gap-0.5 text-muted-foreground hover:text-green-600 disabled:opacity-40" disabled={isIgnored} onClick={() => toast.success(t("comment.accepted"))}>
190
+ <Button variant="ghost" size="sm" className="h-5 text-[10px] px-1.5 gap-0.5 text-muted-foreground hover:text-green-600 disabled:opacity-40" disabled={isIgnored} onClick={() => toast.success(m.comment_accepted())}>
193
191
  <Check className="size-2.5" />
194
- {t("comment.accept")}
192
+ {m.comment_accept()}
195
193
  </Button>
196
- <Button variant="ghost" size="sm" className="h-5 text-[10px] px-1.5 gap-0.5 text-muted-foreground hover:text-foreground disabled:opacity-40" disabled={isIgnored} onClick={() => toast.info(t("comment.replyComingSoon"))}>
194
+ <Button variant="ghost" size="sm" className="h-5 text-[10px] px-1.5 gap-0.5 text-muted-foreground hover:text-foreground disabled:opacity-40" disabled={isIgnored} onClick={() => toast.info(m.comment_replyComingSoon())}>
197
195
  <Reply className="size-2.5" />
198
- {t("comment.reply")}
196
+ {m.story_comment_reply()}
199
197
  </Button>
200
198
  <Button variant="ghost" size="sm" className="h-5 text-[10px] px-1.5 gap-0.5 text-muted-foreground hover:text-red-600" onClick={() => toggleIgnore(c.id)}>
201
199
  <X className="size-2.5" />
202
- {isIgnored ? t("comment.unignore") : t("comment.ignore")}
200
+ {isIgnored ? m.comment_unignore() : m.comment_ignore()}
203
201
  </Button>
204
202
  {isIgnored && (
205
203
  <Button variant="ghost" size="sm" className="h-5 text-[10px] px-1.5 gap-0.5 text-muted-foreground hover:text-foreground" onClick={() => toggleExpand(c.id)}>
206
204
  <ChevronUp className="size-2.5" />
207
- {t("comment.collapse")}
205
+ {m.comment_collapse()}
208
206
  </Button>
209
207
  )}
210
208
  </div>
@@ -219,7 +217,7 @@ export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
219
217
  ) : (
220
218
  <div className="flex-1 overflow-y-auto p-3 space-y-3">
221
219
  {/* <span className="text-xs font-medium text-muted-foreground">评审</span> */}
222
- <p className="text-xs text-muted-foreground text-center py-4">{t("comment.reviewComingSoon")}</p>
220
+ <p className="text-xs text-muted-foreground text-center py-4">{m.comment_reviewComingSoon()}</p>
223
221
  </div>
224
222
  )}
225
223
  </div>
@@ -15,8 +15,8 @@
15
15
  // You should have received a copy of the GNU Affero General Public License
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
- import { useTranslation } from "react-i18next";
19
18
  import { Trash2, Package } from "lucide-react";
19
+ import { m } from '@/paraglide/messages.js'
20
20
  import type { CanvasElement } from "@allbluecn/kernel";
21
21
  import { getComponent } from "@/lib/prototype-registry";
22
22
  import { Button } from "@/components/ui/button";
@@ -37,7 +37,6 @@ export function PRDComponentEditorContent({
37
37
  onElementChange,
38
38
  onDeleteElement,
39
39
  }: PRDComponentEditorContentProps) {
40
- const { t } = useTranslation("prd");
41
40
  if (!element) {
42
41
  return (
43
42
  <div className="flex-1 flex flex-col justify-center px-4 overflow-auto mt-160">
@@ -46,8 +45,8 @@ export function PRDComponentEditorContent({
46
45
  <Skeleton className="h-5 w-[65%] mx-auto rounded-md opacity-40" />
47
46
  <Skeleton className="h-5 w-[80%] mx-auto rounded-md opacity-40" />
48
47
  <div className="pt-5 text-center">
49
- <p className="text-sm text-muted-foreground">{t("editor.noSelection")}</p>
50
- <p className="text-xs text-muted-foreground/50 mt-1">{t("editor.noSelectionHint")}</p>
48
+ <p className="text-sm text-muted-foreground">{m.editor_noSelection()}</p>
49
+ <p className="text-xs text-muted-foreground/50 mt-1">{m.editor_noSelectionHint()}</p>
51
50
  </div>
52
51
  </div>
53
52
  </div>
@@ -71,18 +70,18 @@ export function PRDComponentEditorContent({
71
70
  </div>
72
71
 
73
72
  {editableProps && editableProps.length > 0 && (
74
- <CollapsibleSection title={t("editor.tabContent")} defaultOpen>
73
+ <CollapsibleSection title={m.editor_tabContent()} defaultOpen>
75
74
  <ContentSection fields={editableProps} element={element} onElementChange={onElementChange} />
76
75
  </CollapsibleSection>
77
76
  )}
78
77
 
79
- <CollapsibleSection title={t("editor.tabStyle")} defaultOpen>
78
+ <CollapsibleSection title={m.editor_tabStyle()} defaultOpen>
80
79
  {STYLE_FIELDS.map((field) => (
81
80
  <StyleFieldRow key={field.key} field={field} element={element} onElementChange={onElementChange} />
82
81
  ))}
83
82
  </CollapsibleSection>
84
83
 
85
- <CollapsibleSection title={t("editor.tabPosition")} defaultOpen={false}>
84
+ <CollapsibleSection title={m.editor_tabPosition()} defaultOpen={false}>
86
85
  <PositionSection element={element} />
87
86
  </CollapsibleSection>
88
87
  </div>
@@ -17,7 +17,7 @@
17
17
 
18
18
  import { cn } from "@/lib/utils"
19
19
  import { useEffect, useMemo, useState } from "react";
20
- import { useTranslation } from "react-i18next";
20
+ import { m } from '@/paraglide/messages.js'
21
21
  import { Link } from "@tanstack/react-router";
22
22
  import { Card } from "@/components/ui/card";
23
23
  import { Button } from "@/components/ui/button";
@@ -63,22 +63,27 @@ interface StatCard {
63
63
  accent: string;
64
64
  }
65
65
 
66
- function formatRelative(dateStr: string, timezone: string, t: (key: string, opts?: Record<string, number>) => string): string {
66
+ function formatRelative(dateStr: string, timezone: string): string {
67
67
  const date = new Date(dateStr);
68
68
  const now = new Date();
69
69
  const diffMs = now.getTime() - date.getTime();
70
70
  const minutes = Math.floor(diffMs / 60000);
71
71
  const hours = Math.floor(minutes / 60);
72
72
  const days = Math.floor(hours / 24);
73
- if (minutes < 1) return t("dashboard:dashboard.justNow");
74
- if (minutes < 60) return t("dashboard:dashboard.minutesAgo", { count: minutes });
75
- if (hours < 24) return t("dashboard:dashboard.hoursAgo", { count: hours });
76
- if (days < 7) return t("dashboard:dashboard.daysAgo", { count: days });
73
+ if (minutes < 1) return m.dashboard_dashboard_justNow();
74
+ if (minutes < 60) return m.dashboard_dashboard_minutesAgo({ count: minutes });
75
+ if (hours < 24) return m.dashboard_dashboard_hoursAgo({ count: hours });
76
+ if (days < 7) return m.dashboard_dashboard_daysAgo({ count: days });
77
77
  return formatDate(date, timezone, 'yyyy-MM-dd');
78
78
  }
79
79
 
80
+ const STAT_LABELS: Record<string, () => string> = {
81
+ "dashboard:dashboard.totalCount": m.dashboard_dashboard_totalCount,
82
+ "dashboard:dashboard.weekNew": m.dashboard_dashboard_weekNew,
83
+ "dashboard:dashboard.updated24h": m.dashboard_dashboard_updated24h,
84
+ };
85
+
80
86
  export function PRDDashboard() {
81
- const { t } = useTranslation(["prd", "common", "dashboard"]);
82
87
  const [prds, setPrds] = useState<PRDItem[]>([]);
83
88
  const [loading, setLoading] = useState(true);
84
89
  const [search, setSearch] = useState("");
@@ -183,29 +188,29 @@ export function PRDDashboard() {
183
188
  <LayoutPanelTopIcon size={56} className="mb-4 text-primary" />
184
189
  <h1 className="text-2xl font-semibold">PRD</h1>
185
190
  <p className="mt-2 max-w-2xl text-sm text-muted-foreground">
186
- {t("dashboard:dashboard.subtitle")}
191
+ {m.dashboard_dashboard_subtitle()}
187
192
  </p>
188
193
  <div className="mx-auto mt-6 flex w-full max-w-2xl flex-col items-center gap-3">
189
194
  <div className="relative w-full">
190
195
  <Search className="absolute left-6 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
191
196
  <Input
192
197
  value={search}
193
- onChange={(e) => setSearch(e.target.value)}
194
- placeholder={t("common:button.search")}
198
+ onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearch(e.target.value)}
199
+ placeholder={m.common_button_search()}
195
200
  className="h-14 rounded-3xl bg-background/60 pl-12 dark:border-primary/40"
196
201
  />
197
202
  </div>
198
203
  </div>
199
204
  <Button onClick={() => setCreateOpen(true)} className="mt-6">
200
205
  <Plus className="size-4" />
201
- {t("dashboard:dashboard.newPrd")}
206
+ {m.dashboard_dashboard_newPrd()}
202
207
  </Button>
203
208
  </div>
204
209
 
205
210
  <div className="grid gap-4 sm:grid-cols-3">
206
211
  {stats.map((stat) => (
207
212
  <Card key={stat.title} className="p-5">
208
- <p className="text-sm font-medium text-muted-foreground">{t(stat.title)}</p>
213
+ <p className="text-sm font-medium text-muted-foreground">{STAT_LABELS[stat.title]?.() ?? stat.title}</p>
209
214
  <div className={`mt-2 text-3xl font-bold ${stat.accent}`}>{stat.value}</div>
210
215
  </Card>
211
216
  ))}
@@ -214,14 +219,14 @@ export function PRDDashboard() {
214
219
  {loading ? (
215
220
  <Card className="mt-6 flex flex-col items-center gap-2 p-16 text-muted-foreground">
216
221
  <LoaderPinwheel className="size-6 animate-spin" />
217
- <span>{t("common:status.loading")}</span>
222
+ <span>{m.common_status_loading()}</span>
218
223
  </Card>
219
224
  ) : filtered.length === 0 ? (
220
225
  <Card className="mt-6 flex flex-col items-center justify-center gap-4 p-16 text-center">
221
226
  <div>
222
- <h2 className="text-lg font-medium">{t("dashboard:dashboard.noPrd")}</h2>
227
+ <h2 className="text-lg font-medium">{m.dashboard_dashboard_noPrd()}</h2>
223
228
  <p className="mt-1 text-sm text-muted-foreground">
224
- {search.trim() ? t("dashboard:dashboard.noMatch") : t("dashboard:dashboard.noPrdHint")}
229
+ {search.trim() ? m.dashboard_dashboard_noMatch() : m.dashboard_dashboard_noPrdHint()}
225
230
  </p>
226
231
  </div>
227
232
  </Card>
@@ -240,7 +245,7 @@ export function PRDDashboard() {
240
245
  variant="ghost"
241
246
  size="icon"
242
247
  className="relative z-10 size-7 opacity-0 group-hover:opacity-100"
243
- aria-label={t("dashboard:dashboard.deletePrd")}
248
+ aria-label={m.dashboard_dashboard_deletePrd()}
244
249
  onClick={() => setPendingDeleteId(prd.id)}
245
250
  >
246
251
  <Trash2 className="size-4 text-muted-foreground" />
@@ -255,12 +260,12 @@ export function PRDDashboard() {
255
260
  </div>
256
261
  )}
257
262
  <p className="mt-1 line-clamp-2 min-h-10 text-sm text-muted-foreground">
258
- {prd.description?.trim() || t("dashboard:dashboard.noDescription")}
263
+ {prd.description?.trim() || m.dashboard_dashboard_noDescription()}
259
264
  </p>
260
265
  <div className="mt-4 flex items-center gap-4 text-xs text-muted-foreground">
261
266
  <span className="flex items-center gap-1">
262
267
  <Clock className="size-3.5" />
263
- {t("dashboard:dashboard.updatedAt")} {formatRelative(prd.updatedAt, timezone, t)}
268
+ {m.dashboard_dashboard_updatedAt()} {formatRelative(prd.updatedAt, timezone)}
264
269
  </span>
265
270
  </div>
266
271
  </Card>
@@ -278,21 +283,21 @@ export function PRDDashboard() {
278
283
 
279
284
  <AlertDialog
280
285
  open={!!pendingDeleteId}
281
- onOpenChange={(open) => {
286
+ onOpenChange={(open: boolean) => {
282
287
  if (!open) setPendingDeleteId(null);
283
288
  }}
284
289
  >
285
290
  <AlertDialogContent>
286
291
  <AlertDialogHeader>
287
- <AlertDialogTitle>{t("dashboard:dashboard.confirmDeleteTitle")}</AlertDialogTitle>
292
+ <AlertDialogTitle>{m.dashboard_dashboard_confirmDeleteTitle()}</AlertDialogTitle>
288
293
  <AlertDialogDescription>
289
- {t("dashboard:dashboard.confirmDeleteDesc")}
294
+ {m.dashboard_dashboard_confirmDeleteDesc()}
290
295
  </AlertDialogDescription>
291
296
  </AlertDialogHeader>
292
297
  <AlertDialogFooter>
293
- <AlertDialogCancel disabled={deleting}>{t("common:button.cancel")}</AlertDialogCancel>
298
+ <AlertDialogCancel disabled={deleting}>{m.common_button_cancel()}</AlertDialogCancel>
294
299
  <AlertDialogAction onClick={handleConfirmDelete} disabled={deleting}>
295
- {deleting ? t("common:status.deleting") : t("dashboard:dashboard.confirmDeleteTitle")}
300
+ {deleting ? m.common_status_deleting() : m.dashboard_dashboard_confirmDeleteTitle()}
296
301
  </AlertDialogAction>
297
302
  </AlertDialogFooter>
298
303
  </AlertDialogContent>
@@ -15,17 +15,15 @@
15
15
  // You should have received a copy of the GNU Affero General Public License
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
-
19
18
  import React from "react";
19
+ import { m } from '@/paraglide/messages.js'
20
20
  import { lazy } from "react";
21
- import { useTranslation } from "react-i18next";
22
21
  import { cn } from "@/lib/utils";
23
22
  import { Maximize2, Minimize2, } from "lucide-react";
24
23
 
25
24
  const NotionDocEditor = lazy(() => import("@/components/tiptap/notion-like").then(m => ({ default: m.NotionDocEditor })));
26
25
  import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
27
26
 
28
-
29
27
  interface PRDDocPanelProps {
30
28
  className?: string;
31
29
  content?: { html: string; markdown: string } | { text: string } | string;
@@ -39,14 +37,13 @@ interface PRDDocPanelProps {
39
37
  }
40
38
 
41
39
  export function PRDDocPanel({ className, content, onContentChange, autoSaveTime, saving, widthMode, onWidthModeChange, readOnly, onEditorReady }: PRDDocPanelProps) {
42
- const { t } = useTranslation("prd");
43
40
  return (
44
41
  <div className={cn("flex flex-col h-full", className)}>
45
42
  <div className="shrink-0 flex items-center justify-between gap-1 px-4 h-10 border-b bg-muted/5">
46
43
  <div className="flex items-center gap-2">
47
- <span className="text-xs font-medium text-muted-foreground">{t("docPanel.title")}</span>
44
+ <span className="text-xs font-medium text-muted-foreground">{m.docPanel_title()}</span>
48
45
  {saving ? (
49
- <span className="text-[10px] text-muted-foreground/40">{t("docPanel.saving")}</span>
46
+ <span className="text-[10px] text-muted-foreground/40">{m.docPanel_saving()}</span>
50
47
  ) : autoSaveTime ? (
51
48
  <span className="text-[10px] text-muted-foreground/40">{autoSaveTime}</span>
52
49
  ) : null}
@@ -68,7 +65,7 @@ export function PRDDocPanel({ className, content, onContentChange, autoSaveTime,
68
65
  </button>
69
66
  </TooltipTrigger>
70
67
  <TooltipContent>
71
- <p>{t("docPanel.wider")}</p>
68
+ <p>{m.docPanel_wider()}</p>
72
69
  </TooltipContent>
73
70
  </Tooltip>
74
71
 
@@ -87,7 +84,7 @@ export function PRDDocPanel({ className, content, onContentChange, autoSaveTime,
87
84
  </button>
88
85
  </TooltipTrigger>
89
86
  <TooltipContent>
90
- <p>{t("docPanel.defaultWidth")}</p>
87
+ <p>{m.docPanel_defaultWidth()}</p>
91
88
  </TooltipContent>
92
89
  </Tooltip>
93
90
  </div>
@@ -105,7 +102,7 @@ export function PRDDocPanel({ className, content, onContentChange, autoSaveTime,
105
102
  <NotionDocEditor
106
103
  content={content}
107
104
  onChange={onContentChange}
108
- placeholder={t("docPanel.placeholder")}
105
+ placeholder={m.docPanel_placeholder()}
109
106
  readOnly={readOnly}
110
107
  onEditorReady={onEditorReady}
111
108
  showHeader={false}