@allbluecn/web-app 0.9.4 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (684) hide show
  1. package/package.json +12 -10
  2. package/public/favicon.ico +0 -0
  3. package/src/__tests__/paraglide.test.ts +43 -0
  4. package/src/__tests__/setup.ts +27 -9
  5. package/src/assets/illustrations/empty-states/workspace-empty.svg +5 -0
  6. package/src/assets/illustrations/knowledge/law-card-illustration.svg +5 -0
  7. package/src/assets/logo/logo.tsx +53 -36
  8. package/src/components/agents/agent-card.tsx +7 -7
  9. package/src/components/agents/agent-form-dialog.tsx +41 -42
  10. package/src/components/agents/agent-selector.tsx +6 -8
  11. package/src/components/agents/agents-page.tsx +26 -28
  12. package/src/components/agents/skill-card.tsx +1 -4
  13. package/src/components/agents/skill-form-dialog.tsx +19 -21
  14. package/src/components/agents/slash-skill-menu.tsx +5 -7
  15. package/src/components/agents/use-agent-handlers.ts +5 -8
  16. package/src/components/ai/ai-chat-prompt.tsx +26 -33
  17. package/src/components/ai/global-chat-panel.tsx +10 -11
  18. package/src/components/ai/use-knowledge-bases.ts +2 -2
  19. package/src/components/anyhub/anyhub-app-card.tsx +13 -15
  20. package/src/components/anyhub/anyhub-app-runner.tsx +5 -7
  21. package/src/components/anyhub/anyhub-install-dialog.tsx +16 -18
  22. package/src/components/anyhub/anyhub-management-view.tsx +9 -11
  23. package/src/components/anyhub/anyhub-marketplace-view.tsx +14 -17
  24. package/src/components/anyhub/anyhub-permission-panel.tsx +8 -11
  25. package/src/components/anyhub/anyhub-provider.tsx +0 -1
  26. package/src/components/anyhub/anyhub-top-nav.tsx +5 -8
  27. package/src/components/auth/auth-header.tsx +2 -2
  28. package/src/components/auth/icon-input.tsx +0 -1
  29. package/src/components/auth/oauth-section.tsx +3 -5
  30. package/src/components/auth/password-input.tsx +2 -4
  31. package/src/components/auth/session-guard.tsx +0 -1
  32. package/src/components/auth/sso-section.tsx +3 -4
  33. package/src/components/billing/__tests__/seats-manager.test.tsx +5 -9
  34. package/src/components/billing/billing-panel.tsx +5 -6
  35. package/src/components/billing/checkout-redirect.ts +6 -10
  36. package/src/components/billing/feature-gate.tsx +2 -3
  37. package/src/components/billing/invoice-history.tsx +9 -11
  38. package/src/components/billing/login-prompt-dialog.tsx +10 -11
  39. package/src/components/billing/pricing-card.tsx +6 -7
  40. package/src/components/billing/pricing-page.tsx +4 -5
  41. package/src/components/billing/seats-manager.tsx +19 -20
  42. package/src/components/billing/subscription-card.tsx +13 -14
  43. package/src/components/billing/upgrade-prompt.tsx +11 -13
  44. package/src/components/changelog/changelog-page.tsx +36 -26
  45. package/src/components/chat/ai-chat-history/components/conversation-header.tsx +4 -5
  46. package/src/components/chat/ai-chat-history/components/conversation-item.tsx +15 -17
  47. package/src/components/chat/ai-chat-history/components/conversation-search.tsx +3 -4
  48. package/src/components/chat/ai-chat-history/components/empty-state.tsx +5 -6
  49. package/src/components/chat/ai-chat-history/index.tsx +11 -15
  50. package/src/components/chat/ai-chat-history/utils/group-conversations.ts +9 -2
  51. package/src/components/chat/ai-citations/components/citation-item.tsx +3 -5
  52. package/src/components/chat/ai-citations/components/citations-list.tsx +4 -6
  53. package/src/components/chat/ai-citations/components/inline-citation.tsx +2 -4
  54. package/src/components/chat/ai-citations/components/source-components.tsx +6 -10
  55. package/src/components/chat/ai-citations/index.tsx +3 -4
  56. package/src/components/chat/ai-citations/utils.ts +15 -3
  57. package/src/components/chat/ai-conversation.tsx +10 -12
  58. package/src/components/chat/ai-message/components/message-actions.tsx +7 -9
  59. package/src/components/chat/ai-message/components/streaming-indicator.tsx +3 -4
  60. package/src/components/chat/ai-message/index.tsx +5 -5
  61. package/src/components/chat/ai-message/utils/dom-utils.ts +1 -1
  62. package/src/components/chat/ai-prompt-input/components/action-buttons.tsx +14 -16
  63. package/src/components/chat/ai-prompt-input/components/agent-mode-select.tsx +10 -5
  64. package/src/components/chat/ai-prompt-input/components/context-badge.tsx +2 -3
  65. package/src/components/chat/ai-prompt-input/components/kb-context-selector.tsx +6 -8
  66. package/src/components/chat/ai-prompt-input/components/model-select.tsx +14 -7
  67. package/src/components/chat/ai-prompt-input/components/page-user-context-selector.tsx +6 -8
  68. package/src/components/chat/ai-prompt-input/index.tsx +18 -11
  69. package/src/components/chat/ai-prompt-input/types.ts +6 -5
  70. package/src/components/chat/ai-thinking.tsx +6 -9
  71. package/src/components/chat/chat-thread-page.tsx +4 -5
  72. package/src/components/chat/interrupt-approval.tsx +6 -8
  73. package/src/components/command/command-palette.tsx +7 -10
  74. package/src/components/design/project-card.tsx +2 -3
  75. package/src/components/design/sketch/code-preview.tsx +3 -4
  76. package/src/components/design/sketch/export-panel.tsx +3 -4
  77. package/src/components/design/sketch/property-panel.tsx +16 -17
  78. package/src/components/error/global-error-boundary.tsx +65 -0
  79. package/src/components/forms/app-array-field.tsx +3 -4
  80. package/src/components/forms/app-combobox.tsx +2 -3
  81. package/src/components/forms/app-date-picker.tsx +2 -3
  82. package/src/components/forms/app-form-dialog.tsx +3 -4
  83. package/src/components/forms/app-select.tsx +2 -3
  84. package/src/components/forms/hooks/use-form-submit.ts +2 -2
  85. package/src/components/forms/schemas/common.ts +4 -6
  86. package/src/components/hotkeys/shortcuts-panel.tsx +2 -3
  87. package/src/components/iteration/auto-schedule-dialog.tsx +12 -13
  88. package/src/components/iteration/burndown-chart.tsx +6 -8
  89. package/src/components/iteration/constants.ts +5 -4
  90. package/src/components/iteration/create-iteration-dialog.tsx +14 -15
  91. package/src/components/iteration/iteration-card.tsx +3 -4
  92. package/src/components/iteration/iteration-editor.tsx +7 -8
  93. package/src/components/iteration/iteration-progress-bar.tsx +3 -5
  94. package/src/components/iteration/iteration-status-badge.tsx +1 -3
  95. package/src/components/kibo-ui/contribution-graph/index.tsx +37 -9
  96. package/src/components/knowledge/dialog/knowledge-form-dialog.tsx +8 -9
  97. package/src/components/knowledge/doc-properties.tsx +12 -13
  98. package/src/components/knowledge/editor/doc-header.tsx +7 -8
  99. package/src/components/knowledge/editor/knowledge-doc-editor.tsx +9 -9
  100. package/src/components/knowledge/knowledge-homepage.tsx +6 -7
  101. package/src/components/knowledge/knowledge-tag-input.tsx +3 -4
  102. package/src/components/knowledge/knowledge-toolbar.tsx +38 -40
  103. package/src/components/knowledge/knowledge-tree-item.tsx +21 -22
  104. package/src/components/knowledge/knowledge-tree.tsx +15 -16
  105. package/src/components/knowledge-public/bookmark-card.tsx +13 -14
  106. package/src/components/knowledge-public/bookmark-form-dialog.tsx +25 -26
  107. package/src/components/knowledge-public/knowledge-card-grid.tsx +3 -3
  108. package/src/components/knowledge-public/knowledge-filters.tsx +9 -10
  109. package/src/components/knowledge-public/knowledge-form-dialog.tsx +62 -63
  110. package/src/components/knowledge-public/knowledge-search-bar.tsx +3 -4
  111. package/src/components/knowledge-public/legal-compliance-editor.tsx +30 -31
  112. package/src/components/knowledge-public/markdown-editor.tsx +3 -4
  113. package/src/components/knowledge-public/markdown-view.tsx +2 -3
  114. package/src/components/knowledge-public/sharers-avatar-group.tsx +3 -4
  115. package/src/components/knowledge-public/tag-filter.tsx +3 -4
  116. package/src/components/layout/sidebar-03/__tests__/nav-workspace.test.tsx +42 -79
  117. package/src/components/layout/sidebar-03/__tests__/user-menu-anonymous.test.tsx +51 -0
  118. package/src/components/layout/sidebar-03/app-sidebar.tsx +3 -4
  119. package/src/components/layout/sidebar-03/index.tsx +0 -1
  120. package/src/components/layout/sidebar-03/nav-anyhub.tsx +4 -5
  121. package/src/components/layout/sidebar-03/nav-knowledge.tsx +80 -37
  122. package/src/components/layout/sidebar-03/nav-main.tsx +10 -12
  123. package/src/components/layout/sidebar-03/nav-notifications.tsx +19 -28
  124. package/src/components/layout/sidebar-03/nav-search-trigger.tsx +3 -5
  125. package/src/components/layout/sidebar-03/nav-workspace.tsx +32 -12
  126. package/src/components/layout/sidebar-03/team-switcher.tsx +0 -1
  127. package/src/components/layout/sidebar-03/user-menu.tsx +33 -13
  128. package/src/components/magicui/components/animate/avatar-group.tsx +0 -1
  129. package/src/components/magicui/primitives/animate/avatar-group.tsx +0 -1
  130. package/src/components/magicui/primitives/animate/slot.tsx +0 -1
  131. package/src/components/magicui/primitives/animate/tooltip.tsx +0 -1
  132. package/src/components/magicui/sparkles-text.tsx +0 -1
  133. package/src/components/mindmap/mindmap-doc-editor.tsx +15 -15
  134. package/src/components/notifications/settings-notifications.tsx +22 -23
  135. package/src/components/notifications/team-notifications.tsx +27 -29
  136. package/src/components/plugin-slots/__tests__/plugin-settings-tabs.test.tsx +4 -4
  137. package/src/components/plugin-slots/plugin-settings-tabs.tsx +15 -11
  138. package/src/components/project/create-project-dialog.tsx +60 -34
  139. package/src/components/project/invite-member-dialog.tsx +20 -21
  140. package/src/components/project/project-activity-list.tsx +19 -24
  141. package/src/components/project/project-member-manager.tsx +27 -28
  142. package/src/components/project/project-module-card.tsx +5 -6
  143. package/src/components/project/schemas/create-project.ts +3 -5
  144. package/src/components/prototype/component/GenericPrototype.tsx +0 -1
  145. package/src/components/prototype/component-preview.tsx +0 -1
  146. package/src/components/settings/ai/api-key-field.tsx +8 -10
  147. package/src/components/settings/ai/create-custom-model-dialog.tsx +28 -21
  148. package/src/components/settings/ai/create-custom-provider-dialog.tsx +15 -16
  149. package/src/components/settings/ai/model-card.tsx +25 -10
  150. package/src/components/settings/ai/model-manager.tsx +24 -16
  151. package/src/components/settings/ai/provider-card.tsx +9 -11
  152. package/src/components/settings/ai/provider-detail-form.tsx +24 -26
  153. package/src/components/settings/ai/provider-grid.tsx +23 -13
  154. package/src/components/settings/language-selector.tsx +13 -15
  155. package/src/components/settings/personal-team/account/account-client.tsx +14 -16
  156. package/src/components/settings/personal-team/account/avatar/notion-avatar-editor.tsx +36 -28
  157. package/src/components/settings/personal-team/account/settings-profile.tsx +39 -40
  158. package/src/components/settings/personal-team/team/team-client.tsx +45 -50
  159. package/src/components/settings/personal-team/team/team-invitations.tsx +89 -95
  160. package/src/components/settings/personal-team/team/team-member-list.tsx +50 -47
  161. package/src/components/shadcn-space/blocks/pricing-01/pricing.tsx +170 -172
  162. package/src/components/shared-kit/data-viz/contribution-graph-tooltip.tsx +128 -15
  163. package/src/components/shared-kit/dialogs/name-confirm-dialog.tsx +16 -16
  164. package/src/components/shared-kit/i18n/language-switcher.tsx +6 -9
  165. package/src/components/shared-kit/i18n/translator-text.tsx +2 -4
  166. package/src/components/shared-kit/icons/lucide-icon-picker/panel.tsx +7 -8
  167. package/src/components/shared-kit/logos/logo-icon.tsx +64 -0
  168. package/src/components/shared-kit/navigation/nav-float-button.tsx +3 -5
  169. package/src/components/shared-kit/pages/placeholder-page.tsx +2 -4
  170. package/src/components/shared-kit/theme/animated-theme-toggler.tsx +0 -1
  171. package/src/components/shared-kit/theme/theme-toggle.tsx +0 -1
  172. package/src/components/shared-kit/timezone/timezone-select.tsx +6 -7
  173. package/src/components/story/__tests__/constants.test.ts +7 -7
  174. package/src/components/story/__tests__/dependency-type-badge.test.ts +5 -5
  175. package/src/components/story/ai/action-registry.ts +12 -11
  176. package/src/components/story/ai/handlers/more-popover.tsx +5 -6
  177. package/src/components/story/ai/prototype-dialog.tsx +9 -10
  178. package/src/components/story/ai/split-dialog.tsx +22 -23
  179. package/src/components/story/ai/story-ai-panel.tsx +29 -30
  180. package/src/components/story/ai/story-ai-preview-list.tsx +16 -9
  181. package/src/components/story/ai/story-ai-toolbar.tsx +12 -13
  182. package/src/components/story/columns.tsx +33 -17
  183. package/src/components/story/constants.ts +73 -69
  184. package/src/components/story/create-story-dialog.tsx +13 -14
  185. package/src/components/story/detail/__tests__/categories.test.tsx +8 -10
  186. package/src/components/story/detail/__tests__/dependencies-button.test.tsx +3 -5
  187. package/src/components/story/detail/activity-tabs.tsx +6 -7
  188. package/src/components/story/detail/activity-timeline.tsx +33 -35
  189. package/src/components/story/detail/comment-input.tsx +7 -8
  190. package/src/components/story/detail/comment-item.tsx +15 -16
  191. package/src/components/story/detail/comment-thread.tsx +6 -7
  192. package/src/components/story/detail/reaction-bar.tsx +2 -3
  193. package/src/components/story/detail/story-detail-body.tsx +26 -28
  194. package/src/components/story/detail/story-detail-toolbar/associated-attachments-panel.tsx +42 -45
  195. package/src/components/story/detail/story-detail-toolbar/categories.tsx +13 -14
  196. package/src/components/story/detail/story-detail-toolbar/children.tsx +19 -22
  197. package/src/components/story/detail/story-detail-toolbar/dependencies.tsx +3 -5
  198. package/src/components/story/detail/story-detail-toolbar/dependency-panel.tsx +30 -20
  199. package/src/components/story/detail/story-detail-toolbar.tsx +16 -11
  200. package/src/components/story/detail/story-properties.tsx +7 -8
  201. package/src/components/story/display/__tests__/display-dropdown.test.tsx +3 -5
  202. package/src/components/story/display/__tests__/use-paged-story-groups.test.ts +2 -0
  203. package/src/components/story/display/constants.ts +27 -26
  204. package/src/components/story/display/display-dropdown.tsx +20 -26
  205. package/src/components/story/display/group-resolver.tsx +12 -14
  206. package/src/components/story/display/use-grouped-stories.ts +3 -5
  207. package/src/components/story/display/use-paged-story-groups.ts +12 -13
  208. package/src/components/story/filters/add-filter-dropdown.tsx +4 -5
  209. package/src/components/story/filters/applied-filters.tsx +7 -9
  210. package/src/components/story/filters/filter-condition.tsx +9 -12
  211. package/src/components/story/filters/filter-row.tsx +5 -6
  212. package/src/components/story/filters/filter-toggle.tsx +2 -3
  213. package/src/components/story/filters/filter-types.ts +24 -23
  214. package/src/components/story/filters/filter-value-input.tsx +3 -4
  215. package/src/components/story/infinite-scroll-sentinel.tsx +2 -3
  216. package/src/components/story/inline-editors/__tests__/dependency-type-select.test.tsx +18 -23
  217. package/src/components/story/inline-editors/__tests__/labels-editor.test.tsx +9 -11
  218. package/src/components/story/inline-editors/__tests__/priority-editor.test.tsx +21 -25
  219. package/src/components/story/inline-editors/__tests__/state-editor.test.tsx +21 -25
  220. package/src/components/story/inline-editors/assignee-editor.tsx +8 -9
  221. package/src/components/story/inline-editors/date-editor.tsx +4 -5
  222. package/src/components/story/inline-editors/dependency-type-select.tsx +15 -12
  223. package/src/components/story/inline-editors/inline-trigger.tsx +2 -3
  224. package/src/components/story/inline-editors/labels-editor.tsx +16 -17
  225. package/src/components/story/inline-editors/parent-story-editor.tsx +3 -4
  226. package/src/components/story/inline-editors/priority-editor.tsx +6 -8
  227. package/src/components/story/inline-editors/state-editor.tsx +6 -7
  228. package/src/components/story/inline-editors/story-select-dialog.tsx +25 -26
  229. package/src/components/story/inline-editors/title-editor.tsx +2 -3
  230. package/src/components/story/peek-panel.tsx +6 -7
  231. package/src/components/story/relations/__tests__/knowledge-select-dialog.test.tsx +2 -0
  232. package/src/components/story/relations/__tests__/link-manage-dialog.test.tsx +2 -0
  233. package/src/components/story/relations/attachment-manage-dialog.tsx +23 -24
  234. package/src/components/story/relations/general-groups.ts +12 -29
  235. package/src/components/story/relations/knowledge-select-dialog.tsx +21 -22
  236. package/src/components/story/relations/link-manage-dialog.tsx +12 -13
  237. package/src/components/story/relations/story-ref-row.tsx +20 -21
  238. package/src/components/story/schemas/story-create.ts +3 -5
  239. package/src/components/story/search-popover.tsx +5 -6
  240. package/src/components/story/story-list-table.tsx +3 -4
  241. package/src/components/story/story-list-view.tsx +9 -10
  242. package/src/components/story/story-panel-header.tsx +27 -28
  243. package/src/components/story/story-toolbar.tsx +11 -12
  244. package/src/components/story/transfer-story-popover.tsx +15 -16
  245. package/src/components/story/views/calendar-view.tsx +12 -14
  246. package/src/components/story/views/create-view-dialog.tsx +19 -52
  247. package/src/components/story/views/kanban-board.tsx +9 -12
  248. package/src/components/story/views/kanban-card.tsx +1 -3
  249. package/src/components/story/views/story-list/__tests__/batch-toolbar.test.tsx +9 -2
  250. package/src/components/story/views/story-list/__tests__/group-header.test.tsx +15 -17
  251. package/src/components/story/views/story-list/batch-preview-dialog.tsx +26 -28
  252. package/src/components/story/views/story-list/batch-toolbar.tsx +12 -13
  253. package/src/components/story/views/story-list/group.tsx +9 -11
  254. package/src/components/story/views/story-list/index.tsx +13 -14
  255. package/src/components/story/views/story-list/inline-story-creator.tsx +6 -7
  256. package/src/components/story/views/story-list/row.tsx +6 -7
  257. package/src/components/story/views/timeline-view.tsx +7 -8
  258. package/src/components/story/views/view-list-section.tsx +14 -16
  259. package/src/components/story/views/view-selector-button.tsx +6 -7
  260. package/src/components/story/views/view-switcher.tsx +9 -10
  261. package/src/components/story/views/view-types.ts +15 -15
  262. package/src/components/tiptap/extension/code-block-ellipsis-input-extension.ts +0 -1
  263. package/src/components/tiptap/hooks/use-composed-ref.ts +0 -1
  264. package/src/components/tiptap/hooks/use-cursor-visibility.ts +0 -1
  265. package/src/components/tiptap/hooks/use-floating-element.ts +0 -1
  266. package/src/components/tiptap/hooks/use-is-breakpoint.ts +0 -1
  267. package/src/components/tiptap/hooks/use-isomorphic-layout-effect.ts +0 -1
  268. package/src/components/tiptap/hooks/use-menu-navigation.ts +0 -1
  269. package/src/components/tiptap/hooks/use-on-click-outside.ts +0 -1
  270. package/src/components/tiptap/hooks/use-tiptap-editor.ts +0 -1
  271. package/src/components/tiptap/hooks/use-ui-editor-state.ts +0 -1
  272. package/src/components/tiptap/mindmap/lib/__tests__/default-mindmap-data.test.ts +3 -2
  273. package/src/components/tiptap/mindmap/lib/default-mindmap-data.ts +2 -2
  274. package/src/components/tiptap/mindmap/mind-map.tsx +36 -39
  275. package/src/components/tiptap/mindmap/mindmap-fullscreen-dialog.tsx +2 -3
  276. package/src/components/tiptap/node/annotation-node/annotation-node-view.tsx +11 -12
  277. package/src/components/tiptap/node/doc-card-extension.tsx +8 -10
  278. package/src/components/tiptap/node/image-node/image-node-floating.tsx +2 -3
  279. package/src/components/tiptap/node/image-upload-node/image-upload-node.tsx +0 -1
  280. package/src/components/tiptap/node/mention-extension.ts +5 -5
  281. package/src/components/tiptap/node/table-node/hooks/use-table-handle-state.ts +0 -1
  282. package/src/components/tiptap/node/table-node/ui/table-add-row-column-button/table-add-row-column-button.tsx +0 -1
  283. package/src/components/tiptap/node/table-node/ui/table-add-row-column-button/use-table-add-row-column.ts +5 -6
  284. package/src/components/tiptap/node/table-node/ui/table-align-cell-button/table-align-cell-button.tsx +0 -1
  285. package/src/components/tiptap/node/table-node/ui/table-align-cell-button/use-table-align-cell.ts +8 -9
  286. package/src/components/tiptap/node/table-node/ui/table-alignment-menu/table-alignment-menu.tsx +2 -4
  287. package/src/components/tiptap/node/table-node/ui/table-cell-handle-menu/table-cell-handle-menu.tsx +2 -5
  288. package/src/components/tiptap/node/table-node/ui/table-clear-row-column-content-button/table-clear-row-column-content-button.tsx +0 -1
  289. package/src/components/tiptap/node/table-node/ui/table-clear-row-column-content-button/use-table-clear-row-column-content.ts +4 -5
  290. package/src/components/tiptap/node/table-node/ui/table-delete-row-column-button/table-delete-row-column-button.tsx +0 -1
  291. package/src/components/tiptap/node/table-node/ui/table-delete-row-column-button/use-table-delete-row-column.ts +3 -4
  292. package/src/components/tiptap/node/table-node/ui/table-duplicate-row-column-button/table-duplicate-row-column-button.tsx +0 -1
  293. package/src/components/tiptap/node/table-node/ui/table-duplicate-row-column-button/use-table-duplicate-row-column.ts +3 -4
  294. package/src/components/tiptap/node/table-node/ui/table-extend-row-column-button/table-extend-row-column-button.tsx +2 -4
  295. package/src/components/tiptap/node/table-node/ui/table-fit-to-width-button/table-fit-to-width-button.tsx +0 -1
  296. package/src/components/tiptap/node/table-node/ui/table-fit-to-width-button/use-table-fit-to-width.ts +3 -4
  297. package/src/components/tiptap/node/table-node/ui/table-handle/table-handle.tsx +0 -1
  298. package/src/components/tiptap/node/table-node/ui/table-handle-menu/table-handle-menu.tsx +3 -5
  299. package/src/components/tiptap/node/table-node/ui/table-header-row-column-button/table-header-row-column-button.tsx +0 -1
  300. package/src/components/tiptap/node/table-node/ui/table-header-row-column-button/use-table-header-row-column.ts +3 -4
  301. package/src/components/tiptap/node/table-node/ui/table-merge-split-cell-button/table-merge-split-cell-button.tsx +0 -1
  302. package/src/components/tiptap/node/table-node/ui/table-merge-split-cell-button/use-table-merge-split-cell.ts +3 -4
  303. package/src/components/tiptap/node/table-node/ui/table-move-row-column-button/table-move-row-column-button.tsx +0 -1
  304. package/src/components/tiptap/node/table-node/ui/table-move-row-column-button/use-table-move-row-column.ts +9 -10
  305. package/src/components/tiptap/node/table-node/ui/table-selection-overlay/table-selection-overlay.tsx +0 -1
  306. package/src/components/tiptap/node/table-node/ui/table-selection-overlay/use-resize-overlay.ts +0 -1
  307. package/src/components/tiptap/node/table-node/ui/table-sort-row-column-button/table-sort-row-column-button.tsx +0 -1
  308. package/src/components/tiptap/node/table-node/ui/table-sort-row-column-button/use-table-sort-row-column.ts +5 -6
  309. package/src/components/tiptap/node/table-node/ui/table-trigger-button/table-grid-selector.tsx +2 -3
  310. package/src/components/tiptap/node/table-node/ui/table-trigger-button/table-trigger-button.tsx +0 -1
  311. package/src/components/tiptap/node/table-node/ui/table-trigger-button/use-table-trigger.ts +3 -4
  312. package/src/components/tiptap/node/toc-node/toc-node.tsx +2 -4
  313. package/src/components/tiptap/node/toc-node/ui/toc-show-title-button/toc-show-title-button.tsx +0 -1
  314. package/src/components/tiptap/node/toc-node/ui/toc-show-title-button/toc-show-title.ts +2 -3
  315. package/src/components/tiptap/node/toc-node/ui/toc-sidebar/toc-sidebar.tsx +2 -5
  316. package/src/components/tiptap/notion-like/notion-like-editor-header.tsx +2 -4
  317. package/src/components/tiptap/notion-like/notion-like-editor-mobile-toolbar.tsx +17 -23
  318. package/src/components/tiptap/notion-like/notion-like-editor-theme-toggle.tsx +2 -5
  319. package/src/components/tiptap/notion-like/notion-like-editor-toolbar-floating.tsx +16 -12
  320. package/src/components/tiptap/notion-like/notion-like-editor.tsx +2 -7
  321. package/src/components/tiptap/notion-like/setup-error-message/setup-error-message.tsx +0 -1
  322. package/src/components/tiptap/ui/ai-ask-button/ai-ask-button.tsx +0 -1
  323. package/src/components/tiptap/ui/ai-ask-button/use-ai-ask.ts +2 -3
  324. package/src/components/tiptap/ui/ai-menu/ai-menu-actions/ai-menu-actions.tsx +4 -6
  325. package/src/components/tiptap/ui/ai-menu/ai-menu-input/ai-menu-input.tsx +6 -10
  326. package/src/components/tiptap/ui/ai-menu/ai-menu-items/ai-menu-items-constants.ts +36 -36
  327. package/src/components/tiptap/ui/ai-menu/ai-menu-items/ai-menu-items.tsx +13 -16
  328. package/src/components/tiptap/ui/ai-menu/ai-menu-items/language-selection-submenu.tsx +3 -4
  329. package/src/components/tiptap/ui/ai-menu/ai-menu-items/tone-selection-submenu.tsx +2 -3
  330. package/src/components/tiptap/ui/ai-menu/ai-menu-utils.ts +3 -3
  331. package/src/components/tiptap/ui/ai-menu/ai-menu.tsx +3 -5
  332. package/src/components/tiptap/ui/blockquote-button/blockquote-button.tsx +2 -6
  333. package/src/components/tiptap/ui/blockquote-button/use-blockquote.ts +2 -3
  334. package/src/components/tiptap/ui/code-block-button/code-block-button.tsx +2 -6
  335. package/src/components/tiptap/ui/code-block-button/use-code-block.ts +2 -3
  336. package/src/components/tiptap/ui/color-highlight-button/color-highlight-button.tsx +0 -1
  337. package/src/components/tiptap/ui/color-highlight-button/use-color-highlight.ts +14 -14
  338. package/src/components/tiptap/ui/color-highlight-popover/color-highlight-popover.tsx +9 -11
  339. package/src/components/tiptap/ui/color-menu/color-menu.tsx +5 -11
  340. package/src/components/tiptap/ui/color-text-button/color-text-button.tsx +2 -3
  341. package/src/components/tiptap/ui/color-text-button/use-color-text.ts +12 -13
  342. package/src/components/tiptap/ui/color-text-popover/color-text-popover.tsx +6 -10
  343. package/src/components/tiptap/ui/color-text-popover/use-color-text-popover.ts +2 -3
  344. package/src/components/tiptap/ui/copy-anchor-link-button/copy-anchor-link-button.tsx +2 -6
  345. package/src/components/tiptap/ui/copy-anchor-link-button/use-copy-anchor-link.ts +2 -3
  346. package/src/components/tiptap/ui/copy-anchor-link-button/use-scroll-to-hash.ts +0 -1
  347. package/src/components/tiptap/ui/copy-to-clipboard-button/copy-to-clipboard-button.tsx +2 -6
  348. package/src/components/tiptap/ui/copy-to-clipboard-button/use-copy-to-clipboard.ts +2 -3
  349. package/src/components/tiptap/ui/delete-node-button/delete-node-button.tsx +2 -6
  350. package/src/components/tiptap/ui/delete-node-button/use-delete-node.ts +2 -3
  351. package/src/components/tiptap/ui/doc-reference-floating/doc-reference-floating.tsx +10 -11
  352. package/src/components/tiptap/ui/doc-reference-interaction/doc-reference-interaction.tsx +10 -11
  353. package/src/components/tiptap/ui/drag-context-menu/drag-context-menu.tsx +7 -9
  354. package/src/components/tiptap/ui/duplicate-button/duplicate-button.tsx +2 -6
  355. package/src/components/tiptap/ui/duplicate-button/use-duplicate.ts +2 -3
  356. package/src/components/tiptap/ui/emoji-dropdown-menu/emoji-dropdown-menu.tsx +0 -1
  357. package/src/components/tiptap/ui/emoji-menu/emoji-menu.tsx +2 -5
  358. package/src/components/tiptap/ui/emoji-trigger-button/emoji-trigger-button.tsx +2 -6
  359. package/src/components/tiptap/ui/emoji-trigger-button/use-emoji-trigger.ts +2 -3
  360. package/src/components/tiptap/ui/heading-button/heading-button.tsx +0 -1
  361. package/src/components/tiptap/ui/heading-button/use-heading.ts +7 -8
  362. package/src/components/tiptap/ui/image-align-button/image-align-button.tsx +0 -1
  363. package/src/components/tiptap/ui/image-align-button/use-image-align.ts +4 -5
  364. package/src/components/tiptap/ui/image-caption-button/image-caption-button.tsx +0 -1
  365. package/src/components/tiptap/ui/image-caption-button/use-image-caption.ts +2 -3
  366. package/src/components/tiptap/ui/image-download-button/image-download-button.tsx +0 -1
  367. package/src/components/tiptap/ui/image-download-button/use-image-download.ts +2 -3
  368. package/src/components/tiptap/ui/image-upload-button/image-upload-button.tsx +0 -1
  369. package/src/components/tiptap/ui/image-upload-button/use-image-upload.ts +2 -3
  370. package/src/components/tiptap/ui/improve-dropdown/improve-dropdown.tsx +14 -17
  371. package/src/components/tiptap/ui/improve-dropdown/use-improve-dropdown.ts +2 -3
  372. package/src/components/tiptap/ui/indent-button/indent-button.tsx +0 -1
  373. package/src/components/tiptap/ui/indent-button/use-indent.ts +3 -4
  374. package/src/components/tiptap/ui/link-popover/link-popover.tsx +7 -12
  375. package/src/components/tiptap/ui/link-popover/use-link-popover.ts +2 -3
  376. package/src/components/tiptap/ui/list-button/list-button.tsx +0 -1
  377. package/src/components/tiptap/ui/list-button/use-list.ts +4 -5
  378. package/src/components/tiptap/ui/mark-button/mark-button.tsx +0 -1
  379. package/src/components/tiptap/ui/mark-button/use-mark.ts +8 -9
  380. package/src/components/tiptap/ui/mention-dropdown-menu/mention-dropdown-menu.tsx +0 -2
  381. package/src/components/tiptap/ui/mention-trigger-button/mention-trigger-button.tsx +0 -1
  382. package/src/components/tiptap/ui/mention-trigger-button/use-mention-trigger.ts +2 -3
  383. package/src/components/tiptap/ui/move-node-button/move-node-button.tsx +2 -6
  384. package/src/components/tiptap/ui/move-node-button/use-move-node.ts +2 -3
  385. package/src/components/tiptap/ui/reference-dropdown-menu/reference-dropdown-menu.tsx +6 -10
  386. package/src/components/tiptap/ui/reset-all-formatting-button/reset-all-formatting-button.tsx +2 -6
  387. package/src/components/tiptap/ui/reset-all-formatting-button/use-reset-all-formatting.ts +2 -3
  388. package/src/components/tiptap/ui/slash-command-trigger-button/slash-command-trigger-button.tsx +0 -1
  389. package/src/components/tiptap/ui/slash-command-trigger-button/use-slash-command-trigger.ts +2 -3
  390. package/src/components/tiptap/ui/slash-dropdown-menu/slash-dropdown-menu.tsx +2 -5
  391. package/src/components/tiptap/ui/slash-dropdown-menu/use-slash-dropdown-menu.ts +78 -79
  392. package/src/components/tiptap/ui/text-align-button/text-align-button.tsx +0 -1
  393. package/src/components/tiptap/ui/text-align-button/use-text-align.ts +5 -6
  394. package/src/components/tiptap/ui/text-button/text-button.tsx +2 -6
  395. package/src/components/tiptap/ui/text-button/use-text.ts +2 -3
  396. package/src/components/tiptap/ui/turn-into-dropdown/turn-into-dropdown.tsx +4 -7
  397. package/src/components/tiptap/ui/turn-into-dropdown/use-turn-into-dropdown.ts +11 -12
  398. package/src/components/tiptap/ui/undo-redo-button/undo-redo-button.tsx +0 -1
  399. package/src/components/tiptap/ui/undo-redo-button/use-undo-redo.ts +3 -4
  400. package/src/components/tiptap/ui-primitive/avatar/avatar.tsx +0 -1
  401. package/src/components/tiptap/ui-primitive/badge/badge.tsx +0 -1
  402. package/src/components/tiptap/ui-primitive/button/button.tsx +0 -1
  403. package/src/components/tiptap/ui-primitive/card/card.tsx +0 -1
  404. package/src/components/tiptap/ui-primitive/combobox/combobox.tsx +0 -1
  405. package/src/components/tiptap/ui-primitive/dropdown-menu/dropdown-menu.tsx +0 -1
  406. package/src/components/tiptap/ui-primitive/input/input.tsx +0 -1
  407. package/src/components/tiptap/ui-primitive/input-group/input-group.tsx +0 -1
  408. package/src/components/tiptap/ui-primitive/label/label.tsx +0 -1
  409. package/src/components/tiptap/ui-primitive/menu/menu-context.ts +0 -1
  410. package/src/components/tiptap/ui-primitive/menu/menu-hooks.ts +0 -1
  411. package/src/components/tiptap/ui-primitive/menu/menu-types.ts +0 -1
  412. package/src/components/tiptap/ui-primitive/menu/menu-utils.ts +0 -1
  413. package/src/components/tiptap/ui-primitive/menu/menu.tsx +0 -1
  414. package/src/components/tiptap/ui-primitive/popover/popover.tsx +0 -1
  415. package/src/components/tiptap/ui-primitive/separator/separator.tsx +0 -1
  416. package/src/components/tiptap/ui-primitive/sidebar/sidebar.tsx +0 -1
  417. package/src/components/tiptap/ui-primitive/spacer/spacer.tsx +0 -1
  418. package/src/components/tiptap/ui-primitive/textarea/textarea.tsx +0 -1
  419. package/src/components/tiptap/ui-primitive/textarea-autosize/textarea-autosize.tsx +0 -1
  420. package/src/components/tiptap/ui-primitive/toolbar/toolbar.tsx +0 -1
  421. package/src/components/tiptap/ui-primitive/tooltip/tooltip.tsx +0 -1
  422. package/src/components/tiptap/ui-utils/floating-element/floating-element.tsx +0 -1
  423. package/src/components/tiptap/ui-utils/suggestion-menu/suggestion-menu.tsx +0 -1
  424. package/src/components/ui/field.tsx +1 -1
  425. package/src/components/ui/radio-group.tsx +2 -3
  426. package/src/components/ui/spinner.tsx +2 -2
  427. package/src/components/workspace/create-workspace-dialog.tsx +12 -13
  428. package/src/components/workspace/delete-workspace-options.tsx +177 -0
  429. package/src/components/workspace/edit-workspace-dialog.tsx +153 -0
  430. package/src/components/workspace/schemas/create-workspace.ts +2 -2
  431. package/src/components/workspace/workspace-activity-card.tsx +60 -0
  432. package/src/components/workspace/workspace-contribution-card.tsx +37 -0
  433. package/src/components/workspace/workspace-header.tsx +100 -0
  434. package/src/components/workspace/workspace-kb-card.tsx +31 -0
  435. package/src/components/workspace/workspace-member-item.tsx +80 -0
  436. package/src/components/workspace/workspace-members-manager.tsx +291 -0
  437. package/src/components/workspace/workspace-project-list.tsx +129 -0
  438. package/src/config/sidebar-routes.tsx +25 -24
  439. package/src/config/sidebar-teams.ts +4 -4
  440. package/src/hooks/__tests__/use-commands.test.tsx +0 -10
  441. package/src/hooks/use-commands.ts +3 -7
  442. package/src/hooks/use-entity-subscription.ts +0 -1
  443. package/src/hooks/use-notifications.ts +5 -6
  444. package/src/hooks/useTranslator.ts +0 -1
  445. package/src/lib/__tests__/edition.test.ts +9 -0
  446. package/src/lib/analytics.ts +0 -1
  447. package/src/lib/anyhub/anyhub-message-bridge.ts +1 -1
  448. package/src/lib/auth/__tests__/anonymous-safe.test.ts +89 -0
  449. package/src/lib/auth/__tests__/page-gate.test.ts +29 -0
  450. package/src/lib/auth/anonymous-safe.ts +39 -0
  451. package/src/lib/auth/page-gate.ts +18 -0
  452. package/src/lib/changelog/sdk-versions.ts +19 -19
  453. package/src/lib/collections/knowledge/knowledge-bases-collection.ts +1 -1
  454. package/src/lib/collections/reference/bookmark-categories-collection.ts +1 -1
  455. package/src/lib/collections/reference/labels-collection.ts +1 -1
  456. package/src/lib/collections/reference/projects-collection.ts +1 -1
  457. package/src/lib/collections/reference/users-brief-collection.ts +1 -1
  458. package/src/lib/collections/reference/workspaces-collection.ts +3 -3
  459. package/src/lib/commands/__tests__/registry.test.ts +3 -3
  460. package/src/lib/commands/registry.ts +22 -21
  461. package/src/lib/commands/types.ts +1 -1
  462. package/src/lib/edition.ts +7 -0
  463. package/src/lib/router-context.ts +1 -2
  464. package/src/plugins/.gen-manifest.json +13 -0
  465. package/src/plugins/core/inspiration/pages/inspiration-page.tsx +2 -3
  466. package/src/plugins/core/inspiration/ui.tsx +2 -3
  467. package/src/plugins/core/prd/components/agent-input.tsx +7 -8
  468. package/src/plugins/core/prd/components/component-editor/content-section.tsx +3 -3
  469. package/src/plugins/core/prd/components/component-editor/position-section.tsx +3 -4
  470. package/src/plugins/core/prd/components/component-editor/style-fields.tsx +13 -16
  471. package/src/plugins/core/prd/components/dialog/create-prd-dialog.tsx +11 -12
  472. package/src/plugins/core/prd/components/dialog/prd-detail-client.tsx +7 -9
  473. package/src/plugins/core/prd/components/page-version-panel/components/create-version-dialog.tsx +7 -8
  474. package/src/plugins/core/prd/components/page-version-panel/components/delete-version-dialog.tsx +5 -6
  475. package/src/plugins/core/prd/components/page-version-panel/components/edit-version-dialog.tsx +7 -8
  476. package/src/plugins/core/prd/components/page-version-panel/constants.tsx +3 -2
  477. package/src/plugins/core/prd/components/page-version-panel.tsx +43 -45
  478. package/src/plugins/core/prd/components/page-version-tree.tsx +6 -8
  479. package/src/plugins/core/prd/components/prd-agent-panel.tsx +29 -23
  480. package/src/plugins/core/prd/components/prd-comment-review-panel.tsx +21 -23
  481. package/src/plugins/core/prd/components/prd-component-editor-content.tsx +6 -7
  482. package/src/plugins/core/prd/components/prd-dashboard.tsx +28 -23
  483. package/src/plugins/core/prd/components/prd-doc-panel.tsx +6 -9
  484. package/src/plugins/core/prd/components/prd-editor-layout.tsx +11 -13
  485. package/src/plugins/core/prd/components/prd-filter-bar.tsx +2 -3
  486. package/src/plugins/core/prd/components/prd-left-sidebar.tsx +19 -20
  487. package/src/plugins/core/prd/components/prd-navigation.tsx +12 -14
  488. package/src/plugins/core/prd/components/prd-outline-tab.tsx +3 -4
  489. package/src/plugins/core/prd/components/prd-prototype-panel.tsx +8 -10
  490. package/src/plugins/core/prd/components/prd-right-sidebar.tsx +10 -12
  491. package/src/plugins/core/prd/components/prd-share-panel/components/single-version-share-card.tsx +13 -14
  492. package/src/plugins/core/prd/components/prd-share-panel/constants.ts +5 -3
  493. package/src/plugins/core/prd/components/prd-share-panel.tsx +58 -60
  494. package/src/plugins/core/prd/components/prd-tree-page-tab.tsx +20 -22
  495. package/src/plugins/core/prd/components/prototype/PrototypeCanvas.tsx +2 -4
  496. package/src/plugins/core/prd/components/prototype/PrototypeElement.tsx +3 -5
  497. package/src/plugins/core/prd/components/prototype/ResizeHandles.tsx +0 -1
  498. package/src/plugins/core/prd/components/prototype/icon-components.ts +19 -21
  499. package/src/plugins/core/prd/components/prototype/index.ts +3 -0
  500. package/src/plugins/core/prd/components/restore-version-dialog.tsx +5 -7
  501. package/src/plugins/core/prd/components/share/prd-share-client.tsx +7 -9
  502. package/src/plugins/core/prd/components/share/share-annotation-overlay.tsx +0 -1
  503. package/src/plugins/core/prd/components/share/share-comment-panel.tsx +15 -16
  504. package/src/plugins/core/prd/components/share/share-comment-review-panel.tsx +7 -9
  505. package/src/plugins/core/prd/components/share/share-directory-tree.tsx +3 -5
  506. package/src/plugins/core/prd/components/share/share-doc-view.tsx +3 -5
  507. package/src/plugins/core/prd/components/share/share-layout.tsx +3 -5
  508. package/src/plugins/core/prd/components/share/share-nav-bar.tsx +3 -5
  509. package/src/plugins/core/prd/components/share/share-password-gate.tsx +8 -9
  510. package/src/plugins/core/prd/components/share/share-prototype-view.tsx +3 -5
  511. package/src/plugins/core/prd/components/share/share-review-panel.tsx +9 -11
  512. package/src/plugins/core/prd/components/share/share-sse-listener.tsx +0 -1
  513. package/src/plugins/core/prd/components/share/version-share-client.tsx +3 -5
  514. package/src/plugins/core/prd/pages/prd-detail-page.tsx +9 -21
  515. package/src/plugins/core/prd/pages/share-prd-page.tsx +6 -16
  516. package/src/plugins/core/prd/prd-nav.tsx +2 -3
  517. package/src/plugins/core/tags/nav-tag.tsx +14 -15
  518. package/src/plugins/core/tags/pages/tag-detail-page.tsx +3 -5
  519. package/src/plugins/core/tags/pages/tag-settings-page.tsx +3 -5
  520. package/src/plugins/core/tags/pages/tags-index-page.tsx +3 -5
  521. package/src/plugins/core/tags/tag-badge.tsx +2 -3
  522. package/src/plugins/core/tags/tag-color-picker.tsx +2 -4
  523. package/src/plugins/core/tags/tag-manager.tsx +23 -25
  524. package/src/plugins/core/tags/tag-selector.tsx +4 -5
  525. package/src/plugins/modules.gen.ts +21 -0
  526. package/src/plugins/plugins.gen.ts +20 -0
  527. package/src/plugins/ui.gen.ts +8 -0
  528. package/src/providers/index.tsx +3 -14
  529. package/src/routeTree.gen.ts +27 -0
  530. package/src/router.tsx +16 -6
  531. package/src/routes/__desktop/onboarding/route.lazy.tsx +22 -23
  532. package/src/routes/__root.tsx +13 -36
  533. package/src/routes/__tests__/-edition-routing.test.tsx +151 -0
  534. package/src/routes/_login/forgot-password/route.lazy.tsx +14 -15
  535. package/src/routes/_login/login/route.lazy.tsx +26 -25
  536. package/src/routes/_login/register/route.lazy.tsx +23 -24
  537. package/src/routes/_login/reset-password/route.lazy.tsx +16 -17
  538. package/src/routes/_login/schemas/-auth.ts +11 -13
  539. package/src/routes/_nav/acceptance-criteria/route.tsx +2 -3
  540. package/src/routes/_nav/apps/anyhub/$id/route.tsx +2 -3
  541. package/src/routes/_nav/chat/route.lazy.tsx +9 -10
  542. package/src/routes/_nav/dashboard/-components/activity-feed.tsx +3 -4
  543. package/src/routes/_nav/dashboard/-components/quick-actions.tsx +3 -4
  544. package/src/routes/_nav/dashboard/-components/stats-grid.tsx +5 -6
  545. package/src/routes/_nav/dashboard/route.lazy.tsx +7 -8
  546. package/src/routes/_nav/design/$projectId/$artboardId/route.lazy.tsx +7 -9
  547. package/src/routes/_nav/design/$projectId/route.lazy.tsx +3 -5
  548. package/src/routes/_nav/design/index.lazy.tsx +26 -27
  549. package/src/routes/_nav/inspiration/route.tsx +8 -0
  550. package/src/routes/_nav/knowledge/$kbId/doc/$docId/route.lazy.tsx +4 -5
  551. package/src/routes/_nav/knowledge/$kbId/route.lazy.tsx +3 -4
  552. package/src/routes/_nav/knowledge/bookmarks/$id.lazy.tsx +29 -30
  553. package/src/routes/_nav/knowledge/bookmarks/index.lazy.tsx +12 -13
  554. package/src/routes/_nav/knowledge/compliance/$id.lazy.tsx +22 -23
  555. package/src/routes/_nav/knowledge/compliance/index.lazy.tsx +18 -19
  556. package/src/routes/_nav/knowledge/dictionaries/$id.lazy.tsx +5 -6
  557. package/src/routes/_nav/knowledge/dictionaries/index.lazy.tsx +17 -18
  558. package/src/routes/_nav/knowledge/index.lazy.tsx +248 -40
  559. package/src/routes/_nav/knowledge/laws/$id.lazy.tsx +22 -23
  560. package/src/routes/_nav/knowledge/laws/index.lazy.tsx +14 -15
  561. package/src/routes/_nav/knowledge/summary/index.lazy.tsx +31 -32
  562. package/src/routes/_nav/notifications/route.lazy.tsx +3 -4
  563. package/src/routes/_nav/notifications/route.tsx +2 -0
  564. package/src/routes/_nav/notion-like/route.tsx +2 -3
  565. package/src/routes/_nav/prd/$id/route.tsx +9 -0
  566. package/src/routes/_nav/prd/index.tsx +9 -0
  567. package/src/routes/_nav/prd/route.tsx +8 -0
  568. package/src/routes/_nav/pricing-02/route.tsx +2 -3
  569. package/src/routes/_nav/projects/$projectId/$storyId/route.lazy.tsx +23 -24
  570. package/src/routes/_nav/projects/$projectId/index.lazy.tsx +54 -74
  571. package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy.tsx +27 -30
  572. package/src/routes/_nav/projects/$projectId/iterations/index.lazy.tsx +9 -10
  573. package/src/routes/_nav/projects/$projectId/route.tsx +4 -2
  574. package/src/routes/_nav/projects/$projectId/settings/route.lazy.tsx +40 -41
  575. package/src/routes/_nav/route.tsx +13 -16
  576. package/src/routes/_nav/settings/-settings-tabs.tsx +24 -51
  577. package/src/routes/_nav/settings/account/route.lazy.tsx +1 -9
  578. package/src/routes/_nav/settings/ai/index/route.lazy.tsx +5 -6
  579. package/src/routes/_nav/settings/billing/route.lazy.tsx +4 -5
  580. package/src/routes/_nav/settings/connection/route.lazy.tsx +14 -10
  581. package/src/routes/_nav/settings/design/route.lazy.tsx +21 -22
  582. package/src/routes/_nav/settings/general/route.lazy.tsx +10 -11
  583. package/src/routes/_nav/settings/notifications/route.lazy.tsx +3 -5
  584. package/src/routes/_nav/settings/privacy/route.lazy.tsx +15 -16
  585. package/src/routes/_nav/settings/route.lazy.tsx +2 -3
  586. package/src/routes/_nav/settings/route.tsx +10 -15
  587. package/src/routes/_nav/settings/team/route.lazy.tsx +1 -9
  588. package/src/routes/_nav/tags/$id/route.tsx +8 -0
  589. package/src/routes/_nav/tags/index.tsx +8 -0
  590. package/src/routes/_nav/tags/route.tsx +8 -0
  591. package/src/routes/_nav/tags/settings/route.tsx +9 -0
  592. package/src/routes/_nav/test-cases/route.tsx +2 -3
  593. package/src/routes/_nav/workspaces/$workspaceId/activities/route.lazy.tsx +69 -0
  594. package/src/routes/_nav/workspaces/$workspaceId/activities/route.tsx +28 -0
  595. package/src/routes/_nav/workspaces/$workspaceId/route.lazy.tsx +194 -99
  596. package/src/routes/_nav/workspaces/$workspaceId/route.tsx +12 -3
  597. package/src/routes/_nav/workspaces/$workspaceId/settings/route.lazy.tsx +75 -61
  598. package/src/routes/_nav/workspaces/index.lazy.tsx +196 -22
  599. package/src/routes/_nav/workspaces/route.tsx +2 -0
  600. package/src/routes/_public/index/route.tsx +5 -1
  601. package/src/routes/invite/$token/route.lazy.tsx +36 -37
  602. package/src/routes/share/$versionId/route.lazy.tsx +4 -11
  603. package/src/routes/share/compliance/$id/route.lazy.tsx +6 -8
  604. package/src/routes/share/law/$id/route.lazy.tsx +6 -8
  605. package/src/routes/share/prd/$prdId/route.tsx +10 -0
  606. package/src/server/__tests__/agent-client-graph.test.ts +4 -8
  607. package/src/server/ai-ports.ts +7 -6
  608. package/src/server/builtin-project.ts +43 -0
  609. package/src/server/design/sketch/file-storage.ts +1 -1
  610. package/src/server/pro-services.ts +1 -1
  611. package/src/server/serverFns/__tests__/workspace.test.ts +101 -0
  612. package/src/server/serverFns/activity.ts +15 -9
  613. package/src/server/serverFns/knowledge-public/bookmarks/list.ts +1 -1
  614. package/src/server/serverFns/knowledge-public/bookmarks/share.ts +3 -3
  615. package/src/server/serverFns/knowledge-public/compliance/share.ts +3 -3
  616. package/src/server/serverFns/knowledge-public/dictionary/share.ts +3 -3
  617. package/src/server/serverFns/knowledge-public/legal/share.ts +3 -3
  618. package/src/server/serverFns/knowledge.ts +27 -2
  619. package/src/server/serverFns/notifications.ts +3 -0
  620. package/src/server/serverFns/project.ts +48 -35
  621. package/src/server/serverFns/story/story-crud/bulk.ts +2 -2
  622. package/src/server/serverFns/story/story-crud.ts +9 -7
  623. package/src/server/serverFns/story/story-groups.ts +6 -6
  624. package/src/server/serverFns/workspace.ts +334 -13
  625. package/src/server-entry.ts +29 -0
  626. package/vite.shared.ts +4 -1
  627. package/src/components/layout/sidebar-03/logo.tsx +0 -41
  628. package/src/i18n/__tests__/detect.test.ts +0 -48
  629. package/src/i18n/__tests__/integration.test.tsx +0 -32
  630. package/src/i18n/__tests__/server.test.ts +0 -33
  631. package/src/i18n/client.ts +0 -32
  632. package/src/i18n/config.ts +0 -116
  633. package/src/i18n/detect.ts +0 -43
  634. package/src/i18n/locales/en/agents.json +0 -134
  635. package/src/i18n/locales/en/apps.json +0 -6
  636. package/src/i18n/locales/en/auth.json +0 -90
  637. package/src/i18n/locales/en/billing.json +0 -78
  638. package/src/i18n/locales/en/chat.json +0 -194
  639. package/src/i18n/locales/en/common.json +0 -242
  640. package/src/i18n/locales/en/dashboard.json +0 -38
  641. package/src/i18n/locales/en/design.json +0 -70
  642. package/src/i18n/locales/en/desktop.json +0 -35
  643. package/src/i18n/locales/en/display.json +0 -37
  644. package/src/i18n/locales/en/editor.json +0 -304
  645. package/src/i18n/locales/en/enterprise.json +0 -1
  646. package/src/i18n/locales/en/invite.json +0 -56
  647. package/src/i18n/locales/en/iterations.json +0 -92
  648. package/src/i18n/locales/en/knowledge.json +0 -462
  649. package/src/i18n/locales/en/mindmap.json +0 -28
  650. package/src/i18n/locales/en/notifications.json +0 -79
  651. package/src/i18n/locales/en/prd.json +0 -51
  652. package/src/i18n/locales/en/projects.json +0 -140
  653. package/src/i18n/locales/en/settings.json +0 -428
  654. package/src/i18n/locales/en/share.json +0 -20
  655. package/src/i18n/locales/en/story.json +0 -923
  656. package/src/i18n/locales/en/tags.json +0 -42
  657. package/src/i18n/locales/en/workspace.json +0 -90
  658. package/src/i18n/locales/zh/agents.json +0 -134
  659. package/src/i18n/locales/zh/apps.json +0 -6
  660. package/src/i18n/locales/zh/auth.json +0 -90
  661. package/src/i18n/locales/zh/billing.json +0 -78
  662. package/src/i18n/locales/zh/chat.json +0 -194
  663. package/src/i18n/locales/zh/common.json +0 -242
  664. package/src/i18n/locales/zh/dashboard.json +0 -38
  665. package/src/i18n/locales/zh/design.json +0 -70
  666. package/src/i18n/locales/zh/desktop.json +0 -35
  667. package/src/i18n/locales/zh/display.json +0 -37
  668. package/src/i18n/locales/zh/editor.json +0 -304
  669. package/src/i18n/locales/zh/enterprise.json +0 -1
  670. package/src/i18n/locales/zh/invite.json +0 -56
  671. package/src/i18n/locales/zh/iterations.json +0 -92
  672. package/src/i18n/locales/zh/knowledge.json +0 -462
  673. package/src/i18n/locales/zh/mindmap.json +0 -28
  674. package/src/i18n/locales/zh/notifications.json +0 -79
  675. package/src/i18n/locales/zh/prd.json +0 -51
  676. package/src/i18n/locales/zh/projects.json +0 -140
  677. package/src/i18n/locales/zh/settings.json +0 -428
  678. package/src/i18n/locales/zh/share.json +0 -20
  679. package/src/i18n/locales/zh/story.json +0 -923
  680. package/src/i18n/locales/zh/tags.json +0 -42
  681. package/src/i18n/locales/zh/workspace.json +0 -90
  682. package/src/i18n/server.ts +0 -18
  683. package/src/i18n/types.ts +0 -5
  684. package/src/server/serverFns/locale.ts +0 -20
