@allbluecn/web-app 0.9.5 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (684) hide show
  1. package/package.json +9 -8
  2. package/public/favicon.ico +0 -0
  3. package/src/__tests__/paraglide.test.ts +43 -0
  4. package/src/__tests__/setup.ts +27 -9
  5. package/src/assets/illustrations/empty-states/workspace-empty.svg +5 -0
  6. package/src/assets/illustrations/knowledge/law-card-illustration.svg +5 -0
  7. package/src/assets/logo/logo.tsx +53 -36
  8. package/src/components/agents/agent-card.tsx +7 -7
  9. package/src/components/agents/agent-form-dialog.tsx +41 -42
  10. package/src/components/agents/agent-selector.tsx +6 -8
  11. package/src/components/agents/agents-page.tsx +26 -28
  12. package/src/components/agents/skill-card.tsx +1 -4
  13. package/src/components/agents/skill-form-dialog.tsx +19 -21
  14. package/src/components/agents/slash-skill-menu.tsx +5 -7
  15. package/src/components/agents/use-agent-handlers.ts +5 -8
  16. package/src/components/ai/ai-chat-prompt.tsx +26 -33
  17. package/src/components/ai/global-chat-panel.tsx +10 -11
  18. package/src/components/ai/use-knowledge-bases.ts +2 -2
  19. package/src/components/anyhub/anyhub-app-card.tsx +13 -15
  20. package/src/components/anyhub/anyhub-app-runner.tsx +5 -7
  21. package/src/components/anyhub/anyhub-install-dialog.tsx +16 -18
  22. package/src/components/anyhub/anyhub-management-view.tsx +9 -11
  23. package/src/components/anyhub/anyhub-marketplace-view.tsx +14 -17
  24. package/src/components/anyhub/anyhub-permission-panel.tsx +8 -11
  25. package/src/components/anyhub/anyhub-provider.tsx +0 -1
  26. package/src/components/anyhub/anyhub-top-nav.tsx +5 -8
  27. package/src/components/auth/auth-header.tsx +2 -2
  28. package/src/components/auth/icon-input.tsx +0 -1
  29. package/src/components/auth/oauth-section.tsx +3 -5
  30. package/src/components/auth/password-input.tsx +2 -4
  31. package/src/components/auth/session-guard.tsx +0 -1
  32. package/src/components/auth/sso-section.tsx +3 -4
  33. package/src/components/billing/__tests__/seats-manager.test.tsx +5 -9
  34. package/src/components/billing/billing-panel.tsx +5 -6
  35. package/src/components/billing/checkout-redirect.ts +6 -10
  36. package/src/components/billing/feature-gate.tsx +2 -3
  37. package/src/components/billing/invoice-history.tsx +9 -11
  38. package/src/components/billing/login-prompt-dialog.tsx +10 -11
  39. package/src/components/billing/pricing-card.tsx +6 -7
  40. package/src/components/billing/pricing-page.tsx +4 -5
  41. package/src/components/billing/seats-manager.tsx +19 -20
  42. package/src/components/billing/subscription-card.tsx +13 -14
  43. package/src/components/billing/upgrade-prompt.tsx +11 -13
  44. package/src/components/changelog/changelog-page.tsx +36 -26
  45. package/src/components/chat/ai-chat-history/components/conversation-header.tsx +4 -5
  46. package/src/components/chat/ai-chat-history/components/conversation-item.tsx +15 -17
  47. package/src/components/chat/ai-chat-history/components/conversation-search.tsx +3 -4
  48. package/src/components/chat/ai-chat-history/components/empty-state.tsx +5 -6
  49. package/src/components/chat/ai-chat-history/index.tsx +11 -15
  50. package/src/components/chat/ai-chat-history/utils/group-conversations.ts +9 -2
  51. package/src/components/chat/ai-citations/components/citation-item.tsx +3 -5
  52. package/src/components/chat/ai-citations/components/citations-list.tsx +4 -6
  53. package/src/components/chat/ai-citations/components/inline-citation.tsx +2 -4
  54. package/src/components/chat/ai-citations/components/source-components.tsx +6 -10
  55. package/src/components/chat/ai-citations/index.tsx +3 -4
  56. package/src/components/chat/ai-citations/utils.ts +15 -3
  57. package/src/components/chat/ai-conversation.tsx +10 -12
  58. package/src/components/chat/ai-message/components/message-actions.tsx +7 -9
  59. package/src/components/chat/ai-message/components/streaming-indicator.tsx +3 -4
  60. package/src/components/chat/ai-message/index.tsx +5 -5
  61. package/src/components/chat/ai-message/utils/dom-utils.ts +1 -1
  62. package/src/components/chat/ai-prompt-input/components/action-buttons.tsx +14 -16
  63. package/src/components/chat/ai-prompt-input/components/agent-mode-select.tsx +10 -5
  64. package/src/components/chat/ai-prompt-input/components/context-badge.tsx +2 -3
  65. package/src/components/chat/ai-prompt-input/components/kb-context-selector.tsx +6 -8
  66. package/src/components/chat/ai-prompt-input/components/model-select.tsx +14 -7
  67. package/src/components/chat/ai-prompt-input/components/page-user-context-selector.tsx +6 -8
  68. package/src/components/chat/ai-prompt-input/index.tsx +18 -11
  69. package/src/components/chat/ai-prompt-input/types.ts +6 -5
  70. package/src/components/chat/ai-thinking.tsx +6 -9
  71. package/src/components/chat/chat-thread-page.tsx +4 -5
  72. package/src/components/chat/interrupt-approval.tsx +6 -8
  73. package/src/components/command/command-palette.tsx +7 -10
  74. package/src/components/design/project-card.tsx +2 -3
  75. package/src/components/design/sketch/code-preview.tsx +3 -4
  76. package/src/components/design/sketch/export-panel.tsx +3 -4
  77. package/src/components/design/sketch/property-panel.tsx +16 -17
  78. package/src/components/error/global-error-boundary.tsx +65 -0
  79. package/src/components/forms/app-array-field.tsx +3 -4
  80. package/src/components/forms/app-combobox.tsx +2 -3
  81. package/src/components/forms/app-date-picker.tsx +2 -3
  82. package/src/components/forms/app-form-dialog.tsx +3 -4
  83. package/src/components/forms/app-select.tsx +2 -3
  84. package/src/components/forms/hooks/use-form-submit.ts +2 -2
  85. package/src/components/forms/schemas/common.ts +4 -6
  86. package/src/components/hotkeys/shortcuts-panel.tsx +2 -3
  87. package/src/components/iteration/auto-schedule-dialog.tsx +12 -13
  88. package/src/components/iteration/burndown-chart.tsx +6 -8
  89. package/src/components/iteration/constants.ts +5 -4
  90. package/src/components/iteration/create-iteration-dialog.tsx +14 -15
  91. package/src/components/iteration/iteration-card.tsx +3 -4
  92. package/src/components/iteration/iteration-editor.tsx +7 -8
  93. package/src/components/iteration/iteration-progress-bar.tsx +3 -5
  94. package/src/components/iteration/iteration-status-badge.tsx +1 -3
  95. package/src/components/kibo-ui/contribution-graph/index.tsx +37 -9
  96. package/src/components/knowledge/dialog/knowledge-form-dialog.tsx +8 -9
  97. package/src/components/knowledge/doc-properties.tsx +12 -13
  98. package/src/components/knowledge/editor/doc-header.tsx +7 -8
  99. package/src/components/knowledge/editor/knowledge-doc-editor.tsx +9 -9
  100. package/src/components/knowledge/knowledge-homepage.tsx +6 -7
  101. package/src/components/knowledge/knowledge-tag-input.tsx +3 -4
  102. package/src/components/knowledge/knowledge-toolbar.tsx +38 -40
  103. package/src/components/knowledge/knowledge-tree-item.tsx +21 -22
  104. package/src/components/knowledge/knowledge-tree.tsx +15 -16
  105. package/src/components/knowledge-public/bookmark-card.tsx +13 -14
  106. package/src/components/knowledge-public/bookmark-form-dialog.tsx +25 -26
  107. package/src/components/knowledge-public/knowledge-card-grid.tsx +3 -3
  108. package/src/components/knowledge-public/knowledge-filters.tsx +9 -10
  109. package/src/components/knowledge-public/knowledge-form-dialog.tsx +62 -63
  110. package/src/components/knowledge-public/knowledge-search-bar.tsx +3 -4
  111. package/src/components/knowledge-public/legal-compliance-editor.tsx +30 -31
  112. package/src/components/knowledge-public/markdown-editor.tsx +3 -4
  113. package/src/components/knowledge-public/markdown-view.tsx +2 -3
  114. package/src/components/knowledge-public/sharers-avatar-group.tsx +3 -4
  115. package/src/components/knowledge-public/tag-filter.tsx +3 -4
  116. package/src/components/layout/sidebar-03/__tests__/nav-workspace.test.tsx +42 -79
  117. package/src/components/layout/sidebar-03/__tests__/user-menu-anonymous.test.tsx +51 -0
  118. package/src/components/layout/sidebar-03/app-sidebar.tsx +3 -4
  119. package/src/components/layout/sidebar-03/index.tsx +0 -1
  120. package/src/components/layout/sidebar-03/nav-anyhub.tsx +4 -5
  121. package/src/components/layout/sidebar-03/nav-knowledge.tsx +80 -37
  122. package/src/components/layout/sidebar-03/nav-main.tsx +10 -12
  123. package/src/components/layout/sidebar-03/nav-notifications.tsx +19 -28
  124. package/src/components/layout/sidebar-03/nav-search-trigger.tsx +3 -5
  125. package/src/components/layout/sidebar-03/nav-workspace.tsx +32 -12
  126. package/src/components/layout/sidebar-03/team-switcher.tsx +0 -1
  127. package/src/components/layout/sidebar-03/user-menu.tsx +33 -13
  128. package/src/components/magicui/components/animate/avatar-group.tsx +0 -1
  129. package/src/components/magicui/primitives/animate/avatar-group.tsx +0 -1
  130. package/src/components/magicui/primitives/animate/slot.tsx +0 -1
  131. package/src/components/magicui/primitives/animate/tooltip.tsx +0 -1
  132. package/src/components/magicui/sparkles-text.tsx +0 -1
  133. package/src/components/mindmap/mindmap-doc-editor.tsx +15 -15
  134. package/src/components/notifications/settings-notifications.tsx +22 -23
  135. package/src/components/notifications/team-notifications.tsx +27 -29
  136. package/src/components/plugin-slots/__tests__/plugin-settings-tabs.test.tsx +4 -4
  137. package/src/components/plugin-slots/plugin-settings-tabs.tsx +15 -11
  138. package/src/components/project/create-project-dialog.tsx +60 -34
  139. package/src/components/project/invite-member-dialog.tsx +20 -21
  140. package/src/components/project/project-activity-list.tsx +19 -24
  141. package/src/components/project/project-member-manager.tsx +27 -28
  142. package/src/components/project/project-module-card.tsx +5 -6
  143. package/src/components/project/schemas/create-project.ts +3 -5
  144. package/src/components/prototype/component/GenericPrototype.tsx +0 -1
  145. package/src/components/prototype/component-preview.tsx +0 -1
  146. package/src/components/settings/ai/api-key-field.tsx +8 -10
  147. package/src/components/settings/ai/create-custom-model-dialog.tsx +28 -21
  148. package/src/components/settings/ai/create-custom-provider-dialog.tsx +15 -16
  149. package/src/components/settings/ai/model-card.tsx +25 -10
  150. package/src/components/settings/ai/model-manager.tsx +24 -16
  151. package/src/components/settings/ai/provider-card.tsx +9 -11
  152. package/src/components/settings/ai/provider-detail-form.tsx +24 -26
  153. package/src/components/settings/ai/provider-grid.tsx +23 -13
  154. package/src/components/settings/language-selector.tsx +13 -15
  155. package/src/components/settings/personal-team/account/account-client.tsx +14 -16
  156. package/src/components/settings/personal-team/account/avatar/notion-avatar-editor.tsx +36 -28
  157. package/src/components/settings/personal-team/account/settings-profile.tsx +39 -40
  158. package/src/components/settings/personal-team/team/team-client.tsx +45 -50
  159. package/src/components/settings/personal-team/team/team-invitations.tsx +89 -95
  160. package/src/components/settings/personal-team/team/team-member-list.tsx +50 -47
  161. package/src/components/shadcn-space/blocks/pricing-01/pricing.tsx +170 -172
  162. package/src/components/shared-kit/data-viz/contribution-graph-tooltip.tsx +128 -15
  163. package/src/components/shared-kit/dialogs/name-confirm-dialog.tsx +16 -16
  164. package/src/components/shared-kit/i18n/language-switcher.tsx +6 -9
  165. package/src/components/shared-kit/i18n/translator-text.tsx +2 -4
  166. package/src/components/shared-kit/icons/lucide-icon-picker/panel.tsx +7 -8
  167. package/src/components/shared-kit/logos/logo-icon.tsx +64 -0
  168. package/src/components/shared-kit/navigation/nav-float-button.tsx +3 -5
  169. package/src/components/shared-kit/pages/placeholder-page.tsx +2 -4
  170. package/src/components/shared-kit/theme/animated-theme-toggler.tsx +0 -1
  171. package/src/components/shared-kit/theme/theme-toggle.tsx +0 -1
  172. package/src/components/shared-kit/timezone/timezone-select.tsx +6 -7
  173. package/src/components/story/__tests__/constants.test.ts +7 -7
  174. package/src/components/story/__tests__/dependency-type-badge.test.ts +5 -5
  175. package/src/components/story/ai/action-registry.ts +12 -11
  176. package/src/components/story/ai/handlers/more-popover.tsx +5 -6
  177. package/src/components/story/ai/prototype-dialog.tsx +9 -10
  178. package/src/components/story/ai/split-dialog.tsx +22 -23
  179. package/src/components/story/ai/story-ai-panel.tsx +29 -30
  180. package/src/components/story/ai/story-ai-preview-list.tsx +16 -9
  181. package/src/components/story/ai/story-ai-toolbar.tsx +12 -13
  182. package/src/components/story/columns.tsx +33 -17
  183. package/src/components/story/constants.ts +73 -69
  184. package/src/components/story/create-story-dialog.tsx +13 -14
  185. package/src/components/story/detail/__tests__/categories.test.tsx +8 -10
  186. package/src/components/story/detail/__tests__/dependencies-button.test.tsx +3 -5
  187. package/src/components/story/detail/activity-tabs.tsx +6 -7
  188. package/src/components/story/detail/activity-timeline.tsx +33 -35
  189. package/src/components/story/detail/comment-input.tsx +7 -8
  190. package/src/components/story/detail/comment-item.tsx +15 -16
  191. package/src/components/story/detail/comment-thread.tsx +6 -7
  192. package/src/components/story/detail/reaction-bar.tsx +2 -3
  193. package/src/components/story/detail/story-detail-body.tsx +26 -28
  194. package/src/components/story/detail/story-detail-toolbar/associated-attachments-panel.tsx +42 -45
  195. package/src/components/story/detail/story-detail-toolbar/categories.tsx +13 -14
  196. package/src/components/story/detail/story-detail-toolbar/children.tsx +19 -22
  197. package/src/components/story/detail/story-detail-toolbar/dependencies.tsx +3 -5
  198. package/src/components/story/detail/story-detail-toolbar/dependency-panel.tsx +30 -20
  199. package/src/components/story/detail/story-detail-toolbar.tsx +16 -11
  200. package/src/components/story/detail/story-properties.tsx +7 -8
  201. package/src/components/story/display/__tests__/display-dropdown.test.tsx +3 -5
  202. package/src/components/story/display/__tests__/use-paged-story-groups.test.ts +2 -0
  203. package/src/components/story/display/constants.ts +27 -26
  204. package/src/components/story/display/display-dropdown.tsx +20 -26
  205. package/src/components/story/display/group-resolver.tsx +12 -14
  206. package/src/components/story/display/use-grouped-stories.ts +3 -5
  207. package/src/components/story/display/use-paged-story-groups.ts +12 -13
  208. package/src/components/story/filters/add-filter-dropdown.tsx +4 -5
  209. package/src/components/story/filters/applied-filters.tsx +7 -9
  210. package/src/components/story/filters/filter-condition.tsx +9 -12
  211. package/src/components/story/filters/filter-row.tsx +5 -6
  212. package/src/components/story/filters/filter-toggle.tsx +2 -3
  213. package/src/components/story/filters/filter-types.ts +24 -23
  214. package/src/components/story/filters/filter-value-input.tsx +3 -4
  215. package/src/components/story/infinite-scroll-sentinel.tsx +2 -3
  216. package/src/components/story/inline-editors/__tests__/dependency-type-select.test.tsx +18 -23
  217. package/src/components/story/inline-editors/__tests__/labels-editor.test.tsx +9 -11
  218. package/src/components/story/inline-editors/__tests__/priority-editor.test.tsx +21 -25
  219. package/src/components/story/inline-editors/__tests__/state-editor.test.tsx +21 -25
  220. package/src/components/story/inline-editors/assignee-editor.tsx +8 -9
  221. package/src/components/story/inline-editors/date-editor.tsx +4 -5
  222. package/src/components/story/inline-editors/dependency-type-select.tsx +15 -12
  223. package/src/components/story/inline-editors/inline-trigger.tsx +2 -3
  224. package/src/components/story/inline-editors/labels-editor.tsx +16 -17
  225. package/src/components/story/inline-editors/parent-story-editor.tsx +3 -4
  226. package/src/components/story/inline-editors/priority-editor.tsx +6 -8
  227. package/src/components/story/inline-editors/state-editor.tsx +6 -7
  228. package/src/components/story/inline-editors/story-select-dialog.tsx +25 -26
  229. package/src/components/story/inline-editors/title-editor.tsx +2 -3
  230. package/src/components/story/peek-panel.tsx +6 -7
  231. package/src/components/story/relations/__tests__/knowledge-select-dialog.test.tsx +2 -0
  232. package/src/components/story/relations/__tests__/link-manage-dialog.test.tsx +2 -0
  233. package/src/components/story/relations/attachment-manage-dialog.tsx +23 -24
  234. package/src/components/story/relations/general-groups.ts +12 -29
  235. package/src/components/story/relations/knowledge-select-dialog.tsx +21 -22
  236. package/src/components/story/relations/link-manage-dialog.tsx +12 -13
  237. package/src/components/story/relations/story-ref-row.tsx +20 -21
  238. package/src/components/story/schemas/story-create.ts +3 -5
  239. package/src/components/story/search-popover.tsx +5 -6
  240. package/src/components/story/story-list-table.tsx +3 -4
  241. package/src/components/story/story-list-view.tsx +9 -10
  242. package/src/components/story/story-panel-header.tsx +27 -28
  243. package/src/components/story/story-toolbar.tsx +11 -12
  244. package/src/components/story/transfer-story-popover.tsx +15 -16
  245. package/src/components/story/views/calendar-view.tsx +12 -14
  246. package/src/components/story/views/create-view-dialog.tsx +19 -52
  247. package/src/components/story/views/kanban-board.tsx +9 -12
  248. package/src/components/story/views/kanban-card.tsx +1 -3
  249. package/src/components/story/views/story-list/__tests__/batch-toolbar.test.tsx +9 -2
  250. package/src/components/story/views/story-list/__tests__/group-header.test.tsx +15 -17
  251. package/src/components/story/views/story-list/batch-preview-dialog.tsx +26 -28
  252. package/src/components/story/views/story-list/batch-toolbar.tsx +12 -13
  253. package/src/components/story/views/story-list/group.tsx +9 -11
  254. package/src/components/story/views/story-list/index.tsx +13 -14
  255. package/src/components/story/views/story-list/inline-story-creator.tsx +6 -7
  256. package/src/components/story/views/story-list/row.tsx +6 -7
  257. package/src/components/story/views/timeline-view.tsx +7 -8
  258. package/src/components/story/views/view-list-section.tsx +14 -16
  259. package/src/components/story/views/view-selector-button.tsx +6 -7
  260. package/src/components/story/views/view-switcher.tsx +9 -10
  261. package/src/components/story/views/view-types.ts +15 -15
  262. package/src/components/tiptap/extension/code-block-ellipsis-input-extension.ts +0 -1
  263. package/src/components/tiptap/hooks/use-composed-ref.ts +0 -1
  264. package/src/components/tiptap/hooks/use-cursor-visibility.ts +0 -1
  265. package/src/components/tiptap/hooks/use-floating-element.ts +0 -1
  266. package/src/components/tiptap/hooks/use-is-breakpoint.ts +0 -1
  267. package/src/components/tiptap/hooks/use-isomorphic-layout-effect.ts +0 -1
  268. package/src/components/tiptap/hooks/use-menu-navigation.ts +0 -1
  269. package/src/components/tiptap/hooks/use-on-click-outside.ts +0 -1
  270. package/src/components/tiptap/hooks/use-tiptap-editor.ts +0 -1
  271. package/src/components/tiptap/hooks/use-ui-editor-state.ts +0 -1
  272. package/src/components/tiptap/mindmap/lib/__tests__/default-mindmap-data.test.ts +3 -2
  273. package/src/components/tiptap/mindmap/lib/default-mindmap-data.ts +2 -2
  274. package/src/components/tiptap/mindmap/mind-map.tsx +36 -39
  275. package/src/components/tiptap/mindmap/mindmap-fullscreen-dialog.tsx +2 -3
  276. package/src/components/tiptap/node/annotation-node/annotation-node-view.tsx +11 -12
  277. package/src/components/tiptap/node/doc-card-extension.tsx +8 -10
  278. package/src/components/tiptap/node/image-node/image-node-floating.tsx +2 -3
  279. package/src/components/tiptap/node/image-upload-node/image-upload-node.tsx +0 -1
  280. package/src/components/tiptap/node/mention-extension.ts +5 -5
  281. package/src/components/tiptap/node/table-node/hooks/use-table-handle-state.ts +0 -1
  282. package/src/components/tiptap/node/table-node/ui/table-add-row-column-button/table-add-row-column-button.tsx +0 -1
  283. package/src/components/tiptap/node/table-node/ui/table-add-row-column-button/use-table-add-row-column.ts +5 -6
  284. package/src/components/tiptap/node/table-node/ui/table-align-cell-button/table-align-cell-button.tsx +0 -1
  285. package/src/components/tiptap/node/table-node/ui/table-align-cell-button/use-table-align-cell.ts +8 -9
  286. package/src/components/tiptap/node/table-node/ui/table-alignment-menu/table-alignment-menu.tsx +2 -4
  287. package/src/components/tiptap/node/table-node/ui/table-cell-handle-menu/table-cell-handle-menu.tsx +2 -5
  288. package/src/components/tiptap/node/table-node/ui/table-clear-row-column-content-button/table-clear-row-column-content-button.tsx +0 -1
  289. package/src/components/tiptap/node/table-node/ui/table-clear-row-column-content-button/use-table-clear-row-column-content.ts +4 -5
  290. package/src/components/tiptap/node/table-node/ui/table-delete-row-column-button/table-delete-row-column-button.tsx +0 -1
  291. package/src/components/tiptap/node/table-node/ui/table-delete-row-column-button/use-table-delete-row-column.ts +3 -4
  292. package/src/components/tiptap/node/table-node/ui/table-duplicate-row-column-button/table-duplicate-row-column-button.tsx +0 -1
  293. package/src/components/tiptap/node/table-node/ui/table-duplicate-row-column-button/use-table-duplicate-row-column.ts +3 -4
  294. package/src/components/tiptap/node/table-node/ui/table-extend-row-column-button/table-extend-row-column-button.tsx +2 -4
  295. package/src/components/tiptap/node/table-node/ui/table-fit-to-width-button/table-fit-to-width-button.tsx +0 -1
  296. package/src/components/tiptap/node/table-node/ui/table-fit-to-width-button/use-table-fit-to-width.ts +3 -4
  297. package/src/components/tiptap/node/table-node/ui/table-handle/table-handle.tsx +0 -1
  298. package/src/components/tiptap/node/table-node/ui/table-handle-menu/table-handle-menu.tsx +3 -5
  299. package/src/components/tiptap/node/table-node/ui/table-header-row-column-button/table-header-row-column-button.tsx +0 -1
  300. package/src/components/tiptap/node/table-node/ui/table-header-row-column-button/use-table-header-row-column.ts +3 -4
  301. package/src/components/tiptap/node/table-node/ui/table-merge-split-cell-button/table-merge-split-cell-button.tsx +0 -1
  302. package/src/components/tiptap/node/table-node/ui/table-merge-split-cell-button/use-table-merge-split-cell.ts +3 -4
  303. package/src/components/tiptap/node/table-node/ui/table-move-row-column-button/table-move-row-column-button.tsx +0 -1
  304. package/src/components/tiptap/node/table-node/ui/table-move-row-column-button/use-table-move-row-column.ts +9 -10
  305. package/src/components/tiptap/node/table-node/ui/table-selection-overlay/table-selection-overlay.tsx +0 -1
  306. package/src/components/tiptap/node/table-node/ui/table-selection-overlay/use-resize-overlay.ts +0 -1
  307. package/src/components/tiptap/node/table-node/ui/table-sort-row-column-button/table-sort-row-column-button.tsx +0 -1
  308. package/src/components/tiptap/node/table-node/ui/table-sort-row-column-button/use-table-sort-row-column.ts +5 -6
  309. package/src/components/tiptap/node/table-node/ui/table-trigger-button/table-grid-selector.tsx +2 -3
  310. package/src/components/tiptap/node/table-node/ui/table-trigger-button/table-trigger-button.tsx +0 -1
  311. package/src/components/tiptap/node/table-node/ui/table-trigger-button/use-table-trigger.ts +3 -4
  312. package/src/components/tiptap/node/toc-node/toc-node.tsx +2 -4
  313. package/src/components/tiptap/node/toc-node/ui/toc-show-title-button/toc-show-title-button.tsx +0 -1
  314. package/src/components/tiptap/node/toc-node/ui/toc-show-title-button/toc-show-title.ts +2 -3
  315. package/src/components/tiptap/node/toc-node/ui/toc-sidebar/toc-sidebar.tsx +2 -5
  316. package/src/components/tiptap/notion-like/notion-like-editor-header.tsx +2 -4
  317. package/src/components/tiptap/notion-like/notion-like-editor-mobile-toolbar.tsx +17 -23
  318. package/src/components/tiptap/notion-like/notion-like-editor-theme-toggle.tsx +2 -5
  319. package/src/components/tiptap/notion-like/notion-like-editor-toolbar-floating.tsx +16 -12
  320. package/src/components/tiptap/notion-like/notion-like-editor.tsx +2 -7
  321. package/src/components/tiptap/notion-like/setup-error-message/setup-error-message.tsx +0 -1
  322. package/src/components/tiptap/ui/ai-ask-button/ai-ask-button.tsx +0 -1
  323. package/src/components/tiptap/ui/ai-ask-button/use-ai-ask.ts +2 -3
  324. package/src/components/tiptap/ui/ai-menu/ai-menu-actions/ai-menu-actions.tsx +4 -6
  325. package/src/components/tiptap/ui/ai-menu/ai-menu-input/ai-menu-input.tsx +6 -10
  326. package/src/components/tiptap/ui/ai-menu/ai-menu-items/ai-menu-items-constants.ts +36 -36
  327. package/src/components/tiptap/ui/ai-menu/ai-menu-items/ai-menu-items.tsx +13 -16
  328. package/src/components/tiptap/ui/ai-menu/ai-menu-items/language-selection-submenu.tsx +3 -4
  329. package/src/components/tiptap/ui/ai-menu/ai-menu-items/tone-selection-submenu.tsx +2 -3
  330. package/src/components/tiptap/ui/ai-menu/ai-menu-utils.ts +3 -3
  331. package/src/components/tiptap/ui/ai-menu/ai-menu.tsx +3 -5
  332. package/src/components/tiptap/ui/blockquote-button/blockquote-button.tsx +2 -6
  333. package/src/components/tiptap/ui/blockquote-button/use-blockquote.ts +2 -3
  334. package/src/components/tiptap/ui/code-block-button/code-block-button.tsx +2 -6
  335. package/src/components/tiptap/ui/code-block-button/use-code-block.ts +2 -3
  336. package/src/components/tiptap/ui/color-highlight-button/color-highlight-button.tsx +0 -1
  337. package/src/components/tiptap/ui/color-highlight-button/use-color-highlight.ts +14 -14
  338. package/src/components/tiptap/ui/color-highlight-popover/color-highlight-popover.tsx +9 -11
  339. package/src/components/tiptap/ui/color-menu/color-menu.tsx +5 -11
  340. package/src/components/tiptap/ui/color-text-button/color-text-button.tsx +2 -3
  341. package/src/components/tiptap/ui/color-text-button/use-color-text.ts +12 -13
  342. package/src/components/tiptap/ui/color-text-popover/color-text-popover.tsx +6 -10
  343. package/src/components/tiptap/ui/color-text-popover/use-color-text-popover.ts +2 -3
  344. package/src/components/tiptap/ui/copy-anchor-link-button/copy-anchor-link-button.tsx +2 -6
  345. package/src/components/tiptap/ui/copy-anchor-link-button/use-copy-anchor-link.ts +2 -3
  346. package/src/components/tiptap/ui/copy-anchor-link-button/use-scroll-to-hash.ts +0 -1
  347. package/src/components/tiptap/ui/copy-to-clipboard-button/copy-to-clipboard-button.tsx +2 -6
  348. package/src/components/tiptap/ui/copy-to-clipboard-button/use-copy-to-clipboard.ts +2 -3
  349. package/src/components/tiptap/ui/delete-node-button/delete-node-button.tsx +2 -6
  350. package/src/components/tiptap/ui/delete-node-button/use-delete-node.ts +2 -3
  351. package/src/components/tiptap/ui/doc-reference-floating/doc-reference-floating.tsx +10 -11
  352. package/src/components/tiptap/ui/doc-reference-interaction/doc-reference-interaction.tsx +10 -11
  353. package/src/components/tiptap/ui/drag-context-menu/drag-context-menu.tsx +7 -9
  354. package/src/components/tiptap/ui/duplicate-button/duplicate-button.tsx +2 -6
  355. package/src/components/tiptap/ui/duplicate-button/use-duplicate.ts +2 -3
  356. package/src/components/tiptap/ui/emoji-dropdown-menu/emoji-dropdown-menu.tsx +0 -1
  357. package/src/components/tiptap/ui/emoji-menu/emoji-menu.tsx +2 -5
  358. package/src/components/tiptap/ui/emoji-trigger-button/emoji-trigger-button.tsx +2 -6
  359. package/src/components/tiptap/ui/emoji-trigger-button/use-emoji-trigger.ts +2 -3
  360. package/src/components/tiptap/ui/heading-button/heading-button.tsx +0 -1
  361. package/src/components/tiptap/ui/heading-button/use-heading.ts +7 -8
  362. package/src/components/tiptap/ui/image-align-button/image-align-button.tsx +0 -1
  363. package/src/components/tiptap/ui/image-align-button/use-image-align.ts +4 -5
  364. package/src/components/tiptap/ui/image-caption-button/image-caption-button.tsx +0 -1
  365. package/src/components/tiptap/ui/image-caption-button/use-image-caption.ts +2 -3
  366. package/src/components/tiptap/ui/image-download-button/image-download-button.tsx +0 -1
  367. package/src/components/tiptap/ui/image-download-button/use-image-download.ts +2 -3
  368. package/src/components/tiptap/ui/image-upload-button/image-upload-button.tsx +0 -1
  369. package/src/components/tiptap/ui/image-upload-button/use-image-upload.ts +2 -3
  370. package/src/components/tiptap/ui/improve-dropdown/improve-dropdown.tsx +14 -17
  371. package/src/components/tiptap/ui/improve-dropdown/use-improve-dropdown.ts +2 -3
  372. package/src/components/tiptap/ui/indent-button/indent-button.tsx +0 -1
  373. package/src/components/tiptap/ui/indent-button/use-indent.ts +3 -4
  374. package/src/components/tiptap/ui/link-popover/link-popover.tsx +7 -12
  375. package/src/components/tiptap/ui/link-popover/use-link-popover.ts +2 -3
  376. package/src/components/tiptap/ui/list-button/list-button.tsx +0 -1
  377. package/src/components/tiptap/ui/list-button/use-list.ts +4 -5
  378. package/src/components/tiptap/ui/mark-button/mark-button.tsx +0 -1
  379. package/src/components/tiptap/ui/mark-button/use-mark.ts +8 -9
  380. package/src/components/tiptap/ui/mention-dropdown-menu/mention-dropdown-menu.tsx +0 -2
  381. package/src/components/tiptap/ui/mention-trigger-button/mention-trigger-button.tsx +0 -1
  382. package/src/components/tiptap/ui/mention-trigger-button/use-mention-trigger.ts +2 -3
  383. package/src/components/tiptap/ui/move-node-button/move-node-button.tsx +2 -6
  384. package/src/components/tiptap/ui/move-node-button/use-move-node.ts +2 -3
  385. package/src/components/tiptap/ui/reference-dropdown-menu/reference-dropdown-menu.tsx +6 -10
  386. package/src/components/tiptap/ui/reset-all-formatting-button/reset-all-formatting-button.tsx +2 -6
  387. package/src/components/tiptap/ui/reset-all-formatting-button/use-reset-all-formatting.ts +2 -3
  388. package/src/components/tiptap/ui/slash-command-trigger-button/slash-command-trigger-button.tsx +0 -1
  389. package/src/components/tiptap/ui/slash-command-trigger-button/use-slash-command-trigger.ts +2 -3
  390. package/src/components/tiptap/ui/slash-dropdown-menu/slash-dropdown-menu.tsx +2 -5
  391. package/src/components/tiptap/ui/slash-dropdown-menu/use-slash-dropdown-menu.ts +78 -79
  392. package/src/components/tiptap/ui/text-align-button/text-align-button.tsx +0 -1
  393. package/src/components/tiptap/ui/text-align-button/use-text-align.ts +5 -6
  394. package/src/components/tiptap/ui/text-button/text-button.tsx +2 -6
  395. package/src/components/tiptap/ui/text-button/use-text.ts +2 -3
  396. package/src/components/tiptap/ui/turn-into-dropdown/turn-into-dropdown.tsx +4 -7
  397. package/src/components/tiptap/ui/turn-into-dropdown/use-turn-into-dropdown.ts +11 -12
  398. package/src/components/tiptap/ui/undo-redo-button/undo-redo-button.tsx +0 -1
  399. package/src/components/tiptap/ui/undo-redo-button/use-undo-redo.ts +3 -4
  400. package/src/components/tiptap/ui-primitive/avatar/avatar.tsx +0 -1
  401. package/src/components/tiptap/ui-primitive/badge/badge.tsx +0 -1
  402. package/src/components/tiptap/ui-primitive/button/button.tsx +0 -1
  403. package/src/components/tiptap/ui-primitive/card/card.tsx +0 -1
  404. package/src/components/tiptap/ui-primitive/combobox/combobox.tsx +0 -1
  405. package/src/components/tiptap/ui-primitive/dropdown-menu/dropdown-menu.tsx +0 -1
  406. package/src/components/tiptap/ui-primitive/input/input.tsx +0 -1
  407. package/src/components/tiptap/ui-primitive/input-group/input-group.tsx +0 -1
  408. package/src/components/tiptap/ui-primitive/label/label.tsx +0 -1
  409. package/src/components/tiptap/ui-primitive/menu/menu-context.ts +0 -1
  410. package/src/components/tiptap/ui-primitive/menu/menu-hooks.ts +0 -1
  411. package/src/components/tiptap/ui-primitive/menu/menu-types.ts +0 -1
  412. package/src/components/tiptap/ui-primitive/menu/menu-utils.ts +0 -1
  413. package/src/components/tiptap/ui-primitive/menu/menu.tsx +0 -1
  414. package/src/components/tiptap/ui-primitive/popover/popover.tsx +0 -1
  415. package/src/components/tiptap/ui-primitive/separator/separator.tsx +0 -1
  416. package/src/components/tiptap/ui-primitive/sidebar/sidebar.tsx +0 -1
  417. package/src/components/tiptap/ui-primitive/spacer/spacer.tsx +0 -1
  418. package/src/components/tiptap/ui-primitive/textarea/textarea.tsx +0 -1
  419. package/src/components/tiptap/ui-primitive/textarea-autosize/textarea-autosize.tsx +0 -1
  420. package/src/components/tiptap/ui-primitive/toolbar/toolbar.tsx +0 -1
  421. package/src/components/tiptap/ui-primitive/tooltip/tooltip.tsx +0 -1
  422. package/src/components/tiptap/ui-utils/floating-element/floating-element.tsx +0 -1
  423. package/src/components/tiptap/ui-utils/suggestion-menu/suggestion-menu.tsx +0 -1
  424. package/src/components/ui/field.tsx +1 -1
  425. package/src/components/ui/radio-group.tsx +2 -3
  426. package/src/components/ui/spinner.tsx +2 -2
  427. package/src/components/workspace/create-workspace-dialog.tsx +12 -13
  428. package/src/components/workspace/delete-workspace-options.tsx +177 -0
  429. package/src/components/workspace/edit-workspace-dialog.tsx +153 -0
  430. package/src/components/workspace/schemas/create-workspace.ts +2 -2
  431. package/src/components/workspace/workspace-activity-card.tsx +60 -0
  432. package/src/components/workspace/workspace-contribution-card.tsx +37 -0
  433. package/src/components/workspace/workspace-header.tsx +100 -0
  434. package/src/components/workspace/workspace-kb-card.tsx +31 -0
  435. package/src/components/workspace/workspace-member-item.tsx +80 -0
  436. package/src/components/workspace/workspace-members-manager.tsx +291 -0
  437. package/src/components/workspace/workspace-project-list.tsx +129 -0
  438. package/src/config/sidebar-routes.tsx +25 -24
  439. package/src/config/sidebar-teams.ts +4 -4
  440. package/src/hooks/__tests__/use-commands.test.tsx +0 -10
  441. package/src/hooks/use-commands.ts +3 -7
  442. package/src/hooks/use-entity-subscription.ts +0 -1
  443. package/src/hooks/use-notifications.ts +5 -6
  444. package/src/hooks/useTranslator.ts +0 -1
  445. package/src/lib/__tests__/edition.test.ts +9 -0
  446. package/src/lib/analytics.ts +0 -1
  447. package/src/lib/anyhub/anyhub-message-bridge.ts +1 -1
  448. package/src/lib/auth/__tests__/anonymous-safe.test.ts +89 -0
  449. package/src/lib/auth/__tests__/page-gate.test.ts +29 -0
  450. package/src/lib/auth/anonymous-safe.ts +39 -0
  451. package/src/lib/auth/page-gate.ts +18 -0
  452. package/src/lib/changelog/sdk-versions.ts +19 -19
  453. package/src/lib/collections/knowledge/knowledge-bases-collection.ts +1 -1
  454. package/src/lib/collections/reference/bookmark-categories-collection.ts +1 -1
  455. package/src/lib/collections/reference/labels-collection.ts +1 -1
  456. package/src/lib/collections/reference/projects-collection.ts +1 -1
  457. package/src/lib/collections/reference/users-brief-collection.ts +1 -1
  458. package/src/lib/collections/reference/workspaces-collection.ts +3 -3
  459. package/src/lib/commands/__tests__/registry.test.ts +3 -3
  460. package/src/lib/commands/registry.ts +22 -21
  461. package/src/lib/commands/types.ts +1 -1
  462. package/src/lib/edition.ts +7 -0
  463. package/src/lib/router-context.ts +1 -2
  464. package/src/plugins/.gen-manifest.json +13 -0
  465. package/src/plugins/core/inspiration/pages/inspiration-page.tsx +2 -3
  466. package/src/plugins/core/inspiration/ui.tsx +2 -3
  467. package/src/plugins/core/prd/components/agent-input.tsx +7 -8
  468. package/src/plugins/core/prd/components/component-editor/content-section.tsx +3 -3
  469. package/src/plugins/core/prd/components/component-editor/position-section.tsx +3 -4
  470. package/src/plugins/core/prd/components/component-editor/style-fields.tsx +13 -16
  471. package/src/plugins/core/prd/components/dialog/create-prd-dialog.tsx +11 -12
  472. package/src/plugins/core/prd/components/dialog/prd-detail-client.tsx +7 -9
  473. package/src/plugins/core/prd/components/page-version-panel/components/create-version-dialog.tsx +7 -8
  474. package/src/plugins/core/prd/components/page-version-panel/components/delete-version-dialog.tsx +5 -6
  475. package/src/plugins/core/prd/components/page-version-panel/components/edit-version-dialog.tsx +7 -8
  476. package/src/plugins/core/prd/components/page-version-panel/constants.tsx +3 -2
  477. package/src/plugins/core/prd/components/page-version-panel.tsx +43 -45
  478. package/src/plugins/core/prd/components/page-version-tree.tsx +6 -8
  479. package/src/plugins/core/prd/components/prd-agent-panel.tsx +29 -23
  480. package/src/plugins/core/prd/components/prd-comment-review-panel.tsx +21 -23
  481. package/src/plugins/core/prd/components/prd-component-editor-content.tsx +6 -7
  482. package/src/plugins/core/prd/components/prd-dashboard.tsx +28 -23
  483. package/src/plugins/core/prd/components/prd-doc-panel.tsx +6 -9
  484. package/src/plugins/core/prd/components/prd-editor-layout.tsx +11 -13
  485. package/src/plugins/core/prd/components/prd-filter-bar.tsx +2 -3
  486. package/src/plugins/core/prd/components/prd-left-sidebar.tsx +19 -20
  487. package/src/plugins/core/prd/components/prd-navigation.tsx +12 -14
  488. package/src/plugins/core/prd/components/prd-outline-tab.tsx +3 -4
  489. package/src/plugins/core/prd/components/prd-prototype-panel.tsx +8 -10
  490. package/src/plugins/core/prd/components/prd-right-sidebar.tsx +10 -12
  491. package/src/plugins/core/prd/components/prd-share-panel/components/single-version-share-card.tsx +13 -14
  492. package/src/plugins/core/prd/components/prd-share-panel/constants.ts +5 -3
  493. package/src/plugins/core/prd/components/prd-share-panel.tsx +58 -60
  494. package/src/plugins/core/prd/components/prd-tree-page-tab.tsx +20 -22
  495. package/src/plugins/core/prd/components/prototype/PrototypeCanvas.tsx +2 -4
  496. package/src/plugins/core/prd/components/prototype/PrototypeElement.tsx +3 -5
  497. package/src/plugins/core/prd/components/prototype/ResizeHandles.tsx +0 -1
  498. package/src/plugins/core/prd/components/prototype/icon-components.ts +19 -21
  499. package/src/plugins/core/prd/components/prototype/index.ts +3 -0
  500. package/src/plugins/core/prd/components/restore-version-dialog.tsx +5 -7
  501. package/src/plugins/core/prd/components/share/prd-share-client.tsx +7 -9
  502. package/src/plugins/core/prd/components/share/share-annotation-overlay.tsx +0 -1
  503. package/src/plugins/core/prd/components/share/share-comment-panel.tsx +15 -16
  504. package/src/plugins/core/prd/components/share/share-comment-review-panel.tsx +7 -9
  505. package/src/plugins/core/prd/components/share/share-directory-tree.tsx +3 -5
  506. package/src/plugins/core/prd/components/share/share-doc-view.tsx +3 -5
  507. package/src/plugins/core/prd/components/share/share-layout.tsx +3 -5
  508. package/src/plugins/core/prd/components/share/share-nav-bar.tsx +3 -5
  509. package/src/plugins/core/prd/components/share/share-password-gate.tsx +8 -9
  510. package/src/plugins/core/prd/components/share/share-prototype-view.tsx +3 -5
  511. package/src/plugins/core/prd/components/share/share-review-panel.tsx +9 -11
  512. package/src/plugins/core/prd/components/share/share-sse-listener.tsx +0 -1
  513. package/src/plugins/core/prd/components/share/version-share-client.tsx +3 -5
  514. package/src/plugins/core/prd/pages/prd-detail-page.tsx +9 -21
  515. package/src/plugins/core/prd/pages/share-prd-page.tsx +6 -16
  516. package/src/plugins/core/prd/prd-nav.tsx +2 -3
  517. package/src/plugins/core/tags/nav-tag.tsx +14 -15
  518. package/src/plugins/core/tags/pages/tag-detail-page.tsx +3 -5
  519. package/src/plugins/core/tags/pages/tag-settings-page.tsx +3 -5
  520. package/src/plugins/core/tags/pages/tags-index-page.tsx +3 -5
  521. package/src/plugins/core/tags/tag-badge.tsx +2 -3
  522. package/src/plugins/core/tags/tag-color-picker.tsx +2 -4
  523. package/src/plugins/core/tags/tag-manager.tsx +23 -25
  524. package/src/plugins/core/tags/tag-selector.tsx +4 -5
  525. package/src/plugins/modules.gen.ts +21 -0
  526. package/src/plugins/plugins.gen.ts +20 -0
  527. package/src/plugins/ui.gen.ts +8 -0
  528. package/src/providers/index.tsx +3 -14
  529. package/src/routeTree.gen.ts +27 -0
  530. package/src/router.tsx +16 -6
  531. package/src/routes/__desktop/onboarding/route.lazy.tsx +22 -23
  532. package/src/routes/__root.tsx +13 -36
  533. package/src/routes/__tests__/-edition-routing.test.tsx +151 -0
  534. package/src/routes/_login/forgot-password/route.lazy.tsx +14 -15
  535. package/src/routes/_login/login/route.lazy.tsx +26 -25
  536. package/src/routes/_login/register/route.lazy.tsx +23 -24
  537. package/src/routes/_login/reset-password/route.lazy.tsx +16 -17
  538. package/src/routes/_login/schemas/-auth.ts +11 -13
  539. package/src/routes/_nav/acceptance-criteria/route.tsx +2 -3
  540. package/src/routes/_nav/apps/anyhub/$id/route.tsx +2 -3
  541. package/src/routes/_nav/chat/route.lazy.tsx +9 -10
  542. package/src/routes/_nav/dashboard/-components/activity-feed.tsx +3 -4
  543. package/src/routes/_nav/dashboard/-components/quick-actions.tsx +3 -4
  544. package/src/routes/_nav/dashboard/-components/stats-grid.tsx +5 -6
  545. package/src/routes/_nav/dashboard/route.lazy.tsx +7 -8
  546. package/src/routes/_nav/design/$projectId/$artboardId/route.lazy.tsx +7 -9
  547. package/src/routes/_nav/design/$projectId/route.lazy.tsx +3 -5
  548. package/src/routes/_nav/design/index.lazy.tsx +26 -27
  549. package/src/routes/_nav/inspiration/route.tsx +8 -0
  550. package/src/routes/_nav/knowledge/$kbId/doc/$docId/route.lazy.tsx +4 -5
  551. package/src/routes/_nav/knowledge/$kbId/route.lazy.tsx +3 -4
  552. package/src/routes/_nav/knowledge/bookmarks/$id.lazy.tsx +29 -30
  553. package/src/routes/_nav/knowledge/bookmarks/index.lazy.tsx +12 -13
  554. package/src/routes/_nav/knowledge/compliance/$id.lazy.tsx +22 -23
  555. package/src/routes/_nav/knowledge/compliance/index.lazy.tsx +18 -19
  556. package/src/routes/_nav/knowledge/dictionaries/$id.lazy.tsx +5 -6
  557. package/src/routes/_nav/knowledge/dictionaries/index.lazy.tsx +17 -18
  558. package/src/routes/_nav/knowledge/index.lazy.tsx +248 -40
  559. package/src/routes/_nav/knowledge/laws/$id.lazy.tsx +22 -23
  560. package/src/routes/_nav/knowledge/laws/index.lazy.tsx +14 -15
  561. package/src/routes/_nav/knowledge/summary/index.lazy.tsx +31 -32
  562. package/src/routes/_nav/notifications/route.lazy.tsx +3 -4
  563. package/src/routes/_nav/notifications/route.tsx +2 -0
  564. package/src/routes/_nav/notion-like/route.tsx +2 -3
  565. package/src/routes/_nav/prd/$id/route.tsx +9 -0
  566. package/src/routes/_nav/prd/index.tsx +9 -0
  567. package/src/routes/_nav/prd/route.tsx +8 -0
  568. package/src/routes/_nav/pricing-02/route.tsx +2 -3
  569. package/src/routes/_nav/projects/$projectId/$storyId/route.lazy.tsx +23 -24
  570. package/src/routes/_nav/projects/$projectId/index.lazy.tsx +54 -74
  571. package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy.tsx +27 -30
  572. package/src/routes/_nav/projects/$projectId/iterations/index.lazy.tsx +9 -10
  573. package/src/routes/_nav/projects/$projectId/route.tsx +4 -2
  574. package/src/routes/_nav/projects/$projectId/settings/route.lazy.tsx +40 -41
  575. package/src/routes/_nav/route.tsx +13 -16
  576. package/src/routes/_nav/settings/-settings-tabs.tsx +24 -51
  577. package/src/routes/_nav/settings/account/route.lazy.tsx +1 -9
  578. package/src/routes/_nav/settings/ai/index/route.lazy.tsx +5 -6
  579. package/src/routes/_nav/settings/billing/route.lazy.tsx +4 -5
  580. package/src/routes/_nav/settings/connection/route.lazy.tsx +14 -10
  581. package/src/routes/_nav/settings/design/route.lazy.tsx +21 -22
  582. package/src/routes/_nav/settings/general/route.lazy.tsx +10 -11
  583. package/src/routes/_nav/settings/notifications/route.lazy.tsx +3 -5
  584. package/src/routes/_nav/settings/privacy/route.lazy.tsx +15 -16
  585. package/src/routes/_nav/settings/route.lazy.tsx +2 -3
  586. package/src/routes/_nav/settings/route.tsx +10 -15
  587. package/src/routes/_nav/settings/team/route.lazy.tsx +1 -9
  588. package/src/routes/_nav/tags/$id/route.tsx +8 -0
  589. package/src/routes/_nav/tags/index.tsx +8 -0
  590. package/src/routes/_nav/tags/route.tsx +8 -0
  591. package/src/routes/_nav/tags/settings/route.tsx +9 -0
  592. package/src/routes/_nav/test-cases/route.tsx +2 -3
  593. package/src/routes/_nav/workspaces/$workspaceId/activities/route.lazy.tsx +69 -0
  594. package/src/routes/_nav/workspaces/$workspaceId/activities/route.tsx +28 -0
  595. package/src/routes/_nav/workspaces/$workspaceId/route.lazy.tsx +194 -99
  596. package/src/routes/_nav/workspaces/$workspaceId/route.tsx +12 -3
  597. package/src/routes/_nav/workspaces/$workspaceId/settings/route.lazy.tsx +75 -61
  598. package/src/routes/_nav/workspaces/index.lazy.tsx +196 -22
  599. package/src/routes/_nav/workspaces/route.tsx +2 -0
  600. package/src/routes/_public/index/route.tsx +5 -1
  601. package/src/routes/invite/$token/route.lazy.tsx +36 -37
  602. package/src/routes/share/$versionId/route.lazy.tsx +4 -11
  603. package/src/routes/share/compliance/$id/route.lazy.tsx +6 -8
  604. package/src/routes/share/law/$id/route.lazy.tsx +6 -8
  605. package/src/routes/share/prd/$prdId/route.tsx +10 -0
  606. package/src/server/__tests__/agent-client-graph.test.ts +4 -8
  607. package/src/server/ai-ports.ts +7 -6
  608. package/src/server/builtin-project.ts +43 -0
  609. package/src/server/design/sketch/file-storage.ts +1 -1
  610. package/src/server/pro-services.ts +1 -1
  611. package/src/server/serverFns/__tests__/workspace.test.ts +101 -0
  612. package/src/server/serverFns/activity.ts +15 -9
  613. package/src/server/serverFns/knowledge-public/bookmarks/list.ts +1 -1
  614. package/src/server/serverFns/knowledge-public/bookmarks/share.ts +3 -3
  615. package/src/server/serverFns/knowledge-public/compliance/share.ts +3 -3
  616. package/src/server/serverFns/knowledge-public/dictionary/share.ts +3 -3
  617. package/src/server/serverFns/knowledge-public/legal/share.ts +3 -3
  618. package/src/server/serverFns/knowledge.ts +27 -2
  619. package/src/server/serverFns/notifications.ts +3 -0
  620. package/src/server/serverFns/project.ts +48 -35
  621. package/src/server/serverFns/story/story-crud/bulk.ts +2 -2
  622. package/src/server/serverFns/story/story-crud.ts +9 -7
  623. package/src/server/serverFns/story/story-groups.ts +6 -6
  624. package/src/server/serverFns/workspace.ts +334 -13
  625. package/src/server-entry.ts +29 -0
  626. package/vite.shared.ts +4 -1
  627. package/src/components/layout/sidebar-03/logo.tsx +0 -41
  628. package/src/i18n/__tests__/detect.test.ts +0 -48
  629. package/src/i18n/__tests__/integration.test.tsx +0 -32
  630. package/src/i18n/__tests__/server.test.ts +0 -33
  631. package/src/i18n/client.ts +0 -32
  632. package/src/i18n/config.ts +0 -116
  633. package/src/i18n/detect.ts +0 -43
  634. package/src/i18n/locales/en/agents.json +0 -134
  635. package/src/i18n/locales/en/apps.json +0 -6
  636. package/src/i18n/locales/en/auth.json +0 -90
  637. package/src/i18n/locales/en/billing.json +0 -78
  638. package/src/i18n/locales/en/chat.json +0 -194
  639. package/src/i18n/locales/en/common.json +0 -242
  640. package/src/i18n/locales/en/dashboard.json +0 -38
  641. package/src/i18n/locales/en/design.json +0 -70
  642. package/src/i18n/locales/en/desktop.json +0 -35
  643. package/src/i18n/locales/en/display.json +0 -37
  644. package/src/i18n/locales/en/editor.json +0 -304
  645. package/src/i18n/locales/en/enterprise.json +0 -1
  646. package/src/i18n/locales/en/invite.json +0 -56
  647. package/src/i18n/locales/en/iterations.json +0 -92
  648. package/src/i18n/locales/en/knowledge.json +0 -462
  649. package/src/i18n/locales/en/mindmap.json +0 -28
  650. package/src/i18n/locales/en/notifications.json +0 -79
  651. package/src/i18n/locales/en/prd.json +0 -51
  652. package/src/i18n/locales/en/projects.json +0 -140
  653. package/src/i18n/locales/en/settings.json +0 -428
  654. package/src/i18n/locales/en/share.json +0 -20
  655. package/src/i18n/locales/en/story.json +0 -923
  656. package/src/i18n/locales/en/tags.json +0 -42
  657. package/src/i18n/locales/en/workspace.json +0 -90
  658. package/src/i18n/locales/zh/agents.json +0 -134
  659. package/src/i18n/locales/zh/apps.json +0 -6
  660. package/src/i18n/locales/zh/auth.json +0 -90
  661. package/src/i18n/locales/zh/billing.json +0 -78
  662. package/src/i18n/locales/zh/chat.json +0 -194
  663. package/src/i18n/locales/zh/common.json +0 -242
  664. package/src/i18n/locales/zh/dashboard.json +0 -38
  665. package/src/i18n/locales/zh/design.json +0 -70
  666. package/src/i18n/locales/zh/desktop.json +0 -35
  667. package/src/i18n/locales/zh/display.json +0 -37
  668. package/src/i18n/locales/zh/editor.json +0 -304
  669. package/src/i18n/locales/zh/enterprise.json +0 -1
  670. package/src/i18n/locales/zh/invite.json +0 -56
  671. package/src/i18n/locales/zh/iterations.json +0 -92
  672. package/src/i18n/locales/zh/knowledge.json +0 -462
  673. package/src/i18n/locales/zh/mindmap.json +0 -28
  674. package/src/i18n/locales/zh/notifications.json +0 -79
  675. package/src/i18n/locales/zh/prd.json +0 -51
  676. package/src/i18n/locales/zh/projects.json +0 -140
  677. package/src/i18n/locales/zh/settings.json +0 -428
  678. package/src/i18n/locales/zh/share.json +0 -20
  679. package/src/i18n/locales/zh/story.json +0 -923
  680. package/src/i18n/locales/zh/tags.json +0 -42
  681. package/src/i18n/locales/zh/workspace.json +0 -90
  682. package/src/i18n/server.ts +0 -18
  683. package/src/i18n/types.ts +0 -5
  684. package/src/server/serverFns/locale.ts +0 -20
