@allbluecn/web-app 0.9.5 → 0.10.2

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 { Plus, ChevronDown, ChartNoAxesGantt } from "lucide-react";
21
20
  import { Button } from "@/components/ui/button";
22
21
  import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover";
@@ -39,6 +38,18 @@ import { StoryRefRow } from "../../relations/story-ref-row";
39
38
  import type { DisplayOptions, GroupNode } from "../../display/types";
40
39
  import type { StoryPatch } from "../../display/group-fields";
41
40
  import type { RelationsData, UserBrief, DependencyRow } from "../../types";
41
+ import { m } from "@/paraglide/messages.js";
42
+
43
+ const DEPENDENCY_ERROR_LABELS: Record<string, () => string> = {
44
+ CYCLE: m.story_dependency_errors_CYCLE,
45
+ DUPLICATED: m.story_dependency_errors_DUPLICATED,
46
+ SELF: m.story_dependency_errors_SELF,
47
+ }
48
+
49
+ const SECTION_TITLE_LABELS: Record<string, () => string> = {
50
+ "dependency.dependsOnTitle": m.story_dependency_dependsOnTitle,
51
+ "dependency.dependentsTitle": m.story_dependency_dependentsTitle,
52
+ }
42
53
 
43
54
  type DependencySection = "dependsOn" | "dependents";
44
55
 
