@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,8 +15,10 @@
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 { m } from "@/paraglide/messages.js";
19
+
18
20
  export const EXPIRY_OPTIONS = [
19
- { value: "7", labelKey: "sharePanel.expiry7" },
20
- { value: "30", labelKey: "sharePanel.expiry30" },
21
- { value: "90", labelKey: "sharePanel.expiry90" },
21
+ { value: "7", label: m.sharePanel_expiry7 },
22
+ { value: "30", label: m.sharePanel_expiry30 },
23
+ { value: "90", label: m.sharePanel_expiry90 },
22
24
  ];
@@ -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, useEffect, useCallback, useMemo } 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 { Input } from "@/components/ui/input";
@@ -48,7 +47,6 @@ import { sortByVersionDesc } from "./prd-share-panel/utils";
48
47
  import { SingleVersionShareCard } from "./prd-share-panel/components/single-version-share-card";
49
48
 
50
49
  export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
51
- const { t } = useTranslation("prd");
52
50
  const [versions, setVersions] = useState<any[]>([]);
53
51
  const [enabled, setEnabled] = useState(false);
54
52
  const [selectedVersionIds, setSelectedVersionIds] = useState<Set<string>>(new Set());
@@ -125,21 +123,21 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
125
123
  const data = await togglePrdSharePasswordFn({ data: { prdId, enabled: v } });
126
124
  setEnablePassword(data.hasPassword);
127
125
  if (data.password) setPassword(data.password);
128
- toast.success(v ? t("sharePanel.passwordEnabled") : t("sharePanel.passwordDisabled"));
126
+ toast.success(v ? m.sharePanel_passwordEnabled() : m.sharePanel_passwordDisabled());
129
127
  } catch {
130
- toast.error(v ? t("sharePanel.enablePasswordFailed") : t("sharePanel.disablePasswordFailed"));
128
+ toast.error(v ? m.sharePanel_enablePasswordFailed() : m.sharePanel_disablePasswordFailed());
131
129
  }
132
- }, [prdId, t]);
130
+ }, [prdId]);
133
131
 
134
132
  const generateNewPassword = useCallback(async () => {
135
133
  try {
136
134
  const data = await setPrdSharePasswordFn({ data: { prdId } });
137
135
  setPassword(data.password);
138
- toast.success(t("sharePanel.passwordUpdated"));
136
+ toast.success(m.sharePanel_passwordUpdated());
139
137
  } catch {
140
- toast.error(t("sharePanel.passwordGenerateFailed"));
138
+ toast.error(m.sharePanel_passwordGenerateFailed());
141
139
  }
142
- }, [prdId, t]);
140
+ }, [prdId]);
143
141
 
144
142
  const latestUpdatedVersionId = useMemo(() => {
145
143
  if (!versions.length) return null;
@@ -168,33 +166,33 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
168
166
  try {
169
167
  await createPrdShareFn({ data: { prdId, enabled: newEnabled } });
170
168
  setEnabled(newEnabled);
171
- toast.success(newEnabled ? t("sharePanel.shareEnabled") : t("sharePanel.shareDisabled"));
169
+ toast.success(newEnabled ? m.sharePanel_shareEnabled() : m.sharePanel_shareDisabled());
172
170
  } catch {
173
- toast.error(newEnabled ? t("sharePanel.enableShareFailed") : t("sharePanel.disableShareFailed"));
171
+ toast.error(newEnabled ? m.sharePanel_enableShareFailed() : m.sharePanel_disableShareFailed());
174
172
  } finally {
175
173
  setSaving(false);
176
174
  }
177
- }, [prdId, t]);
175
+ }, [prdId]);
178
176
 