@@ -15,7 +15,6 @@
15
15
  // You should have received a copy of the GNU Affero General Public License
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
-
19
18
  import {
20
19
  Collapsible,
21
20
  CollapsibleContent,
@@ -35,7 +34,7 @@ import {
35
34
  Tooltip,
36
35
  TooltipContent,
37
36
  TooltipTrigger,
38
- } from "@/components/ui/tooltip"
37
+ } from "@/components/ui/tooltip";
39
38
  import {
40
39
  BookOpenText,
41
40
  BookMarked,
@@ -64,17 +63,21 @@ import {
64
63
  BarChart3,
65
64
  MessageSquare,
66
65
  LibraryBig,
66
+ Pin,
67
+ PinOff,
67
68
  } from "lucide-react";
68
69
  import { Link, useLocation } from "@tanstack/react-router";
69
- import { useTranslation } from "react-i18next";
70
70
  import { cn } from "@/lib/utils";
71
71
  import { isParentActive } from "@/lib/sidebar-utils";
72
72
  import { useEffect, useState } from "react";
73
73
  import { useLiveQuery } from "@tanstack/react-db";
74
74
  import { knowledgeBasesCollection } from "@/lib/collections/knowledge/knowledge-bases-collection";
75
75
  import { KnowledgeFormDialog } from "@/components/knowledge/dialog/knowledge-form-dialog";
76
+ import { useServerFn } from "@tanstack/react-start";
77
+ import { toggleKnowledgePinFn } from "@/server/serverFns/knowledge";
76
78
 
77
79
  import { AnimatedGradientText } from "@/components/magicui/animated-gradient-text";
80
+ import { m } from "@/paraglide/messages.js";
78
81
 
79
82
  const ICON_MAP: Record<string, React.ComponentType<{ className?: string }>> = {
80
83
  notebook: LibraryBig,
@@ -96,35 +99,43 @@ const ICON_MAP: Record<string, React.ComponentType<{ className?: string }>> = {
96
99
  messageSquare: MessageSquare,
97
100
  };
98
101
 
99
- const systemRoutes = [
102
+ interface SystemRoute {
103
+ id: string;
104
+ title: () => string;
105
+ icon: React.ComponentType<{ className?: string }>;
106
+ link: string;
107
+ badge?: () => string;
108
+ }
109
+
110
+ const systemRoutes: SystemRoute[] = [
100
111
  {
101
112
  id: "knowledge-law",
102
- title: "nav.law",
113
+ title: m.common_nav_law,
103
114
  icon: Scale,
104
115
  link: "/knowledge/laws",
105
116
  },
106
117
  {
107
118
  id: "knowledge-compliance",
108
- title: "nav.compliance",
119
+ title: m.common_nav_compliance,
109
120
  icon: ShieldCheck,
110
121
  link: "/knowledge/compliance",
111
122
  },
112
123
  {
113
124
  id: "knowledge-dictionary",
114
- title: "nav.dictionary",
125
+ title: m.common_nav_dictionary,
115
126
  icon: BookMarked,
116
127
  link: "/knowledge/dictionaries",
117
128
  },
118
129
  {
119
130
  id: "knowledge-bookmarks",
120
- title: "nav.bookmarks",
131
+ title: m.common_nav_bookmarks,
121
132
  icon: Bookmark,
122
133
  link: "/knowledge/bookmarks",
123
134
  },
124
135
  {
125
136
  id: "knowledge-summary",
126
- title: "nav.summary",
127
- badge: "nav.summaryBadge",
137
+ title: m.common_nav_summary,
138
+ // badge: m.common_nav_summaryBadge,
128
139
  icon: BookCopy,
129
140
  link: "/knowledge/summary",
130
141
  },
@@ -134,8 +145,41 @@ interface KnowledgeItem {
134
145
  id: string;
135
146
  name: string;
136
147
  description: string | null;
137
- badge?: string;
138
148
  icon: string;
149
+ pinnedToSidebar: boolean;
150
+ }
151
+
152
+ function UnpinButton({ kb }: { kb: KnowledgeItem }) {
153
+ const togglePin = useServerFn(toggleKnowledgePinFn);
154
+ const [pinned, setPinned] = useState(kb.pinnedToSidebar);
155
+
156
+ const handleClick = async () => {
157
+ const newPinned = false;
158
+ setPinned(newPinned);
159
+ try {
160
+ await togglePin({ data: { kbId: kb.id, pinned: newPinned } });
161
+ (knowledgeBasesCollection as any).utils?.refetch?.();
162
+ window.dispatchEvent(new CustomEvent("knowledge-pinned", { detail: { kbId: kb.id, pinned: newPinned } }));
163
+ } catch {
164
+ setPinned(!newPinned);
165
+ }
166
+ };
167
+
168
+ return (
169
+ <button
170
+ type="button"
171
+ aria-label={m.sidebar_knowledge_unpin()}
172
+ className="absolute right-1 top-1/2 -translate-y-1/2 flex size-5 items-center justify-center rounded text-sidebar-foreground/70 opacity-0 transition-opacity group-hover/kb:opacity-100 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground"
173
+ onClick={handleClick}
174
+ >
175
+ <Tooltip>
176
+ <TooltipTrigger asChild>
177
+ <PinOff className="size-3.5" />
178
+ </TooltipTrigger>
179
+ <TooltipContent>{m.sidebar_knowledge_unpin()}</TooltipContent>
180
+ </Tooltip>
181
+ </button>
182
+ );
139
183
  }
140
184
 
141
185
  function KnowledgeBaseLinks({ pathname }: { pathname: string }) {
@@ -143,23 +187,20 @@ function KnowledgeBaseLinks({ pathname }: { pathname: string }) {
143
187
  (q) => q.from({ kb: knowledgeBasesCollection })
144
188
  );
145
189
  const itemsList =
146
- (items as unknown as Array<{
147
- id: string;
148
- name: string;
149
- icon: string;
150
- description?: string | null;
151
- badge?: string;
152
- }> | undefined) ?? [];
190
+ (items as unknown as Array<KnowledgeItem> | undefined) ?? [];
153
191
 
154
192
  if (itemsList.length === 0) return null;
155
193
 
194
+ const pinnedItems = itemsList.filter((item) => item.pinnedToSidebar);
195
+ if (pinnedItems.length === 0) return null;
196
+
156
197
  return (
157
198
  <SidebarMenu className="space-y-1">
158
- {itemsList.map((item) => {
199
+ {pinnedItems.map((item) => {
159
200
  const Icon = ICON_MAP[item.icon] || NotebookPen;
160
201
  const itemActive = pathname.startsWith(`/knowledge/${item.id}`);
161
202
  return (
162
- <SidebarMenuItem key={item.id}>
203
+ <SidebarMenuItem key={item.id} className="group/kb relative">
163
204
  <SidebarMenuButton
164
205
  asChild
165
206
  tooltip={item.name}
@@ -167,14 +208,15 @@ function KnowledgeBaseLinks({ pathname }: { pathname: string }) {
167
208
  className="flex w-full items-center rounded-lg px-2"
168
209
  >
169
210
  <Link
170
- to="/knowledge/$kbId"
171
- params={{ kbId: item.id }}
211
+ to={"/knowledge/$kbId" as any}
212
+ params={{ kbId: item.id } as any}
172
213
  className="flex w-full items-center"
173
214
  >
174
215
  <Icon className="size-4 mr-2 shrink-0" />
175
216
  <span className="text-sm font-medium truncate">{item.name}</span>
176
217
  </Link>
177
218
  </SidebarMenuButton>
219
+ <UnpinButton kb={item} />
178
220
  </SidebarMenuItem>
179
221
  );
180
222
  })}
@@ -185,7 +227,6 @@ function KnowledgeBaseLinks({ pathname }: { pathname: string }) {
185
227
  export function NavKnowledge() {
186
228
  const { state } = useSidebar();
187
229
  const { pathname } = useLocation();
188
- const { t } = useTranslation('common');
189
230
  const isCollapsed = state === "collapsed";
190
231
  const [mounted, setMounted] = useState(false);
191
232
  const [open, setOpen] = useState(false);
@@ -203,10 +244,12 @@ export function NavKnowledge() {
203
244
  window.addEventListener("knowledge-created", refresh);
204
245
  window.addEventListener("knowledge-updated", refresh);
205
246
  window.addEventListener("knowledge-deleted", refresh);
247
+ window.addEventListener("knowledge-pinned", refresh);
206
248
  return () => {
207
249
  window.removeEventListener("knowledge-created", refresh);
208
250
  window.removeEventListener("knowledge-updated", refresh);
209
251
  window.removeEventListener("knowledge-deleted", refresh);
252
+ window.removeEventListener("knowledge-pinned", refresh);
210
253
  };
211
254
  }, []);
212
255
 
@@ -214,12 +257,12 @@ export function NavKnowledge() {
214
257
  <SidebarGroup className="p-0 space-y-1">
215
258
  {!isCollapsed && (
216
259
  <div className="flex h-8 items-center justify-between px-2 mb-1">
217
- <span className="text-xs font-medium text-sidebar-foreground/70">{t('sidebar.knowledge.title')}</span>
260
+ <span className="text-xs font-medium text-sidebar-foreground/70">{m.common_sidebar_knowledge_title()}</span>
218
261
  <Tooltip>
219
262
  <TooltipTrigger asChild>
220
263
  <button
221
264
  type="button"
222
- aria-label={t('sidebar.knowledge.create')}
265
+ aria-label={m.common_sidebar_knowledge_create()}
223
266
  onClick={() => setCreateOpen(true)}
224
267
  className="flex size-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2"
225
268
  >
@@ -227,7 +270,7 @@ export function NavKnowledge() {
227
270
  </button>
228
271
  </TooltipTrigger>
229
272
  <TooltipContent side="right">
230
- <p>{t('sidebar.knowledge.create')}</p>
273
+ <p>{m.common_sidebar_knowledge_create()}</p>
231
274
  </TooltipContent>
232
275
  </Tooltip>
233
276
  </div>
@@ -243,19 +286,19 @@ export function NavKnowledge() {
243
286
  <div className="relative">
244
287
  <SidebarMenuButton
245
288
  asChild
246
- tooltip={t('sidebar.knowledge.title')}
289
+ tooltip={m.common_sidebar_knowledge_title()}
247
290
  isActive={active}
248
291
  className={cn(
249
292
  "flex w-full items-center rounded-lg px-2 pr-9",
250
293
  isCollapsed && "justify-center"
251
294
  )}
252
295
  >
253
- <Link to="/knowledge"
296
+ <Link to={("/knowledge" as any)}
254
297
  className="flex w-full items-center"
255
298
  >
256
299
  <BookOpenText className="size-4" />
257
300
  {!isCollapsed && (
258
- <span className="ml-2 text-sm font-medium">{t('sidebar.knowledge.general')}</span>
301
+ <span className="ml-2 text-sm font-medium">{m.common_sidebar_knowledge_general()}</span>
259
302
  )}
260
303
  </Link>
261
304
  </SidebarMenuButton>
@@ -263,7 +306,7 @@ export function NavKnowledge() {
263
306
  {!isCollapsed && (
264
307
  <span
265
308
  role="button"
266
- aria-label={open ? t('sidebar.collapseSubMenu') : t('sidebar.expandSubMenu')}
309
+ aria-label={open ? m.common_sidebar_collapseSubMenu() : m.common_sidebar_expandSubMenu()}
267
310
  className="absolute right-1 top-1/2 -translate-y-1/2 z-10 flex h-6 w-6 cursor-pointer items-center justify-center rounded-md hover:bg-muted"
268
311
  onClick={() => setOpen((o) => !o)}
269
312
  >
@@ -290,13 +333,13 @@ export function NavKnowledge() {
290
333
  <Link to={route.link}
291
334
  className="flex items-center rounded-md w-50 py-1.5 text-sm font-medium"
292
335
  >
293
- <Icon className="size-4 mr-2" />
294
- {t(route.title)}
295
- {route.badge?.trim() && (
296
- <Badge className="h-4 px-1 text-[10px] bg-blue-50 text-blue-700 border-blue-400 dark:bg-blue-950 dark:text-blue-300 ">
297
- <AnimatedGradientText speed={2} colorFrom="#0760FF" colorTo="#3E83FF">{t(route.badge)}</AnimatedGradientText>
298
- </Badge>
299
- )}
336
+ <Icon className="size-4 mr-2" />
337
+ {route.title()}
338
+ {route.badge && (
339
+ <Badge className="h-4 px-1 text-[10px] bg-blue-50 text-blue-700 border-blue-400 dark:bg-blue-950 dark:text-blue-300 ">
340
+ <AnimatedGradientText speed={2} colorFrom="#0760FF" colorTo="#3E83FF">{route.badge()}</AnimatedGradientText>
341
+ </Badge>
342
+ )}
300
343
  </Link>
301
344
  </SidebarMenuSubButton>
302
345
  </SidebarMenuSubItem>
@@ -15,7 +15,6 @@
15
15
  // You should have received a copy of the GNU Affero General Public License
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
-
19
18
  import {
20
19
  Collapsible,
21
20
  CollapsibleContent,
@@ -48,7 +47,6 @@ import {
48
47
  } from "lucide-react";
49
48
  import { Link } from "@tanstack/react-router";
50
49
  import { useState } from "react";
51
- import { useTranslation } from "react-i18next";
52
50
  import { useLocation } from "@tanstack/react-router";
53
51
  import type { Route } from "@/config/sidebar-routes";
54
52
  import { isParentActive } from "@/lib/sidebar-utils";
@@ -95,11 +93,11 @@ function getIconComponent(iconName: string | undefined) {
95
93
  return IconComponent ? <IconComponent className="size-4 mr-2" /> : null;
96
94
  }
97
95
  import { CreatePRDDialog } from "@/plugins/core/prd/components/dialog/create-prd-dialog";
96
+ import { m } from "@/paraglide/messages.js";
98
97
 
99
98
  export default function DashboardNavigation({ routes }: { routes: Route[] }) {
100
99
  const { state } = useSidebar();
101
100
  const { pathname } = useLocation();
102
- const { t } = useTranslation('common');
103
101
  const isCollapsed = state === "collapsed";
104
102
  const [openCollapsible, setOpenCollapsible] = useState<string | null>(null);
105
103
  const [createPRDOpen, setCreatePRDOpen] = useState(false);
@@ -147,10 +145,10 @@ export default function DashboardNavigation({ routes }: { routes: Route[] }) {
147
145
  {route.icon}
148
146
  {!isCollapsed && (
149
147
  <span className="ml-2 flex-1 text-sm font-medium">
150
- {t(route.title)}
151
- {route.badge?.trim() && (
148
+ {route.title()}
149
+ {route.badge()?.trim() && (
152
150
  <Badge className="ml-2 bg-green-50 text-green-700 border-green-400 dark:bg-green-950 dark:text-green-300 ">
153
- <AnimatedGradientText speed={2} colorFrom="#8ECEAA" colorTo="#2A7E3B">{t(route.badge)}</AnimatedGradientText>
151
+ <AnimatedGradientText speed={2} colorFrom="#8ECEAA" colorTo="#2A7E3B">{route.badge()}</AnimatedGradientText>
154
152
  </Badge>
155
153
  )}
156
154
  </span>
@@ -163,7 +161,7 @@ export default function DashboardNavigation({ routes }: { routes: Route[] }) {
163
161
  {isPRDRoute && (
164
162
  <span
165
163
  role="button"
166
- aria-label={t("pr.create")}
164
+ aria-label={m.common_pr_create()}
167
165
  className="flex h-6 w-6 cursor-pointer items-center justify-center rounded-md hover:bg-muted"
168
166
  onClick={() => setCreatePRDOpen(true)}
169
167
  >
@@ -172,7 +170,7 @@ export default function DashboardNavigation({ routes }: { routes: Route[] }) {
172
170
  <BadgePlus className="h-4 w-4" />
173
171
  </TooltipTrigger>
174
172
  <TooltipContent>
175
- <p>{t('pr.create')}</p>
173
+ <p>{m.common_pr_create()}</p>
176
174
  </TooltipContent>
177
175
  </Tooltip>
178
176
  </span>
@@ -180,7 +178,7 @@ export default function DashboardNavigation({ routes }: { routes: Route[] }) {
180
178
  {hasSubRoutes && (
181
179
  <span
182
180
  role="button"
183
- aria-label={isOpen ? t('sidebar.collapseSubMenu') : t('sidebar.expandSubMenu')}
181
+ aria-label={isOpen ? m.common_sidebar_collapseSubMenu() : m.common_sidebar_expandSubMenu()}
184
182
  className="flex h-6 w-6 cursor-pointer items-center justify-center rounded-md hover:bg-muted"
185
183
  onClick={() =>
186
184
  setOpenCollapsible(isOpen ? null : route.id)
@@ -210,7 +208,7 @@ export default function DashboardNavigation({ routes }: { routes: Route[] }) {
210
208
  className="flex items-center rounded-md px-2.5 py-1.5 text-sm font-medium"
211
209
  >
212
210
  {getIconComponent(subRoute.icon as string)}
213
- <span className="truncate min-w-0">{subRoute.title}</span>
211
+ <span className="truncate min-w-0">{subRoute.title()}</span>
214
212
  {/* {subRoute.badge?.trim() && (
215
213
  <Badge variant="destructive" >
216
214
  {subRoute.badge}
@@ -225,7 +223,7 @@ export default function DashboardNavigation({ routes }: { routes: Route[] }) {
225
223
  )}
226
224
  </Collapsible>
227
225
  ) : (
228
- <SidebarMenuButton asChild tooltip={t(route.title)} isActive={active}>
226
+ <SidebarMenuButton asChild tooltip={route.title()} isActive={active}>
229
227
  <Link to={route.link}
230
228
  className={cn(
231
229
  "flex items-center rounded-lg px-2",
@@ -235,7 +233,7 @@ export default function DashboardNavigation({ routes }: { routes: Route[] }) {
235
233
  {route.icon}
236
234
  {!isCollapsed && (
237
235
  <span className="ml-2 text-sm font-medium">
238
- {t(route.title)}
236
+ {route.title()}
239
237
  </span>
240
238
  )}
241
239
  </Link>
@@ -15,9 +15,9 @@
15
15
  // You should have received a copy of the GNU Affero General Public License
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
+ import { useState } from 'react'
18
19
  import { useQuery, useQueryClient } from '@tanstack/react-query'
19
20
  import { Link, useNavigate } from '@tanstack/react-router'
20
- import { useTranslation } from 'react-i18next'
21
21
  import { Bell, CheckCheck } from 'lucide-react'
22
22
  import { Button } from '@/components/ui/button'
23
23
  import {
@@ -32,7 +32,6 @@ import {
32
32
  PopoverTrigger,
33
33
  } from '@/components/ui/popover'
34
34
  import { Separator } from '@/components/ui/separator'
35
- import { cn } from '@/lib/utils'
36
35
  import { CATEGORY_ICONS, formatRelativeTime } from '@/components/notifications/team-notifications'
37
36
  import {
38
37
  useNotifications,
@@ -41,19 +40,20 @@ import {
41
40
  } from '@/hooks/use-notifications'
42
41
  import { listNotificationsFn, markAllNotificationsReadFn, markNotificationReadFn } from '@/server/serverFns/notifications'
43
42
  import type { NotificationItem } from '@allbluecn/kernel'
43
+ import { m } from "@/paraglide/messages.js";
44
44
 
45
45
  const POPOVER_ITEM_LIMIT = 8
46
46
 
47
47
  export function NotificationsBell() {
48
- const { t } = useTranslation('notifications')
49
48
  const navigate = useNavigate()
50
49
  const queryClient = useQueryClient()
51
50
  const { unreadCount } = useNotifications()
51
+ const [open, setOpen] = useState(false)
52
52
 
53
53
  // ⚠ 与详情页 useInfiniteQuery 的分页缓存形态不同,必须使用独立 queryKey
54
54
  const { data } = useQuery({
55
- queryKey: NOTIFICATION_POPOVER_KEY,
56
- queryFn: () => listNotificationsFn({ data: {} }),
55
+ queryKey: [...NOTIFICATION_POPOVER_KEY, 'status', 'unread'],
56
+ queryFn: () => listNotificationsFn({ data: { status: 'unread' } }),
57
57
  })
58
58
  const items = (data?.items ?? []).slice(0, POPOVER_ITEM_LIMIT)
59
59
 
@@ -65,7 +65,8 @@ export function NotificationsBell() {
65
65
  if (!item.readAt) {
66
66
  void markNotificationReadFn({ data: { id: item.id } }).then(invalidateNotificationData)
67
67
  }
68
- if (item.link) navigate({ to: item.link as never })
68
+ setOpen(false)
69
+ if (item.link) void navigate({ to: item.link as never })
69
70
  }
70
71
 
71
72
  const handleMarkAllRead = async () => {
@@ -74,10 +75,10 @@ export function NotificationsBell() {
74
75
  }
75
76
 
76
77
  return (
77
- <Popover>
78
+ <Popover open={open} onOpenChange={setOpen}>
78
79
  <PopoverTrigger asChild>
79
80
  <Button
80
- aria-label={t('bell.label')}
81
+ aria-label={m.notifications_bell_label()}
81
82
  className="relative rounded-full"
82
83
  size="icon"
83
84
  variant="ghost"
@@ -92,11 +93,11 @@ export function NotificationsBell() {
92
93
  </PopoverTrigger>
93
94
  <PopoverContent align="start" className="w-80 p-0">
94
95
  <div className="flex h-6 mt-3 items-center justify-between px-4">
95
- <span className="flex h-full items-center text-sm font-semibold">{t('bell.recentTitle')}</span>
96
+ <span className="flex h-full items-center text-sm font-semibold">{m.notifications_bell_recentTitle()}</span>
96
97
  {unreadCount > 0 && (
97
98
  <Button onClick={handleMarkAllRead} size="sm" type="button" variant="ghost">
98
99
  <CheckCheck className="size-4" />
99
- {t('actions.markAllRead')}
100
+ {m.notifications_actions_markAllRead()}
100
101
  </Button>
101
102
  )}
102
103
  </div>
@@ -107,40 +108,29 @@ export function NotificationsBell() {
107
108
  <EmptyMedia variant="icon">
108
109
  <Bell className="size-6" />
109
110
  </EmptyMedia>
110
- <EmptyTitle>{t('empty')}</EmptyTitle>
111
+ <EmptyTitle>{m.notifications_allCaughtUp()}</EmptyTitle>
111
112
  </EmptyHeader>
112
113
  </Empty>
113
114
  ) : (
114
115
  <div className="max-h-96 overflow-y-auto border-t">
115
116
  {items.map((item) => {
116
117
  const Icon = CATEGORY_ICONS[item.category]
117
- const isUnread = !item.readAt
118
118
  return (
119
119
  <div
120
120
  key={item.id}
121
- className={cn(
122
- 'flex cursor-pointer items-start gap-3 px-4 py-3 transition-colors hover:bg-muted/50',
123
- isUnread && 'bg-primary/5'
124
- )}
121
+ className="flex cursor-pointer items-start gap-3 px-4 py-3 transition-colors hover:bg-muted/50"
125
122
  onClick={() => handleOpenItem(item)}
126
123
  >
127
- <div
128
- className={cn(
129
- 'flex size-8 shrink-0 items-center justify-center rounded-full',
130
- isUnread ? 'bg-primary/10 text-primary' : 'bg-muted text-muted-foreground'
131
- )}
132
- >
124
+ <div className="flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground">
133
125
  <Icon className="size-4" />
134
126
  </div>
135
127
  <div className="flex min-w-0 flex-1 flex-col gap-0.5">
136
- <span className={cn('truncate text-sm', isUnread ? 'font-medium' : 'text-muted-foreground')}>
137
- {item.title}
138
- </span>
128
+ <span className="truncate text-sm">{item.title}</span>
139
129
  <span className="text-muted-foreground text-xs">
140
- {formatRelativeTime(item.createdAt, t)}
130
+ {formatRelativeTime(item.createdAt)}
141
131
  </span>
142
132
  </div>
143
- {isUnread && <span className="mt-1.5 size-2 shrink-0 rounded-full bg-primary" />}
133
+ <span className="mt-1.5 size-2 shrink-0 rounded-full bg-primary" />
144
134
  </div>
145
135
  )
146
136
  })}
@@ -150,9 +140,10 @@ export function NotificationsBell() {
150
140
  <div className="p-1 border-t">
151
141
  <Link
152
142
  className="flex h-10 w-full items-center justify-center rounded-md text-sm text-muted-foreground transition-colors hover:bg-muted/50 hover:text-primary"
143
+ onClick={() => setOpen(false)}
153
144
  to="/notifications"
154
145
  >
155
- {t('actions.viewAll')}
146
+ {m.notifications_actions_viewAll()}
156
147
  </Link>
157
148
  </div>
158
149
  </PopoverContent>
@@ -14,12 +14,11 @@
14
14
  //
15
15
  // You should have received a copy of the GNU Affero General Public License
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
-
18
- import { useTranslation } from "react-i18next"
19
17
  import { Search, Command } from "lucide-react"
20
18
  import { useSidebar } from "@/components/ui/sidebar"
21
19
  import { cn } from "@/lib/utils"
22
20
  import { setCommandPaletteOpen } from "@/lib/commands/command-palette-state"
21
+ import { m } from "@/paraglide/messages.js";
23
22
 
24
23
  const isMac =
25
24
  typeof navigator !== "undefined" &&
@@ -27,7 +26,6 @@ const isMac =
27
26
  navigator.userAgent.toUpperCase().includes("MAC"))
28
27
 
29
28
  export function SidebarSearchTrigger() {
30
- const { t } = useTranslation("common")
31
29
  const { state } = useSidebar()
32
30
  const isCollapsed = state === "collapsed"
33
31
  const openPalette = () => setCommandPaletteOpen(true)
@@ -37,7 +35,7 @@ export function SidebarSearchTrigger() {
37
35
  <button
38
36
  type="button"
39
37
  onClick={openPalette}
40
- aria-label={t("command.searchPlaceholder")}
38
+ aria-label={m.common_command_searchPlaceholder()}
41
39
  className="flex size-8 w-full items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground"
42
40
  >
43
41
  <Search className="size-4" />
@@ -56,7 +54,7 @@ export function SidebarSearchTrigger() {
56
54
  >
57
55
  <Search className="size-4 shrink-0" />
58
56
  <span className="flex-1 truncate text-left text-xs">
59
- {t("command.searchPlaceholder")}
57
+ {m.common_command_searchPlaceholder()}
60
58
  </span>
61
59
  <span className="inline-flex items-center gap-1 rounded border border-border bg-muted/60 px-1.5 py-0.5">
62
60
  <kbd