@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,12 +15,11 @@
15
15
  // You should have received a copy of the GNU Affero General Public License
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
-
19
18
  import React, { useState, useRef, useCallback, useEffect, useMemo } from "react";
20
- import { useTranslation } from "react-i18next";
19
+ import { m } from '@/paraglide/messages.js'
21
20
  import { useStore } from "@tanstack/react-store"
22
21
  import { cn } from "@/lib/utils";
23
- import { prdCanvasStore, setCanvasElements, setCanvasSelectedElementId, updateCanvasElement, deleteCanvasElement } from "@/lib/stores/prd-canvas-store"
22
+ import { prdCanvasStore, setCanvasElements, setCanvasSelectedElementId, updateCanvasElement, deleteCanvasElement, type PrdCanvasState } from "@/lib/stores/prd-canvas-store"
24
23
  import { NavFloatButton } from "@/components/shared-kit/navigation/nav-float-button";
25
24
  import { PRDLeftSidebar } from "./prd-left-sidebar";
26
25
  import { PRDPrototypePanel } from "./prd-prototype-panel";
@@ -46,7 +45,6 @@ interface PRDEditorLayoutProps {
46
45
  }
47
46
 
48
47
  export function PRDEditorLayout({ prd: initialPrd }: PRDEditorLayoutProps) {
49
- const { t } = useTranslation("prd");
50
48
  const containerRef = useRef<HTMLDivElement>(null);
51
49
  const contentAreaRef = useRef<HTMLDivElement>(null);
52
50
  const editorRef = useRef<Editor | null>(null);
@@ -54,8 +52,8 @@ export function PRDEditorLayout({ prd: initialPrd }: PRDEditorLayoutProps) {
54
52
  const [leftPanelOpen, setLeftPanelOpen] = useState(true);
55
53
  const [activePageId, setActivePageId] = useState<string | null>(null);
56
54
 
57
- const elements = useStore(prdCanvasStore, (s) => s.elements)
58
- const selectedComponentId = useStore(prdCanvasStore, (s) => s.selectedElementId)
55
+ const elements = useStore(prdCanvasStore, (s: PrdCanvasState) => s.elements)
56
+ const selectedComponentId = useStore(prdCanvasStore, (s: PrdCanvasState) => s.selectedElementId)
59
57
 
60
58
  const setElements = useCallback((value: React.SetStateAction<CanvasElement[]>) => {
61
59
  setCanvasElements(value)
@@ -283,7 +281,7 @@ export function PRDEditorLayout({ prd: initialPrd }: PRDEditorLayoutProps) {
283
281
  }).run();
284
282
  }, []);
285
283
 
286
- const selectedElement = elements.find((e) => e.id === selectedComponentId) ?? null;
284
+ const selectedElement = elements.find((e: CanvasElement) => e.id === selectedComponentId) ?? null;
287
285
 
288
286
  const updateElement = useCallback((id: string, patch: Partial<CanvasElement>) => {
289
287
  if (isPreviewing) return;
@@ -313,12 +311,12 @@ export function PRDEditorLayout({ prd: initialPrd }: PRDEditorLayoutProps) {
313
311
  await updatePrdFn({ data: { id: prd.id, name } });
314
312
  setPrd((prev) => ({ ...prev, name }));
315
313
  window.dispatchEvent(new CustomEvent("prd-updated"));
316
- toast.success(t("editor.nameUpdated"));
314
+ toast.success(m.editor_nameUpdated());
317
315
  } catch (err) {
318
316
  console.error("Update PRD name failed:", err);
319
- toast.error(t("editor.nameUpdateFailed"));
317
+ toast.error(m.editor_nameUpdateFailed());
320
318
  }
321
- }, [prd.id, t]);
319
+ }, [prd.id, ]);
322
320
 