179
177
  const handleCopy = useCallback(async () => {
180
178
  const separator = shareLink.includes('?') ? '&' : '?';
181
179
  let text = `${shareLink}${separator}from=copylink`;
182
180
  if (copyPasswordOnShare && enablePassword && password) {
183
- text = `${text}\n${t("sharePanel.passwordLabel")}: ${password}`;
181
+ text = `${text}\n${m.sharePanel_passwordLabel()}: ${password}`;
184
182
  }
185
183
  try {
186
184
  await navigator.clipboard.writeText(text);
187
185
  setCopied(true);
188
186
  setTimeout(() => setCopied(false), 2000);
189
187
  if (enablePassword && password) {
190
- toast.success(t("sharePanel.copiedWithPassword", { password }), { duration: 5000 });
188
+ toast.success(m.sharePanel_copiedWithPassword({ password }), { duration: 5000 });
191
189
  } else {
192
- toast.success(t("sharePanel.copied"));
190
+ toast.success(m.sharePanel_copied());
193
191
  }
194
192
  } catch {
195
- toast.error(t("sharePanel.copyFailed"));
193
+ toast.error(m.sharePanel_copyFailed());
196
194
  }
197
- }, [shareLink, enablePassword, password, copyPasswordOnShare, t]);
195
+ }, [shareLink, enablePassword, password, copyPasswordOnShare]);
198
196
 
199
197
  const handleSave = useCallback(async () => {
200
198
  if (!enabled) return;
@@ -208,13 +206,13 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
208
206
  },
209
207
  });
210
208
  setSavedVersionIds(new Set(selectedVersionIds));
211
- toast.success(t("sharePanel.versionSelectionSaved"));
209
+ toast.success(m.sharePanel_versionSelectionSaved());
212
210
  } catch {
213
- toast.error(t("sharePanel.saveSelectionFailed"));
211
+ toast.error(m.sharePanel_saveSelectionFailed());
214
212
  } finally {
215
213
  setSaving(false);
216
214
  }
217
- }, [prdId, enabled, selectedVersionIds, expiryDays, t]);
215
+ }, [prdId, enabled, selectedVersionIds, expiryDays]);
218
216
 
219
217
  const allSelected = versions.length > 0 && versions.every((v: any) => selectedVersionIds.has(v.id));
220
218
 
@@ -262,13 +260,13 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
262
260
  }));
263
261
  setSingleVersionShareLinks(formattedShares.sort(sortByVersionDesc));
264
262
 
265
- toast.success(t("sharePanel.singleShareEnabled"));
263
+ toast.success(m.sharePanel_singleShareEnabled());
266
264
  } catch {
267
- toast.error(t("sharePanel.singleShareFailed"));
265
+ toast.error(m.sharePanel_singleShareFailed());
268
266
  } finally {
269
267
  setSingleVersionSaving(false);
270
268
  }
271
- }, [prdId, selectedVersionIds, versions, enablePassword, password, expiryDays, t]);
269
+ }, [prdId, selectedVersionIds, versions, enablePassword, password, expiryDays]);
272
270
 
273
271
  const handleSingleVersionToggle = useCallback(async (shareId: string, enabled: boolean) => {
274
272
  try {
@@ -280,11 +278,11 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
280
278
  share.id === shareId ? { ...share, enabled } : share
281
279
  )
282
280
  );
283
- toast.success(enabled ? t("sharePanel.shareEnabled") : t("sharePanel.shareDisabled"));
281
+ toast.success(enabled ? m.sharePanel_shareEnabled() : m.sharePanel_shareDisabled());
284
282
  } catch {
285
- toast.error(t("sharePanel.operationFailed"));
283
+ toast.error(m.sharePanel_operationFailed());
286
284
  }
287
- }, [t]);
285
+ }, []);
288
286
 
289
287
  const handleSingleVersionPasswordReset = useCallback(async (shareId: string) => {
290
288
  try {
@@ -296,11 +294,11 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
296
294
  share.id === shareId ? { ...share, password: data.password } : share
297
295
  )
298
296
  );
299
- toast.success(t("sharePanel.passwordReset"));
297
+ toast.success(m.sharePanel_passwordReset());
300
298
  } catch {
301
- toast.error(t("sharePanel.resetPasswordFailed"));
299
+ toast.error(m.sharePanel_resetPasswordFailed());
302
300
  }
303
- }, [t]);
301
+ }, []);
304
302
 
305
303
  const handleSingleVersionExpiryUpdate = useCallback(async (shareId: string, expiryDays: string) => {
306
304
  try {
@@ -318,11 +316,11 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
318
316
  share.id === shareId ? { ...share, expiresAt } : share
319
317
  )
320
318
  );
321
- toast.success(t("sharePanel.expiryUpdated"));
319
+ toast.success(m.sharePanel_expiryUpdated());
322
320
  } catch {
323
- toast.error(t("sharePanel.updateExpiryFailed"));
321
+ toast.error(m.sharePanel_updateExpiryFailed());
324
322
  }
