@allbluecn/web-app 0.9.5 → 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 +9 -8
  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
@@ -16,7 +16,6 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  import * as React from "react";
19
- import { useTranslation } from "react-i18next";
20
19
  import { toast } from "sonner";
21
20
  import { UploadCloud, X, ChevronLeft, ChevronRight } from "lucide-react";
22
21
  import { Button } from "@/components/ui/button";
@@ -30,6 +29,7 @@ import { Textarea } from "@/components/ui/textarea";
30
29
  import { formatFileSize, getFileTypeIcon } from "./format";
31
30
  import { FilePreview } from "./file-preview";
32
31
  import type { StoryAttachmentItem } from "../types";
32
+ import { m } from "@/paraglide/messages.js";
33
33
 
34
34
  const MAX_FILE_SIZE = 10 * 1024 * 1024;
35
35
 
@@ -70,7 +70,6 @@ export function AttachmentManageDialog({
70
70
  onActivity,
71
71
  editItem,
72
72
  }: AttachmentManageDialogProps) {
73
- const { t } = useTranslation("story");
74
73
  const inputRef = React.useRef<HTMLInputElement>(null);
75
74
  const [staged, setStaged] = React.useState<StagedFile[]>([]);
76
75
  const [description, setDescription] = React.useState("");
@@ -81,7 +80,7 @@ export function AttachmentManageDialog({
81
80
  const [computedHashes, setComputedHashes] = React.useState<Set<string>>(new Set());
82
81
 
83
82
  const isEdit = !!editItem;
84
- const dialogTitle = isEdit ? t("attachmentDialog.editTitle") : t("attachmentDialog.title");
83
+ const dialogTitle = isEdit ? m.story_attachmentDialog_editTitle() : m.story_attachmentDialog_title();
85
84
 
86
85
  // 编辑模式:预取现有文件并预填描述,同时计算 hash
87
86
  React.useEffect(() => {
@@ -124,7 +123,7 @@ export function AttachmentManageDialog({
124
123
  const next: StagedFile[] = [];
125
124
  for (const file of Array.from(files)) {
126
125
  if (file.size > MAX_FILE_SIZE) {
127
- toast.error(t("attachmentDialog.sizeLimit", { name: file.name }));
126
+ toast.error(m.story_attachmentDialog_sizeLimit({ name: file.name }));
128
127
  continue;
129
128
  }
130
129
  next.push({
@@ -247,13 +246,13 @@ export function AttachmentManageDialog({
247
246
  });
248
247
  if (!res.ok) {
249
248
  const err = await res.json().catch(() => ({}));
250
- throw new Error(err.error || t("attachmentDialog.removeFailed"));
249
+ throw new Error(err.error || m.story_attachmentDialog_removeFailed());
251
250
  }
252
251
  const json = await res.json() as Record<string, unknown>;
253
252
  if ((json.duplicated as boolean | undefined) === true) continue;
254
253
  added.push(json as unknown as StoryAttachmentItem & { activity?: import("../types").ActivityItem });
255
254
  } catch (err) {
256
- toast.error((err as Error)?.message || t("attachmentDialog.removeFailed"));
255
+ toast.error((err as Error)?.message || m.story_attachmentDialog_removeFailed());
257
256
  }
258
257
  }
259
258
  setUploading(false);
@@ -262,12 +261,12 @@ export function AttachmentManageDialog({
262
261
  for (const item of added) {
263
262
  if (item.activity) onActivity?.(item.activity);
264
263
  }
265
- toast.success(t("attachmentDialog.uploaded", { count: added.length }));
264
+ toast.success(m.story_attachmentDialog_uploaded({ count: added.length }));
266
265
  clearStaged();
267
266
  onOpenChange(false);
268
267
  } else if (!hasDuplicates) {
269
268
  // 所有文件都重复,无新增
270
- toast.info(t("attachmentDialog.duplicateHint"));
269
+ toast.info(m.story_attachmentDialog_duplicateHint());
271
270
  clearStaged();
272
271
  onOpenChange(false);
273
272
  }
@@ -313,7 +312,7 @@ export function AttachmentManageDialog({
313
312
  <div
314
313
  role="button"
315
314
  tabIndex={0}
316
- aria-label={t("attachmentDialog.upload")}
315
+ aria-label={m.story_attachmentDialog_upload()}
317
316
  onClick={() => inputRef.current?.click()}
318
317
  onKeyDown={(e) => {
319
318
  if (e.key === "Enter" || e.key === " ") {
@@ -337,8 +336,8 @@ export function AttachmentManageDialog({
337
336
  >
338
337
  <UploadCloud className="size-10" />
339
338
  <div className="text-center">
340
- <span className="block text-base font-medium text-foreground">{t("attachmentDialog.upload")}</span>
341
- <span className="mt-1 block text-xs">{t("attachmentDialog.uploadHint")}</span>
339
+ <span className="block text-base font-medium text-foreground">{m.story_attachmentDialog_upload()}</span>
340
+ <span className="mt-1 block text-xs">{m.story_attachmentDialog_uploadHint()}</span>
342
341
  </div>
343
342
  </div>
344
343
  ) : (
@@ -349,10 +348,10 @@ export function AttachmentManageDialog({
349
348
  file={previewFile!}
350
349
  fileName={previewName}
351
350
  showTitleToggle
352
- titleToggleLabel={t("attachmentDialog.toggleTitle")}
353
- titleToggleHideLabel={t("attachmentDialog.hideTitle")}
354
- fullscreenLabel={t("associatedAttachments.fullscreen")}
355
- exitFullscreenLabel={t("associatedAttachments.exitFullscreen")}
351
+ titleToggleLabel={m.story_attachmentDialog_toggleTitle()}
352
+ titleToggleHideLabel={m.story_attachmentDialog_hideTitle()}
353
+ fullscreenLabel={m.story_associatedAttachments_fullscreen()}
354
+ exitFullscreenLabel={m.story_associatedAttachments_exitFullscreen()}
356
355
  />
357
356
  {/* 文件列表(水平排列,可滚动) */}
358
357
  <div className="flex items-center gap-2">
@@ -384,7 +383,7 @@ export function AttachmentManageDialog({
384
383
  >
385
384
  {isDup && (
386
385
  <span className="absolute top-0 left-1 z-20 -translate-x-1/2 -translate-y-1/2 rounded-full bg-red-500 px-1.5 py-0.5 text-[9px] font-semibold text-white shadow-sm whitespace-nowrap">
387
- {t("attachmentDialog.duplicateBadge")}
386
+ {m.story_attachmentDialog_duplicateBadge()}
388
387
  </span>
389
388
  )}
390
389
  <button
@@ -404,7 +403,7 @@ export function AttachmentManageDialog({
404
403
  variant="ghost"
405
404
  size="icon"
406
405
  className="absolute right-0.5 top-0.5 size-4 opacity-0 group-hover:opacity-100 transition-opacity"
407
- aria-label={t("attachmentDialog.removeFile")}
406
+ aria-label={m.story_attachmentDialog_removeFile()}
408
407
  disabled={uploading}
409
408
  onClick={(e) => {
410
409
  e.stopPropagation();
@@ -436,38 +435,38 @@ export function AttachmentManageDialog({
436
435
  {/* 描述 */}
437
436
  <div className="space-y-1.5">
438
437
  <label htmlFor="attachment-desc" className="text-xs font-medium text-muted-foreground">
439
- {t("attachmentDialog.descOptional")}
438
+ {m.story_attachmentDialog_descOptional()}
440
439
  </label>
441
440
  <Textarea
442
441
  id="attachment-desc"
443
- placeholder={t("attachmentDialog.descPlaceholder")}
442
+ placeholder={m.story_attachmentDialog_descPlaceholder()}
444
443
  value={description}
445
444
  onChange={(e) => setDescription(e.target.value)}
446
445
  disabled={isBatch}
447
446
  className="min-h-16 resize-none mt-1.5"
448
447
  />
449
- {isBatch && <p className="text-xs text-muted-foreground">{t("attachmentDialog.batchDescDisabled")}</p>}
448
+ {isBatch && <p className="text-xs text-muted-foreground">{m.story_attachmentDialog_batchDescDisabled()}</p>}
450
449
  </div>
451
450
  {/* 操作按钮行 */}
452
451
  <div className="flex items-center justify-between gap-2">
453
452
  {hasFiles && !isEdit && (
454
453
  <Button variant="outline" size="sm" onClick={() => inputRef.current?.click()}>
455
454
  <UploadCloud className="size-3.5 mr-1.5" />
456
- {t("attachmentDialog.continueUpload")}
455
+ {m.story_attachmentDialog_continueUpload()}
457
456
  </Button>
458
457
  )}
459
458
  <div className="flex items-center gap-2 ml-auto">
460
459
  {hasDuplicates && (
461
- <span className="text-xs mr-2 text-amber-600 dark:text-amber-400">{t("attachmentDialog.duplicateHint")}</span>
460
+ <span className="text-xs mr-2 text-amber-600 dark:text-amber-400">{m.story_attachmentDialog_duplicateHint()}</span>
462
461
  )}
463
462
  <Button variant="outline" disabled={uploading} onClick={() => handleClose(false)}>
464
- {t("attachmentDialog.cancel")}
463
+ {m.story_attachmentDialog_cancel()}
465
464
  </Button>
466
465
  <Button
467
466
  disabled={staged.length === 0 || uploading}
468
467
  onClick={() => void handleConfirm()}
469
468
  >
470
- {uploading ? t("attachmentDialog.uploading") : t("attachmentDialog.confirmUpload")}
469
+ {uploading ? m.story_attachmentDialog_uploading() : m.story_attachmentDialog_confirmUpload()}
471
470
  </Button>
472
471
  </div>
473
472
  </div>
@@ -1,32 +1,15 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // AllBlue - 理想之海
3
- // Copyright (C) 2026 AllBlue Contributors
4
- //
5
- // This program is free software: you can redistribute it and/or modify
6
- // it under the terms of the GNU Affero General Public License as published by
7
- // the Free Software Foundation, either version 3 of the License, or
8
- // (at your option) any later version.
9
- //
10
- // This program is distributed in the hope that it will be useful,
11
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- // GNU Affero General Public License for more details.
14
- //
15
- // You should have received a copy of the GNU Affero General Public License
16
- // along with this program. If not, see <https://www.gnu.org/licenses/>.
1
+ import { m } from '@/paraglide/messages.js'
17
2
 
18
- import type { TFunction } from "i18next";
19
-
20
- const GROUP_I18N_KEYS: Record<string, string> = {
21
- legal: "knowledgeDialog.groupLegal",
22
- compliance: "knowledgeDialog.groupCompliance",
23
- dictionary: "knowledgeDialog.groupDictionary",
24
- bookmark: "knowledgeDialog.groupBookmark",
25
- summary: "knowledgeDialog.groupSummary",
26
- };
3
+ const GROUP_LABELS: Record<string, () => string> = {
4
+ legal: m.story_knowledgeDialog_groupLegal,
5
+ compliance: m.story_knowledgeDialog_groupCompliance,
6
+ dictionary: m.story_knowledgeDialog_groupDictionary,
7
+ bookmark: m.story_knowledgeDialog_groupBookmark,
8
+ summary: m.story_knowledgeDialog_groupSummary,
9
+ }
27
10
 
28
- /** 通用知识库分组 key → i18n 标签(未知 key 原样返回) */
29
- export function generalGroupLabel(t: TFunction, group: string): string {
30
- const key = GROUP_I18N_KEYS[group];
31
- return key ? t(key) : group;
11
+ /** 通用知识库分组 key → 标签(未知 key 原样返回) */
12
+ export function generalGroupLabel(group: string): string {
13
+ const labelFn = GROUP_LABELS[group]
14
+ return labelFn ? labelFn() : group
32
15
  }
@@ -16,7 +16,6 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  import * as React from "react";
19
- import { useTranslation } from "react-i18next";
20
19
  import { useServerFn } from "@tanstack/react-start";
21
20
  import { toast } from "sonner";
22
21
  import { BookMarked, BookOpenText, Bookmark, Check, ChevronsUpDown, Scale, ShieldCheck, Sprout } from "lucide-react";
@@ -42,6 +41,7 @@ import {
42
41
  } from "@/server/serverFns/story";
43
42
  import { generalGroupLabel } from "./general-groups";
44
43
  import type { DocBrief } from "../types";
44
+ import { m } from "@/paraglide/messages.js";
45
45
 
46
46
  interface KbBrief {
47
47
  id: string;
@@ -86,7 +86,6 @@ export function KnowledgeSelectDialog({
86
86
  onUpdate,
87
87
  onActivity,
88
88
  }: KnowledgeSelectDialogProps) {
89
- const { t } = useTranslation("story");
90
89
  const listKbs = useServerFn(listStoryAvailableKbsFn);
91
90
  const searchDocs = useServerFn(searchKbDocsFn);
92
91
  const linkDocs = useServerFn(linkDocsFn);
@@ -117,13 +116,13 @@ export function KnowledgeSelectDialog({
117
116
  });
118
117
  setItems(res.items as SearchDocRow[]);
119
118
  } catch (err) {
120
- toast.error((err as Error)?.message || t("knowledgeDialog.linkFailed"));
119
+ toast.error((err as Error)?.message || m.story_knowledgeDialog_linkFailed());
121
120
  setItems([]);
122
121
  } finally {
123
122
  setLoading(false);
124
123
  }
125
124
  },
126
- [searchDocs, storyId, t],
125
+ [searchDocs, storyId],
127
126
  );
128
127
 
129
128
  React.useEffect(() => {
@@ -233,12 +232,12 @@ export function KnowledgeSelectDialog({
233
232
  <span className="min-w-0 flex-1 truncate text-sm">{row.title}</span>
234
233
  {kbFilter === null && (
235
234
  <span className="shrink-0 text-xs text-muted-foreground">
236
- {isGeneral ? generalGroupLabel(t, row.kbName) : row.kbName}
235
+ {isGeneral ? generalGroupLabel(row.kbName) : row.kbName}
237
236
  </span>
238
237
  )}
239
238
  {linkedIds.has(row.id) && (
240
239
  <Badge variant="secondary" className="shrink-0 text-[10px]">
241
- {t("knowledgeDialog.linked")}
240
+ {m.story_knowledgeDialog_linked()}
242
241
  </Badge>
243
242
  )}
244
243
  </div>,
@@ -265,7 +264,7 @@ export function KnowledgeSelectDialog({
265
264
  if (toAdd.length > 0) {
266
265
  const res = await linkDocs({ data: { storyId, docIds: toAdd } });
267
266
  if (res.failed.length > 0) {
268
- toast.warning(t("knowledgeDialog.partialFailed", { count: res.failed.length }));
267
+ toast.warning(m.story_knowledgeDialog_partialFailed({ count: res.failed.length }));
269
268
  }
270
269
  if (res.activity) onActivity?.(res.activity);
271
270
  const addedIds = new Set(res.linked);
@@ -276,7 +275,7 @@ export function KnowledgeSelectDialog({
276
275
  } onUpdate(nextDocs);
277
276
  onOpenChange(false);
278
277
  } catch (err) {
279
- toast.error((err as Error)?.message || t("knowledgeDialog.linkFailed"));
278
+ toast.error((err as Error)?.message || m.story_knowledgeDialog_linkFailed());
280
279
  } finally {
281
280
  setSubmitting(false);
282
281
  }
@@ -288,12 +287,12 @@ export function KnowledgeSelectDialog({
288
287
  <Dialog open={open} onOpenChange={onOpenChange}>
289
288
  <DialogContent className="sm:max-w-260 -mt-50">
290
289
  <DialogHeader>
291
- <DialogTitle>{t("knowledgeDialog.title")}</DialogTitle>
290
+ <DialogTitle>{m.story_knowledgeDialog_title()}</DialogTitle>
292
291
  </DialogHeader>
293
292
 
294
293
  <div className="flex items-center gap-2">
295
294
  <Input
296
- placeholder={t("knowledgeDialog.searchPlaceholder")}
295
+ placeholder={m.story_knowledgeDialog_searchPlaceholder()}
297
296
  value={search}
298
297
  onChange={(e) => handleSearch(e.target.value)}
299
298
  className="h-8"
@@ -305,8 +304,8 @@ export function KnowledgeSelectDialog({
305
304
  {activeKb
306
305
  ? activeKb.name
307
306
  : kbFilter?.type === "general"
308
- ? generalGroupLabel(t, kbFilter.group)
309
- : t("knowledgeDialog.allKbs")}
307
+ ? generalGroupLabel(kbFilter.group)
308
+ : m.story_knowledgeDialog_allKbs()}
310
309
  <ChevronsUpDown className="size-3.5 opacity-50" />
311
310
  </Button>
312
311
  </PopoverTrigger>
@@ -316,11 +315,11 @@ export function KnowledgeSelectDialog({
316
315
  className="flex w-full items-center justify-between rounded-sm px-2 py-1.5 mt-1 text-sm hover:bg-muted"
317
316
  onClick={() => handleKbSelect(null)}
318
317
  >
319
- {t("knowledgeDialog.allKbs")}
318
+ {m.story_knowledgeDialog_allKbs()}
320
319
  {kbFilter === null && <Check className="size-3.5" />}
321
320
  </button>
322
321
  <div className="border-t px-2 pt-3 text-xs font-medium text-muted-foreground">
323
- {t("knowledgeDialog.userKbs")}
322
+ {m.story_knowledgeDialog_userKbs()}
324
323
  </div>
325
324
  {kbs.map((kb) => (
326
325
  <button
@@ -334,7 +333,7 @@ export function KnowledgeSelectDialog({
334
333
  </button>
335
334
  ))}
336
335
  <div className=" border-t px-2 pt-3 text-xs font-medium text-muted-foreground">
337
- {t("knowledgeDialog.generalKbs")}
336
+ {m.story_knowledgeDialog_generalKbs()}
338
337
  </div>
339
338
  {GENERAL_GROUP_META.map((group) => {
340
339
  const Icon = GENERAL_GROUP_ICONS[group.key];
@@ -347,7 +346,7 @@ export function KnowledgeSelectDialog({
347
346
  >
348
347
  <span className="flex min-w-0 items-center gap-2">
349
348
  <Icon className="size-3.5 shrink-0 text-muted-foreground" />
350
- <span className="truncate">{generalGroupLabel(t, group.key)}</span>
349
+ <span className="truncate">{generalGroupLabel(group.key)}</span>
351
350
  </span>
352
351
  {kbFilter?.type === "general" && kbFilter.group === group.key && <Check className="size-3.5" />}
353
352
  </button>
@@ -364,7 +363,7 @@ export function KnowledgeSelectDialog({
364
363
  renderRows(null, 0)
365
364
  ) : (
366
365
  <div className="flex h-full items-center justify-center text-sm text-muted-foreground">
367
- {t("knowledgeDialog.empty")}
366
+ {m.story_knowledgeDialog_empty()}
368
367
  </div>
369
368
  )}
370
369
  </div>
@@ -376,24 +375,24 @@ export function KnowledgeSelectDialog({
376
375
  checked={allSelected ? true : someSelected ? "indeterminate" : false}
377
376
  onCheckedChange={toggleSelectAll}
378
377
  disabled={listedIds.length === 0}
379
- aria-label={t("knowledgeDialog.selectAll")}
378
+ aria-label={m.story_knowledgeDialog_selectAll()}
380
379
  />
381
380
  <label
382
381
  htmlFor="kb-select-all"
383
382
  className="cursor-pointer text-xs text-muted-foreground select-none"
384
383
  >
385
- {t("knowledgeDialog.selectAll")}
384
+ {m.story_knowledgeDialog_selectAll()}
386
385
  </label>
387
386
  <span className="text-xs text-muted-foreground">
388
- {t("knowledgeDialog.selectedCount", { count: selected.size })}
387
+ {m.story_knowledgeDialog_selectedCount({ count: selected.size })}
389
388
  </span>
390
389
  </div>
391
390
  <div className="flex gap-2">
392
391
  <Button variant="outline" onClick={() => onOpenChange(false)}>
393
- {t("knowledgeDialog.cancel")}
392
+ {m.story_knowledgeDialog_cancel()}
394
393
  </Button>
395
394
  <Button onClick={handleConfirm} disabled={submitting}>
396
- {t("knowledgeDialog.confirm")}
395
+ {m.story_knowledgeDialog_confirm()}
397
396
  </Button>
398
397
  </div>
399
398
  </DialogFooter>
@@ -16,7 +16,6 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  import * as React from "react";
19
- import { useTranslation } from "react-i18next";
20
19
  import { useServerFn } from "@tanstack/react-start";
21
20
  import { toast } from "sonner";
22
21
  import { Button } from "@/components/ui/button";
@@ -30,6 +29,7 @@ import {
30
29
  } from "@/components/ui/dialog";
31
30
  import { addLinkFn, updateLinkFn } from "@/server/serverFns/story";
32
31
  import type { StoryLinkItem } from "../types";
32
+ import { m } from "@/paraglide/messages.js";
33
33
 
34
34
  export interface LinkManageDialogProps {
35
35
  open: boolean;
@@ -52,7 +52,6 @@ export function LinkManageDialog({
52
52
  onActivity,
53
53
  initialEdit = null,
54
54
  }: LinkManageDialogProps) {
55
- const { t } = useTranslation("story");
56
55
  const addLink = useServerFn(addLinkFn);
57
56
  const updateLink = useServerFn(updateLinkFn);
58
57
  const [editing, setEditing] = React.useState<StoryLinkItem | null>(null);
@@ -84,7 +83,7 @@ export function LinkManageDialog({
84
83
  description: form.description || undefined,
85
84
  },
86
85
  });
87
- toast.success(t("linkDialog.updated"));
86
+ toast.success(m.story_linkDialog_updated());
88
87
  if (updated.activity) onActivity?.(updated.activity);
89
88
  onUpdate(
90
89
  data.map((l) =>
@@ -102,7 +101,7 @@ export function LinkManageDialog({
102
101
  description: form.description || undefined,
103
102
  },
104
103
  });
105
- toast.success(t("linkDialog.added"));
104
+ toast.success(m.story_linkDialog_added());
106
105
  if (created.activity) onActivity?.(created.activity);
107
106
  onUpdate([
108
107
  ...data,
@@ -118,7 +117,7 @@ export function LinkManageDialog({
118
117
  setEditing(null);
119
118
  onOpenChange(false);
120
119
  } catch (err) {
121
- toast.error((err as Error)?.message || t("linkDialog.saveFailed"));
120
+ toast.error((err as Error)?.message || m.story_linkDialog_saveFailed());
122
121
  } finally {
123
122
  setSubmitting(false);
124
123
  }
@@ -129,7 +128,7 @@ export function LinkManageDialog({
129
128
  <DialogContent className="sm:max-w-130">
130
129
  <DialogHeader>
131
130
  <DialogTitle className="text-xl">
132
- {t(editing ? "linkDialog.editTitle" : "linkDialog.title")}
131
+ {editing ? m.story_linkDialog_editTitle() : m.story_linkDialog_title()}
133
132
  </DialogTitle>
134
133
  </DialogHeader>
135
134
  <form onSubmit={handleSubmit} className="flex h-96 flex-col gap-4 overflow-y-auto px-1 pb-1">
@@ -141,7 +140,7 @@ export function LinkManageDialog({
141
140
  id="link-url"
142
141
  type="url"
143
142
  required
144
- placeholder={t("linkDialog.urlPlaceholder")}
143
+ placeholder={m.story_linkDialog_urlPlaceholder()}
145
144
  value={form.url}
146
145
  onChange={(e) => setForm({ ...form, url: e.target.value })}
147
146
  className="h-10 text-base"
@@ -149,11 +148,11 @@ export function LinkManageDialog({
149
148
  </div>
150
149
  <div className="space-y-1.5">
151
150
  <label htmlFor="link-title" className="text-xs font-medium text-muted-foreground">
152
- {t("linkDialog.titleOptional")}
151
+ {m.story_linkDialog_titleOptional()}
153
152
  </label>
154
153
  <Input
155
154
  id="link-title"
156
- placeholder={t("linkDialog.titlePlaceholder")}
155
+ placeholder={m.story_linkDialog_titlePlaceholder()}
157
156
  value={form.title}
158
157
  onChange={(e) => setForm({ ...form, title: e.target.value })}
159
158
  className="h-10"
@@ -161,11 +160,11 @@ export function LinkManageDialog({
161
160
  </div>
162
161
  <div className="flex min-h-0 flex-1 flex-col gap-1.5">
163
162
  <label htmlFor="link-desc" className="text-xs font-medium text-muted-foreground">
164
- {t("linkDialog.descOptional")}
163
+ {m.story_linkDialog_descOptional()}
165
164
  </label>
166
165
  <Textarea
167
166
  id="link-desc"
168
- placeholder={t("linkDialog.descPlaceholder")}
167
+ placeholder={m.story_linkDialog_descPlaceholder()}
169
168
  value={form.description}
170
169
  onChange={(e) => setForm({ ...form, description: e.target.value })}
171
170
  className="min-h-20 flex-1 resize-none"
@@ -178,11 +177,11 @@ export function LinkManageDialog({
178
177
  variant="outline"
179
178
  onClick={() => onOpenChange(false)}
180
179
  >
181
- {t("linkDialog.cancel")}
180
+ {m.story_linkDialog_cancel()}
182
181
  </Button>
183
182
  )}
184
183
  <Button type="submit" disabled={submitting}>
185
- {t(editing ? "linkDialog.save" : "linkDialog.add")}
184
+ {editing ? m.story_linkDialog_save() : m.story_linkDialog_add()}
186
185
  </Button>
187
186
  </div>
188
187
  </form>
@@ -16,7 +16,6 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  import * as React from "react";
19
- import { useTranslation } from "react-i18next";
20
19
  import { Archive, MoreHorizontal, Trash2, Waypoints, CalendarCheck, CalendarPlus2 } from "lucide-react";
21
20
  import { Button } from "@/components/ui/button";
22
21
  import { Checkbox } from "@/components/ui/checkbox";
@@ -50,6 +49,7 @@ import type {
50
49
  DependencyGroup,
51
50
  } from "../types";
52
51
  import type { DependencyTypeOption } from "../constants";
52
+ import { m } from "@/paraglide/messages.js";
53
53
 
54
54
  /** 行内编辑/归档/删除后回传给面板的补丁载荷(StoryPatch 字段 + 面板控制信号) */
55
55
  export type StoryRelationPatch = StoryPatch & {
@@ -97,7 +97,6 @@ export function StoryRefRow({
97
97
  onDependencyTypeChange,
98
98
  currentIdentifier,
99
99
  }: StoryRefRowProps) {
100
- const { t } = useTranslation("story");
101
100
  const [storyState, setStoryState] = React.useState(story);
102
101
  React.useEffect(() => {
103
102
  setStoryState(story);
@@ -119,7 +118,7 @@ export function StoryRefRow({
119
118
  onStoryRefresh(story.id, patch);
120
119
  } catch (e) {
121
120
  setStoryState(story);
122
- toast.error((e as Error)?.message || t("children.updateFailed"));
121
+ toast.error((e as Error)?.message || m.story_children_updateFailed());
123
122
  }
124
123
  };
125
124
 
@@ -134,15 +133,15 @@ export function StoryRefRow({
134
133
 
135
134
  const handleArchive = async () => {
136
135
  if (!canArchiveSingle) {
137
- toast.error(t("children.archiveOnlyDone"));
136
+ toast.error(m.story_children_archiveOnlyDone());
138
137
  return;
139
138
  }
140
139
  try {
141
140
  await archiveStory({ data: { storyId: story.id } });
142
141
  onStoryRefresh(story.id, { archived: true, archivedAt: new Date().toISOString() });
143
- toast.success(t("children.archived"));
142
+ toast.success(m.story_children_archived());
144
143
  } catch (e) {
145
- toast.error((e as Error)?.message || t("children.archiveFailed"));
144
+ toast.error((e as Error)?.message || m.story_children_archiveFailed());
146
145
  }
147
146
  };
148
147
 
@@ -150,9 +149,9 @@ export function StoryRefRow({
150
149
  try {
151
150
  await unarchiveStory({ data: { storyId: story.id } });
152
151
  onStoryRefresh(story.id, { archived: false, archivedAt: null });
153
- toast.success(t("children.unarchived"));
152
+ toast.success(m.story_children_unarchived());
154
153
  } catch (e) {
155
- toast.error((e as Error)?.message || t("children.unarchiveFailed"));
154
+ toast.error((e as Error)?.message || m.story_children_unarchiveFailed());
156
155
  }
157
156
  };
158
157
 
@@ -160,9 +159,9 @@ export function StoryRefRow({
160
159
  try {
161
160
  await deleteStory({ data: { storyId: story.id } });
162
161
  onStoryRefresh(story.id, { deleted: true });
163
- toast.success(t("children.deleted"));
162
+ toast.success(m.story_children_deleted());
164
163
  } catch (e) {
165
- toast.error((e as Error)?.message || t("children.deleteFailed"));
164
+ toast.error((e as Error)?.message || m.story_children_deleteFailed());
166
165
  }
167
166
  };
168
167
 
@@ -175,7 +174,7 @@ export function StoryRefRow({
175
174
  <Checkbox
176
175
  checked={selected}
177
176
  onCheckedChange={() => onToggle(story.id)}
178
- aria-label={t("children.selectStory", { name: story.name })}
177
+ aria-label={m.story_children_selectStory({ name: story.name })}
179
178
  className={cn(
180
179
  "shrink-0 transition-opacity",
181
180
  selected ? "opacity-100" : "opacity-0 group-hover:opacity-100",
@@ -197,7 +196,7 @@ export function StoryRefRow({
197
196
  </span>
198
197
  </TooltipTrigger>
199
198
  <TooltipContent side="top" sideOffset={6} className="flex flex-col items-start gap-0.5 text-xs">
200
- <span className="opacity-80">{t("children.crossProject")}</span>
199
+ <span className="opacity-80">{m.story_children_crossProject()}</span>
201
200
  <span className="font-medium">{storyProjectInfo.name}</span>
202
201
  </TooltipContent>
203
202
  </Tooltip>
@@ -219,7 +218,7 @@ export function StoryRefRow({
219
218
  </span>
220
219
  </TooltipTrigger>
221
220
  <TooltipContent side="top" sideOffset={6} className="flex flex-col items-start gap-0.5 text-xs">
222
- <span className="opacity-80">{t("children.crossProject")}</span>
221
+ <span className="opacity-80">{m.story_children_crossProject()}</span>
223
222
  <span className="font-medium">{storyProjectInfo.name}</span>
224
223
  </TooltipContent>
225
224
  </Tooltip>
@@ -247,10 +246,10 @@ export function StoryRefRow({
247
246
  <AssigneeEditor assignee={storyState.assignee} users={users} onChange={(v) => updateField({ assigneeId: v })} variant="button" />
248
247
  )}
249
248
  {properties.includes("startDate") && (
250
- <DateEditor value={storyState.startDate} onChange={(v) => updateField({ startDate: v })} label={t("children.startDate")} icon={CalendarPlus2} />
249
+ <DateEditor value={storyState.startDate} onChange={(v) => updateField({ startDate: v })} label={m.story_children_startDate()} icon={CalendarPlus2} />
251
250
  )}
252
251
  {properties.includes("dueDate") && (
253
- <DateEditor value={storyState.targetDate} onChange={(v) => updateField({ targetDate: v })} label={t("children.dueDate")} icon={CalendarCheck} overdue={overdue} />
252
+ <DateEditor value={storyState.targetDate} onChange={(v) => updateField({ targetDate: v })} label={m.story_children_dueDate()} icon={CalendarCheck} overdue={overdue} />
254
253
  )}
255
254
  {properties.includes("labels") && (
256
255
  <LabelsEditor labelIds={currentLabelIds} labels={labels} onChange={(v) => updateField({ labelIds: v })} variant="button" aiContext={{ name: () => storyState.name }} />
@@ -273,7 +272,7 @@ export function StoryRefRow({
273
272
  <>
274
273
  <DropdownMenuItem onClick={handleArchive}>
275
274
  <Archive className="mr-2 size-4" />
276
- {t("children.archive")}
275
+ {m.story_children_archive()}
277
276
  </DropdownMenuItem>
278
277
  <DropdownMenuSeparator />
279
278
  </>
@@ -283,13 +282,13 @@ export function StoryRefRow({
283
282
  className="text-destructive focus:text-destructive"
284
283
  >
285
284
  <Trash2 className="mr-2 size-4" />
286
- {t("children.delete")}
285
+ {m.story_children_delete()}
287
286
  </DropdownMenuItem>
288
287
  </>
289
288
  ) : (
290
289
  <DropdownMenuItem onClick={handleUnarchive}>
291
290
  <Archive className="mr-2 size-4" />
292
- {t("children.unarchive")}
291
+ {m.story_children_unarchive()}
293
292
  </DropdownMenuItem>
294
293
  )}
295
294
  </DropdownMenuContent>
@@ -298,9 +297,9 @@ export function StoryRefRow({
298
297
  <NameConfirmDialog
299
298
  open={deleteDialogOpen}
300
299
  onOpenChange={setDeleteDialogOpen}
301
- title={t("children.deleteTitle")}
302
- description={t("children.deleteDescription")}
303
- confirmText={t("children.delete")}
300
+ title={m.story_children_deleteTitle()}
301
+ description={m.story_children_deleteDescription()}
302
+ confirmText={m.story_children_delete()}
304
303
  expectedName={storyState.identifier ?? storyState.id ?? ""}
305
304
  onConfirm={handleDelete}
306
305
  />
@@ -16,13 +16,11 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  import { z } from "zod"
19
- import { getClientI18n } from "@/i18n/client"
20
-
21
- const t = (key: string) => getClientI18n().t(key)
19
+ import { m } from '@/paraglide/messages.js'
22
20
 
23
21
  export const createStorySchema = z.object({
24
- name: z.string().min(1, t("form.storyTitleRequired")),
25
- projectId: z.string().min(1, t("form.projectRequired")),
22
+ name: z.string().min(1, m.common_form_storyTitleRequired()),
23
+ projectId: z.string().min(1, m.common_form_projectRequired()),
26
24
  state: z.string().default("backlog"),
27
25
  priority: z.string().default("none"),
28
26
  assigneeId: z.string().default("none"),