@@ -28,7 +28,7 @@ import { listBookmarkCategoriesFn, createBookmarkCategoryFn } from '@/server/ser
28
28
  import { deleteBookmarkFn } from '@/server/serverFns/knowledge-public/bookmarks/delete'
29
29
  import { Trash2, Check, X } from 'lucide-react'
30
30
  import { toast } from '@/components/ui/sonner'
31
- import { useTranslation } from 'react-i18next'
31
+ import { m } from "@/paraglide/messages.js";
32
32
 
33
33
  export interface BookmarkEditTarget {
34
34
  id: string
@@ -49,7 +49,6 @@ export function BookmarkFormDialog({
49
49
  onSuccess?: () => void
50
50
  editItem?: BookmarkEditTarget | null
51
51
  }) {
52
- const { t } = useTranslation('knowledge')
53
52
  const isEdit = !!editItem
54
53
  const [title, setTitle] = useState('')
55
54
  const [url, setUrl] = useState('')
@@ -83,7 +82,7 @@ export function BookmarkFormDialog({
83
82
  setCreatingCat(false)
84
83
  refetchCats()
85
84
  } catch (e) {
86
- toast.error(e instanceof Error ? e.message : t('bookmarks.detail.createFailed'))
85
+ toast.error(e instanceof Error ? e.message : m.knowledge_bookmarks_detail_createFailed())
87
86
  }
88
87
  }
89
88
 
@@ -91,7 +90,7 @@ export function BookmarkFormDialog({
91
90
 
92
91
  const submit = async () => {
93
92
  if (!title.trim() || !url.trim()) {
94
- toast.error(t('bookmarks.detail.required'))
93
+ toast.error(m.knowledge_bookmarks_detail_required())
95
94
  return
96
95
  }
97
96
  setLoading(true)
@@ -106,8 +105,8 @@ export function BookmarkFormDialog({
106
105
  summary: summary.trim() || null,
107
106
  },
108
107
  })
109
- toast.success(t('bookmarks.detail.saved'))
110
- if (urlChanged) toast.info(t('bookmarks.detail.urlChanged'))
108
+ toast.success(m.knowledge_bookmarks_detail_saved())
109
+ if (urlChanged) toast.info(m.knowledge_bookmarks_detail_urlChanged())
111
110
  } else {
112
111
  await createBookmarkFn({
113
112
  data: {
@@ -117,12 +116,12 @@ export function BookmarkFormDialog({
117
116
  summary: summary.trim() || undefined,
118
117
  },
119
118
  })
120
- toast.success(t('bookmarks.detail.addedSync'))
119
+ toast.success(m.knowledge_bookmarks_detail_addedSync())
121
120
  }
122
121
  onOpenChange(false)
123
122
  onSuccess?.()
124
123
  } catch (e) {
125
- toast.error(e instanceof Error ? e.message : isEdit ? t('bookmarks.detail.saveFailed') : t('bookmarks.detail.addFailed'))
124
+ toast.error(e instanceof Error ? e.message : isEdit ? m.knowledge_bookmarks_detail_saveFailed() : m.knowledge_bookmarks_detail_addFailed())
126
125
  } finally {
127
126
  setLoading(false)
128
127
  }
@@ -133,12 +132,12 @@ export function BookmarkFormDialog({
133
132
  setLoading(true)
134
133
  try {
135
134
  await deleteBookmarkFn({ data: { id: editItem.id } })
136
- toast.success(t('bookmarks.detail.deleted'))
135
+ toast.success(m.knowledge_bookmarks_detail_deleted())
137
136
  setConfirming(false)
138
137
  onOpenChange(false)
139
138
  onSuccess?.()
140
139
  } catch (e) {
141
- toast.error(e instanceof Error ? e.message : t('bookmarks.detail.deleteFailed'))
140
+ toast.error(e instanceof Error ? e.message : m.knowledge_bookmarks_detail_deleteFailed())
142
141
  } finally {
143
142
  setLoading(false)
144
143
  }
@@ -148,29 +147,29 @@ export function BookmarkFormDialog({
148
147
  <Dialog open={open} onOpenChange={onOpenChange}>
149
148
  <DialogContent className="sm:max-w-110">
150
149
  <DialogHeader>
151
- <DialogTitle>{isEdit ? t('bookmarks.detail.editTitle') : t('bookmarks.detail.newTitle')}</DialogTitle>
150
+ <DialogTitle>{isEdit ? m.knowledge_bookmarks_detail_editTitle() : m.knowledge_bookmarks_detail_newTitle()}</DialogTitle>
152
151
  </DialogHeader>
153
152
  <div className="space-y-3">
154
153
  <div className="flex flex-col gap-1.5">
155
- <label className="text-sm font-medium">{t('bookmarks.detail.name')} *</label>
154
+ <label className="text-sm font-medium">{m.knowledge_bookmarks_detail_name()} *</label>
156
155
  <Input value={title} onChange={(e) => setTitle(e.target.value)} autoFocus />
157
156
  </div>
158
157
  <div className="flex flex-col gap-1.5">
159
- <label className="text-sm font-medium">{t('bookmarks.detail.url')} *</label>
158
+ <label className="text-sm font-medium">{m.knowledge_bookmarks_detail_url()} *</label>
160
159
  <Input value={url} onChange={(e) => setUrl(e.target.value)} placeholder="https://example.com" />
161
160
  {urlChanged && (
162
- <p className="text-xs text-amber-600 dark:text-amber-500">{t('bookmarks.detail.urlChangeHint')}</p>
161
+ <p className="text-xs text-amber-600 dark:text-amber-500">{m.knowledge_bookmarks_detail_urlChangeHint()}</p>
163
162
  )}
164
163
  </div>
165
164
  <div className="flex flex-col gap-1.5">
166
- <label className="text-sm font-medium">{t('bookmarks.detail.category')}</label>
165
+ <label className="text-sm font-medium">{m.knowledge_bookmarks_detail_category()}</label>
167
166
  {creatingCat ? (
168
167
  <div className="flex gap-2">
169
168
  <Input
170
169
  value={newCatName}
171
170
  autoFocus
172
171
  onChange={(e) => setNewCatName(e.target.value)}
173
- placeholder={t('bookmarks.detail.newCategoryName')}
172
+ placeholder={m.knowledge_bookmarks_detail_newCategoryName()}
174
173
  onKeyDown={(e) => {
175
174
  if (e.key === 'Enter') handleCreateCat()
176
175
  if (e.key === 'Escape') {
@@ -180,17 +179,17 @@ export function BookmarkFormDialog({
180
179
  }}
181
180
  />
182
181
  <Button type="button" variant="outline" size="sm" onClick={() => { setCreatingCat(false); setNewCatName('') }}>
183
- {t('bookmarks.detail.cancel')}
182
+ {m.knowledge_bookmarks_detail_cancel()}
184
183
  </Button>
185
184
  <Button type="button" size="sm" onClick={handleCreateCat}>
186
- {t('bookmarks.detail.create')}
185
+ {m.knowledge_bookmarks_detail_create()}
187
186
  </Button>
188
187
  </div>
189
188
  ) : (
190
189
  <div className="flex gap-2">
191
190
  <Select value={categoryId} onValueChange={setCategoryId}>
192
191
  <SelectTrigger className="flex-1">
193
- <SelectValue placeholder={t('bookmarks.detail.selectCategory')} />
192
+ <SelectValue placeholder={m.knowledge_bookmarks_detail_selectCategory()} />
194
193
  </SelectTrigger>
195
194
  <SelectContent>
196
195
  {(cats ?? []).map((c) => (
@@ -201,13 +200,13 @@ export function BookmarkFormDialog({
201
200
  </SelectContent>
202
201
  </Select>
203
202
  <Button type="button" variant="outline" size="sm" onClick={() => setCreatingCat(true)}>
204
- + {t('bookmarks.detail.addCategory')}
203
+ + {m.knowledge_bookmarks_detail_addCategory()}
205
204
  </Button>
206
205
  </div>
207
206
  )}
208
207
  </div>
209
208
  <div className="flex flex-col gap-1.5">
210
- <label className="text-sm font-medium">{t('bookmarks.detail.summary')}</label>
209
+ <label className="text-sm font-medium">{m.knowledge_bookmarks_detail_summary()}</label>
211
210
  <Textarea value={summary} onChange={(e) => setSummary(e.target.value)} rows={2} maxLength={500} />
212
211
  </div>
213
212
  </div>
@@ -222,13 +221,13 @@ export function BookmarkFormDialog({
222
221
  className="text-destructive hover:text-destructive hover:bg-destructive/10"
223
222
  >
224
223
  <Trash2 className="h-4 w-4" />
225
- {t('bookmarks.detail.delete')}
224
+ {m.knowledge_bookmarks_detail_delete()}
226
225
  </Button>
227
226
  {confirming && (
228
227
  <>
229
228
  <Button variant="destructive" size="sm" onClick={handleDelete} disabled={loading}>
230
229
  <Check className="h-4 w-4" />
231
- {t('bookmarks.detail.confirmDelete')}
230
+ {m.knowledge_bookmarks_detail_confirmDelete()}
232
231
  </Button>
233
232
  <Button
234
233
  variant="ghost"
@@ -236,7 +235,7 @@ export function BookmarkFormDialog({
236
235
  className="h-8 w-8"
237
236
  onClick={() => setConfirming(false)}
238
237
  disabled={loading}
239
- aria-label={t('bookmarks.detail.cancelDeleteAria')}
238
+ aria-label={m.knowledge_bookmarks_detail_cancelDeleteAria()}
240
239
  >
241
240
  <X className="h-4 w-4" />
242
241
  </Button>
@@ -246,10 +245,10 @@ export function BookmarkFormDialog({
246
245
  ) : null}
247
246
  <div className="ml-auto flex gap-2 ">
248
247
  <Button variant="outline" onClick={() => onOpenChange(false)}>
249
- {t('bookmarks.detail.cancel')}
248
+ {m.knowledge_bookmarks_detail_cancel()}
250
249
  </Button>
251
250
  <Button onClick={submit} disabled={loading}>
252
- {loading ? (isEdit ? t('bookmarks.detail.saving') : t('bookmarks.detail.adding')) : isEdit ? t('bookmarks.detail.save') : t('bookmarks.detail.add')}
251
+ {loading ? (isEdit ? m.knowledge_bookmarks_detail_saving() : m.knowledge_bookmarks_detail_adding()) : isEdit ? m.knowledge_bookmarks_detail_save() : m.knowledge_bookmarks_detail_add()}
253
252
  </Button>
254
253
  </div>
255
254
  </DialogFooter>
@@ -1,4 +1,5 @@
1
- import { useTranslation } from 'react-i18next'
1
+ import { m } from "@/paraglide/messages.js";
2
+
2
3
  // SPDX-License-Identifier: AGPL-3.0-or-later
3
4
  // AllBlue - 理想之海
4
5
  // Copyright (C) 2026 AllBlue Contributors
@@ -21,6 +22,5 @@ export function KnowledgeCardGrid({ children }: { children: React.ReactNode }) {
21
22
  }
22
23
 
23
24
  export function EmptyState({ text }: { text?: string }) {
24
- const { t } = useTranslation('knowledge')
25
- return <p className="py-12 text-center text-sm text-muted-foreground">{text ?? t('knowledgeGrid.empty')}</p>
25
+ return <p className="py-12 text-center text-sm text-muted-foreground">{text ?? m.knowledge_knowledgeGrid_empty()}</p>
26
26
  }
@@ -16,7 +16,7 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  import { chipClass } from './chip-utils'
19
- import { useTranslation } from 'react-i18next'
19
+ import { m } from "@/paraglide/messages.js";
20
20
 
21
21
  type Scope = 'all' | 'private' | 'share' | 'favorite'
22
22
 
@@ -33,23 +33,22 @@ interface Props {
33
33
  onScopeChange?: (s: Scope) => void
34
34
  }
35
35
 
36
- const SCOPE_OPTIONS: { value: Scope; label: string }[] = [
37
- { value: 'all', label: 'all' },
38
- { value: 'private', label: 'private' },
39
- { value: 'share', label: 'share' },
40
- { value: 'favorite', label: 'favorite' },
36
+ const SCOPE_OPTIONS: { value: Scope; label: () => string }[] = [
37
+ { value: 'all', label: m.knowledge_filters_all },
38
+ { value: 'private', label: m.knowledge_filters_private },
39
+ { value: 'share', label: m.knowledge_filters_share },
40
+ { value: 'favorite', label: m.knowledge_filters_favorite },
41
41
  ]
42
42
 
43
43
  export function KnowledgeFilters({ groups, active, onChange, scope, onScopeChange }: Props) {
44
- const { t } = useTranslation('knowledge')
45
44
  return (
46
45
  <div className="mx-auto flex w-full max-w-2xl flex-col items-start gap-3.5 mt-20">
47
46
  {scope !== undefined && onScopeChange && (
48
47
  <div className="flex flex-wrap items-center gap-2.5">
49
- <span className="text-sm font-medium text-muted-foreground mr-4">{t('filters.scope')}</span>
48
+ <span className="text-sm font-medium text-muted-foreground mr-4">{m.knowledge_filters_scope()}</span>
50
49
  {SCOPE_OPTIONS.map((o) => (
51
50
  <button key={o.value} type="button" onClick={() => onScopeChange(o.value)} className={chipClass(scope === o.value)}>
52
- {t('filters.' + o.value)}
51
+ {o.label()}
53
52
  </button>
54
53
  ))}
55
54
  </div>
@@ -58,7 +57,7 @@ export function KnowledgeFilters({ groups, active, onChange, scope, onScopeChang
58
57
  <div key={g.key} className="flex flex-wrap items-center gap-2.5">
59
58
  <span className="text-sm font-medium text-muted-foreground mr-4">{g.label}</span>
60
59
  <button type="button" onClick={() => onChange(g.key, undefined)} className={chipClass(!active[g.key])}>
61
- {t('filters.all')}
60
+ {m.knowledge_filters_all()}
62
61
  </button>
63
62
  {g.options.map((o) => (
64
63
  <button
@@ -36,27 +36,27 @@ import { getComplianceDetailFn } from '@/server/serverFns/knowledge-public/compl
36
36
  import { createDictionaryFn } from '@/server/serverFns/knowledge-public/dictionary/create'
37
37
  import { updateDictionaryFn } from '@/server/serverFns/knowledge-public/dictionary/update'
38
38
  import { getDictionaryDetailFn } from '@/server/serverFns/knowledge-public/dictionary/detail'
39
- import { useTranslation } from 'react-i18next'
39
+ import { m } from "@/paraglide/messages.js";
40
40
 
41
41
  type KnowledgeType = 'legal' | 'compliance' | 'dictionary'
42
42
 
43
43
  const JURISDICTION_OPTIONS = [
44
- { value: 'CN_NATIONAL', label: 'public.legal-form.jurisdiction-options.CN_NATIONAL' },
45
- { value: 'CN_LOCAL', label: 'public.legal-form.jurisdiction-options.CN_LOCAL' },
46
- { value: 'OVERSEAS', label: 'public.legal-form.jurisdiction-options.OVERSEAS' },
44
+ { value: 'CN_NATIONAL', label: m['knowledge_public_legal-form_jurisdiction-options_CN_NATIONAL'] },
45
+ { value: 'CN_LOCAL', label: m['knowledge_public_legal-form_jurisdiction-options_CN_LOCAL'] },
46
+ { value: 'OVERSEAS', label: m['knowledge_public_legal-form_jurisdiction-options_OVERSEAS'] },
47
47
  ]
48
48
 
49
49
  const INDUSTRY_OPTIONS = [
50
- { value: '通用', label: 'public.legal-form.industry.通用' },
51
- { value: '互联网', label: 'public.legal-form.industry.互联网' },
52
- { value: '金融', label: 'public.legal-form.industry.金融' },
53
- { value: '医疗', label: 'public.legal-form.industry.医疗' },
54
- { value: '教育', label: 'public.legal-form.industry.教育' },
55
- { value: '制造业', label: 'public.legal-form.industry.制造业' },
56
- { value: '能源', label: 'public.legal-form.industry.能源' },
57
- { value: '交通', label: 'public.legal-form.industry.交通' },
58
- { value: '电商', label: 'public.legal-form.industry.电商' },
59
- { value: '游戏', label: 'public.legal-form.industry.游戏' },
50
+ { value: '通用', label: m.knowledge_compliance_industries_general },
51
+ { value: '互联网', label: m.knowledge_compliance_industries_internet },
52
+ { value: '金融', label: m.knowledge_compliance_industries_finance },
53
+ { value: '医疗', label: m.knowledge_compliance_industries_medical },
54
+ { value: '教育', label: m.knowledge_compliance_industries_education },
55
+ { value: '制造业', label: m.knowledge_compliance_industries_manufacturing },
56
+ { value: '能源', label: m.knowledge_compliance_industries_energy },
57
+ { value: '交通', label: m.knowledge_compliance_industries_transportation },
58
+ { value: '电商', label: m.knowledge_compliance_industries_ecommerce },
59
+ { value: '游戏', label: m.knowledge_compliance_industries_gaming },
60
60
  ]
61
61
 
62
62
  interface Props {
@@ -68,7 +68,6 @@ interface Props {
68
68
  }
69
69
 
70
70
  export function KnowledgeFormDialog({ type, open, onOpenChange, editingId, onSuccess }: Props) {
71
- const { t } = useTranslation('knowledge')
72
71
  const isEdit = !!editingId
73
72
 
74
73
  const detailQuery = useQuery({
@@ -169,14 +168,14 @@ export function KnowledgeFormDialog({ type, open, onOpenChange, editingId, onSuc
169
168
  }, [isEdit, detailQuery.data, hydrated, type])
170
169
 
171
170
  const titleMap = {
172
- legal: { create: t('public.legal-form.title.create'), edit: t('public.legal-form.title.edit') },
173
- compliance: { create: t('public.compliance-form.title.create'), edit: t('public.compliance-form.title.edit') },
174
- dictionary: { create: t('public.dictionary-form.title.create'), edit: t('public.dictionary-form.title.edit') },
171
+ legal: { create: m['knowledge_public_legal-form_title_create'](), edit: m['knowledge_public_legal-form_title_edit']() },
172
+ compliance: { create: m['knowledge_public_compliance-form_title_create'](), edit: m['knowledge_public_compliance-form_title_edit']() },
173
+ dictionary: { create: m['knowledge_public_dictionary-form_title_create'](), edit: m['knowledge_public_dictionary-form_title_edit']() },
175
174
  } as const
176
175
 
177
176
  async function submit() {
178
177
  if (!title.trim()) {
179
- toast.error(t('public.knowledge-form.name-required'))
178
+ toast.error(m['knowledge_public_knowledge-form_name-required']())
180
179
  return
181
180
  }
182
181
  setLoading(true)
@@ -279,11 +278,11 @@ export function KnowledgeFormDialog({ type, open, onOpenChange, editingId, onSuc
279
278
  })
280
279
  }
281
280
  }
282
- toast.success(editingId ? t('public.knowledge-form.updated') : t('public.knowledge-form.created'))
281
+ toast.success(editingId ? m['knowledge_public_knowledge-form_updated']() : m['knowledge_public_knowledge-form_created']())
283
282
  onSuccess?.()
284
283
  onOpenChange(false)
285
284
  } catch (e) {
286
- toast.error(e instanceof Error ? e.message : t('public.knowledge-form.save-failed'))
285
+ toast.error(e instanceof Error ? e.message : m['knowledge_public_knowledge-form_save-failed']())
287
286
  } finally {
288
287
  setLoading(false)
289
288
  }
@@ -299,11 +298,11 @@ export function KnowledgeFormDialog({ type, open, onOpenChange, editingId, onSuc
299
298
  </DialogHeader>
300
299
 
301
300
  {isEdit && !hydrated ? (
302
- <p className="py-8 text-center text-sm text-muted-foreground">{t('public.legal-form.loading')}</p>
301
+ <p className="py-8 text-center text-sm text-muted-foreground">{m['knowledge_public_legal-form_loading']()}</p>
303
302
  ) : (
304
303
  <div className="space-y-3">
305
304
  <div className="flex flex-col gap-1.5">
306
- <label className="text-sm font-medium">{type === 'dictionary' ? t('public.dictionary-form.term-name') : t('public.knowledge-form.name')}</label>
305
+ <label className="text-sm font-medium">{type === 'dictionary' ? m['knowledge_public_dictionary-form_term-name']() : m['knowledge_public_knowledge-form_name']()}</label>
307
306
  <Input value={title} onChange={(e) => setTitle(e.target.value)} autoFocus />
308
307
  </div>
309
308
 
@@ -311,17 +310,17 @@ export function KnowledgeFormDialog({ type, open, onOpenChange, editingId, onSuc
311
310
  <>
312
311
  <div className="grid grid-cols-2 gap-3">
313
312
  <div className="flex flex-col gap-1.5">
314
- <label className="text-sm font-medium">{t('public.legal-form.code')}</label>
315
- <Input value={code} onChange={(e) => setCode(e.target.value)} placeholder={t('public.legal-form.optional')} />
313
+ <label className="text-sm font-medium">{m['knowledge_public_legal-form_code']()}</label>
314
+ <Input value={code} onChange={(e) => setCode(e.target.value)} placeholder={m['knowledge_public_legal-form_optional']()} />
316
315
  </div>
317
316
  <div className="flex flex-col gap-1.5">
318
- <label className="text-sm font-medium">{t('public.legal-form.category')}</label>
319
- <Input value={category} onChange={(e) => setCategory(e.target.value)} placeholder={t('public.legal-form.category-placeholder')} />
317
+ <label className="text-sm font-medium">{m['knowledge_public_legal-form_category']()}</label>
318
+ <Input value={category} onChange={(e) => setCategory(e.target.value)} placeholder={m['knowledge_public_legal-form_category-placeholder']()} />
320
319
  </div>
321
320
  </div>
322
321
  <div className="grid grid-cols-2 gap-3">
323
322
  <div className="flex flex-col gap-1.5">
324
- <label className="text-sm font-medium">{t('public.legal-form.jurisdiction')} *</label>
323
+ <label className="text-sm font-medium">{m['knowledge_public_legal-form_jurisdiction']()} *</label>
325
324
  <Select value={jurisdiction} onValueChange={(v) => setJurisdiction(v as typeof jurisdiction)}>
326
325
  <SelectTrigger>
327
326
  <SelectValue />
@@ -329,45 +328,45 @@ export function KnowledgeFormDialog({ type, open, onOpenChange, editingId, onSuc
329
328
  <SelectContent>
330
329
  {JURISDICTION_OPTIONS.map((o) => (
331
330
  <SelectItem key={o.value} value={o.value}>
332
- {t(o.label)}
331
+ {o.label()}
333
332
  </SelectItem>
334
333
  ))}
335
334
  </SelectContent>
336
335
  </Select>
337
336
  </div>
338
337
  <div className="flex flex-col gap-1.5">
339
- <label className="text-sm font-medium">{t('public.legal-form.effective-date')}</label>
338
+ <label className="text-sm font-medium">{m['knowledge_public_legal-form_effective-date']()}</label>
340
339
  <Input type="date" value={effectiveDate} onChange={(e) => setEffectiveDate(e.target.value)} />
341
340
  </div>
342
341
  </div>
343
342
  {jurisdiction === 'CN_LOCAL' && (
344
343
  <div className="flex flex-col gap-1.5">
345
- <label className="text-sm font-medium">{t('public.legal-form.region')}</label>
346
- <Input value={region} onChange={(e) => setRegion(e.target.value)} placeholder={t('public.legal-form.region-placeholder')} />
344
+ <label className="text-sm font-medium">{m['knowledge_public_legal-form_region']()}</label>
345
+ <Input value={region} onChange={(e) => setRegion(e.target.value)} placeholder={m['knowledge_public_legal-form_region-placeholder']()} />
347
346
  </div>
348
347
  )}
349
348
  {jurisdiction === 'OVERSEAS' && (
350
349
  <div className="flex flex-col gap-1.5">
351
- <label className="text-sm font-medium">{t('public.legal-form.country')}</label>
352
- <Input value={country} onChange={(e) => setCountry(e.target.value)} placeholder={t('public.legal-form.country-placeholder')} />
350
+ <label className="text-sm font-medium">{m['knowledge_public_legal-form_country']()}</label>
351
+ <Input value={country} onChange={(e) => setCountry(e.target.value)} placeholder={m['knowledge_public_legal-form_country-placeholder']()} />
353
352
  </div>
354
353
  )}
355
354
  <div className="flex flex-col gap-1.5">
356
- <label className="text-sm font-medium">{t('public.legal-form.issuing-authority')}</label>
357
- <Input value={issuingAuthority} onChange={(e) => setIssuingAuthority(e.target.value)} placeholder={t('public.legal-form.authority-placeholder')} />
355
+ <label className="text-sm font-medium">{m['knowledge_public_legal-form_issuing-authority']()}</label>
356
+ <Input value={issuingAuthority} onChange={(e) => setIssuingAuthority(e.target.value)} placeholder={m['knowledge_public_legal-form_authority-placeholder']()} />
358
357
  </div>
359
358
  <div className="flex flex-col gap-1.5">
360
- <label className="text-sm font-medium">{t('public.legal-form.summary')}</label>
359
+ <label className="text-sm font-medium">{m['knowledge_public_legal-form_summary']()}</label>
361
360
  <Textarea value={summary} onChange={(e) => setSummary(e.target.value)} rows={2} maxLength={1000} />
362
361
  </div>
363
362
  <div className="flex flex-col gap-1.5">
364
- <label className="text-sm font-medium">{t('public.legal-form.content')}</label>
363
+ <label className="text-sm font-medium">{m['knowledge_public_legal-form_content']()}</label>
365
364
  <div className="min-h-60 overflow-hidden rounded-md border">
366
- <NotionDocEditor content={content} onChange={(c) => setContent(c.html)} placeholder={t('public.legal-form.content-placeholder')} />
365
+ <NotionDocEditor content={content} onChange={(c) => setContent(c.html)} placeholder={m['knowledge_public_legal-form_content-placeholder']()} />
367
366
  </div>
368
367
  </div>
369
368
  <div className="flex flex-col gap-1.5">
370
- <label className="text-sm font-medium">{t('public.legal-form.source-url')}</label>
369
+ <label className="text-sm font-medium">{m['knowledge_public_legal-form_source-url']()}</label>
371
370
  <Input value={sourceUrl} onChange={(e) => setSourceUrl(e.target.value)} placeholder="https://..." />
372
371
  </div>
373
372
  </>
@@ -377,11 +376,11 @@ export function KnowledgeFormDialog({ type, open, onOpenChange, editingId, onSuc
377
376
  <>
378
377
  <div className="grid grid-cols-2 gap-3">
379
378
  <div className="flex flex-col gap-1.5">
380
- <label className="text-sm font-medium">{t('public.compliance-form.clause-number')}</label>
381
- <Input value={code} onChange={(e) => setCode(e.target.value)} placeholder={t('public.legal-form.optional')} />
379
+ <label className="text-sm font-medium">{m['knowledge_public_compliance-form_clause-number']()}</label>
380
+ <Input value={code} onChange={(e) => setCode(e.target.value)} placeholder={m['knowledge_public_legal-form_optional']()} />
382
381
  </div>
383
382
  <div className="flex flex-col gap-1.5">
384
- <label className="text-sm font-medium">{t('public.compliance-form.industry')} *</label>
383
+ <label className="text-sm font-medium">{m['knowledge_public_compliance-form_industry']()} *</label>
385
384
  <Select value={industry} onValueChange={setIndustry}>
386
385
  <SelectTrigger>
387
386
  <SelectValue />
@@ -389,7 +388,7 @@ export function KnowledgeFormDialog({ type, open, onOpenChange, editingId, onSuc
389
388
  <SelectContent>
390
389
  {INDUSTRY_OPTIONS.map((o) => (
391
390
  <SelectItem key={o.value} value={o.value}>
392
- {t(o.label)}
391
+ {o.label()}
393
392
  </SelectItem>
394
393
  ))}
395
394
  </SelectContent>
@@ -398,17 +397,17 @@ export function KnowledgeFormDialog({ type, open, onOpenChange, editingId, onSuc
398
397
  </div>
399
398
  <div className="grid grid-cols-2 gap-3">
400
399
  <div className="flex flex-col gap-1.5">
401
- <label className="text-sm font-medium">{t('public.compliance-form.regulatory-body')}</label>
400
+ <label className="text-sm font-medium">{m['knowledge_public_compliance-form_regulatory-body']()}</label>
402
401
  <Input value={regulatoryBody} onChange={(e) => setRegulatoryBody(e.target.value)} />
403
402
  </div>
404
403
  <div className="flex flex-col gap-1.5">
405
- <label className="text-sm font-medium">{t('public.compliance-form.region')}</label>
404
+ <label className="text-sm font-medium">{m['knowledge_public_compliance-form_region']()}</label>
406
405
  <Input value={region} onChange={(e) => setRegion(e.target.value)} />
407
406
  </div>
408
407
  </div>
409
408
  <div className="flex flex-col gap-1.5">
410
409
  <div className="flex items-center justify-between">
411
- <label className="text-sm font-medium">{t('public.compliance-form.requirements')}</label>
410
+ <label className="text-sm font-medium">{m['knowledge_public_compliance-form_requirements']()}</label>
412
411
  <Button
413
412
  type="button"
414
413
  variant="outline"
@@ -416,7 +415,7 @@ export function KnowledgeFormDialog({ type, open, onOpenChange, editingId, onSuc
416
415
  onClick={() => setRequirements([...requirements, { title: '', detail: '' }])}
417
416
  >
418
417
  <Plus className="h-3.5 w-3.5" />
419
- {t('public.compliance-form.add-one')}
418
+ {m['knowledge_public_compliance-form_add-one']()}
420
419
  </Button>
421
420
  </div>
422
421
  <div className="space-y-2">
@@ -428,14 +427,14 @@ export function KnowledgeFormDialog({ type, open, onOpenChange, editingId, onSuc
428
427
  onChange={(e) =>
429
428
  setRequirements(requirements.map((x, j) => (j === i ? { ...x, title: e.target.value } : x)))
430
429
  }
431
- placeholder={t('public.compliance-form.req-title')}
430
+ placeholder={m['knowledge_public_compliance-form_req-title']()}
432
431
  />
433
432
  <Input
434
433
  value={r.detail}
435
434
  onChange={(e) =>
436
435
  setRequirements(requirements.map((x, j) => (j === i ? { ...x, detail: e.target.value } : x)))
437
436
  }
438
- placeholder={t('public.compliance-form.req-detail')}
437
+ placeholder={m['knowledge_public_compliance-form_req-detail']()}
439
438
  />
440
439
  </div>
441
440
  <Button
@@ -451,17 +450,17 @@ export function KnowledgeFormDialog({ type, open, onOpenChange, editingId, onSuc
451
450
  </div>
452
451
  </div>
453
452
  <div className="flex flex-col gap-1.5">
454
- <label className="text-sm font-medium">{t('public.legal-form.summary')}</label>
453
+ <label className="text-sm font-medium">{m['knowledge_public_legal-form_summary']()}</label>
455
454
  <Textarea value={summary} onChange={(e) => setSummary(e.target.value)} rows={2} maxLength={1000} />
456
455
  </div>
457
456
  <div className="flex flex-col gap-1.5">
458
- <label className="text-sm font-medium">{t('public.legal-form.content')}</label>
457
+ <label className="text-sm font-medium">{m['knowledge_public_legal-form_content']()}</label>
459
458
  <div className="min-h-60 overflow-hidden rounded-md border">
460
- <NotionDocEditor content={content} onChange={(c) => setContent(c.html)} placeholder={t('public.legal-form.content-placeholder')} />
459
+ <NotionDocEditor content={content} onChange={(c) => setContent(c.html)} placeholder={m['knowledge_public_legal-form_content-placeholder']()} />
461
460
  </div>
462
461
  </div>
463
462
  <div className="flex flex-col gap-1.5">
464
- <label className="text-sm font-medium">{t('public.legal-form.source-url')}</label>
463
+ <label className="text-sm font-medium">{m['knowledge_public_legal-form_source-url']()}</label>
465
464
  <Input value={sourceUrl} onChange={(e) => setSourceUrl(e.target.value)} placeholder="https://..." />
466
465
  </div>
467
466
  </>
@@ -470,7 +469,7 @@ export function KnowledgeFormDialog({ type, open, onOpenChange, editingId, onSuc
470
469
  {type === 'dictionary' && (
471
470
  <>
472
471
  <div className="flex flex-col gap-1.5">
473
- <label className="text-sm font-medium">{t('public.compliance-form.industry')} *</label>
472
+ <label className="text-sm font-medium">{m['knowledge_public_compliance-form_industry']()} *</label>
474
473
  <Select value={industry} onValueChange={setIndustry}>
475
474
  <SelectTrigger>
476
475
  <SelectValue />
@@ -478,33 +477,33 @@ export function KnowledgeFormDialog({ type, open, onOpenChange, editingId, onSuc
478
477
  <SelectContent>
479
478
  {INDUSTRY_OPTIONS.map((o) => (
480
479
  <SelectItem key={o.value} value={o.value}>
481
- {t(o.label)}
480
+ {o.label()}
482
481
  </SelectItem>
483
482
  ))}
484
483
  </SelectContent>
485
484
  </Select>
486
485
  </div>
487
486
  <div className="flex flex-col gap-1.5">
488
- <label className="text-sm font-medium">{t('public.dictionary-form.definition')}</label>
487
+ <label className="text-sm font-medium">{m['knowledge_public_dictionary-form_definition']()}</label>
489
488
  <MarkdownEditor value={definition} onChange={setDefinition} />
490
489
  </div>
491
490
  <div className="flex flex-col gap-1.5">
492
- <label className="text-sm font-medium">{t('public.dictionary-form.aliases')}</label>
491
+ <label className="text-sm font-medium">{m['knowledge_public_dictionary-form_aliases']()}</label>
493
492
  <KnowledgeTagInput tags={aliases} onChange={setAliases} />
494
493
  </div>
495
494
  <div className="flex flex-col gap-1.5">
496
- <label className="text-sm font-medium">{t('public.dictionary-form.examples')}</label>
495
+ <label className="text-sm font-medium">{m['knowledge_public_dictionary-form_examples']()}</label>
497
496
  <KnowledgeTagInput tags={examples} onChange={setExamples} />
498
497
  </div>
499
498
  <div className="flex flex-col gap-1.5">
500
- <label className="text-sm font-medium">{t('public.dictionary-form.reference-url')}</label>
499
+ <label className="text-sm font-medium">{m['knowledge_public_dictionary-form_reference-url']()}</label>
501
500
  <Input value={referenceUrl} onChange={(e) => setReferenceUrl(e.target.value)} placeholder="https://..." />
502
501
  </div>
503
502
  </>
504
503
  )}
505
504
 
506
505
  <div className="flex flex-col gap-1.5">
507
- <label className="text-sm font-medium">{t('public.legal-form.tags')}</label>
506
+ <label className="text-sm font-medium">{m['knowledge_public_legal-form_tags']()}</label>
508
507
  <KnowledgeTagInput tags={tags} onChange={setTags} />
509
508
  </div>
510
509
  </div>
@@ -512,10 +511,10 @@ export function KnowledgeFormDialog({ type, open, onOpenChange, editingId, onSuc
512
511
 
513
512
  <DialogFooter>
514
513
  <Button variant="outline" onClick={() => onOpenChange(false)}>
515
- {t('public.legal-form.cancel')}
514
+ {m['knowledge_public_legal-form_cancel']()}
516
515
  </Button>
517
516
  <Button onClick={submit} disabled={loading}>
518
- {loading ? t('public.legal-form.saving') : t('public.legal-form.save')}
517
+ {loading ? m['knowledge_public_legal-form_saving']() : m['knowledge_public_legal-form_save']()}
519
518
  </Button>
520
519
  </DialogFooter>
521
520
  </DialogContent>
@@ -18,7 +18,7 @@
18
18
  import { Input } from '@/components/ui/input'
19
19
  import { Button } from '@/components/ui/button'
20
20
  import { Plus, Search } from 'lucide-react'
21
- import { useTranslation } from 'react-i18next'
21
+ import { m } from "@/paraglide/messages.js";
22
22
 
23
23
  interface Props {
24
24
  search: string
@@ -28,17 +28,16 @@ interface Props {
28
28
  }
29
29
 
30
30
  export function KnowledgeSearchBar({ search, onSearchChange, onCreate, createLabel }: Props) {
31
- const { t } = useTranslation('knowledge')
32
31
  return (
33
32
  <div className="mx-auto flex w-full max-w-2xl flex-col items-center gap-3">
34
33
  <div className="relative w-full max-w-2xl mt-12">
35
34
  <Search className="absolute left-6 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
36
- <Input value={search} onChange={(e) => onSearchChange(e.target.value)} placeholder={t('knowledgeSearch.placeholder')} className="pl-12 h-14 rounded-3xl bg-background/60 dark:border-primary/40" />
35
+ <Input value={search} onChange={(e) => onSearchChange(e.target.value)} placeholder={m.knowledge_knowledgeSearch_placeholder()} className="pl-12 h-14 rounded-3xl bg-background/60 dark:border-primary/40" />
37
36
  </div>
38
37
  {onCreate && (
39
38
  <Button onClick={onCreate} className="mt-4">
40
39
  <Plus className="h-4 w-4" />
41
- {createLabel ?? t('knowledgeSearch.new')}
40
+ {createLabel ?? m.knowledge_knowledgeSearch_new()}
42
41
  </Button>
43
42
  )}
44
43
  </div>