325
- }, [t]);
323
+ }, []);
326
324
 
327
325
  const handleSingleVersionPasswordToggle = useCallback(async (shareId: string, enabled: boolean) => {
328
326
  try {
@@ -338,22 +336,22 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
338
336
  } : share
339
337
  )
340
338
  );
341
- toast.success(enabled ? t("sharePanel.passwordEnabled") : t("sharePanel.passwordDisabled"));
339
+ toast.success(enabled ? m.sharePanel_passwordEnabled() : m.sharePanel_passwordDisabled());
342
340
  } catch {
343
- toast.error(t("sharePanel.operationFailed"));
341
+ toast.error(m.sharePanel_operationFailed());
344
342
  }
345
- }, [t]);
343
+ }, []);
346
344
 
347
345
  const handleCopySingleVersionLink = useCallback(async (link: string) => {
348
346
  try {
349
347
  const separator = link.includes('?') ? '&' : '?';
350
348
  const result = `${link}${separator}from=copylink`;
351
349
  await navigator.clipboard.writeText(result);
352
- toast.success(t("sharePanel.copied"));
350
+ toast.success(m.sharePanel_copied());
353
351
  } catch {
354
- toast.error(t("sharePanel.copyFailed"));
352
+ toast.error(m.sharePanel_copyFailed());
355
353
  }
356
- }, [t]);
354
+ }, []);
357
355
 
358
356
  const handleDeleteSingleVersion = useCallback(async (shareId: string) => {
359
357
  try {
@@ -361,11 +359,11 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
361
359
 
362
360
  // 移除本地状态
363
361
  setSingleVersionShareLinks(prev => prev.filter(share => share.id !== shareId));
364
- toast.success(t("sharePanel.singleShareDeleted"));
362
+ toast.success(m.sharePanel_singleShareDeleted());
365
363
  } catch {
366
- toast.error(t("sharePanel.deleteFailed"));
364
+ toast.error(m.sharePanel_deleteFailed());
367
365
  }
368
- }, [t]);
366
+ }, []);
369
367
 
370
368
  // 根据过期时间计算有效期天数
371
369
  const getExpiryDaysValue = useCallback((expiresAt: string | Date | null) => {
@@ -382,13 +380,13 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
382
380
  <div className="flex gap-4 min-w-0 overflow-x-hidden">
383
381
  <div className="w-2/5 flex flex-col min-h-0 min-w-0">
384
382
  <div className="flex items-center justify-between mb-2">
385
- <Label className="text-sm font-medium">{t("sharePanel.versionSelection")}</Label>
383
+ <Label className="text-sm font-medium">{m.sharePanel_versionSelection()}</Label>
386
384
  <div className="flex items-center gap-1">
387
385
  <Button variant="ghost" size="sm" className="h-6 text-xs px-2 text-muted-foreground" onClick={handleSelectAll}>
388
- {allSelected ? t("sharePanel.deselectAll") : t("sharePanel.selectAll")}
386
+ {allSelected ? m.sharePanel_deselectAll() : m.sharePanel_selectAll()}
389
387
  </Button>
390
388
  <Button variant="ghost" size="sm" className="h-6 text-xs px-2 text-muted-foreground" onClick={handleRestoreSaved}>
391
- {t("sharePanel.restoreSaved")}
389
+ {m.sharePanel_restoreSaved()}
392
390
  </Button>
393
391
  </div>
394
392
  </div>
@@ -398,7 +396,7 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
398
396
  )}>
399
397
  <div className="flex-1 overflow-y-auto space-y-1 p-2">