@@ -78,7 +89,6 @@ export function StoryDetailDependencyPanel({
78
89
  onAppendActivities,
79
90
  onNavigateInPanel,
80
91
  }: StoryDetailDependencyPanelProps) {
81
- const { t } = useTranslation("story");
82
92
  const removeDependency = useServerFn(removeDependencyFn);
83
93
  const updateDependency = useServerFn(updateDependencyFn);
84
94
  const [selectedIds, setSelectedIds] = React.useState<Set<string>>(() => new Set());
@@ -169,7 +179,7 @@ export function StoryDetailDependencyPanel({
169
179
  .filter((a) => a.storyId === storyId)
170
180
  .map(({ storyId: _sid, ...rest }) => rest);
171
181
  if (mine.length > 0) onAppendActivities?.(mine);
172
- toast.success(t("dependency.removed"));
182
+ toast.success(m.story_dependency_removed());
173
183
  applyRowsUpdate((rows) => rows.filter((r) => r.id !== rowId), group);
174
184
  setSelectedIds((prev) => {
175
185
  const next = new Set(prev);
@@ -177,7 +187,7 @@ export function StoryDetailDependencyPanel({
177
187
  return next;
178
188
  });
179
189
  } catch (e) {
180
- toast.error(isNetworkError(e) ? t("dependency.networkFailed") : (e as Error)?.message || t("dependency.removeFailed"));
190
+ toast.error(isNetworkError(e) ? m.story_dependency_networkFailed() : (e as Error)?.message || m.story_dependency_removeFailed());
181
191
  }
182
192
  };
183
193
 
@@ -192,14 +202,14 @@ export function StoryDetailDependencyPanel({
192
202
  try {
193
203
  const res = await updateDependency({ data: { depId: row.depId, ...edge } });
194
204
  if (!res.ok) {
195
- toast.warning(t(`dependency.errors.${res.reason}`));
205
+ toast.warning(DEPENDENCY_ERROR_LABELS[res.reason]?.() ?? res.reason);
196
206
  return;
197
207
  }
198
208
  const mine = (res.activities ?? [])
199
209
  .filter((a) => a.storyId === storyId)
200
210
  .map(({ storyId: _sid, ...rest }) => rest);
201
211
  if (mine.length > 0) onAppendActivities?.(mine);
202
- toast.success(t("dependency.updated"));
212
+ toast.success(m.story_dependency_updated());
203
213
  // 行的 group 跟随 option 方向:同 group 原地更新,跨 group 移动到另一 section
204
214
  const oldGroup: DependencySection = data.dependsOn.some((r) => r.id === otherStoryId)
205
215
  ? "dependsOn"
@@ -216,7 +226,7 @@ export function StoryDetailDependencyPanel({
216
226
  }
217
227
  } catch (e) {
218
228
  toast.error(
219
- isNetworkError(e) ? t("dependency.networkFailed") : (e as Error)?.message || t("dependency.updateFailed"),
229
+ isNetworkError(e) ? m.story_dependency_networkFailed() : (e as Error)?.message || m.story_dependency_updateFailed(),
220
230
  );
221
231
  }
222
232
  };
@@ -235,11 +245,11 @@ export function StoryDetailDependencyPanel({
235
245
  if (mine.length > 0) onAppendActivities?.(mine);
236
246
  }
237
247
  }
238
- toast.success(t("dependency.removed"));
248
+ toast.success(m.story_dependency_removed());
239
249
  setSelectedIds(new Set());
240
250
  refreshDependencies();
241
251
  } catch (e) {
242
- toast.error(isNetworkError(e) ? t("dependency.networkFailed") : (e as Error)?.message || t("dependency.removeFailed"));
252
+ toast.error(isNetworkError(e) ? m.story_dependency_networkFailed() : (e as Error)?.message || m.story_dependency_removeFailed());
243
253
  } finally {
244
254
  setBusy(false);
245
255
  }
@@ -253,13 +263,13 @@ export function StoryDetailDependencyPanel({
253
263
  const res = await bulkArchiveStoriesFn({ data: { storyIds: ids } });
254
264
  toast.success(
255
265
  res.skipped > 0
256
- ? t("children.bulkArchivedSkipped", { archived: res.archived, skipped: res.skipped })
257
- : t("children.bulkArchived", { count: res.archived }),
266
+ ? m.story_children_bulkArchivedSkipped({ archived: res.archived, skipped: res.skipped })
267
+ : m.story_children_bulkArchived({ count: res.archived }),
258
268
  );
259
269
  setSelectedIds(new Set());
260
270
  refreshDependencies();
261
271
  } catch (e) {
262
- toast.error((e as Error)?.message || t("children.archiveFailed"));
272
+ toast.error((e as Error)?.message || m.story_children_archiveFailed());
263
273
  } finally {
264
274
  setBusy(false);
265
275
  }
@@ -271,11 +281,11 @@ export function StoryDetailDependencyPanel({
271
281
  setBusy(true);
272
282
  try {
273
283
  const res = await bulkDeleteStoriesFn({ data: { storyIds: ids } });
274
- toast.success(t("children.bulkDeleted", { count: res.deleted }));
284
+ toast.success(m.story_children_bulkDeleted({ count: res.deleted }));
275
285
  setSelectedIds(new Set());
276
286
  refreshDependencies();
277
287
  } catch (e) {
278
- toast.error((e as Error)?.message || t("children.deleteFailed"));
288
+ toast.error((e as Error)?.message || m.story_children_deleteFailed());
279
289
  } finally {
280
290
  setBusy(false);
281
291
  }
@@ -287,10 +297,10 @@ export function StoryDetailDependencyPanel({
287
297
  try {
288
298
  await bulkUpdateStoriesFn({ data: { storyIds: [...selectedIds], patch } });
289
299
  setSelectedIds(new Set());
290
- toast.success(t("dependency.bulkUpdated"));
300
+ toast.success(m.story_dependency_bulkUpdated());
291
301
  refreshDependencies();
292
302
  } catch (e) {
293
- toast.error((e as Error)?.message || t("children.bulkUpdateFailed"));
303
+ toast.error((e as Error)?.message || m.story_children_bulkUpdateFailed());
294
304
  } finally {
295
305
  setBusy(false);
296
306
  }
@@ -365,7 +375,7 @@ export function StoryDetailDependencyPanel({
365
375
  onToggle={toggleStory}
366
376
  onOpenStory={handleOpenStory}
367
377
  onRemove={handleRemoveRow}
368
- removeMenuLabel={t("dependency.remove")}
378
+ removeMenuLabel={m.story_dependency_remove()}
369
379
  dependencyMeta={{ depType: row.depType, group }}
370
380
  onDependencyTypeChange={handleDependencyTypeChange}
371
381
  currentIdentifier={storyIdentifier}
@@ -426,7 +436,7 @@ export function StoryDetailDependencyPanel({
426
436
  <CollapsibleTrigger asChild>
427
437
  <div className="flex h-9 cursor-pointer select-none items-center gap-1.5 bg-muted/50 px-3 text-sm font-medium hover:text-foreground transition-colors">
428
438
  <ChevronDown className={`size-3 shrink-0 text-muted-foreground transition-transform ${isCollapsed ? "-rotate-90" : "rotate-0"}`} />
429
- <span>{t(titleKey)}</span>
439
+ <span>{SECTION_TITLE_LABELS[titleKey]?.() ?? titleKey}</span>
430
440
  <span className="ml-1 text-xs text-muted-foreground">{rows.length}</span>
431
441
  </div>
432
442
  </CollapsibleTrigger>
@@ -434,7 +444,7 @@ export function StoryDetailDependencyPanel({
434
444
  {rows.length === 0 ? (
435
445
  <p className="flex items-center gap-1.5 px-2 py-1.5 text-xs text-muted-foreground">
436
446
  <span className="w-4 shrink-0" aria-hidden />
437
- {t("relation.none")}
447
+ {m.story_relation_none()}
438
448
  </p>
439
449
  ) : filters.groupBy === "none" ? (
440
450
  rows.map((row) => renderRow(row, sectionKey))
@@ -463,7 +473,7 @@ export function StoryDetailDependencyPanel({
463
473
  }}
464
474
  >
465
475
  <div className="flex items-center gap-1.5">
466
- <span>{t("relations.dependency")}</span>
476
+ <span>{m.story_relations_dependency()}</span>
467
477
  <span className="inline-flex min-w-[18px] items-center justify-center rounded-full bg-primary px-1 text-[10px] font-medium text-primary-foreground">
468
478
  {totalCount}
469
479
  </span>
@@ -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 { LinkIcon, Paperclip, BookOpenText } from "lucide-react";
@@ -38,6 +37,13 @@ import { CreateStoryDialog } from "../create-story-dialog";
38
37
  import { addDependenciesFn, getDependenciesFn, listChildStoriesFn } from "@/server/serverFns/story";
39
38
  import { DEPENDENCY_TYPE_OPTIONS, toDependencyEdge, type DependencyTypeOption } from "../constants";
40
39
  import type { RelationsData, UserBrief } from "../types";
40
+ import { m } from "@/paraglide/messages.js";
41
+
42
+ const DEPENDENCY_ERROR_LABELS: Record<string, () => string> = {
43
+ CYCLE: m.story_dependency_errors_CYCLE,
44
+ DUPLICATED: m.story_dependency_errors_DUPLICATED,
45
+ SELF: m.story_dependency_errors_SELF,
46
+ }
41
47
 
42
48
  interface StoryDetailToolbarProps {
43
49
  storyId: string;
@@ -55,7 +61,6 @@ interface StoryDetailToolbarProps {
55
61
  }
56
62
 
57
63
  export function StoryDetailToolbar({ storyId, storyIdentifier, projectId, data, onRefresh, onAppendActivities, users, projects, labels, onNavigateInPanel }: StoryDetailToolbarProps) {
58
- const { t } = useTranslation("story");
59
64
  const [actionOpen, setActionOpen] = React.useState<"create" | "select" | null>(null);
60
65
  const [dependencyDialogOpen, setDependencyDialogOpen] = React.useState(false);
61
66
  const [assocDialogOpen, setAssocDialogOpen] = React.useState<AssociatedDialogKind | null>(null);
@@ -90,21 +95,21 @@ export function StoryDetailToolbar({ storyId, storyIdentifier, projectId, data,
90
95
  try {
91
96
  const res = await addDependencies({ data: { items } });
92
97
  if (res.created.length > 0) {
93
- toast.success(t("dependency.added", { count: res.created.length }));
98
+ toast.success(m.story_dependency_added({ count: res.created.length }));
94
99
  const mine = res.activities
95
100
  .filter((a) => a.storyId === storyId)
96
101
  .map(({ storyId: _sid, ...rest }) => rest);
97
102
  if (mine.length > 0) onAppendActivities?.(mine);
98
103
  }
99
104
  if (res.failed.length > 0) {
100
- const reasons = [...new Set(res.failed.map((f) => t(`dependency.errors.${f.reason}`)))].join("、");
101
- toast.warning(t("dependency.addPartialFailed", { failed: res.failed.length, reasons }));
105
+ const reasons = [...new Set(res.failed.map((f) => DEPENDENCY_ERROR_LABELS[f.reason]?.() ?? f.reason))].join("、");
106
+ toast.warning(m.story_dependency_addPartialFailed({ failed: res.failed.length, reasons }));
102
107
  } else {
103
108
  setDependencyDialogOpen(false);
104
109
  }
105
110
  refreshDependencies();
106
111
  } catch (e) {
107
- toast.error((e as Error)?.message || t("dependency.addFailed"));
112
+ toast.error((e as Error)?.message || m.story_dependency_addFailed());
108
113
  }
109
114
  };
110
115
 
@@ -194,7 +199,7 @@ export function StoryDetailToolbar({ storyId, storyIdentifier, projectId, data,
194
199
  onClick={() => handleOpenAssocDialog("link")}
195
200
  >
196
201
  <LinkIcon className="size-3.5 text-muted-foreground" />
197
- {t("linkDialog.button")}
202
+ {m.story_linkDialog_button()}
198
203
  {data.links.length > 0 && (
199
204
  <span className="ml-0.5 inline-flex min-w-[18px] items-center justify-center rounded-full bg-primary px-1 text-[10px] font-medium text-primary-foreground">
200
205
  {data.links.length}
@@ -208,7 +213,7 @@ export function StoryDetailToolbar({ storyId, storyIdentifier, projectId, data,
208
213
  onClick={() => handleOpenAssocDialog("attachment")}
209
214
  >
210
215
  <Paperclip className="size-3.5 text-muted-foreground" />
211
- {t("attachmentDialog.button")}
216
+ {m.story_attachmentDialog_button()}
212
217
  {data.attachments.length > 0 && (
213
218
  <span className="ml-0.5 inline-flex min-w-[18px] items-center justify-center rounded-full bg-primary px-1 text-[10px] font-medium text-primary-foreground">
214
219
  {data.attachments.length}
@@ -222,7 +227,7 @@ export function StoryDetailToolbar({ storyId, storyIdentifier, projectId, data,
222
227
  onClick={() => handleOpenAssocDialog("knowledge")}
223
228
  >
224
229
  <BookOpenText className="size-3.5 text-muted-foreground" />
225
- {t("knowledgeDialog.button")}
230
+ {m.story_knowledgeDialog_button()}
226
231
  {data.knowledge.docs.length > 0 && (
227
232
  <span className="ml-0.5 inline-flex min-w-[18px] items-center justify-center rounded-full bg-primary px-1 text-[10px] font-medium text-primary-foreground">
228
233
  {data.knowledge.docs.length}
@@ -280,7 +285,7 @@ export function StoryDetailToolbar({ storyId, storyIdentifier, projectId, data,
280
285
  projects={projects ?? []}
281
286
  initialProjectId={projectId ?? undefined}
282
287
  mode="child"
283
- title={t("children.selectChild")}
288
+ title={m.story_children_selectChild()}
284
289
  defaultSelectedParentIds={data.hierarchy.children.map((c) => c.id)}
285
290
  onSelected={() => {
286
291
  setActionOpen(null);
@@ -298,7 +303,7 @@ export function StoryDetailToolbar({ storyId, storyIdentifier, projectId, data,
298
303
  initialProjectId={projectId ?? undefined}
299
304
  mode="dependency"
300
305
  skipTransfer
301
- title={t("dependency.add")}
306
+ title={m.story_dependency_add()}
302
307
  excludeIds={dependencyExcludeIds}
303
308
  dependencyType={dependencyType}
304
309
  onDependencyTypeChange={setDependencyType}
@@ -16,7 +16,6 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  import { GitPullRequestArrow, Tag, CalendarRange } from "lucide-react";
19
- import { useTranslation } from "react-i18next";
20
19
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible";
21
20
  import { ChevronDown } from "lucide-react";
22
21
  import type { StoryState } from "../constants";
@@ -25,6 +24,7 @@ import { ParentStoryEditor } from "../inline-editors/parent-story-editor";
25
24
  import { LabelsEditor } from "../inline-editors/labels-editor";
26
25
  import { IterationEditor } from "@/components/iteration/iteration-editor";
27
26
  import type { IterationSummary } from "@/server/serverFns/iteration/schemas";
27
+ import { m } from "@/paraglide/messages.js";
28
28
 
29
29
  interface PropertyItemProps {
30
30
  icon: React.ReactNode;
@@ -74,19 +74,18 @@ export function StoryProperties({
74
74
  onIterationChange,
75
75
  onActivities,
76
76
  }: StoryPropertiesProps) {
77
- const { t } = useTranslation("story");
78
77
  return (
79
78
  <Collapsible defaultOpen>
80
- <div className="px-6 py-4 text-sm font-semibold">{t("properties.title")}</div>
79
+ <div className="px-6 py-4 text-sm font-semibold">{m.story_properties_title()}</div>
81
80
  <CollapsibleContent className="px-6 pb-2 space-y-2">
82
81
  <Collapsible defaultOpen>
83
82
  <CollapsibleTrigger className="flex select-none items-center gap-2 pb-4 text-xs font-semibold hover:text-foreground transition-colors">
84
- {t("properties.basic")}
83
+ {m.story_properties_basic()}
85
84
  <ChevronDown className="size-3" />
86
85
  </CollapsibleTrigger>
87
86
  <CollapsibleContent className="space-y-2 pb-2">
88
87
  {projects && (
89
- <PropertyItem icon={<GitPullRequestArrow className="size-3.5" />} label={t("properties.parent")}>
88
+ <PropertyItem icon={<GitPullRequestArrow className="size-3.5" />} label={m.story_properties_parent()}>
90
89
  <ParentStoryEditor
91
90
  parentId={story.parentId}
92
91
  parent={story.parent}
@@ -101,7 +100,7 @@ export function StoryProperties({
101
100
  </PropertyItem>
102
101
  )}
103
102
  {labels && (
104
- <PropertyItem icon={<Tag className="size-3.5" />} label={t("properties.labels")}>
103
+ <PropertyItem icon={<Tag className="size-3.5" />} label={m.story_properties_labels()}>
105
104
  <LabelsEditor
106
105
  labelIds={story.labels.map((l) => l.id)}
107
106
  labels={labels}
@@ -115,11 +114,11 @@ export function StoryProperties({
115
114
  </Collapsible>
116
115
  <Collapsible>
117
116
  <CollapsibleTrigger className="flex select-none items-center gap-2 pb-4 text-xs font-semibold hover:text-foreground transition-colors">
118
- {t("properties.iteration")}
117
+ {m.story_properties_iteration()}
119
118
  <ChevronDown className="size-3" />
120
119
  </CollapsibleTrigger>
121
120
  <CollapsibleContent className="pb-2">
122
- <PropertyItem icon={<CalendarRange className="size-3.5" />} label={t("properties.iteration")}>
121
+ <PropertyItem icon={<CalendarRange className="size-3.5" />} label={m.story_properties_iteration()}>
123
122
  <IterationEditor
124
123
  storyId={story.id}
125
124
  current={story.iteration ?? null}
@@ -17,8 +17,6 @@
17
17
 
18
18
  import { describe, it, expect, vi, beforeAll, beforeEach } from "vitest";
19
19
  import { render, screen, fireEvent, within } from "@testing-library/react";
20
- import { I18nextProvider } from "react-i18next";
21
- import { createServerI18n } from "@/i18n/server";
22
20
  import { TooltipProvider } from "@/components/ui/tooltip";
23
21
  import { DisplayDropdown } from "../display-dropdown";
24
22
  import { DEFAULT_DISPLAY_OPTIONS } from "../types";
@@ -29,6 +27,8 @@ vi.mock("@/components/billing/use-feature", () => ({
29
27
  useFeature: vi.fn(),
30
28
  }));
31
29
 
30
+ ;
31
+
32
32
  import { useFeature } from "@/components/billing/use-feature";
33
33
 
34
34
  const mockUseFeature = useFeature as ReturnType<typeof vi.fn>;
@@ -44,10 +44,8 @@ beforeAll(() => {
44
44
  Element.prototype.scrollIntoView = () => {};
45
45
  });
46
46
 
47
- const i18n = createServerI18n("zh");
48
-
49
47
  const renderWithTooltip = (ui: React.ReactElement) =>
50
- render(<I18nextProvider i18n={i18n}><TooltipProvider>{ui}</TooltipProvider></I18nextProvider>);
48
+ render(<TooltipProvider>{ui}</TooltipProvider>);
51
49
 
52
50
  const makeFilters = (over: Partial<DisplayOptions> = {}): DisplayOptions => ({
53
51
  ...DEFAULT_DISPLAY_OPTIONS,
@@ -29,6 +29,8 @@ const h = vi.hoisted(() => ({
29
29
 
30
30
  vi.mock("@/server/serverFns/story", () => h);
31
31
 
32
+ ;
33
+
32
34
  import { usePagedStoryGroups } from "../use-paged-story-groups";
33
35
 
34
36
  const makeStory = (over: Partial<StoryListItem> & { id: string }): StoryListItem => ({
@@ -17,39 +17,40 @@
17
17
 
18
18
  import { CircleDotDashed, ArrowUpDown, User, Tag, UserPlus, Trees, X, CircleFadingArrowUp, ArrowDownUp, Plus, RefreshCw, CalendarPlus2, CalendarCheck, Hash, GitBranch, Paperclip, LayoutList, FolderKanban, type LucideIcon } from "lucide-react";
19
19
  import type { StoryView } from "../views/view-switcher";
20
+ import { m } from '@/paraglide/messages.js';
20
21
  import type { GroupKey, OrderKey, DisplayProperty } from "./types";
21
22
  import { ALL_DISPLAY_PROPERTIES } from "./types";
22
23
 
23
- export const GROUP_LABELS: Record<GroupKey, string> = {
24
- state: "group.state",
25
- priority: "group.priority",
26
- assignee: "group.assignee",
27
- labels: "group.labels",
28
- createdBy: "group.createdBy",
29
- project: "group.project",
30
- none: "group.none",
24
+ export const GROUP_LABELS: Record<GroupKey, () => string> = {
25
+ state: m.story_display_group_state,
26
+ priority: m.story_display_group_priority,
27
+ assignee: m.story_display_group_assignee,
28
+ labels: m.story_display_group_labels,
29
+ createdBy: m.story_display_group_createdBy,
30
+ project: m.story_display_group_project,
31
+ none: m.story_display_group_none,
31
32
  };
32
33
 
33
- export const ORDER_LABELS: Record<OrderKey, string> = {
34
- manual: "order.manual",
35
- created: "order.created",
36
- updated: "order.updated",
37
- startDate: "order.startDate",
38
- dueDate: "order.dueDate",
39
- priority: "order.priority",
34
+ export const ORDER_LABELS: Record<OrderKey, () => string> = {
35
+ manual: m.story_display_order_manual,
36
+ created: m.story_display_order_created,
37
+ updated: m.story_display_order_updated,
38
+ startDate: m.story_display_order_startDate,
39
+ dueDate: m.story_display_order_dueDate,
40
+ priority: m.story_display_order_priority,
40
41
  };
41
42
 
42
- export const PROPERTY_LABELS: Record<DisplayProperty, string> = {
43
- id: "property.id",
44
- project: "property.project",
45
- assignee: "property.assignee",
46
- startDate: "property.startDate",
47
- dueDate: "property.dueDate",
48
- labels: "property.labels",
49
- priority: "property.priority",
50
- state: "property.state",
51
- subCount: "property.subCount",
52
- attachmentCount: "property.attachmentCount",
43
+ export const PROPERTY_LABELS: Record<DisplayProperty, () => string> = {
44
+ id: m.story_display_property_id,
45
+ project: m.story_display_property_project,
46
+ assignee: m.story_display_property_assignee,
47
+ startDate: m.story_display_property_startDate,
48
+ dueDate: m.story_display_property_dueDate,
49
+ labels: m.story_display_property_labels,
50
+ priority: m.story_display_property_priority,
51
+ state: m.story_display_property_state,
52
+ subCount: m.story_display_property_subCount,
53
+ attachmentCount: m.story_display_property_attachmentCount,
53
54
  };
54
55
 
55
56
  export const GROUP_ICONS: Record<GroupKey, LucideIcon> = {
@@ -16,7 +16,6 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  import { useMemo, useState, type ReactNode } from "react";
19
- import { useTranslation } from "react-i18next";
20
19
  import { ArrowDownNarrowWide, ArrowUpWideNarrow, ChartNoAxesGantt, Check, ChevronRight, ChevronDown, Lock, type LucideIcon } from "lucide-react";
21
20
  import { Button } from "@/components/ui/button";
22
21
  import { Switch } from "@/components/ui/switch";
@@ -34,6 +33,7 @@ import type { StoryView } from "../views/view-switcher";
34
33
  import { DEFAULT_DISPLAY_OPTIONS, GROUP_KEYS, ORDER_KEYS, PAGE_SIZE_OPTIONS, type DisplayOptions, type DisplayProperty, type GroupKey, type OrderDirection, type OrderKey, type PageSize } from "./types";
35
34
  import { GROUP_LABELS, ORDER_LABELS, PROPERTY_LABELS, LAYOUT_SUPPORT, LAYOUT_PROPERTIES, GROUP_ICONS, ORDER_ICONS } from "./constants";
36
35
  import { implementedModules } from "@/plugins/modules.gen";
36
+ import { m } from "@/paraglide/messages.js";
37
37
 
38
38
  /** 分组选项:布局不支持分组时返回空数组;选中特定项目时隐藏"项目"分组 */
39
39
  export function getGroupOptions(layout: StoryView, projectId?: string): GroupKey[] {
@@ -102,7 +102,6 @@ export interface DisplayDropdownProps {
102
102
  }
103
103
 
104
104
  export function DisplayDropdown({ filters, onChange, layout, projectId, projects, views, activeViewId, onApplyView, onEditView, onDeleteView, onAddView, pageSize, onPageSizeChange }: DisplayDropdownProps) {
105
- const { t } = useTranslation("display");
106
105
  const support = LAYOUT_SUPPORT[layout];
107
106
  const changed = useMemo(() => hasDisplayChanges(filters, layout), [filters, layout]);
108
107
 
@@ -114,7 +113,7 @@ export function DisplayDropdown({ filters, onChange, layout, projectId, projects
114
113
  <Button
115
114
  variant="outline"
116
115
  size="sm"
117
- aria-label={t("displayOptions")}
116
+ aria-label={m.display_displayOptions()}
118
117
  className={cn(
119
118
  "relative h-8 gap-1.5 px-2.5 text-sm font-normal",
120
119
  changed && "border-primary/50 bg-primary/5 text-primary",
@@ -130,7 +129,7 @@ export function DisplayDropdown({ filters, onChange, layout, projectId, projects
130
129
  </Button>
131
130
  </TooltipTrigger>
132
131
  </PopoverTrigger>
133
- <TooltipContent side="bottom">{t("viewGrouping")}</TooltipContent>
132
+ <TooltipContent side="bottom">{m.display_viewGrouping()}</TooltipContent>
134
133
  </Tooltip>
135
134
  <PopoverContent className="w-75 p-0" align="start">
136
135
  <div className="max-h-[70vh] overflow-y-auto">
@@ -171,7 +170,6 @@ export interface DisplayOptionsBodyProps {
171
170
  }
172
171
 
173
172
  export function DisplayOptionsBody({ filters, onChange, layout, projectId, pageSize, onPageSizeChange, showSubItems, beforeOptions }: DisplayOptionsBodyProps) {
174
- const { t } = useTranslation("display");
175
173
  const support = LAYOUT_SUPPORT[layout];
176
174
  const showEmptyGroups = support.options && support.groupBy;
177
175
  const showSubItemsEnabled = showSubItems ?? layout === "list";
@@ -183,28 +181,27 @@ export function DisplayOptionsBody({ filters, onChange, layout, projectId, pageS
183
181
  selected={filters.properties}
184
182
  onChange={(props) => onChange({ properties: props })}
185
183
  layout={layout}
186
- t={t}
187
184
  />
188
185
  )}
189
186
  {support.groupBy && (
190
187
  <InlineRadioSection
191
188
  dataSection="groupBy"
192
- label={t("group")}
189
+ label={m.display_group()}
193
190
  value={filters.groupBy}
194
191
  optionKeys={getGroupOptions(layout, projectId)}
195
192
  iconMap={GROUP_ICONS as Record<string, LucideIcon>}
196
- labelMap={GROUP_LABELS as Record<string, string>}
193
+ labelMap={GROUP_LABELS}
197
194
  onSelect={(v) => onChange({ groupBy: v as GroupKey })}
198
195
  />
199
196
  )}
200
197
  {support.subGroupBy && (
201
198
  <InlineRadioSection
202
199
  dataSection="subGroupBy"
203
- label={t("subGroup")}
200
+ label={m.display_subGroup()}
204
201
  value={filters.subGroupBy}
205
202
  optionKeys={getSubGroupOptions(layout, filters.groupBy, projectId)}
206
203
  iconMap={GROUP_ICONS as Record<string, LucideIcon>}
207
- labelMap={GROUP_LABELS as Record<string, string>}
204
+ labelMap={GROUP_LABELS}
208
205
  disabled={filters.groupBy === "none"}
209
206
  onSelect={(v) => onChange({ subGroupBy: v as GroupKey })}
210
207
  />
@@ -212,11 +209,11 @@ export function DisplayOptionsBody({ filters, onChange, layout, projectId, pageS
212
209
  {support.orderBy && (
213
210
  <InlineRadioSection
214
211
  dataSection="orderBy"
215
- label={t("order")}
212
+ label={m.display_order()}
216
213
  value={filters.orderBy}
217
214
  optionKeys={getOrderOptions(layout)}
218
215
  iconMap={ORDER_ICONS as Record<string, LucideIcon>}
219
- labelMap={ORDER_LABELS as Record<string, string>}
216
+ labelMap={ORDER_LABELS}
220
217
  onSelect={(v) => onChange({ orderBy: v as OrderKey })}
221
218
  orderDir={filters.orderDir}
222
219
  onOrderDirChange={(dir) => onChange({ orderDir: dir })}
@@ -244,7 +241,7 @@ interface InlineRadioSectionProps {
244
241
  value: string;
245
242
  optionKeys: string[];
246
243
  iconMap: Record<string, LucideIcon>;
247
- labelMap: Record<string, string>;
244
+ labelMap: Record<string, () => string>;
248
245
  disabled?: boolean;
249
246
  onSelect: (value: string) => void;
250
247
  orderDir?: OrderDirection;
@@ -263,11 +260,10 @@ function InlineRadioSection({
263
260
  orderDir,
264
261
  onOrderDirChange,
265
262
  }: InlineRadioSectionProps) {
266
- const { t } = useTranslation("display");
267
263
  const [collapsed, setCollapsed] = useState(false);
268
264
  const options = optionKeys.map((k) => ({
269
265
  value: k,
270
- label: t(labelMap[k] ?? k),
266
+ label: labelMap[k]?.() ?? k,
271
267
  icon: iconMap[k],
272
268
  }));
273
269
 
@@ -291,7 +287,7 @@ function InlineRadioSection({
291
287
  variant="ghost"
292
288
  size="sm"
293
289
  data-testid="order-dir-asc"
294
- aria-label={t("asc")}
290
+ aria-label={m.display_asc()}
295
291
  className={cn(
296
292
  "size-6 rounded p-0 text-xs text-muted-foreground hover:bg-muted hover:text-foreground",
297
293
  orderDir === "asc" && "bg-muted text-foreground",
@@ -306,7 +302,7 @@ function InlineRadioSection({
306
302
  variant="ghost"
307
303
  size="sm"
308
304
  data-testid="order-dir-desc"
309
- aria-label={t("desc")}
305
+ aria-label={m.display_desc()}
310
306
  className={cn(
311
307
  "size-6 rounded p-0 text-xs text-muted-foreground hover:bg-muted hover:text-foreground",
312
308
  orderDir === "desc" && "bg-muted text-foreground",
@@ -360,10 +356,9 @@ interface PropertiesSectionProps {
360
356
  selected: DisplayProperty[];
361
357
  onChange: (props: DisplayProperty[]) => void;
362
358
  layout: StoryView;
363
- t: (key: string) => string;
364
359
  }
365
360
 
366
- function PropertiesSection({ selected, onChange, layout, t }: PropertiesSectionProps) {
361
+ function PropertiesSection({ selected, onChange, layout }: PropertiesSectionProps) {
367
362
  const [collapsed, setCollapsed] = useState(false);
368
363
  const available = LAYOUT_PROPERTIES[layout];
369
364
  const toggle = (prop: DisplayProperty) => {
@@ -384,7 +379,7 @@ function PropertiesSection({ selected, onChange, layout, t }: PropertiesSectionP
384
379
  className="mb-1.5 flex w-full items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground"
385
380
  >
386
381
  {collapsed ? <ChevronRight className="size-3" /> : <ChevronDown className="size-3" />}
387
- {t("showProperties")}
382
+ {m.display_showProperties()}
388
383
  </button>
389
384
  {!collapsed && (
390
385
  <div className="flex flex-wrap gap-1.5">
@@ -402,7 +397,7 @@ function PropertiesSection({ selected, onChange, layout, t }: PropertiesSectionP
402
397
  : "border-border text-muted-foreground hover:bg-muted hover:text-foreground",
403
398
  )}
404
399
  >
405
- {t(PROPERTY_LABELS[prop])}
400
+ {PROPERTY_LABELS[prop]?.() ?? prop}
406
401
  </button>
407
402
  );
408
403
  })}
@@ -431,7 +426,6 @@ function OptionsSection({
431
426
  pageSize,
432
427
  onPageSizeChange,
433
428
  }: OptionsSectionProps) {
434
- const { t } = useTranslation("display");
435
429
  // OSS 环境(billing 模块未实现)只显示 100/200;Pro 环境显示全部
436
430
  const sizeOptions = implementedModules.billing
437
431
  ? (PAGE_SIZE_OPTIONS as readonly PageSize[])
@@ -445,21 +439,21 @@ function OptionsSection({
445
439
  return (
446
440
  <div data-section="options" className="border-t px-3 py-2">
447
441
  <div className="flex items-center justify-between gap-2 py-0.5">
448
- <span className="text-xs font-medium text-foreground">{t("extraOptions")}</span>
442
+ <span className="text-xs font-medium text-foreground">{m.display_extraOptions()}</span>
449
443
  </div>
450
444
  <div className="mt-1 flex flex-col gap-1">
451
445
  <label className="flex cursor-pointer items-center justify-between py-1">
452
- <span className="text-xs text-muted-foreground">{t("showEmptyGroups")}</span>
446
+ <span className="text-xs text-muted-foreground">{m.display_showEmptyGroups()}</span>
453
447
  <Switch checked={showEmptyGroups} onCheckedChange={onShowEmptyChange} size="sm" />
454
448
  </label>
455
449
  {showSubItemsSupported && (
456
450
  <label className="flex cursor-pointer items-center justify-between py-1">
457
- <span className="text-xs text-muted-foreground">{t("showSubItems")}</span>
451
+ <span className="text-xs text-muted-foreground">{m.display_showSubItems()}</span>
458
452
  <Switch checked={showSubItems} onCheckedChange={onShowSubChange} size="sm" />
459
453
  </label>
460
454
  )}
461
455
  <div className="flex items-center justify-between py-1">
462
- <span className="text-xs text-muted-foreground">{t("pageSize")}</span>
456
+ <span className="text-xs text-muted-foreground">{m.display_pageSize()}</span>
463
457
  <div className="flex items-center gap-0.5 rounded border border-border p-0.5">
464
458
  {sizeOptions.map((v) => {
465
459
  const locked = isPageSizeLocked(v);