323
321
  useHotkey("Mod+S", saveAll, {
324
322
  enabled: !pageFullscreen && !windowFullscreen,
@@ -393,12 +391,12 @@ export function PRDEditorLayout({ prd: initialPrd }: PRDEditorLayoutProps) {
393
391
  <div className="flex-1 min-w-0 relative">
394
392
  {isPreviewing && elements.length === 0 && (
395
393
  <div className="absolute inset-0 z-10 flex items-center justify-center bg-background/80">
396
- <p className="text-sm text-muted-foreground">{t("editor.noCanvasInVersion")}</p>
394
+ <p className="text-sm text-muted-foreground">{m.editor_noCanvasInVersion()}</p>
397
395
  </div>
398
396
  )}
399
397
  {isPreviewing && (
400
398
  <div className="absolute top-14 right-4 z-20 text-[10px] text-muted-foreground bg-muted/80 px-1.5 py-0.5 rounded pointer-events-none">
401
- {t("editor.versionPreview")}
399
+ {m.editor_versionPreview()}
402
400
  </div>
403
401
  )}
404
402
  <PRDPrototypePanel
@@ -415,7 +413,7 @@ export function PRDEditorLayout({ prd: initialPrd }: PRDEditorLayoutProps) {
415
413
  <div className="relative shrink-0">
416
414
  {isPreviewing && !docContent.html && !docContent.markdown && (
417
415
  <div className="absolute inset-0 z-10 flex items-center justify-center bg-background/80">
418
- <p className="text-sm text-muted-foreground">{t("editor.noDocInVersion")}</p>
416
+ <p className="text-sm text-muted-foreground">{m.editor_noDocInVersion()}</p>
419
417
  </div>
420
418
  )}
421
419
  <PRDDocPanel
@@ -16,7 +16,7 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  import React, { useState, useEffect, useRef } from "react";
19
- import { useTranslation } from "react-i18next";
19
+ import { m } from '@/paraglide/messages.js'
20
20
  import { cn } from "@/lib/utils";
21
21
  import { ChevronLeft, ChevronRight } from "lucide-react";
22
22
 
@@ -29,7 +29,6 @@ export function FilterBar({
29
29
  tagFilter: string;
30
30
  onTagFilterChange: (tag: string) => void;
31
31
  }) {
32
- const { t } = useTranslation("prd");
33
32
  const [page, setPage] = useState(0);
34
33
  const containerRef = useRef<HTMLDivElement>(null);
35
34
  const [visibleCount, setVisibleCount] = useState(5);
@@ -64,7 +63,7 @@ export function FilterBar({
64
63
  tagFilter === "all" ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted"
65
64
  )}
66
65
  >
67
- {t("filterBar.all")}
66
+ {m.filterBar_all()}
68
67
  </button>
69
68
  <div ref={containerRef} className="flex-1 flex items-center gap-1 overflow-hidden">
70
69
  {visibleTags.map((tag) => (
@@ -16,7 +16,7 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  import React, { useState, useEffect, useMemo } from "react";
19
- import { useTranslation } from "react-i18next";
19
+ import { m } from '@/paraglide/messages.js'
20
20
  import { cn } from "@/lib/utils";
21
21
  import { Input } from "@/components/ui/input";
22
22
  import {
@@ -58,7 +58,7 @@ import { FilterBar } from "./prd-filter-bar";
58
58
  import { PRDAgentPanel } from "./prd-agent-panel";
59
59
  import { CanvasElement } from "@allbluecn/kernel";
60
60
  import { listComponentsFn } from "@/plugins/core/prd/serverFns/components";
61
- import { BUILTIN_COMPONENTS, ICON_COMPONENTS, ICON_LUCIDE_MAP } from "./prototype";
61
+ import { BUILTIN_COMPONENTS, ICON_COMPONENTS, ICON_LUCIDE_MAP, type PrototypeComponentConfig } from "./prototype";
62
62
 
63
63
  interface PRDLeftSidebarProps {
64
64
  prdId: string;
@@ -95,7 +95,7 @@ interface ComponentItem {
95
95
  defaultHeight?: number;
96
96
  }
97
97
 
98
- const BUILTIN_ITEMS: ComponentItem[] = BUILTIN_COMPONENTS.map((c) => ({
98
+ const BUILTIN_ITEMS: ComponentItem[] = BUILTIN_COMPONENTS.map((c: PrototypeComponentConfig) => ({
99
99
  id: `builtin_${c.type}`,
100
100
  name: c.name,
101
101
  description: null,
@@ -142,10 +142,10 @@ const ICON_ITEMS: ComponentItem[] = ICON_COMPONENTS.map((c) => ({
142
142
  const ALL_BUILTIN_ITEMS: ComponentItem[] = [...ICON_ITEMS, ...BUILTIN_ITEMS];
143
143
 
144
144
  const CATEGORIES = [
145
- { key: "icons", labelKey: "prototype.categoryIcon", icon: <Smile className="size-3.5" /> },
146
- { key: "basic", labelKey: "prototype.categoryBasic", icon: <Box className="size-3.5" /> },
147
- { key: "content", labelKey: "prototype.categoryContent", icon: <LayoutTemplate className="size-3.5" /> },
148
- { key: "template", labelKey: "prototype.categoryTemplate", icon: <FileCode className="size-3.5" /> },
145
+ { key: "icons", label: m.prd_prototype_categoryIcon, icon: <Smile className="size-3.5" /> },
146
+ { key: "basic", label: m.prd_prototype_categoryBasic, icon: <Box className="size-3.5" /> },
147
+ { key: "content", label: m.prd_prototype_categoryContent, icon: <LayoutTemplate className="size-3.5" /> },
148
+ { key: "template", label: m.prd_prototype_categoryTemplate, icon: <FileCode className="size-3.5" /> },
149
149
  ];
150
150
 
151
151
  // 图标组件的 lucide 组件映射(icon-smile → Smile 等),供列表视图图标缩略图使用
@@ -164,7 +164,6 @@ const COMPONENT_ICONS: Record<string, React.ComponentType<{ className?: string }
164
164
  };
165
165
 
166
166
  export function PRDLeftSidebar({ prdId, open, onToggle, activePageId, onPageSelect, canvasElements = [], onOutlineSelect, onElementsChange, aiModel, onAiModelChange }: PRDLeftSidebarProps) {
167
- const { t } = useTranslation("prd");
168
167
  const [activeTab, setActiveTab] = useState<"page" | "outline">("page");
169
168
  const [componentTab, setComponentTab] = useState<"library" | "agent">("library");
170
169
 
@@ -184,7 +183,7 @@ export function PRDLeftSidebar({ prdId, open, onToggle, activePageId, onPageSele
184
183
  useEffect(() => {
185
184
  let cancelled = false;
186
185
  listComponentsFn({ data: {} })
187
- .then((comps) => {
186
+ .then((comps: Awaited<ReturnType<typeof listComponentsFn>>) => {
188
187
  if (!cancelled) {
189
188
  // 按 prototypeKey 去重:内置(图标+基础)优先,DB 组件排除与内置同 key 的;
190
189
  // DB 组件自身也按 prototypeKey 去重(防 admin 重复添加)
@@ -192,7 +191,7 @@ export function PRDLeftSidebar({ prdId, open, onToggle, activePageId, onPageSele
192
191
  ALL_BUILTIN_ITEMS.map((c) => c.prototypeKey).filter(Boolean),
193
192
  );
194
193
  // Prisma Component.createdAt 是 Date,本地 ComponentItem.createdAt 是 string,统一转换
195
- const mappedComps: ComponentItem[] = comps.map((c) => ({
194
+ const mappedComps: ComponentItem[] = comps.map((c: Awaited<ReturnType<typeof listComponentsFn>>[number]) => ({
196
195
  id: c.id,
197
196
  name: c.name,
198
197
  description: c.description,
@@ -260,7 +259,7 @@ export function PRDLeftSidebar({ prdId, open, onToggle, activePageId, onPageSele
260
259
 
261
260
  const groups = useMemo(
262
261
  () =>
263
- CATEGORIES.map((cat) => [cat.key, cat.labelKey, grouped[cat.key] || []] as [string, string, ComponentItem[]]).filter(
262
+ CATEGORIES.map((cat) => [cat.key, cat.label(), grouped[cat.key] || []] as [string, string, ComponentItem[]]).filter(
264
263
  ([, , items]) => !search || items.length > 0
265
264
  ),
266
265
  [grouped, search]
@@ -279,7 +278,7 @@ export function PRDLeftSidebar({ prdId, open, onToggle, activePageId, onPageSele
279
278
  activeTab === "page" ? "text-foreground border-b-2 border-primary" : "text-muted-foreground hover:text-foreground"
280
279
  )}
281
280
  >
282
- <FileText className="size-3.5" /> {t("sidebar.tabPage")}
281
+ <FileText className="size-3.5" /> {m.sidebar_tabPage()}
283
282
  </button>
284
283
  <button
285
284
  onClick={() => setActiveTab("outline")}
@@ -288,7 +287,7 @@ export function PRDLeftSidebar({ prdId, open, onToggle, activePageId, onPageSele
288
287
  activeTab === "outline" ? "text-foreground border-b-2 border-primary" : "text-muted-foreground hover:text-foreground"
289
288
  )}
290
289
  >
291
- <Layers className="size-3.5" /> {t("sidebar.tabOutline")}
290
+ <Layers className="size-3.5" /> {m.sidebar_tabOutline()}
292
291
  </button>
293
292
 
294
293
  </div>
@@ -316,7 +315,7 @@ export function PRDLeftSidebar({ prdId, open, onToggle, activePageId, onPageSele
316
315
  componentTab === "library" ? "text-foreground border-b-2 border-primary" : "text-muted-foreground hover:text-foreground",
317
316
  )}
318
317
  >
319
- <Package className="size-3.5" /> {t("sidebar.tabLibrary")}
318
+ <Package className="size-3.5" /> {m.sidebar_tabLibrary()}
320
319
  </button>
321
320
  <button
322
321
  onClick={() => setComponentTab("agent")}
@@ -325,7 +324,7 @@ export function PRDLeftSidebar({ prdId, open, onToggle, activePageId, onPageSele
325
324
  componentTab === "agent" ? "text-foreground border-b-2 border-primary" : "text-muted-foreground hover:text-foreground",
326
325
  )}
327
326
  >
328
- <Sparkles className="size-3.5" /> {t("sidebar.tabAgent")}
327
+ <Sparkles className="size-3.5" /> {m.sidebar_tabAgent()}
329
328
  </button>
330
329
  </div>
331
330
 
@@ -343,7 +342,7 @@ export function PRDLeftSidebar({ prdId, open, onToggle, activePageId, onPageSele
343
342
  <div className="flex items-center gap-1 mt-2">
344
343
  <div className="relative flex-1">
345
344
  <Search className="absolute left-2 top-1/2 -translate-y-1/2 size-3 text-muted-foreground/40" />
346
- <Input placeholder={t("sidebar.searchComponents")} className="h-6 pl-6 pr-2 text-xs md:text-xs placeholder:text-xs placeholder:text-muted-foreground/30" value={search} onChange={(e) => setSearch(e.target.value)} />
345
+ <Input placeholder={m.sidebar_searchComponents()} className="h-6 pl-6 pr-2 text-xs md:text-xs placeholder:text-xs placeholder:text-muted-foreground/30" value={search} onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearch(e.target.value)} />
347
346
  </div>
348
347
  <Tooltip>
349
348
  <TooltipTrigger asChild>
@@ -355,7 +354,7 @@ export function PRDLeftSidebar({ prdId, open, onToggle, activePageId, onPageSele
355
354
  </button>
356
355
  </TooltipTrigger>
357
356
  <TooltipContent>
358
- <p>{viewMode === "list" ? t("sidebar.gridView") : t("sidebar.listView")}</p>
357
+ <p>{viewMode === "list" ? m.sidebar_gridView() : m.sidebar_listView()}</p>
359
358
  </TooltipContent>
360
359
  </Tooltip>
361
360
  </div>
@@ -368,14 +367,14 @@ export function PRDLeftSidebar({ prdId, open, onToggle, activePageId, onPageSele
368
367
  {[1, 2, 3].map((i) => <div key={i} className="h-6 rounded bg-muted/50 animate-pulse" />)}
369
368
  </div>
370
369
  ) : groups.length === 0 ? (
371
- <p className="text-xs text-muted-foreground text-center py-4">{search ? t("sidebar.noMatch") : t("sidebar.noComponents")}</p>
370
+ <p className="text-xs text-muted-foreground text-center py-4">{search ? m.sidebar_noMatch() : m.sidebar_noComponents()}</p>
372
371
  ) : (
373
- groups.map(([category, labelKey, items]) => (
372
+ groups.map(([category, label, items]) => (
374
373
  <div key={category}>
375
374
  <div className="flex items-center gap-1 px-2 py-1.5 bg-muted/20 rounded-t-md border-b border-border/40 cursor-pointer" onClick={() => setCatOpen((p) => ({ ...p, [category]: !p[category] }))}>
376
375
  <ChevronDown className={cn("size-3 text-muted-foreground/60 transition-transform", catOpen[category] ? "rotate-0" : "-rotate-90")} />
377
376
  <span className="text-muted-foreground shrink-0">{CATEGORIES.find((c) => c.key === category)?.icon}</span>
378
- <span className="text-xs font-semibold text-foreground/90 flex-1">{t(labelKey)}</span>
377
+ <span className="text-xs font-semibold text-foreground/90 flex-1">{label}</span>
379
378
  <span className="text-[10px] text-muted-foreground/60">{items.length}</span>
380
379
  </div>
381
380
  {catOpen[category] && (
@@ -15,9 +15,8 @@
15
15
  // You should have received a copy of the GNU Affero General Public License
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
-
19
18
  import React, { useState, useRef, useEffect } from "react";
20
- import { useTranslation } from "react-i18next";
19
+ import { m } from '@/paraglide/messages.js'
21
20
  import { Button } from "@/components/ui/button";
22
21
  import { Input } from "@/components/ui/input";
23
22
  import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog";
@@ -79,7 +78,6 @@ export function PRDNavigation({
79
78
  onWindowFullscreen,
80
79
  onDelete,
81
80
  }: PRDNavigationProps) {
82
- const { t } = useTranslation(["prd", "common"]);
83
81
  const [shareOpen, setShareOpen] = useState(false);
84
82
  const [editingName, setEditingName] = useState(false);
85
83
  const [nameValue, setNameValue] = useState(prd.name);
@@ -162,7 +160,7 @@ export function PRDNavigation({
162
160
  onClick={handleStartEdit}
163
161
  className="flex items-center gap-1.5 text-foreground hover:text-foreground/80 transition-colors group"
164
162
  disabled={!onNameChange}
165
- aria-label={t("navigation.editName")}
163
+ aria-label={m.navigation_editName()}
166
164
  >
167
165
  <span className="text-sm font-medium truncate max-w-50">{prd.name}</span>
168
166
  {onNameChange && (
@@ -216,26 +214,26 @@ export function PRDNavigation({
216
214
  {onVersion && (
217
215
  <Button variant="ghost" size="sm" className="h-8 gap-1.5" onClick={onVersion}>
218
216
  <History className="size-3.5" />
219
- <span className="hidden sm:inline">{t("navigation.version")}</span>
217
+ <span className="hidden sm:inline">{m.navigation_version()}</span>
220
218
  </Button>
221
219
  )}
222
220
 
223
221
  {onSave && (
224
222
  <Button variant="ghost" size="sm" className="h-8 gap-1.5" onClick={onSave}>
225
223
  <Save className="size-3.5" />
226
- <span className="hidden sm:inline">{t("common:button.save")}</span>
224
+ <span className="hidden sm:inline">{m.common_button_save()}</span>
227
225
  </Button>
228
226
  )}
229
227
 
230
228
  <Button variant="ghost" size="sm" className="h-8 gap-1.5" onClick={() => setShareOpen(true)}>
231
229
  <Share2 className="size-3.5" />
232
- <span className="hidden sm:inline">{t("navigation.share")}</span>
230
+ <span className="hidden sm:inline">{m.navigation_share()}</span>
233
231
  </Button>
234
232
 
235
233
  <Dialog open={shareOpen} onOpenChange={setShareOpen}>
236
234
  <DialogContent className="sm:max-w-3xl">
237
235
  <DialogHeader>
238
- <DialogTitle>{t("navigation.sharePrd")}</DialogTitle>
236
+ <DialogTitle>{m.navigation_sharePrd()}</DialogTitle>
239
237
  </DialogHeader>
240
238
  <PRDSharePanel prdId={prd.id} onClose={() => setShareOpen(false)} />
241
239
  </DialogContent>
@@ -251,13 +249,13 @@ export function PRDNavigation({
251
249
  {onExport && (
252
250
  <DropdownMenuItem onClick={onExport}>
253
251
  <Download className="size-4 mr-2" />
254
- {t("navigation.export")}
252
+ {m.navigation_export()}
255
253
  </DropdownMenuItem>
256
254
  )}
257
255
  {onSettings && (
258
256
  <DropdownMenuItem onClick={onSettings}>
259
257
  <SettingsIcon className="size-4 mr-2" />
260
- {t("navigation.prdSettings")}
258
+ {m.navigation_prdSettings()}
261
259
  </DropdownMenuItem>
262
260
  )}
263
261
  <DropdownMenuSeparator />
@@ -266,7 +264,7 @@ export function PRDNavigation({
266
264
  className="text-destructive focus:text-destructive"
267
265
  >
268
266
  <Trash2 className="size-4 mr-2" />
269
- {t("navigation.deletePrd")}
267
+ {m.navigation_deletePrd()}
270
268
  </DropdownMenuItem>
271
269
  </DropdownMenuContent>
272
270
  </DropdownMenu>
@@ -276,9 +274,9 @@ export function PRDNavigation({
276
274
  <NameConfirmDialog
277
275
  open={deleteConfirmOpen}
278
276
  onOpenChange={setDeleteConfirmOpen}
279
- title={t("navigation.deletePrd")}
280
- description={t("navigation.deletePrdDesc")}
281
- confirmText={t("navigation.confirmDelete")}
277
+ title={m.navigation_deletePrd()}
278
+ description={m.navigation_deletePrdDesc()}
279
+ confirmText={m.navigation_confirmDelete()}
282
280
  expectedName={prd.name}
283
281
  onConfirm={handleDelete}
284
282
  />
@@ -16,14 +16,13 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  import React, { useMemo } from "react";
19
- import { useTranslation } from "react-i18next";
19
+ import { m } from '@/paraglide/messages.js'
20
20
  import { LayoutTemplate, Box } from "lucide-react";
21
21
  import { buildOutline } from "@/lib/outline-utils";
22
22
  import { OutlineNode } from "@allbluecn/kernel";
23
23
  import { CanvasElement } from "@allbluecn/kernel";
24
24
 
25
25
  export function OutlineTab({ elements, onSelect }: { elements: CanvasElement[]; onSelect?: (elementId: string) => void }) {
26
- const { t } = useTranslation("prd");
27
26
  const tree = useMemo(() => buildOutline(elements), [elements]);
28
27
 
29
28
  const renderNode = (node: OutlineNode, depth: number = 0) => (
@@ -48,10 +47,10 @@ export function OutlineTab({ elements, onSelect }: { elements: CanvasElement[];
48
47
 
49
48
  return (
50
49
  <div className="flex flex-col h-full">
51
- <div className="shrink-0 px-3 py-2 text-xs text-muted-foreground border-b">{t("outline.pageStructure")}</div>
50
+ <div className="shrink-0 px-3 py-2 text-xs text-muted-foreground border-b">{m.outline_pageStructure()}</div>
52
51
  <div className="flex-1 overflow-y-auto py-1">
53
52
  {tree.length === 0 ? (
54
- <div className="px-3 py-4 text-xs text-muted-foreground text-center">{t("outline.empty")}</div>
53
+ <div className="px-3 py-4 text-xs text-muted-foreground text-center">{m.outline_empty()}</div>
55
54
  ) : (
56
55
  tree.map(node => renderNode(node))
57
56
  )}
@@ -15,9 +15,8 @@
15
15
  // You should have received a copy of the GNU Affero General Public License
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
-
19
18
  import React, { useState, useEffect } from "react";
20
- import { useTranslation } from "react-i18next";
19
+ import { m } from '@/paraglide/messages.js'
21
20
  import { cn } from "@/lib/utils";
22
21
  import { Monitor, Smartphone, Tablet } from "lucide-react";
23
22
  import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
@@ -39,7 +38,6 @@ interface PRDPrototypePanelProps {
39
38
  }
40
39
 
41
40
  export function PRDPrototypePanel({ className, elements: externalElements, onElementsChange, onComponentSelect, autoSaveTime, saving, onAnnotate }: PRDPrototypePanelProps) {
42
- const { t } = useTranslation("prd");
43
41
  const [device, setDevice] = useState<DeviceType>("desktop");
44
42
  const [internalElements, setInternalElements] = useState<CanvasElement[]>([]);
45
43
 
@@ -50,7 +48,7 @@ export function PRDPrototypePanel({ className, elements: externalElements, onEle
50
48
  registerComponents([...ICON_COMPONENTS, ...BUILTIN_COMPONENTS, ...LOCAL_IMPORTED_COMPONENTS]);
51
49
 
52
50
  listComponentsFn({ data: { type: "prototype" } })
53
- .then((dbComponents) => {
51
+ .then((dbComponents: Awaited<ReturnType<typeof listComponentsFn>>) => {
54
52
  for (const dbc of dbComponents) {
55
53
  if (!dbc.prototypeKey) continue;
56
54
  if (getComponent(dbc.prototypeKey)) continue;
@@ -71,7 +69,7 @@ export function PRDPrototypePanel({ className, elements: externalElements, onEle
71
69
  .catch(console.error);
72
70
 
73
71
  return () => {
74
- BUILTIN_COMPONENTS.forEach((c) => unregisterComponent(c.type));
72
+ BUILTIN_COMPONENTS.forEach((c: { type: string }) => unregisterComponent(c.type));
75
73
  };
76
74
  }, []);
77
75
 
@@ -79,9 +77,9 @@ export function PRDPrototypePanel({ className, elements: externalElements, onEle
79
77
  <div className={cn("flex flex-col h-full", className)}>
80
78
  <div className="shrink-0 flex items-center justify-between gap-1 px-3 h-10 border-b border-l -ml-px bg-muted/5">
81
79
  <div className="flex items-center gap-2">
82
- <span className="text-xs font-medium text-muted-foreground">{t("prototypePanel.title")}</span>
80
+ <span className="text-xs font-medium text-muted-foreground">{m.prototypePanel_title()}</span>
83
81
  {saving ? (
84
- <span className="text-[10px] text-muted-foreground/40">{t("prototypePanel.saving")}</span>
82
+ <span className="text-[10px] text-muted-foreground/40">{m.prototypePanel_saving()}</span>
85
83
  ) : autoSaveTime ? (
86
84
  <span className="text-[10px] text-muted-foreground/40">{autoSaveTime}</span>
87
85
  ) : null}
@@ -97,7 +95,7 @@ export function PRDPrototypePanel({ className, elements: externalElements, onEle
97
95
  </button>
98
96
  </TooltipTrigger>
99
97
  <TooltipContent>
100
- <p>{t("prototypePanel.desktop")}</p>
98
+ <p>{m.prototypePanel_desktop()}</p>
101
99
  </TooltipContent>
102
100
  </Tooltip>
103
101
  <Tooltip>
@@ -110,7 +108,7 @@ export function PRDPrototypePanel({ className, elements: externalElements, onEle
110
108
  </button>
111
109
  </TooltipTrigger>
112
110
  <TooltipContent>
113
- <p>{t("prototypePanel.tablet")}</p>
111
+ <p>{m.prototypePanel_tablet()}</p>
114
112
  </TooltipContent>
115
113
  </Tooltip>
116
114
  <Tooltip>
@@ -123,7 +121,7 @@ export function PRDPrototypePanel({ className, elements: externalElements, onEle
123
121
  </button>
124
122
  </TooltipTrigger>
125
123
  <TooltipContent>
126
- <p>{t("prototypePanel.mobile")}</p>
124
+ <p>{m.prototypePanel_mobile()}</p>
127
125
  </TooltipContent>
128
126
  </Tooltip>
129
127
  </div>
@@ -15,9 +15,8 @@
15
15
  // You should have received a copy of the GNU Affero General Public License
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
-
19
18
  import React, { useState, useEffect } from "react";
20
- import { useTranslation } from "react-i18next";
19
+ import { m } from '@/paraglide/messages.js'
21
20
  import { cn } from "@/lib/utils";
22
21
  import { Button } from "@/components/ui/button";
23
22
  import { Pin, PinOff, X } from "lucide-react";
@@ -48,13 +47,12 @@ interface PRDRightSidebarProps {
48
47
  type SidebarState = "collapsed" | "expanded" | "pinned";
49
48
 
50
49
  const TABS = [
51
- { key: "editor", labelKey: "rightSidebar.tabEditor" },
52
- { key: "version", labelKey: "rightSidebar.tabVersion" },
53
- { key: "comment-review", labelKey: "rightSidebar.tabComment" },
50
+ { key: "editor", label: m.rightSidebar_tabEditor },
51
+ { key: "version", label: m.rightSidebar_tabVersion },
52
+ { key: "comment-review", label: m.rightSidebar_tabComment },
54
53
  ] as const;
55
54
 
56
55
  export function PRDRightSidebar({ prdId, selectedComponentId, onClose, activePageId, element, onElementChange, onDeleteElement }: PRDRightSidebarProps) {
57
- const { t } = useTranslation("prd");
58
56
  const [state, setState] = useState<SidebarState>("collapsed");
59
57
  const [activeTab, setActiveTab] = useState<string>("editor");
60
58
  const [isHydrated, setIsHydrated] = useState(false);
@@ -133,7 +131,7 @@ export function PRDRightSidebar({ prdId, selectedComponentId, onClose, activePag
133
131
  : "text-muted-foreground hover:text-foreground"
134
132
  )}
135
133
  >
136
- {t(tab.labelKey)}
134
+ {tab.label()}
137
135
  </button>
138
136
  ))}
139
137
  </div>
@@ -145,7 +143,7 @@ export function PRDRightSidebar({ prdId, selectedComponentId, onClose, activePag
145
143
  </Button>
146
144
  </TooltipTrigger>
147
145
  <TooltipContent>
148
- <p>{isPinned ? t("rightSidebar.unpin") : t("rightSidebar.pin")}</p>
146
+ <p>{isPinned ? m.rightSidebar_unpin() : m.rightSidebar_pin()}</p>
149
147
  </TooltipContent>
150
148
  </Tooltip>
151
149
  <Tooltip>
@@ -155,7 +153,7 @@ export function PRDRightSidebar({ prdId, selectedComponentId, onClose, activePag
155
153
  </Button>
156
154
  </TooltipTrigger>
157
155
  <TooltipContent>
158
- <p>{t("rightSidebar.collapse")}</p>
156
+ <p>{m.rightSidebar_collapse()}</p>
159
157
  </TooltipContent>
160
158
  </Tooltip>
161
159
  </div>
@@ -172,7 +170,7 @@ export function PRDRightSidebar({ prdId, selectedComponentId, onClose, activePag
172
170
  {activePageId ? (
173
171
  <PageVersionPanel prdId={prdId} pageId={activePageId} />
174
172
  ) : (
175
- <div className="p-3 text-sm text-muted-foreground text-center py-8">{t("rightSidebar.selectPageHint")}</div>
173
+ <div className="p-3 text-sm text-muted-foreground text-center py-8">{m.rightSidebar_selectPageHint()}</div>
176
174
  )}
177
175
  </div>
178
176
  ) : (
@@ -194,11 +192,11 @@ export function PRDRightSidebar({ prdId, selectedComponentId, onClose, activePag
194
192
  : "text-muted-foreground hover:text-foreground hover:bg-muted/30"
195
193
  )}
196
194
  >
197
- {t(tab.labelKey).split("").join("\n")}
195
+ {tab.label().split("").join("\n")}
198
196
  </button>
199
197
  </TooltipTrigger>
200
198
  <TooltipContent>
201
- <p>{t(tab.labelKey)}</p>
199
+ <p>{tab.label()}</p>
202
200
  </TooltipContent>
203
201
  </Tooltip>
204
202
  ))}
@@ -16,7 +16,7 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  import { cn } from "@/lib/utils";
19
- import { useTranslation } from "react-i18next";
19
+ import { m } from '@/paraglide/messages.js'
20
20
  import { Button } from "@/components/ui/button";
21
21
  import { Input } from "@/components/ui/input";
22
22
  import { Switch } from "@/components/ui/switch";
@@ -68,14 +68,13 @@ export function SingleVersionShareCard({
68
68
  onExpiryUpdate,
69
69
  onToggle,
70
70
  }: SingleVersionShareCardProps) {
71
- const { t } = useTranslation("prd");
72
71
  return (
73
72
  <div className={cn("border rounded-lg p-4 space-y-3", !share.enabled && "opacity-50")}>
74
73
  <div className="flex items-center justify-between">
75
74
  <div className="flex items-center gap-3">
76
75
  <span className="text-sm font-medium bg-muted px-2 py-0.5 rounded">{share.versionLabel}</span>
77
76
  {share.hasPassword && (
78
- <span className="text-xs bg-primary/10 text-primary px-2 py-0.5 rounded-full">{t("sharePanel.passwordEnabled")}</span>
77
+ <span className="text-xs bg-primary/10 text-primary px-2 py-0.5 rounded-full">{m.sharePanel_passwordEnabled()}</span>
79
78
  )}
80
79
  </div>
81
80
  <div className="flex items-center gap-2">
@@ -86,7 +85,7 @@ export function SingleVersionShareCard({
86
85
  </Button>
87
86
  </TooltipTrigger>
88
87
  <TooltipContent>
89
- <p className="text-xs">{t("sharePanel.copyShareLink")}</p>
88
+ <p className="text-xs">{m.sharePanel_copyShareLink()}</p>
90
89
  </TooltipContent>
91
90
  </Tooltip>
92
91
  <Tooltip>
@@ -101,14 +100,14 @@ export function SingleVersionShareCard({
101
100
  </Button>
102
101
  </TooltipTrigger>
103
102
  <TooltipContent>
104
- <p className="text-xs">{t("sharePanel.deleteShareLink")}</p>
103
+ <p className="text-xs">{m.sharePanel_deleteShareLink()}</p>
105
104
  </TooltipContent>
106
105
  </Tooltip>
107
106
  </div>
108
107
  </div>
109
108
 
110
109
  <div className="space-y-1">
111
- <span className="text-xs text-muted-foreground">{t("sharePanel.shareLink")}:</span>
110
+ <span className="text-xs text-muted-foreground">{m.sharePanel_shareLink()}:</span>
112
111
  <div className="flex items-center gap-2">
113
112
  <Input value={share.link} readOnly className="h-8 text-xs flex-1 font-mono max-w-full" />
114
113
  </div>
@@ -117,7 +116,7 @@ export function SingleVersionShareCard({
117
116
  <div className="grid grid-cols-2 gap-3">
118
117
  <div className="space-y-1">
119
118
  <div className="flex items-center justify-between">
120
- <span className="text-xs text-muted-foreground">{t("sharePanel.enablePassword")}:
119
+ <span className="text-xs text-muted-foreground">{m.sharePanel_enablePassword()}:
121
120
  <Switch
122
121
  checked={share.hasPassword}
123
122
  onCheckedChange={(v) => onPasswordToggle(share.id, v)}
@@ -139,14 +138,14 @@ export function SingleVersionShareCard({
139
138
  variant="outline"
140
139
  size="sm"
141
140
  className="h-8 w-8 p-0"
142
- onClick={() => { navigator.clipboard.writeText(share.password); toast.success(t("sharePanel.passwordCopied")); }}
141
+ onClick={() => { navigator.clipboard.writeText(share.password); toast.success(m.sharePanel_passwordCopied()); }}
143
142
  disabled={!share.hasPassword}
144
143
  >
145
144
  <Copy className="size-3" />
146
145
  </Button>
147
146
  </TooltipTrigger>
148
147
  <TooltipContent>
149
- <p className="text-xs">{t("sharePanel.copyPassword")}</p>
148
+ <p className="text-xs">{m.sharePanel_copyPassword()}</p>
150
149
  </TooltipContent>
151
150
  </Tooltip>
152
151
  <Tooltip>
@@ -162,7 +161,7 @@ export function SingleVersionShareCard({
162
161
  </Button>
163
162
  </TooltipTrigger>
164
163
  <TooltipContent>
165
- <p className="text-xs">{t("sharePanel.generateRandomPassword")}</p>
164
+ <p className="text-xs">{m.sharePanel_generateRandomPassword()}</p>
166
165
  </TooltipContent>
167
166
  </Tooltip>
168
167
  </div>
@@ -170,23 +169,23 @@ export function SingleVersionShareCard({
170
169
 
171
170
  <div className="grid grid-cols-2 gap-4">
172
171
  <div className="space-y-1">
173
- <span className="text-xs text-muted-foreground">{t("sharePanel.expiry")}:</span>
172
+ <span className="text-xs text-muted-foreground">{m.sharePanel_expiry()}:</span>
174
173
  <Select
175
174
  value={getExpiryDaysValue(share.expiresAt)}
176
175
  onValueChange={(v) => onExpiryUpdate(share.id, v)}
177
176
  >
178
177
  <SelectTrigger className="h-8 text-xs">
179
- <SelectValue placeholder={t("sharePanel.selectExpiry")} />
178
+ <SelectValue placeholder={m.sharePanel_selectExpiry()} />
180
179
  </SelectTrigger>
181
180
  <SelectContent>
182
181
  {EXPIRY_OPTIONS.map((opt) => (
183
- <SelectItem key={opt.value} value={opt.value}>{t(opt.labelKey)}</SelectItem>
182
+ <SelectItem key={opt.value} value={opt.value}>{opt.label()}</SelectItem>
184
183
  ))}
185
184
  </SelectContent>
186
185
  </Select>
187
186
  </div>
188
187
  <div className="space-y-1">
189
- <span className="text-xs text-muted-foreground">{t("sharePanel.enableSingleShare")}</span>
188
+ <span className="text-xs text-muted-foreground">{m.sharePanel_enableSingleShare()}</span>
190
189
  <div className="flex justify-start mt-2">
191
190
  <Switch
192
191
  checked={share.enabled}