400
398
  {versions.length === 0 ? (
401
- <p className="text-sm text-muted-foreground text-center py-3">{t("sharePanel.noVersions")}</p>
399
+ <p className="text-sm text-muted-foreground text-center py-3">{m.sharePanel_noVersions()}</p>
402
400
  ) : (
403
401
  versions.map((v: any) => (
404
402
  <label
@@ -412,7 +410,7 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
412
410
  <span className="flex items-center gap-1.5">
413
411
  {v.versionLabel}
414
412
  {v.id === latestUpdatedVersionId && (
415
- <Badge variant="secondary" className="text-[10px] h-4 px-1.5 leading-none font-normal">{t("sharePanel.recentlyUpdated")}</Badge>
413
+ <Badge variant="secondary" className="text-[10px] h-4 px-1.5 leading-none font-normal">{m.sharePanel_recentlyUpdated()}</Badge>
416
414
  )}
417
415
  </span>
418
416
  </label>
@@ -425,7 +423,7 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
425
423
  onClick={handleSave}
426
424
  disabled={saving || !enabled || selectedVersionIds.size === 0}
427
425
  >
428
- {saving ? t("sharePanel.saving") : t("sharePanel.saveSelection")}
426
+ {saving ? m.sharePanel_saving() : m.sharePanel_saveSelection()}
429
427
  </Button>
430
428
  </div>
431
429
  </div>
@@ -433,26 +431,26 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
433
431
 
434
432
  <div className="flex-1 space-y-4 min-h-0 min-w-0 overflow-y-auto overflow-x-hidden">
435
433
  <div className="flex items-center justify-between">
436
- <span className="text-sm font-medium">{t("sharePanel.enableShare")}</span>
434
+ <span className="text-sm font-medium">{m.sharePanel_enableShare()}</span>
437
435
  <Switch checked={enabled} onCheckedChange={handleToggle} />
438
436
  </div>
439
437
 
440
438
  <div className={cn("space-y-4", !enabled && "opacity-50 pointer-events-none")}>
441
439
  <div className="space-y-2">
442
- <Label className="text-sm text-muted-foreground">{t("sharePanel.shareLink")}</Label>
440
+ <Label className="text-sm text-muted-foreground">{m.sharePanel_shareLink()}</Label>
443
441
  <Input value={shareLink} readOnly className="h-9 text-xs flex-1 font-mono w-full max-w-full" />
444
442
  </div>
445
443
 
446
444
  <div className="space-y-2">
447
445
  <div className="flex items-center justify-between">
448
- <Label className="text-sm text-muted-foreground">{t("sharePanel.enablePassword")}
446
+ <Label className="text-sm text-muted-foreground">{m.sharePanel_enablePassword()}
449
447
  <div className={cn("inline-flex items-center gap-2 ml-2", !enablePassword && "opacity-50 pointer-events-none")}>
450
448
  <Checkbox
451
449
  id="copy-password-on-share"
452
450
  checked={copyPasswordOnShare}
453
451
  onCheckedChange={(v) => setCopyPasswordOnShare(v === true)}
454
452
  />
455
- <Label htmlFor="copy-password-on-share" className="text-sm cursor-pointer">{t("sharePanel.copyPasswordOnShare")}</Label>
453
+ <Label htmlFor="copy-password-on-share" className="text-sm cursor-pointer">{m.sharePanel_copyPasswordOnShare()}</Label>
456
454
  </div>
457
455
  </Label>
458
456
 
@@ -472,12 +470,12 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
472
470
  />
473
471
  <Tooltip>
474
472
  <TooltipTrigger asChild>
475
- <Button variant="outline" className="h-9 w-9 p-0" onClick={() => { navigator.clipboard.writeText(password); toast.success(t("sharePanel.passwordCopied")); }}>
473
+ <Button variant="outline" className="h-9 w-9 p-0" onClick={() => { navigator.clipboard.writeText(password); toast.success(m.sharePanel_passwordCopied()); }}>
476
474
  <Copy className="size-4" />
477
475
  </Button>
478
476
  </TooltipTrigger>
479
477
  <TooltipContent>
480
- <p className="text-xs">{t("sharePanel.copyPassword")}</p>
478
+ <p className="text-xs">{m.sharePanel_copyPassword()}</p>
481
479
  </TooltipContent>
482
480
  </Tooltip>
483
481
  <Tooltip>
@@ -487,7 +485,7 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
487
485
  </Button>
488
486
  </TooltipTrigger>
489
487
  <TooltipContent>
490
- <p className="text-xs">{t("sharePanel.generateRandomPassword")}</p>
488
+ <p className="text-xs">{m.sharePanel_generateRandomPassword()}</p>
491
489
  </TooltipContent>
492
490
  </Tooltip>
493
491
  </div>
@@ -495,7 +493,7 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
495
493
  </div>
496
494
 
497
495
  <div className="flex items-center justify-between">
498
- <Label className="text-sm text-muted-foreground">{t("sharePanel.expiry")}</Label>
496
+ <Label className="text-sm text-muted-foreground">{m.sharePanel_expiry()}</Label>
499
497
  <Select value={expiryDays} onValueChange={setExpiryDays}>
500
498
  <SelectTrigger className="h-9 w-28">
501
499
  <SelectValue />
@@ -503,7 +501,7 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
503
501
  <SelectContent>
504
502
  {EXPIRY_OPTIONS.map((opt) => (
505
503
  <SelectItem key={opt.value} value={opt.value}>
506
- {t(opt.labelKey)}
504
+ {opt.label()}
507
505
  </SelectItem>
508
506
  ))}
509
507
  </SelectContent>
@@ -520,26 +518,26 @@ export function PRDSharePanel({ prdId, onClose }: PRDSharePanelProps) {
520
518
  onClick={handleSingleVersionShare}
521
519
  disabled={selectedVersionIds.size !== 1 || singleVersionSaving}
522
520
  >
523
- {singleVersionSaving ? t("sharePanel.creating") : t("sharePanel.singleShare")}
521
+ {singleVersionSaving ? m.sharePanel_creating() : m.sharePanel_singleShare()}
524
522
  </Button>
525
523
  </span>
526
524
  </TooltipTrigger>
527
525
  {selectedVersionIds.size !== 1 && (
528
526
  <TooltipContent>
529
- <p className="text-xs">{t("sharePanel.singleShareHint")}</p>
527
+ <p className="text-xs">{m.sharePanel_singleShareHint()}</p>
530
528
  </TooltipContent>
531
529
  )}
532
530
  </Tooltip>
533
531
  <Button className="h-9 gap-1.5" onClick={handleCopy}>
534
532
  {copied ? <Check className="size-4" /> : <Copy className="size-4" />}
535
- {copied ? t("sharePanel.copied") : t("sharePanel.copyDocLink")}
533
+ {copied ? m.sharePanel_copied() : m.sharePanel_copyDocLink()}
536
534
  </Button>
537
535
  </div>
538
536
 
539
537
  {/* 单独版本分享记录 */}
540
538
  {singleVersionShareLinks.length > 0 && (
541
539
  <div className="mt-6 border-t pt-4">
542
- <Label className="text-sm font-medium mb-3 block">{t("sharePanel.singleShareRecords", { count: singleVersionShareLinks.length })}</Label>
540
+ <Label className="text-sm font-medium mb-3 block">{m.sharePanel_singleShareRecords({ count: singleVersionShareLinks.length })}</Label>
543
541
  <div className={cn(
544
542
  "space-y-3",
545
543
  singleVersionShareLinks.length > 3 && "max-h-90 overflow-y-auto pr-2"
@@ -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 React, { useState, useCallback, useEffect, useRef, useMemo, useReducer } from "react";
20
- import { useTranslation } from "react-i18next";
21
19
  import { Folder, File, FolderPlus, Plus, Search, ChevronRight } from "lucide-react";
22
20
  import {
23
21
  editReducer,
@@ -50,6 +48,7 @@ import {
50
48
  } from "@/components/ui/alert-dialog";
51
49
  import { buildTree, TreeNode, PRDPage } from "@/lib/prd-tree-utils";
52
50
  import { listPrdPagesFn, createPrdPageFn, updatePrdPageFn, deletePrdPageFn } from "../serverFns/pages";
51
+ import { m } from "@/paraglide/messages.js";
53
52
 
54
53
  interface PRDPageTabProps {
55
54
  prdId: string;
@@ -58,7 +57,6 @@ interface PRDPageTabProps {
58
57
  }
59
58
 
60
59
  export function PRDPageTab({ prdId, activePageId, onPageSelect }: PRDPageTabProps) {
61
- const { t } = useTranslation(["prd", "common"]);
62
60
  const [pages, setPages] = useState<PRDPage[]>([]);
63
61
  const [tree, setTree] = useState<TreeNode[]>([]);
64
62
  const [editState, editDispatch] = useReducer(editReducer, initialEditState);
@@ -134,7 +132,7 @@ export function PRDPageTab({ prdId, activePageId, onPageSelect }: PRDPageTabProp
134
132
  const pages = data as PRDPage[];
135
133
  if (pages.length === 0 && !homeCreated.current) {
136
134
  homeCreated.current = true;
137
- createPrdPageFn({ data: { prdId, name: t("treePage.homeName"), type: "page" } }).then(() => refreshPages());
135
+ createPrdPageFn({ data: { prdId, name: m.prd_treePage_homeName(), type: "page" } }).then(() => refreshPages());
138
136
  return;
139
137
  }
140
138
  setPages(pages);
@@ -164,7 +162,7 @@ export function PRDPageTab({ prdId, activePageId, onPageSelect }: PRDPageTabProp
164
162
  }, [refreshPages]);
165
163
 
166
164
  const duplicateNode = useCallback(async (node: TreeNode) => {
167
- await createPrdPageFn({ data: { prdId, name: node.name + t("treePage.duplicateSuffix"), type: node.type, parentId: node.parentId } });
165
+ await createPrdPageFn({ data: { prdId, name: node.name + m.prd_treePage_duplicateSuffix(), type: node.type, parentId: node.parentId } });
168
166
  refreshPages();
169
167
  }, [prdId, refreshPages]);
170
168
 
@@ -213,7 +211,7 @@ export function PRDPageTab({ prdId, activePageId, onPageSelect }: PRDPageTabProp
213
211
 
214
212
  const handleCreateConfirm = useCallback(async () => {
215
213
  if (!createState.creatingType) return;
216
- const name = createState.creatingName.trim() || (createState.creatingType === "folder" ? t("treePage.unnamedFolder") : t("treePage.unnamed"));
214
+ const name = createState.creatingName.trim() || (createState.creatingType === "folder" ? m.prd_treePage_unnamedFolder() : m.prd_treePage_unnamed());
217
215
  try {
218
216
  await createPrdPageFn({ data: { prdId, name, type: createState.creatingType } });
219
217
  refreshPages();
@@ -422,27 +420,27 @@ export function PRDPageTab({ prdId, activePageId, onPageSelect }: PRDPageTabProp
422
420
  ref={editingRef}
423
421
  className="h-7 w-full rounded-md border border-input bg-transparent px-1.5 py-0 text-xs outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 placeholder:text-muted-foreground/40"
424
422
  value={editState.editValue}
425
- aria-label={t("treePage.pageName")}
423
+ aria-label={m.treePage_pageName()}
426
424
  onChange={e => editDispatch({ type: "SET_EDIT_VALUE", value: e.target.value })}
427
425
  onKeyDown={e => {
428
426
  if (e.key === "Enter") confirmEdit(node.id, editState.editValue);
429
427
  if (e.key === "Escape") editDispatch({ type: "CANCEL_EDIT" });
430
428
  }}
431
429
  onBlur={() => confirmEdit(node.id, editState.editValue)}
432
- placeholder={node.type === "folder" ? t("treePage.folderName") : t("treePage.pageName")}
430
+ placeholder={node.type === "folder" ? m.treePage_folderName() : m.treePage_pageName()}
433
431
  />
434
432
  ) : (
435
- <span className="flex-1 truncate text-xs">{node.name || t("treePage.unnamed")}</span>
433
+ <span className="flex-1 truncate text-xs">{node.name || m.prd_treePage_unnamed()}</span>
436
434
  )}
437
435
  </div>
438
436
  </ContextMenuTrigger>
439
437
  <ContextMenuContent className="min-w-36 space-y-1.5">
440
438
  <ContextMenuItem onClick={() => editDispatch({ type: "START_EDIT", id: node.id, name: node.name })}>
441
- {t("treePage.rename")}
439
+ {m.treePage_rename()}
442
440
  {/* <ContextMenuShortcut className="text-xs">Ctrl+Shift+R</ContextMenuShortcut> */}
443
441
  </ContextMenuItem>
444
442
  <ContextMenuItem onClick={() => duplicateNode(node)}>
445
- {t("treePage.duplicate")}
443
+ {m.treePage_duplicate()}
446
444
  </ContextMenuItem>
447
445
  {/* <ContextMenuItem onClick={() => {
448
446
  const targetName = window.prompt("输入目标页面/文件夹名称");
@@ -461,7 +459,7 @@ export function PRDPageTab({ prdId, activePageId, onPageSelect }: PRDPageTabProp
461
459
  </ContextMenuItem> */}
462
460
  <ContextMenuSeparator />
463
461
  <ContextMenuItem onClick={() => setDeleteConfirmId(node.id)} className="text-destructive">
464
- {t("treePage.delete")}
462
+ {m.treePage_delete()}
465
463
  </ContextMenuItem>
466
464
  </ContextMenuContent>
467
465
  </ContextMenu>
@@ -479,14 +477,14 @@ export function PRDPageTab({ prdId, activePageId, onPageSelect }: PRDPageTabProp
479
477
  <AlertDialog open={!!deleteConfirmId} onOpenChange={(v) => { if (!v) setDeleteConfirmId(null); }}>
480
478
  <AlertDialogContent className="border border-border">
481
479
  <AlertDialogHeader>
482
- <AlertDialogTitle>{t("treePage.confirmDelete")}</AlertDialogTitle>
480
+ <AlertDialogTitle>{m.treePage_confirmDelete()}</AlertDialogTitle>
483
481
  <AlertDialogDescription>
484
- {t("treePage.deleteConfirmDesc", { name: deleteTarget?.name || t("treePage.unnamed") })}
482
+ {m.treePage_deleteConfirmDesc({ name: deleteTarget?.name || m.prd_treePage_unnamed() })}
485
483
  </AlertDialogDescription>
486
484
  </AlertDialogHeader>
487
485
  <AlertDialogFooter>
488
- <AlertDialogCancel onClick={() => setDeleteConfirmId(null)}>{t("common:button.cancel")}</AlertDialogCancel>
489
- <AlertDialogAction variant="destructive" onClick={() => deleteConfirmId && deleteNode(deleteConfirmId)}>{t("treePage.delete")}</AlertDialogAction>
486
+ <AlertDialogCancel onClick={() => setDeleteConfirmId(null)}>{m.common_button_cancel()}</AlertDialogCancel>
487
+ <AlertDialogAction variant="destructive" onClick={() => deleteConfirmId && deleteNode(deleteConfirmId)}>{m.treePage_delete()}</AlertDialogAction>
490
488
  </AlertDialogFooter>
491
489
  </AlertDialogContent>
492
490
  </AlertDialog>
@@ -497,7 +495,7 @@ export function PRDPageTab({ prdId, activePageId, onPageSelect }: PRDPageTabProp
497
495
  <Search className="absolute left-2 top-1/2 -translate-y-1/2 size-3 text-muted-foreground/40" />
498
496
  <Input
499
497
  className="h-6 pl-6 pr-2 text-xs md:text-xs placeholder:text-xs placeholder:text-muted-foreground/30"
500
- placeholder={t("treePage.searchPlaceholder")}
498
+ placeholder={m.treePage_searchPlaceholder()}
501
499
  value={searchQuery}
502
500
  onChange={e => setSearchQuery(e.target.value)}
503
501
  />
@@ -512,7 +510,7 @@ export function PRDPageTab({ prdId, activePageId, onPageSelect }: PRDPageTabProp
512
510
  </button>
513
511
  </TooltipTrigger>
514
512
  <TooltipContent>
515
- <p>{t("treePage.newFolder")}</p>
513
+ <p>{m.treePage_newFolder()}</p>
516
514
  </TooltipContent>
517
515
  </Tooltip>
518
516
  <Tooltip>
@@ -525,7 +523,7 @@ export function PRDPageTab({ prdId, activePageId, onPageSelect }: PRDPageTabProp
525
523
  </button>
526
524
  </TooltipTrigger>
527
525
  <TooltipContent>
528
- <p>{t("treePage.newPage")}</p>
526
+ <p>{m.treePage_newPage()}</p>
529
527
  </TooltipContent>
530
528
  </Tooltip>
531
529
  </div>
@@ -549,20 +547,20 @@ export function PRDPageTab({ prdId, activePageId, onPageSelect }: PRDPageTabProp
549
547
  ref={creatingRef}
550
548
  className="h-7 w-full rounded-md border border-input bg-transparent px-1.5 py-0 text-xs outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 placeholder:text-muted-foreground/40"
551
549
  value={createState.creatingName}
552
- aria-label={t("treePage.pageName")}
550
+ aria-label={m.treePage_pageName()}
553
551
  onChange={e => createDispatch({ type: "SET_CREATING_NAME", value: e.target.value })}
554
552
  onKeyDown={e => {
555
553
  if (e.key === "Enter") handleCreateConfirm();
556
554
  if (e.key === "Escape") handleCreateCancel();
557
555
  }}
558
556
  onBlur={handleCreateConfirm}
559
- placeholder={createState.creatingType === "folder" ? t("treePage.folderName") : t("treePage.pageName")}
557
+ placeholder={createState.creatingType === "folder" ? m.treePage_folderName() : m.treePage_pageName()}
560
558
  />
561
559
  </div>
562
560
  )}
563
561
  {filteredTree.length === 0 && !createState.creatingType && (
564
562
  <div className="px-3 py-4 text-xs text-muted-foreground text-center">
565
- {searchQuery ? t("treePage.noMatch") : t("treePage.noPages")}
563
+ {searchQuery ? m.treePage_noMatch() : m.treePage_noPages()}
566
564
  </div>
567
565
  )}
568
566
  </div>
@@ -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, useCallback, useMemo, useRef, useEffect } from "react";
20
- import { useTranslation } from "react-i18next";
19
+ import { m } from '@/paraglide/messages.js'
21
20
  import {
22
21
  DragDropProvider,
23
22
  DragOverlay,
@@ -60,7 +59,6 @@ interface SelectBox {
60
59
  }
61
60
 
62
61
  export function PrototypeCanvas({ elements, onElementsChange, device, className, onComponentSelect, onAnnotate }: PrototypeCanvasProps) {
63
- const { t } = useTranslation("prd");
64
62
  const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());
65
63
  const [draggingElement, setDraggingElement] = useState<CanvasElement | null>(null);
66
64
  const [selectBox, setSelectBox] = useState<SelectBox | null>(null);
@@ -348,7 +346,7 @@ export function PrototypeCanvas({ elements, onElementsChange, device, className,
348
346
  <Skeleton className="h-5 w-[70%] mx-auto rounded-md opacity-40" />
349
347
  <Skeleton className="h-5 w-[85%] mx-auto rounded-md opacity-40" />
350
348
  <div className="pt-5 text-center">
351
- <p className="text-sm text-muted-foreground">{t("canvas.emptyHint")}</p>
349
+ <p className="text-sm text-muted-foreground">{m.canvas_emptyHint()}</p>
352
350
  </div>
353
351
  </div>
354
352
  </div>
@@ -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, { useCallback, useRef, useState, useLayoutEffect } from "react";
20
- import { useTranslation } from "react-i18next";
19
+ import { m } from '@/paraglide/messages.js'
21
20
  import { useDraggable } from "@dnd-kit/react";
22
21
  import { MessageSquareQuote } from "lucide-react";
23
22
  import { CanvasElement, type ResizeDirection } from "@allbluecn/kernel";
@@ -45,7 +44,6 @@ export function PrototypeElement({
45
44
  onAnnotate,
46
45
  groupDragDelta,
47
46
  }: PrototypeElementProps) {
48
- const { t } = useTranslation("prd");
49
47
  const config = getComponent(element.type);
50
48
  // 未注册类型兜底为 GenericPrototype,避免画布上空白不可见
51
49
  const Component = config?.component ?? GenericPrototype;
@@ -149,7 +147,7 @@ export function PrototypeElement({
149
147
  className="flex items-center gap-1 px-1.5 py-1 min-w-14 rounded text-xs text-muted-foreground hover:bg-muted hover:text-foreground"
150
148
  >
151
149
  <MessageSquareQuote className="size-3.5" />
152
- <span>{t("element.annotate")}</span>
150
+ <span>{m.element_annotate()}</span>
153
151
  </button>
154
152
  </div>
155
153
  )}
@@ -160,7 +158,7 @@ export function PrototypeElement({
160
158
  className="absolute -top-6 left-0 px-1.5 py-0.5 bg-muted text-[10px] text-muted-foreground font-mono rounded max-w-60 truncate z-20 pointer-events-none"
161
159
  contentEditable={false}
162
160
  >
163
- {t("element.componentId", { id: element.id })}
161
+ {m.element_componentId({ id: element.id })}
164
162
  </div>
165
163
  )}
166
164
  </div>
@@ -15,7 +15,6 @@
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, { useCallback } from "react";
20
19
  import type { ResizeDirection } from "@allbluecn/kernel";
21
20