@allbluecn/web-app 0.18.1 → 0.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (555) hide show
  1. package/package.json +3 -5
  2. package/src/__tests__/{knowledge/public → knowledge-public}/canonical-id.test.ts +1 -1
  3. package/src/__tests__/{knowledge/public → knowledge-public}/favicon.test.ts +1 -1
  4. package/src/__tests__/{knowledge/public → knowledge-public}/github-sync.test.ts +1 -1
  5. package/src/__tests__/{knowledge/public → knowledge-public}/share-merge.test.ts +1 -1
  6. package/src/__tests__/visual/theme-surface.vrt.test.tsx +1 -1
  7. package/src/components/agents/agent-bindings-tab.tsx +3 -3
  8. package/src/components/agents/agent-card.tsx +4 -4
  9. package/src/components/agents/agent-form-dialog.tsx +9 -9
  10. package/src/components/agents/agent-selector.tsx +1 -1
  11. package/src/components/agents/agents-page.tsx +1 -1
  12. package/src/components/agents/skill-card.tsx +1 -1
  13. package/src/components/agents/skill-form-dialog.tsx +5 -5
  14. package/src/components/agents/use-agent-handlers.ts +1 -1
  15. package/src/components/ai/__tests__/prompt-input-actions.test.tsx +1 -1
  16. package/src/components/ai/ai-chat-prompt.tsx +3 -3
  17. package/src/components/ai/ai-prompt-input/components/action-buttons.tsx +3 -3
  18. package/src/components/ai/ai-prompt-input/components/agent-mode-select.tsx +1 -1
  19. package/src/components/ai/ai-prompt-input/components/model-select.tsx +1 -1
  20. package/src/components/ai/ai-prompt-input/index.tsx +3 -3
  21. package/src/components/ai/ai-suggested-prompts.tsx +5 -5
  22. package/src/components/ai/global-harness-sidebar/index.tsx +5 -5
  23. package/src/components/ai/tool-parts/tool-call-part.tsx +1 -1
  24. package/src/components/ai/tool-parts/tool-result-part.tsx +1 -1
  25. package/src/components/anyhub/anyhub-app-card.tsx +5 -5
  26. package/src/components/anyhub/anyhub-install-dialog.tsx +4 -4
  27. package/src/components/anyhub/anyhub-management-view.tsx +1 -1
  28. package/src/components/anyhub/anyhub-marketplace-view.tsx +4 -4
  29. package/src/components/anyhub/anyhub-permission-panel.tsx +4 -4
  30. package/src/components/anyhub/anyhub-top-nav.tsx +2 -2
  31. package/src/components/auth/icon-input.tsx +2 -2
  32. package/src/components/auth/oauth-section.tsx +2 -2
  33. package/src/components/auth/password-input.tsx +2 -2
  34. package/src/components/auth/sso-section.tsx +1 -1
  35. package/src/components/billing/__tests__/seats-manager.test.tsx +1 -1
  36. package/src/components/billing/checkout-redirect.ts +1 -1
  37. package/src/components/billing/login-prompt-dialog.tsx +3 -3
  38. package/src/components/billing/seats-manager.tsx +2 -2
  39. package/src/components/bug/__tests__/bug-display-dropdown.test.tsx +1 -1
  40. package/src/components/bug/__tests__/bug-toolbar.test.tsx +1 -1
  41. package/src/components/bug/__tests__/create-bug-dialog.test.tsx +2 -2
  42. package/src/components/bug/__tests__/use-paged-bug-groups.test.tsx +1 -1
  43. package/src/components/bug/bug-list-table.tsx +1 -1
  44. package/src/components/bug/bug-list-view.tsx +1 -1
  45. package/src/components/bug/bug-panel-header.tsx +5 -5
  46. package/src/components/bug/bug-toolbar.tsx +3 -3
  47. package/src/components/bug/collect/__tests__/collect-form.test.tsx +1 -1
  48. package/src/components/bug/collect/collect-form.tsx +5 -5
  49. package/src/components/bug/columns.tsx +1 -1
  50. package/src/components/bug/create-bug-dialog.tsx +4 -4
  51. package/src/components/bug/detail/__tests__/error-context.test.tsx +1 -1
  52. package/src/components/bug/detail/__tests__/repro-report-card.test.tsx +1 -1
  53. package/src/components/bug/detail/activity-tabs.tsx +1 -1
  54. package/src/components/bug/detail/bug-detail-body.tsx +6 -6
  55. package/src/components/bug/detail/comment-input.tsx +3 -3
  56. package/src/components/bug/detail/comment-item.tsx +5 -5
  57. package/src/components/bug/detail/events-timeline.tsx +1 -1
  58. package/src/components/bug/detail/fix-timeline.tsx +3 -3
  59. package/src/components/bug/detail/props-section.tsx +2 -2
  60. package/src/components/bug/detail/regression-section.tsx +3 -3
  61. package/src/components/bug/detail/repro-report-card.tsx +6 -6
  62. package/src/components/bug/display/display-dropdown.tsx +2 -2
  63. package/src/components/bug/filters/add-filter-dropdown.tsx +1 -1
  64. package/src/components/bug/filters/applied-filters.tsx +1 -1
  65. package/src/components/bug/filters/filter-row.tsx +1 -1
  66. package/src/components/bug/filters/filter-toggle.tsx +2 -2
  67. package/src/components/bug/filters/filter-value-input.tsx +1 -1
  68. package/src/components/bug/inline-editors/assignee-editor.tsx +1 -1
  69. package/src/components/bug/inline-editors/date-editor.tsx +1 -1
  70. package/src/components/bug/inline-editors/inline-trigger.tsx +2 -2
  71. package/src/components/bug/peek-panel.tsx +1 -1
  72. package/src/components/bug/reproduce-steps-editor.tsx +3 -3
  73. package/src/components/bug/settings/bug-settings-panel.tsx +4 -4
  74. package/src/components/bug/settings/collect-page-manager.tsx +9 -9
  75. package/src/components/bug/settings/install-commands.tsx +3 -3
  76. package/src/components/bug/settings/token-list.tsx +7 -7
  77. package/src/components/bug/settings/webhook-manager.tsx +9 -9
  78. package/src/components/bug/views/bug-list/batch-toolbar.tsx +4 -4
  79. package/src/components/bug/views/bug-list/group.tsx +2 -2
  80. package/src/components/bug/views/bug-list/index.tsx +1 -1
  81. package/src/components/bug/views/bug-list/inline-bug-creator.tsx +1 -1
  82. package/src/components/bug/views/bug-list/row.tsx +2 -2
  83. package/src/components/bug/views/view-switcher.tsx +1 -1
  84. package/src/components/changelog/changelog-page.tsx +1 -1
  85. package/{allblue-ui/src → src}/components/confirm-dialog.tsx +2 -2
  86. package/src/components/design/canvas/panels/appearance-text-panel.tsx +3 -3
  87. package/src/components/design/canvas/panels/controls/add-button.tsx +1 -1
  88. package/src/components/design/canvas/panels/controls/constraint-select.tsx +1 -1
  89. package/src/components/design/canvas/panels/controls/gradient-editor.tsx +1 -1
  90. package/src/components/design/canvas/panels/controls/pattern-params.tsx +2 -2
  91. package/src/components/design/canvas/panels/controls/rows.tsx +3 -3
  92. package/src/components/design/canvas/panels/controls/shader-picker.tsx +3 -3
  93. package/src/components/design/canvas/panels/controls/text-style-button.tsx +1 -1
  94. package/src/components/design/canvas/panels/controls/toolbar-button.tsx +2 -2
  95. package/src/components/design/canvas/panels/frame-property-panel.tsx +3 -3
  96. package/src/components/design/canvas/panels/layer-panel.tsx +2 -2
  97. package/src/components/design/canvas/panels/paint-lists-panel.tsx +1 -1
  98. package/src/components/design/canvas/panels/property-panel.tsx +3 -3
  99. package/src/components/design/canvas/panels/shape-corners-panel.tsx +2 -2
  100. package/src/components/design/canvas/panels/toolbar.tsx +4 -4
  101. package/src/components/design/canvas/panels/transform-layout-panel.tsx +3 -3
  102. package/src/components/design/canvas/react/__tests__/hooks.test.tsx +2 -2
  103. package/src/components/design/canvas/react/hooks.ts +1 -1
  104. package/src/components/design/canvas/react/workbench.tsx +2 -2
  105. package/src/components/design/editor/annotation/annotation-node/annotation-node-view.tsx +1 -1
  106. package/src/components/design/editor/collaboration/__tests__/design-agent-panel-regenerate.test.tsx +1 -1
  107. package/src/components/design/editor/collaboration/__tests__/design-agent-panel-stream.test.tsx +2 -2
  108. package/src/components/design/editor/collaboration/agent-input.tsx +2 -2
  109. package/src/components/design/editor/collaboration/design-agent-panel.tsx +2 -2
  110. package/src/components/design/editor/collaboration/design-comment-review-panel.tsx +4 -4
  111. package/src/components/design/editor/dashboard/create-design-dialog.tsx +3 -3
  112. package/src/components/design/editor/dashboard/design-dashboard.tsx +4 -4
  113. package/src/components/design/editor/layout/__tests__/context-menu.test.tsx +1 -1
  114. package/src/components/design/editor/layout/__tests__/no-page-save-toast.test.tsx +2 -2
  115. package/src/components/design/editor/layout/__tests__/persistence-restore.test.tsx +1 -1
  116. package/src/components/design/editor/layout/__tests__/ssr-localstorage-smoke.test.tsx +1 -1
  117. package/src/components/design/editor/layout/context-menu.tsx +1 -1
  118. package/src/components/design/editor/layout/design-doc-panel.tsx +2 -2
  119. package/src/components/design/editor/layout/design-editor-layout.tsx +1 -1
  120. package/src/components/design/editor/layout/design-navigation.tsx +4 -4
  121. package/src/components/design/editor/layout/design-right-sidebar.tsx +2 -2
  122. package/src/components/design/editor/layout/hooks/use-design-auto-save.ts +1 -1
  123. package/src/components/design/editor/pages/design-detail-page.tsx +1 -1
  124. package/src/components/design/editor/pages/share-design-page.tsx +1 -1
  125. package/src/components/design/editor/pages-tree/design-tree-page-tab.tsx +3 -3
  126. package/src/components/design/editor/share/design-share-panel/components/single-version-share-card.tsx +6 -6
  127. package/src/components/design/editor/share/design-share-panel/index.tsx +9 -9
  128. package/src/components/design/editor/share/share-comment-panel.tsx +4 -4
  129. package/src/components/design/editor/share/share-nav-bar.tsx +3 -3
  130. package/src/components/design/editor/share/share-password-gate.tsx +3 -3
  131. package/src/components/design/editor/share/share-review-panel.tsx +4 -4
  132. package/src/components/design/editor/versions/components/create-version-dialog.tsx +2 -2
  133. package/src/components/design/editor/versions/components/delete-version-dialog.tsx +2 -2
  134. package/src/components/design/editor/versions/components/edit-version-dialog.tsx +2 -2
  135. package/src/components/design/editor/versions/components/page-tree-selector.tsx +4 -4
  136. package/src/components/design/editor/versions/components/page-version-timeline.tsx +2 -2
  137. package/src/components/design/editor/versions/page-version-panel.tsx +5 -5
  138. package/src/components/design/editor/versions/page-version-tree.tsx +3 -3
  139. package/src/components/design/editor/versions/restore-version-dialog.tsx +2 -2
  140. package/src/components/error/global-error-boundary.tsx +1 -1
  141. package/src/components/forms/app-array-field.tsx +1 -1
  142. package/src/components/forms/app-checkbox.tsx +1 -1
  143. package/src/components/forms/app-combobox.tsx +1 -1
  144. package/src/components/forms/app-date-picker.tsx +1 -1
  145. package/src/components/forms/app-field.tsx +1 -1
  146. package/src/components/forms/app-form-dialog.tsx +2 -2
  147. package/src/components/forms/app-input.tsx +1 -1
  148. package/src/components/forms/app-section.tsx +1 -1
  149. package/src/components/forms/app-select.tsx +1 -1
  150. package/src/components/forms/app-switch.tsx +1 -1
  151. package/src/components/forms/app-textarea.tsx +1 -1
  152. package/src/components/forms/hooks/use-form-submit.ts +1 -1
  153. package/src/components/harness/__tests__/media-route.test.tsx +1 -1
  154. package/src/components/harness/agent-preset-picker.tsx +3 -3
  155. package/src/components/harness/ai-chat-history/components/conversation-header.tsx +2 -2
  156. package/src/components/harness/ai-chat-history/components/conversation-item.tsx +3 -3
  157. package/src/components/harness/ai-chat-history/components/conversation-search.tsx +1 -1
  158. package/src/components/harness/ai-chat-history/components/empty-state.tsx +1 -1
  159. package/src/components/harness/ai-chat-history/index.tsx +2 -2
  160. package/src/components/harness/ai-citations/components/citation-item.tsx +1 -1
  161. package/src/components/harness/ai-citations/components/source-components.tsx +1 -1
  162. package/src/components/harness/ai-citations/index.tsx +1 -1
  163. package/src/components/harness/ai-thinking.tsx +1 -1
  164. package/src/components/harness/code/file-tree.tsx +1 -1
  165. package/src/components/harness/code/preview-panel.tsx +2 -2
  166. package/src/components/harness/code/workspace-picker.tsx +3 -3
  167. package/src/components/harness/composer/harness-composer.tsx +3 -3
  168. package/src/components/harness/composer/model-select.tsx +1 -1
  169. package/src/components/harness/connection-indicator.tsx +1 -1
  170. package/src/components/harness/gallery/gallery-card.tsx +5 -5
  171. package/src/components/harness/gallery/gallery-grid.tsx +5 -5
  172. package/src/components/harness/gallery/lightbox-viewer.tsx +2 -2
  173. package/src/components/harness/gallery/retranscribe-dialog.tsx +5 -5
  174. package/src/components/harness/harness-workbench-page.tsx +2 -2
  175. package/src/components/harness/image-lightbox.tsx +1 -1
  176. package/src/components/harness/interrupt-approval.tsx +2 -2
  177. package/src/components/harness/message-actions.tsx +2 -2
  178. package/src/components/harness/plan-approval-card.tsx +2 -2
  179. package/src/components/harness/plugin-define-approval.tsx +2 -2
  180. package/src/components/harness/plugin-panel.tsx +3 -3
  181. package/src/components/harness/queue-bar.tsx +1 -1
  182. package/src/components/harness/queue-item.tsx +1 -1
  183. package/src/components/harness/retry-countdown-bar.tsx +1 -1
  184. package/src/components/hextaui/ai-citations.tsx +1 -1
  185. package/src/components/hextaui/ai-file-upload.tsx +2 -2
  186. package/src/components/hextaui/ai-message.tsx +2 -2
  187. package/src/components/hextaui/ai-thinking.tsx +1 -1
  188. package/src/components/hotkeys/shortcuts-panel.tsx +2 -2
  189. package/src/components/iteration/auto-schedule-dialog.tsx +5 -5
  190. package/src/components/iteration/create-iteration-dialog.tsx +5 -5
  191. package/src/components/iteration/iteration-editor.tsx +3 -3
  192. package/src/components/knowledge/dialog/knowledge-form-dialog.tsx +3 -3
  193. package/src/components/knowledge/doc-properties.tsx +2 -2
  194. package/src/components/knowledge/kb-filter-popover.tsx +2 -2
  195. package/src/components/knowledge/knowledge-tag-input.tsx +2 -2
  196. package/src/components/knowledge/knowledge-toolbar.tsx +9 -9
  197. package/src/components/knowledge/knowledge-tree-item.tsx +5 -5
  198. package/src/components/knowledge/knowledge-tree.tsx +3 -3
  199. package/src/components/{knowledge/public → knowledge-public}/bookmark-card.tsx +3 -3
  200. package/src/components/{knowledge/public → knowledge-public}/bookmark-form-dialog.tsx +10 -10
  201. package/src/components/{knowledge/public → knowledge-public}/knowledge-card.tsx +2 -2
  202. package/src/components/{knowledge/public → knowledge-public}/knowledge-form-dialog.tsx +15 -15
  203. package/src/components/{knowledge/public → knowledge-public}/knowledge-search-bar.tsx +2 -2
  204. package/src/components/{knowledge/public → knowledge-public}/legal-compliance-editor.tsx +7 -7
  205. package/src/components/{knowledge/public → knowledge-public}/markdown-editor.tsx +2 -2
  206. package/src/components/{knowledge/public → knowledge-public}/sharers-avatar-group.tsx +1 -1
  207. package/src/components/layout/sidebar-03/__tests__/nav-workspace.test.tsx +2 -2
  208. package/src/components/layout/sidebar-03/__tests__/user-menu-anonymous.test.tsx +3 -3
  209. package/src/components/layout/sidebar-03/app-sidebar.tsx +1 -1
  210. package/src/components/layout/sidebar-03/index.tsx +1 -1
  211. package/src/components/layout/sidebar-03/nav-anyhub.tsx +2 -2
  212. package/src/components/layout/sidebar-03/nav-knowledge.tsx +4 -4
  213. package/src/components/layout/sidebar-03/nav-main.tsx +4 -4
  214. package/src/components/layout/sidebar-03/nav-notifications.tsx +1 -1
  215. package/src/components/layout/sidebar-03/nav-search-trigger.tsx +1 -1
  216. package/src/components/layout/sidebar-03/nav-secondary.tsx +1 -1
  217. package/src/components/layout/sidebar-03/nav-workspace.tsx +2 -2
  218. package/src/components/layout/sidebar-03/team-switcher.tsx +2 -2
  219. package/src/components/layout/sidebar-03/user-menu.tsx +3 -3
  220. package/src/components/notifications/settings-notifications.tsx +6 -6
  221. package/src/components/notifications/team-notifications.tsx +6 -6
  222. package/src/components/project/create-project-dialog.tsx +4 -4
  223. package/src/components/project/invite-member-dialog.tsx +6 -6
  224. package/src/components/project/project-member-manager.tsx +5 -5
  225. package/src/components/project/project-module-card.tsx +1 -1
  226. package/src/components/settings/ai/api-key-field.tsx +3 -3
  227. package/src/components/settings/ai/byok-section.tsx +2 -2
  228. package/src/components/settings/ai/create-custom-model-dialog.tsx +5 -5
  229. package/src/components/settings/ai/create-custom-provider-dialog.tsx +5 -5
  230. package/src/components/settings/ai/local-agent-panel.tsx +3 -3
  231. package/src/components/settings/ai/model-card.tsx +2 -2
  232. package/src/components/settings/ai/model-manager.tsx +4 -4
  233. package/src/components/settings/ai/provider-card.tsx +1 -1
  234. package/src/components/settings/ai/provider-detail-form.tsx +6 -6
  235. package/src/components/settings/ai/provider-grid.tsx +3 -3
  236. package/src/components/settings/ai/source/model-source-picker.tsx +2 -2
  237. package/src/components/settings/language-selector.tsx +2 -2
  238. package/src/components/settings/personal-team/account/account-client.tsx +2 -2
  239. package/src/components/settings/personal-team/account/avatar/notion-avatar-editor.tsx +3 -3
  240. package/src/components/settings/personal-team/account/settings-profile.tsx +8 -8
  241. package/src/components/settings/personal-team/team/invitation-cards/invitation-badges.tsx +1 -1
  242. package/src/components/settings/personal-team/team/invitation-cards/invitation-history-list.tsx +5 -5
  243. package/src/components/settings/personal-team/team/invitation-cards/invite-email-card.tsx +5 -5
  244. package/src/components/settings/personal-team/team/invitation-cards/invite-link-card.tsx +3 -3
  245. package/src/components/settings/personal-team/team/team-client.tsx +6 -6
  246. package/src/components/settings/personal-team/team/team-invitations.tsx +1 -1
  247. package/src/components/settings/personal-team/team/team-member-list.tsx +7 -7
  248. package/src/components/shared-kit/avatars/notion-avatar.tsx +109 -3
  249. package/src/components/shared-kit/avatars/user-avatar.tsx +65 -3
  250. package/src/components/shared-kit/data-viz/contribution-graph-tooltip.tsx +1 -1
  251. package/src/components/shared-kit/dialogs/name-confirm-dialog.tsx +5 -5
  252. package/src/components/shared-kit/i18n/language-switcher.tsx +2 -2
  253. package/src/components/shared-kit/icons/lucide-icon-picker/index.tsx +1 -1
  254. package/src/components/shared-kit/icons/lucide-icon-picker/panel.tsx +1 -1
  255. package/src/components/shared-kit/theme/theme-surface.tsx +4 -4
  256. package/src/components/shared-kit/theme/theme-toggle.tsx +1 -1
  257. package/src/components/shared-kit/timezone/timezone-select.tsx +1 -1
  258. package/src/components/story/__tests__/story-list-view-restore.test.tsx +2 -2
  259. package/src/components/story/__tests__/story-list-view-ssr.test.tsx +2 -2
  260. package/src/components/story/ai/handlers/more-popover.tsx +2 -2
  261. package/src/components/story/ai/handlers/stream-text.ts +1 -1
  262. package/src/components/story/ai/prototype-dialog.tsx +4 -4
  263. package/src/components/story/ai/split-dialog.tsx +6 -6
  264. package/src/components/story/ai/story-ai-panel.tsx +4 -4
  265. package/src/components/story/ai/story-ai-preview-list.tsx +4 -4
  266. package/src/components/story/ai/story-ai-toolbar.tsx +3 -3
  267. package/src/components/story/columns.tsx +1 -1
  268. package/src/components/story/create-story-dialog.tsx +4 -4
  269. package/src/components/story/detail/__tests__/associated-attachments-panel.test.tsx +1 -1
  270. package/src/components/story/detail/__tests__/categories.test.tsx +1 -1
  271. package/src/components/story/detail/__tests__/dependencies-button.test.tsx +1 -1
  272. package/src/components/story/detail/comment-input.tsx +3 -3
  273. package/src/components/story/detail/comment-item.tsx +3 -3
  274. package/src/components/story/detail/reaction-bar.tsx +1 -1
  275. package/src/components/story/detail/story-detail-body.tsx +5 -5
  276. package/src/components/story/detail/story-detail-toolbar/__tests__/related-test-cases.test.tsx +1 -1
  277. package/src/components/story/detail/story-detail-toolbar/associated-attachments-panel.tsx +4 -4
  278. package/src/components/story/detail/story-detail-toolbar/categories.tsx +1 -1
  279. package/src/components/story/detail/story-detail-toolbar/children.tsx +5 -5
  280. package/src/components/story/detail/story-detail-toolbar/dependencies.tsx +1 -1
  281. package/src/components/story/detail/story-detail-toolbar/dependency-panel.tsx +3 -3
  282. package/src/components/story/detail/story-detail-toolbar/related-test-cases.tsx +1 -1
  283. package/src/components/story/detail/story-detail-toolbar.tsx +2 -2
  284. package/src/components/story/detail/story-properties.tsx +1 -1
  285. package/src/components/story/display/__tests__/display-dropdown.test.tsx +1 -1
  286. package/src/components/story/display/display-dropdown.tsx +3 -3
  287. package/src/components/story/filters/add-filter-dropdown.tsx +1 -1
  288. package/src/components/story/filters/applied-filters.tsx +1 -1
  289. package/src/components/story/filters/filter-row.tsx +1 -1
  290. package/src/components/story/filters/filter-toggle.tsx +2 -2
  291. package/src/components/story/inline-editors/__tests__/dependency-type-select.test.tsx +2 -2
  292. package/src/components/story/inline-editors/__tests__/labels-editor.test.tsx +2 -2
  293. package/src/components/story/inline-editors/__tests__/priority-editor.test.tsx +1 -1
  294. package/src/components/story/inline-editors/__tests__/state-editor.test.tsx +1 -1
  295. package/src/components/story/inline-editors/assignee-editor.tsx +1 -1
  296. package/src/components/story/inline-editors/date-editor.tsx +1 -1
  297. package/src/components/story/inline-editors/dependency-type-select.tsx +2 -2
  298. package/src/components/story/inline-editors/inline-trigger.tsx +2 -2
  299. package/src/components/story/inline-editors/labels-editor.tsx +2 -2
  300. package/src/components/story/inline-editors/parent-story-editor.tsx +1 -1
  301. package/src/components/story/inline-editors/story-select-dialog.tsx +6 -6
  302. package/src/components/story/peek-panel.tsx +2 -2
  303. package/src/components/story/relations/__tests__/attachment-manage-dialog.test.tsx +4 -4
  304. package/src/components/story/relations/__tests__/knowledge-select-dialog.test.tsx +2 -2
  305. package/src/components/story/relations/__tests__/link-manage-dialog.test.tsx +1 -1
  306. package/src/components/story/relations/attachment-manage-dialog.tsx +4 -4
  307. package/src/components/story/relations/knowledge-select-dialog.tsx +5 -5
  308. package/src/components/story/relations/link-manage-dialog.tsx +5 -5
  309. package/src/components/story/relations/story-ref-row.tsx +5 -5
  310. package/src/components/story/search-popover.tsx +1 -1
  311. package/src/components/story/story-list-table.tsx +1 -1
  312. package/src/components/story/story-list-view.tsx +2 -2
  313. package/src/components/story/story-panel-header.tsx +5 -5
  314. package/src/components/story/story-toolbar.tsx +4 -4
  315. package/src/components/story/transfer-story-popover.tsx +4 -4
  316. package/src/components/story/views/calendar-view.tsx +3 -3
  317. package/src/components/story/views/create-view-dialog.tsx +2 -2
  318. package/src/components/story/views/kanban-board.tsx +2 -2
  319. package/src/components/story/views/story-list/__tests__/batch-toolbar.test.tsx +1 -1
  320. package/src/components/story/views/story-list/__tests__/group-header.test.tsx +1 -1
  321. package/src/components/story/views/story-list/batch-preview-dialog.tsx +7 -7
  322. package/src/components/story/views/story-list/batch-toolbar.tsx +3 -3
  323. package/src/components/story/views/story-list/group.tsx +2 -2
  324. package/src/components/story/views/story-list/index.tsx +1 -1
  325. package/src/components/story/views/story-list/row.tsx +1 -1
  326. package/src/components/story/views/timeline-view.tsx +3 -3
  327. package/src/components/story/views/view-list-section.tsx +1 -1
  328. package/src/components/story/views/view-selector-button.tsx +2 -2
  329. package/src/components/story/views/view-switcher.tsx +1 -1
  330. package/src/components/tags/nav-tag.tsx +6 -6
  331. package/src/components/tags/tag-badge.tsx +1 -1
  332. package/src/components/tags/tag-manager.tsx +5 -5
  333. package/src/components/tags/tag-selector.tsx +1 -1
  334. package/src/components/testcase/__tests__/artifact-panel.test.tsx +1 -1
  335. package/src/components/testcase/__tests__/case-row.test.tsx +2 -2
  336. package/src/components/testcase/__tests__/convert-bug.test.tsx +2 -2
  337. package/src/components/testcase/__tests__/folder-tree.test.tsx +2 -2
  338. package/src/components/testcase/__tests__/generate-dialog.test.tsx +1 -1
  339. package/src/components/testcase/__tests__/review-layout.test.tsx +1 -1
  340. package/src/components/testcase/__tests__/step-editor.test.tsx +2 -2
  341. package/src/components/testcase/ai/generate-dialog.tsx +4 -4
  342. package/src/components/testcase/automation/artifact-diff.tsx +1 -1
  343. package/src/components/testcase/automation/artifact-panel.tsx +6 -6
  344. package/src/components/testcase/automation/verify-report.tsx +1 -1
  345. package/src/components/testcase/create-testcase-dialog.tsx +5 -5
  346. package/src/components/testcase/detail/case-detail-body.tsx +1 -1
  347. package/src/components/testcase/detail/properties.tsx +1 -1
  348. package/src/components/testcase/detail/story-link-editor.tsx +1 -1
  349. package/src/components/testcase/filters/index.tsx +2 -2
  350. package/src/components/testcase/folder-tree.tsx +2 -2
  351. package/src/components/testcase/generation/batch-actions.tsx +1 -1
  352. package/src/components/testcase/generation/draft-card.tsx +5 -5
  353. package/src/components/testcase/generation/review-layout.tsx +2 -2
  354. package/src/components/testcase/inline-editors/assignee-editor.tsx +1 -1
  355. package/src/components/testcase/list/case-row.tsx +1 -1
  356. package/src/components/testcase/list/grouped-list.tsx +1 -1
  357. package/src/components/testcase/list-view.tsx +1 -1
  358. package/src/components/testcase/peek-panel.tsx +4 -4
  359. package/src/components/testcase/plans/add-to-plan-bar.tsx +2 -2
  360. package/src/components/testcase/plans/add-to-plan-dialog.tsx +4 -4
  361. package/src/components/testcase/plans/create-plan-dialog.tsx +5 -5
  362. package/src/components/testcase/plans/plan-detail.tsx +7 -7
  363. package/src/components/testcase/plans/plan-list.tsx +3 -3
  364. package/src/components/testcase/plans/plan-state-badge.tsx +1 -1
  365. package/src/components/testcase/runs/case-checklist.tsx +3 -3
  366. package/src/components/testcase/runs/convert-bug-button.tsx +1 -1
  367. package/src/components/testcase/runs/failure-list.tsx +2 -2
  368. package/src/components/testcase/runs/pending-bugs.tsx +3 -3
  369. package/src/components/testcase/runs/run-header.tsx +1 -1
  370. package/src/components/testcase/runs/step-row.tsx +2 -2
  371. package/src/components/testcase/step-editor.tsx +2 -2
  372. package/src/components/testcase/table/table-view.tsx +1 -1
  373. package/src/components/testcase/testcase-toolbar.tsx +3 -3
  374. package/src/components/testcase/views/create-view-dialog.tsx +2 -2
  375. package/src/components/testcase/views/view-selector-button.tsx +2 -2
  376. package/src/components/testcase/views/view-switcher.tsx +1 -1
  377. package/src/components/tiptap/mindmap/mind-map-context-menu.tsx +1 -1
  378. package/src/components/tiptap/mindmap/mind-map-controls.tsx +2 -2
  379. package/src/components/tiptap/mindmap/mindmap-fullscreen-dialog.tsx +1 -1
  380. package/src/components/tiptap/notion-like/notion-like-editor-header.tsx +2 -2
  381. package/src/components/tiptap/ui/ai-menu/ai-menu.tsx +1 -1
  382. package/src/components/tiptap/ui/mention-dropdown-menu/mention-dropdown-menu.tsx +1 -1
  383. package/src/components/ui/__tests__/select.test.tsx +1 -1
  384. package/src/components/ui/button-group.tsx +1 -1
  385. package/src/components/ui/calendar.tsx +1 -1
  386. package/src/components/ui/command.tsx +2 -2
  387. package/src/components/ui/item.tsx +1 -1
  388. package/src/components/ui/message-scroller.tsx +1 -1
  389. package/src/components/ui/questionnaire.tsx +1 -1
  390. package/{allblue-ui/src → src/components}/ui/sidebar.tsx +1 -1
  391. package/src/components/workspace/__tests__/dialogs/create-workspace-dialog.test.tsx +3 -3
  392. package/src/components/workspace/__tests__/dialogs/delete-workspace-options.test.tsx +3 -3
  393. package/src/components/workspace/__tests__/dialogs/edit-workspace-dialog.test.tsx +3 -3
  394. package/src/components/workspace/__tests__/header/workspace-header.test.tsx +3 -3
  395. package/src/components/workspace/__tests__/kb/workspace-kb-card.test.tsx +2 -2
  396. package/src/components/workspace/__tests__/members/workspace-members-manager.test.tsx +5 -5
  397. package/src/components/workspace/__tests__/projects/workspace-project-list.test.tsx +2 -2
  398. package/src/components/workspace/dialogs/create-workspace-dialog.tsx +3 -3
  399. package/src/components/workspace/dialogs/delete-workspace-options.tsx +3 -3
  400. package/src/components/workspace/dialogs/edit-workspace-dialog.tsx +3 -3
  401. package/src/components/workspace/header/workspace-header.tsx +3 -3
  402. package/src/components/workspace/kb/workspace-kb-card.tsx +6 -6
  403. package/src/components/workspace/kb/workspace-kb-manage-dialog.tsx +5 -5
  404. package/src/components/workspace/kb/workspace-quick-doc-dialog.tsx +6 -6
  405. package/src/components/workspace/members/workspace-members-manager.tsx +6 -6
  406. package/src/components/workspace/projects/workspace-project-list.tsx +2 -2
  407. package/src/hooks/use-notifications.ts +1 -1
  408. package/src/lib/changelog/sdk-versions.ts +1 -1
  409. package/src/lib/collections/reference/bookmark-categories-collection.ts +1 -1
  410. package/src/lib/datetime.ts +209 -4
  411. package/src/lib/sanitize.ts +17 -19
  412. package/src/lib/toast-error.ts +1 -1
  413. package/src/providers/index.tsx +2 -2
  414. package/src/routes/__desktop/onboarding/route.lazy.tsx +6 -6
  415. package/src/routes/__root.tsx +2 -2
  416. package/src/routes/_login/forgot-password/route.lazy.tsx +1 -1
  417. package/src/routes/_login/login/route.lazy.tsx +4 -4
  418. package/src/routes/_login/register/route.lazy.tsx +2 -2
  419. package/src/routes/_login/reset-password/route.lazy.tsx +1 -1
  420. package/src/routes/_login/verify-email/route.lazy.tsx +1 -1
  421. package/src/routes/_nav/-components/nav-not-found.tsx +1 -1
  422. package/src/routes/_nav/bugs/$bugId/route.tsx +1 -1
  423. package/src/routes/_nav/dashboard/-components/activity-feed.tsx +1 -1
  424. package/src/routes/_nav/dashboard/-components/quick-actions.tsx +1 -1
  425. package/src/routes/_nav/dashboard/-components/stats-grid.tsx +1 -1
  426. package/src/routes/_nav/dashboard/route.lazy.tsx +1 -1
  427. package/src/routes/_nav/knowledge/$kbId/-components/knowledge-workspace-pending.tsx +1 -1
  428. package/src/routes/_nav/knowledge/$kbId/doc/$docId/route.tsx +1 -1
  429. package/src/routes/_nav/knowledge/$kbId/route.lazy.tsx +1 -1
  430. package/src/routes/_nav/knowledge/bookmarks/$id.lazy.tsx +12 -12
  431. package/src/routes/_nav/knowledge/bookmarks/index.lazy.tsx +11 -11
  432. package/src/routes/_nav/knowledge/compliance/$id.lazy.tsx +12 -12
  433. package/src/routes/_nav/knowledge/compliance/edit/$id.lazy.tsx +1 -1
  434. package/src/routes/_nav/knowledge/compliance/index.lazy.tsx +8 -8
  435. package/src/routes/_nav/knowledge/dictionaries/$id.lazy.tsx +7 -7
  436. package/src/routes/_nav/knowledge/dictionaries/index.lazy.tsx +6 -6
  437. package/src/routes/_nav/knowledge/index.lazy.tsx +6 -6
  438. package/src/routes/_nav/knowledge/laws/$id.lazy.tsx +12 -12
  439. package/src/routes/_nav/knowledge/laws/edit/$id.lazy.tsx +1 -1
  440. package/src/routes/_nav/knowledge/laws/index.lazy.tsx +9 -9
  441. package/src/routes/_nav/knowledge/summary/index.lazy.tsx +1 -1
  442. package/src/routes/_nav/projects/$projectId/$storyId/route.lazy.tsx +2 -2
  443. package/src/routes/_nav/projects/$projectId/index.lazy.tsx +1 -1
  444. package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy.tsx +5 -5
  445. package/src/routes/_nav/projects/$projectId/iterations/index.lazy.tsx +1 -1
  446. package/src/routes/_nav/projects/$projectId/settings/route.lazy.tsx +8 -8
  447. package/src/routes/_nav/settings/ai/hosted/route.lazy.tsx +2 -2
  448. package/src/routes/_nav/settings/ai/index/route.lazy.tsx +1 -1
  449. package/src/routes/_nav/settings/billing/route.lazy.tsx +1 -1
  450. package/src/routes/_nav/settings/connection/route.lazy.tsx +3 -3
  451. package/src/routes/_nav/settings/general/route.lazy.tsx +3 -3
  452. package/src/routes/_nav/settings/privacy/route.lazy.tsx +5 -5
  453. package/src/routes/_nav/settings/route.tsx +1 -1
  454. package/src/routes/_nav/stories/-components/story-detail-skeleton.tsx +1 -1
  455. package/src/routes/_nav/test-cases/$caseId/route.tsx +1 -1
  456. package/src/routes/_nav/test-cases/generation/$generationId/route.tsx +1 -1
  457. package/src/routes/_nav/test-cases/plans/$planId/route.tsx +1 -1
  458. package/src/routes/_nav/test-cases/runs/$runId/route.tsx +1 -1
  459. package/src/routes/_nav/workspaces/$workspaceId/activities/route.lazy.tsx +1 -1
  460. package/src/routes/_nav/workspaces/$workspaceId/settings/route.lazy.tsx +6 -6
  461. package/src/routes/_nav/workspaces/index.lazy.tsx +5 -5
  462. package/src/routes/api/knowledge/sync-github.ts +1 -1
  463. package/src/routes/invite/$token/route.lazy.tsx +2 -2
  464. package/src/routes/share/compliance/$id/route.lazy.tsx +5 -5
  465. package/src/routes/share/compliance/$id/route.tsx +1 -1
  466. package/src/routes/share/law/$id/route.lazy.tsx +5 -5
  467. package/src/routes/share/law/$id/route.tsx +1 -1
  468. package/src/server/__tests__/agent-client-graph.test.ts +1 -1
  469. package/src/server/serverFns/__tests__/read-write-merge.test.ts +2 -2
  470. package/src/server/serverFns/{knowledge/public → knowledge-public}/bookmarks/create.ts +3 -3
  471. package/src/server/serverFns/{knowledge/public → knowledge-public}/bookmarks/detail.ts +1 -1
  472. package/src/server/serverFns/{knowledge/public → knowledge-public}/bookmarks/list.ts +1 -1
  473. package/src/server/serverFns/{knowledge/public → knowledge-public}/bookmarks/refresh-favicon.ts +1 -1
  474. package/src/server/serverFns/{knowledge/public → knowledge-public}/bookmarks/share.ts +1 -1
  475. package/src/server/serverFns/{knowledge/public → knowledge-public}/bookmarks/sync-github.ts +1 -1
  476. package/src/server/serverFns/{knowledge/public → knowledge-public}/bookmarks/update.ts +3 -3
  477. package/src/server/serverFns/{knowledge/public → knowledge-public}/compliance/create.ts +1 -1
  478. package/src/server/serverFns/{knowledge/public → knowledge-public}/compliance/detail.ts +1 -1
  479. package/src/server/serverFns/{knowledge/public → knowledge-public}/compliance/list.ts +1 -1
  480. package/src/server/serverFns/{knowledge/public → knowledge-public}/compliance/share.ts +1 -1
  481. package/src/server/serverFns/{knowledge/public → knowledge-public}/compliance/update.ts +1 -1
  482. package/src/server/serverFns/{knowledge/public → knowledge-public}/dictionary/create.ts +1 -1
  483. package/src/server/serverFns/{knowledge/public → knowledge-public}/dictionary/detail.ts +1 -1
  484. package/src/server/serverFns/{knowledge/public → knowledge-public}/dictionary/list.ts +1 -1
  485. package/src/server/serverFns/{knowledge/public → knowledge-public}/dictionary/share.ts +1 -1
  486. package/src/server/serverFns/{knowledge/public → knowledge-public}/dictionary/update.ts +1 -1
  487. package/src/server/serverFns/{knowledge/public → knowledge-public}/legal/create.ts +1 -1
  488. package/src/server/serverFns/{knowledge/public → knowledge-public}/legal/detail.ts +1 -1
  489. package/src/server/serverFns/{knowledge/public → knowledge-public}/legal/list.ts +1 -1
  490. package/src/server/serverFns/{knowledge/public → knowledge-public}/legal/share.ts +1 -1
  491. package/src/server/serverFns/{knowledge/public → knowledge-public}/legal/update.ts +1 -1
  492. package/src/start.ts +1 -1
  493. package/src/styles/globals.css +0 -1
  494. package/allblue-ui/package.json +0 -6
  495. package/allblue-ui/src/components/notion-avatar.tsx +0 -126
  496. package/allblue-ui/src/components/user-avatar.tsx +0 -82
  497. package/allblue-ui/src/data-table/data-table-pagination.tsx +0 -121
  498. package/allblue-ui/src/data-table/data-table.tsx +0 -218
  499. package/allblue-ui/src/data-table/table-detail-layout.tsx +0 -97
  500. package/allblue-ui/src/index.ts +0 -31
  501. package/allblue-ui/src/lib/avatar.ts +0 -41
  502. package/allblue-ui/src/lib/datetime.ts +0 -226
  503. package/allblue-ui/src/lib/sanitize.ts +0 -18
  504. package/allblue-ui/src/lib/utils.ts +0 -1
  505. /package/{allblue-ui/src → src}/components/infinite-scroll-sentinel.tsx +0 -0
  506. /package/src/components/{knowledge/public → knowledge-public}/category-icon.tsx +0 -0
  507. /package/src/components/{knowledge/public → knowledge-public}/chip-utils.ts +0 -0
  508. /package/src/components/{knowledge/public → knowledge-public}/knowledge-card-grid.tsx +0 -0
  509. /package/src/components/{knowledge/public → knowledge-public}/knowledge-filters.tsx +0 -0
  510. /package/src/components/{knowledge/public → knowledge-public}/markdown-view.tsx +0 -0
  511. /package/src/components/{knowledge/public → knowledge-public}/tag-filter.tsx +0 -0
  512. /package/{allblue-ui/src → src/components}/ui/alert-dialog.tsx +0 -0
  513. /package/{allblue-ui/src → src/components}/ui/alert.tsx +0 -0
  514. /package/{allblue-ui/src → src/components}/ui/avatar.tsx +0 -0
  515. /package/{allblue-ui/src → src/components}/ui/badge.tsx +0 -0
  516. /package/{allblue-ui/src → src/components}/ui/button.tsx +0 -0
  517. /package/{allblue-ui/src → src/components}/ui/card.tsx +0 -0
  518. /package/{allblue-ui/src → src/components}/ui/checkbox.tsx +0 -0
  519. /package/{allblue-ui/src → src/components}/ui/collapsible.tsx +0 -0
  520. /package/{allblue-ui/src → src/components}/ui/dialog.tsx +0 -0
  521. /package/{allblue-ui/src → src/components}/ui/dropdown-menu.tsx +0 -0
  522. /package/{allblue-ui/src → src/components}/ui/field.tsx +0 -0
  523. /package/{allblue-ui/src → src/components}/ui/input-group.tsx +0 -0
  524. /package/{allblue-ui/src → src/components}/ui/input.tsx +0 -0
  525. /package/{allblue-ui/src → src/components}/ui/label.tsx +0 -0
  526. /package/{allblue-ui/src → src/components}/ui/pagination.tsx +0 -0
  527. /package/{allblue-ui/src → src/components}/ui/select.tsx +0 -0
  528. /package/{allblue-ui/src → src/components}/ui/separator.tsx +0 -0
  529. /package/{allblue-ui/src → src/components}/ui/sheet.tsx +0 -0
  530. /package/{allblue-ui/src → src/components}/ui/skeleton.tsx +0 -0
  531. /package/{allblue-ui/src → src/components}/ui/switch.tsx +0 -0
  532. /package/{allblue-ui/src → src/components}/ui/table.tsx +0 -0
  533. /package/{allblue-ui/src → src/components}/ui/textarea.tsx +0 -0
  534. /package/{allblue-ui/src → src/components}/ui/toast.tsx +0 -0
  535. /package/{allblue-ui/src → src/components}/ui/tooltip.tsx +0 -0
  536. /package/{allblue-ui/src → src}/hooks/use-load-more.ts +0 -0
  537. /package/{allblue-ui/src → src}/hooks/use-mobile.ts +0 -0
  538. /package/src/server/{knowledge/public → knowledge-public}/canonical-id.ts +0 -0
  539. /package/src/server/{knowledge/public → knowledge-public}/favicon.ts +0 -0
  540. /package/src/server/{knowledge/public → knowledge-public}/github-sync.ts +0 -0
  541. /package/src/server/{knowledge/public → knowledge-public}/share-merge.ts +0 -0
  542. /package/src/server/serverFns/{knowledge/public → knowledge-public}/bookmarks/categories.ts +0 -0
  543. /package/src/server/serverFns/{knowledge/public → knowledge-public}/bookmarks/delete.ts +0 -0
  544. /package/src/server/serverFns/{knowledge/public → knowledge-public}/bookmarks/favorite.ts +0 -0
  545. /package/src/server/serverFns/{knowledge/public → knowledge-public}/bookmarks/unshare.ts +0 -0
  546. /package/src/server/serverFns/{knowledge/public → knowledge-public}/compliance/delete.ts +0 -0
  547. /package/src/server/serverFns/{knowledge/public → knowledge-public}/compliance/public.ts +0 -0
  548. /package/src/server/serverFns/{knowledge/public → knowledge-public}/compliance/unshare.ts +0 -0
  549. /package/src/server/serverFns/{knowledge/public → knowledge-public}/dictionary/delete.ts +0 -0
  550. /package/src/server/serverFns/{knowledge/public → knowledge-public}/dictionary/unshare.ts +0 -0
  551. /package/src/server/serverFns/{knowledge/public → knowledge-public}/entity-tags.ts +0 -0
  552. /package/src/server/serverFns/{knowledge/public → knowledge-public}/favorite.ts +0 -0
  553. /package/src/server/serverFns/{knowledge/public → knowledge-public}/legal/delete.ts +0 -0
  554. /package/src/server/serverFns/{knowledge/public → knowledge-public}/legal/public.ts +0 -0
  555. /package/src/server/serverFns/{knowledge/public → knowledge-public}/legal/unshare.ts +0 -0
@@ -1,218 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // AllBlue - 理想之海
3
- // Copyright (C) 2026 AllBlue Contributors
4
- //
5
- // This program is free software: you can redistribute it and/or modify
6
- // it under the terms of the GNU Affero General Public License as published by
7
- // the Free Software Foundation, either version 3 of the License, or
8
- // (at your option) any later version.
9
- //
10
- // This program is distributed in the hope that it will be useful,
11
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- // GNU Affero General Public License for more details.
14
- //
15
- // You should have received a copy of the GNU Affero General Public License
16
- // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
-
18
- import type { CSSProperties } from 'react'
19
- import { useRef } from 'react'
20
- import {
21
- type ColumnDef,
22
- type RowData,
23
- columnVisibilityFeature,
24
- flexRender,
25
- tableFeatures,
26
- useTable,
27
- } from '@tanstack/react-table'
28
- import { useVirtualizer } from '@tanstack/react-virtual'
29
- import {
30
- Table,
31
- TableBody,
32
- TableCell,
33
- TableHead,
34
- TableHeader,
35
- TableRow,
36
- } from '../ui/table'
37
- import { VIRTUALIZE_THRESHOLD } from '@allbluecn/kernel'
38
-
39
- export const dataTableFeatures = tableFeatures({
40
- columnVisibilityFeature,
41
- })
42
-
43
- export type AdminColumnDef<
44
- TData extends RowData,
45
- TValue = unknown,
46
- > = ColumnDef<typeof dataTableFeatures, TData, TValue> & {
47
- meta?: { style?: CSSProperties }
48
- }
49
-
50
- export interface DataTableProps<TData extends RowData> {
51
- columns: AdminColumnDef<TData>[];
52
- data: TData[];
53
- onRowClick?: (row: TData) => void;
54
- actions?: React.ReactNode;
55
- }
56
-
57
- const ROW_HEIGHT = 48
58
-
59
- function ColGroup({ columns }: { columns: AdminColumnDef<any>[] }) {
60
- return (
61
- <colgroup>
62
- {columns.map((col, i) => {
63
- const style = (col.meta as { style?: CSSProperties } | undefined)?.style
64
- const width = style?.width
65
- return width != null ? <col key={i} style={{ width }} /> : null
66
- })}
67
- </colgroup>
68
- )
69
- }
70
-
71
- export function DataTable<TData extends RowData>({
72
- columns,
73
- data,
74
- onRowClick,
75
- actions,
76
- }: DataTableProps<TData>) {
77
- const table = useTable({
78
- features: dataTableFeatures,
79
- data,
80
- columns,
81
- });
82
-
83
- const { rows } = table.getRowModel();
84
- const parentRef = useRef<HTMLDivElement>(null);
85
-
86
- const shouldVirtualize = rows.length > VIRTUALIZE_THRESHOLD;
87
-
88
- const rowVirtualizer = useVirtualizer({
89
- count: shouldVirtualize ? rows.length : 0,
90
- getScrollElement: () => parentRef.current,
91
- estimateSize: () => ROW_HEIGHT,
92
- overscan: 10,
93
- enabled: shouldVirtualize,
94
- });
95
-
96
- const virtualRows = shouldVirtualize ? rowVirtualizer.getVirtualItems() : [];
97
- const totalHeight = shouldVirtualize ? rowVirtualizer.getTotalSize() : 0;
98
- const paddingTop = virtualRows.length > 0 ? virtualRows[0].start : 0;
99
- const paddingBottom =
100
- virtualRows.length > 0
101
- ? totalHeight - virtualRows[virtualRows.length - 1].end
102
- : 0;
103
-
104
- const headerGroups = table.getHeaderGroups();
105
-
106
- const renderRows = () => {
107
- if (!shouldVirtualize) {
108
- return rows.map((row) => (
109
- <TableRow
110
- key={row.id}
111
- className={onRowClick ? 'cursor-pointer' : undefined}
112
- onClick={() => onRowClick?.(row.original)}
113
- >
114
- {row.getVisibleCells().map((cell) => {
115
- const style = (cell.column.columnDef.meta as
116
- | { style?: CSSProperties }
117
- | undefined)?.style
118
- const alignClass =
119
- style?.textAlign === 'right' ? 'text-right' : undefined
120
- return (
121
- <TableCell
122
- key={cell.id}
123
- className={alignClass}
124
- style={{ width: style?.width }}
125
- >
126
- {flexRender(cell.column.columnDef.cell, cell.getContext())}
127
- </TableCell>
128
- )
129
- })}
130
- </TableRow>
131
- ))
132
- }
133
-
134
- return (
135
- <>
136
- {paddingTop > 0 && <tr style={{ height: paddingTop }} />}
137
- {virtualRows.map((virtualRow) => {
138
- const row = rows[virtualRow.index]
139
- return (
140
- <TableRow
141
- key={row.id}
142
- style={{
143
- position: 'absolute',
144
- transform: `translateY(${virtualRow.start}px)`,
145
- height: ROW_HEIGHT,
146
- }}
147
- className={onRowClick ? 'cursor-pointer' : undefined}
148
- onClick={() => onRowClick?.(row.original)}
149
- >
150
- {row.getVisibleCells().map((cell) => {
151
- const style = (cell.column.columnDef.meta as
152
- | { style?: CSSProperties }
153
- | undefined)?.style
154
- const alignClass =
155
- style?.textAlign === 'right' ? 'text-right' : undefined
156
- return (
157
- <TableCell
158
- key={cell.id}
159
- className={alignClass}
160
- style={{ width: style?.width }}
161
- >
162
- {flexRender(cell.column.columnDef.cell, cell.getContext())}
163
- </TableCell>
164
- )
165
- })}
166
- </TableRow>
167
- )
168
- })}
169
- {paddingBottom > 0 && <tr style={{ height: paddingBottom }} />}
170
- </>
171
- );
172
- };
173
-
174
- return (
175
- <div className="rounded-md border flex flex-col min-h-0 flex-1 overflow-x-hidden">
176
- <div className="shrink-0">
177
- <Table className="table-fixed">
178
- <ColGroup columns={columns} />
179
- <TableHeader>
180
- {headerGroups.map((headerGroup) => (
181
- <TableRow key={headerGroup.id}>
182
- {headerGroup.headers.map((header) => {
183
- const style = (
184
- header.column.columnDef.meta as
185
- | { style?: CSSProperties }
186
- | undefined
187
- )?.style
188
- const alignClass =
189
- style?.textAlign === 'right' ? 'text-right' : undefined
190
- return (
191
- <TableHead
192
- key={header.id}
193
- className={alignClass}
194
- style={{ width: style?.width }}
195
- >
196
- {header.isPlaceholder
197
- ? null
198
- : flexRender(header.column.columnDef.header, header.getContext())}
199
- </TableHead>
200
- )
201
- })}
202
- </TableRow>
203
- ))}
204
- </TableHeader>
205
- </Table>
206
- </div>
207
- <div ref={parentRef} className="overflow-y-auto flex-1 min-h-0">
208
- <div style={{ position: "relative", height: shouldVirtualize ? totalHeight : undefined }}>
209
- <Table className="table-fixed">
210
- <ColGroup columns={columns} />
211
- <TableBody>{renderRows()}</TableBody>
212
- </Table>
213
- </div>
214
- </div>
215
- {actions && <div className="shrink-0 border-t">{actions}</div>}
216
- </div>
217
- );
218
- }
@@ -1,97 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // AllBlue - 理想之海
3
- // Copyright (C) 2026 AllBlue Contributors
4
- //
5
- // This program is free software: you can redistribute it and/or modify
6
- // it under the terms of the GNU Affero General Public License as published by
7
- // the Free Software Foundation, either version 3 of the License, or
8
- // (at your option) any later version.
9
- //
10
- // This program is distributed in the hope that it will be useful,
11
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- // GNU Affero General Public License for more details.
14
- //
15
- // You should have received a copy of the GNU Affero General Public License
16
- // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
-
18
- import { useNavigate } from "@tanstack/react-router";
19
- import { Button } from "../ui/button";
20
- import { Skeleton } from "../ui/skeleton";
21
- import { ArrowLeftIcon } from "lucide-react";
22
-
23
- interface TableDetailLayoutProps {
24
- backHref: string;
25
- // i18n 由消费方注入(包内不依赖 @/paraglide),原 admin 实现默认回退文案由调用方显式传入
26
- backLabel: string;
27
- title: string;
28
- subtitle?: string;
29
- avatar?: React.ReactNode;
30
- badges?: React.ReactNode;
31
- actions?: React.ReactNode;
32
- loading?: boolean;
33
- children: React.ReactNode;
34
- }
35
-
36
- export function TableDetailLayout({
37
- backHref,
38
- backLabel,
39
- title,
40
- subtitle,
41
- avatar,
42
- badges,
43
- actions,
44
- loading,
45
- children,
46
- }: TableDetailLayoutProps) {
47
- const navigate = useNavigate();
48
-
49
- if (loading) {
50
- return (
51
- <div className="p-6 space-y-6">
52
- <Skeleton className="h-8 w-24" />
53
- <div className="flex items-center gap-4">
54
- <Skeleton className="h-12 w-12 rounded-full" />
55
- <div className="space-y-2">
56
- <Skeleton className="h-6 w-40" />
57
- <Skeleton className="h-4 w-60" />
58
- </div>
59
- </div>
60
- <Skeleton className="h-64 w-full" />
61
- </div>
62
- );
63
- }
64
-
65
- return (
66
- <div>
67
- <div className="sticky top-0 z-10 bg-background border-b px-6 py-2.5">
68
- <Button
69
- variant="ghost"
70
- size="sm"
71
- onClick={() => navigate({ to: backHref })}
72
- className="gap-1.5 text-muted-foreground hover:text-foreground"
73
- >
74
- <ArrowLeftIcon className="h-4 w-4" />
75
- {backLabel}
76
- </Button>
77
- </div>
78
- <div className="p-6 pt-4 space-y-6">
79
- <div className="flex items-start justify-between">
80
- <div className="flex items-center gap-4">
81
- {avatar}
82
- <div>
83
- <div className="flex items-center gap-2">
84
- <h1 className="text-2xl font-bold">{title}</h1>
85
- {badges}
86
- </div>
87
- {subtitle && <p className="text-muted-foreground mt-1">{subtitle}</p>}
88
- </div>
89
- </div>
90
- {actions && <div className="flex gap-2">{actions}</div>}
91
- </div>
92
-
93
- {children}
94
- </div>
95
- </div>
96
- );
97
- }
@@ -1,31 +0,0 @@
1
- export * from "./ui/alert"
2
- export * from "./ui/alert-dialog"
3
- export * from "./ui/avatar"
4
- export * from "./ui/badge"
5
- export * from "./ui/button"
6
- export * from "./ui/card"
7
- export * from "./ui/checkbox"
8
- export * from "./ui/collapsible"
9
- export * from "./ui/dialog"
10
- export * from "./ui/dropdown-menu"
11
- export * from "./ui/field"
12
- export * from "./ui/input"
13
- export * from "./ui/input-group"
14
- export * from "./ui/label"
15
- export * from "./ui/pagination"
16
- export * from "./ui/select"
17
- export * from "./ui/separator"
18
- export * from "./ui/sheet"
19
- export * from "./ui/sidebar"
20
- export * from "./ui/skeleton"
21
- export * from "./ui/switch"
22
- export * from "./ui/table"
23
- export * from "./ui/textarea"
24
- export * from "./ui/toast"
25
- export * from "./ui/tooltip"
26
- export { ConfirmDialog, type ConfirmDialogProps } from "./components/confirm-dialog"
27
- export { InfiniteScrollSentinel } from "./components/infinite-scroll-sentinel"
28
- export { useLoadMore } from "./hooks/use-load-more"
29
- export { useIsMobile } from "./hooks/use-mobile"
30
- export { getBoringAvatarUrl, getAvatarFallback, type AvatarOptions } from "./lib/avatar"
31
- export { cn } from "./lib/utils"
@@ -1,41 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // AllBlue - 理想之海
3
- // Copyright (C) 2026 AllBlue Contributors
4
- //
5
- // This program is free software: you can redistribute it and/or modify
6
- // it under the terms of the GNU Affero General Public License as published by
7
- // the Free Software Foundation, either version 3 of the License, or
8
- // (at your option) any later version.
9
- //
10
- // This program is distributed in the hope that it will be useful,
11
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- // GNU Affero General Public License for more details.
14
- //
15
- // You should have received a copy of the GNU Affero General Public License
16
- // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
-
18
- const DICE_BEAR_BASE = "https://api.dicebear.com/7.x";
19
-
20
- const DICE_BEAR_STYLES = ["avataaars", "micah", "notionists", "lorelei", "adventurer"] as const;
21
-
22
- type DiceBearStyle = (typeof DICE_BEAR_STYLES)[number];
23
-
24
- export interface AvatarOptions {
25
- style?: DiceBearStyle;
26
- size?: number;
27
- square?: boolean;
28
- }
29
-
30
- export function getBoringAvatarUrl(
31
- seed: string,
32
- options: AvatarOptions = {}
33
- ): string {
34
- const { style = "avataaars", size = 80 } = options;
35
-
36
- return `${DICE_BEAR_BASE}/${style}/svg?seed=${encodeURIComponent(seed)}&size=${size}`;
37
- }
38
-
39
- export function getAvatarFallback(name: string): string {
40
- return name.charAt(0).toUpperCase();
41
- }
@@ -1,226 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // AllBlue - 理想之海
3
- // Copyright (C) 2026 AllBlue Contributors
4
- //
5
- // This program is free software: you can redistribute it and/or modify
6
- // it under the terms of the GNU Affero General Public License as published by
7
- // the Free Software Foundation, either version 3 of the License, or
8
- // (at your option) any later version.
9
- //
10
- // This program is distributed in the hope that it will be useful,
11
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- // GNU Affero General Public License for more details.
14
- //
15
- // You should have received a copy of the GNU Affero General Public License
16
- // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
-
18
- import { formatInTimeZone, toZonedTime, fromZonedTime } from 'date-fns-tz'
19
- import { startOfDay, subDays } from 'date-fns'
20
-
21
- const FALLBACK_TIMEZONE = 'Asia/Shanghai'
22
-
23
- /**
24
- * 解析生效时区:项目时区 > 用户时区 > 浏览器时区 > Asia/Shanghai
25
- */
26
- export function resolveTimezone(
27
- projectTz?: string | null,
28
- userTz?: string | null,
29
- ): string {
30
- const browserTz =
31
- typeof Intl !== 'undefined'
32
- ? Intl.DateTimeFormat().resolvedOptions().timeZone
33
- : FALLBACK_TIMEZONE
34
- return projectTz || userTz || browserTz || FALLBACK_TIMEZONE
35
- }
36
-
37
- /**
38
- * 时区感知的时间格式化。
39
- * @param date UTC Date 对象(来自 DB)
40
- * @param timezone IANA 时区,如 "Asia/Shanghai"
41
- * @param fmt date-fns 格式,默认 "yyyy-MM-dd HH:mm"
42
- */
43
- export function formatDate(
44
- date: Date,
45
- timezone: string,
46
- fmt = 'yyyy-MM-dd HH:mm',
47
- ): string {
48
- try {
49
- return formatInTimeZone(date, timezone, fmt)
50
- } catch {
51
- return formatInTimeZone(date, FALLBACK_TIMEZONE, fmt)
52
- }
53
- }
54
-
55
- /**
56
- * 确定性时间戳格式化:固定时区 + date-fns 数字格式,不依赖运行环境 locale/时区。
57
- * SSR 与客户端输出字节级一致,专治 toLocaleString() 引发的 hydration mismatch。
58
- * @param date Date 对象或 ISO 字符串
59
- * @param fmt date-fns 格式,默认 "yyyy-MM-dd HH:mm"
60
- */
61
- export function formatTimestamp(
62
- date: Date | string,
63
- fmt = 'yyyy-MM-dd HH:mm',
64
- ): string {
65
- const d = typeof date === 'string' ? new Date(date) : date
66
- if (Number.isNaN(d.getTime())) return '-'
67
- return formatDate(d, FALLBACK_TIMEZONE, fmt)
68
- }
69
-
70
- /**
71
- * 相对时间(今天/昨天/具体日期),基于时区计算「今天的 0 点」。
72
- * @param now 当前时间(测试注入;生产用默认 new Date())
73
- */
74
- export function formatRelative(
75
- date: Date,
76
- timezone: string,
77
- now: Date = new Date(),
78
- ): string {
79
- try {
80
- const todayStart = startOfDayInTimeZone(now, timezone)
81
- const yesterdayStart = new Date(todayStart)
82
- yesterdayStart.setDate(yesterdayStart.getDate() - 1)
83
-
84
- const dateStart = startOfDayInTimeZone(date, timezone)
85
-
86
- if (dateStart.getTime() === todayStart.getTime()) return '今天'
87
- if (dateStart.getTime() === yesterdayStart.getTime()) return '昨天'
88
- return formatInTimeZone(date, timezone, 'yyyy-MM-dd')
89
- } catch {
90
- return formatInTimeZone(date, FALLBACK_TIMEZONE, 'yyyy-MM-dd')
91
- }
92
- }
93
-
94
- /**
95
- * 获取指定时区下某天的 0 点(UTC Date 对象)。
96
- */
97
- function startOfDayInTimeZone(date: Date, timezone: string): Date {
98
- const zoned = toZonedTime(date, timezone)
99
- const dayStart = startOfDay(zoned)
100
- return fromZonedTime(dayStart, timezone)
101
- }
102
-
103
- /**
104
- * 对话历史日期分组标签(今天/昨天/本周/具体日期)。
105
- * @param date UTC Date 对象
106
- * @param timezone IANA 时区
107
- */
108
- export function formatChatDate(date: Date, timezone: string): string {
109
- try {
110
- const now = new Date()
111
- const todayStart = startOfDayInTimeZone(now, timezone)
112
- const yesterdayStart = subDays(todayStart, 1)
113
- const weekStart = subDays(todayStart, 7)
114
-
115
- const dateStart = startOfDayInTimeZone(date, timezone)
116
-
117
- if (dateStart.getTime() === todayStart.getTime()) return '今天'
118
- if (dateStart.getTime() === yesterdayStart.getTime()) return '昨天'
119
- if (dateStart.getTime() >= weekStart.getTime()) return '本周'
120
-
121
- const currentYear = Number(formatInTimeZone(now, timezone, 'yyyy'))
122
- const dateYear = Number(formatInTimeZone(date, timezone, 'yyyy'))
123
- if (dateYear === currentYear) {
124
- return formatInTimeZone(date, timezone, 'M月d日')
125
- }
126
- return formatInTimeZone(date, timezone, 'yyyy年M月d日')
127
- } catch {
128
- return formatInTimeZone(date, FALLBACK_TIMEZONE, 'yyyy-MM-dd')
129
- }
130
- }
131
-
132
-
133
- // ---- 本地日历工具(自 lib/date-utils.ts 并入:按本地时区做日历网格/日键计算,无时区转换) ----
134
-
135
- /** 解析 "yyyy-MM-dd" 前缀为本地 Date(避免 UTC 偏移) */
136
- export function parseDate(s: string): Date {
137
- const datePart = s.slice(0, 10)
138
- const [y, m, d] = datePart.split('-').map(Number)
139
- return new Date(y, m - 1, d)
140
- }
141
-
142
- /** 本地时区 yyyy-MM-dd 日键(与 timezone 版 formatDate 区分) */
143
- export function formatDateLocal(d: Date): string {
144
- const y = d.getFullYear()
145
- const m = String(d.getMonth() + 1).padStart(2, '0')
146
- const day = String(d.getDate()).padStart(2, '0')
147
- return `${y}-${m}-${day}`
148
- }
149
-
150
- export function isSameDay(a: Date, b: Date): boolean {
151
- return (
152
- a.getFullYear() === b.getFullYear() &&
153
- a.getMonth() === b.getMonth() &&
154
- a.getDate() === b.getDate()
155
- )
156
- }
157
-
158
- export function getMonthGrid(
159
- year: number,
160
- month: number,
161
- ): Array<{ date: Date; inMonth: boolean }> {
162
- const firstDay = new Date(year, month, 1)
163
- const startOffset = firstDay.getDay() // 周日=0
164
- const gridStart = new Date(year, month, 1 - startOffset)
165
- const result: Array<{ date: Date; inMonth: boolean }> = []
166
- for (let i = 0; i < 42; i++) {
167
- const date = new Date(gridStart)
168
- date.setDate(gridStart.getDate() + i)
169
- result.push({ date, inMonth: date.getMonth() === month })
170
- }
171
- return result
172
- }
173
-
174
- export function getWeekGrid(
175
- year: number,
176
- month: number,
177
- day: number,
178
- ): Array<{ date: Date; inMonth: boolean }> {
179
- const anchor = new Date(year, month, day)
180
- const startOffset = anchor.getDay()
181
- const gridStart = new Date(year, month, day - startOffset)
182
- const result: Array<{ date: Date; inMonth: boolean }> = []
183
- for (let i = 0; i < 7; i++) {
184
- const date = new Date(gridStart)
185
- date.setDate(gridStart.getDate() + i)
186
- result.push({ date, inMonth: date.getMonth() === month })
187
- }
188
- return result
189
- }
190
-
191
- export function buildTimelineRange(
192
- start: Date,
193
- end: Date,
194
- mode: 'month' | 'week',
195
- ): Array<{ start: Date; label: string }> {
196
- const ticks: Array<{ start: Date; label: string }> = []
197
- const cursor = new Date(start.getFullYear(), start.getMonth(), 1)
198
- const endDate = new Date(end.getFullYear(), end.getMonth(), 1)
199
- while (cursor <= endDate) {
200
- const label =
201
- mode === 'month'
202
- ? `${cursor.getFullYear()}-${String(cursor.getMonth() + 1).padStart(2, '0')}`
203
- : `${cursor.getFullYear()}-${String(cursor.getMonth() + 1).padStart(2, '0')}-${String(cursor.getDate()).padStart(2, '0')}`
204
- ticks.push({ start: new Date(cursor), label })
205
- if (mode === 'month') cursor.setMonth(cursor.getMonth() + 1)
206
- else cursor.setDate(cursor.getDate() + 7)
207
- }
208
- return ticks
209
- }
210
-
211
- export function getRangeFromDates(dates: Date[]): { start: Date; end: Date } {
212
- if (dates.length === 0) {
213
- const now = new Date()
214
- return {
215
- start: new Date(now.getFullYear(), now.getMonth(), 1),
216
- end: new Date(now.getFullYear(), now.getMonth() + 2, 0),
217
- }
218
- }
219
- const times = dates.map((d) => d.getTime())
220
- const min = new Date(Math.min(...times))
221
- const max = new Date(Math.max(...times))
222
- return {
223
- start: new Date(min.getFullYear(), min.getMonth() - 1, 1),
224
- end: new Date(max.getFullYear(), max.getMonth() + 1, 0),
225
- }
226
- }
@@ -1,18 +0,0 @@
1
- import DOMPurify from 'isomorphic-dompurify'
2
-
3
- // HTML 清理:默认配置(html + svg + mathMl profile 均启用),
4
- // 覆盖富文本 diff、附件预览等 7 处 HTML 渲染场景。
5
- export function sanitize(html: string): string {
6
- return DOMPurify.sanitize(html)
7
- }
8
-
9
- // SVG 清理:头像渲染(NotionAvatar)专用。
10
- // 显式复用默认配置——DOMPurify 默认 profile 已包含 SVG 滤镜元素
11
- // (<defs>/<filter>/<feMorphology>/<feFlood>/<feComposite>/<feMerge>/<feMergeNode>),
12
- // 同时清除 <script>/on*/javascript: 等 XSS 载荷。
13
- // 禁止改成 USE_PROFILES: { svg: true }——严格 SVG profile 会移除全部 fe* 滤镜元素,
14
- // 头像轮廓辉光(feMorphology+feFlood+feComposite+feMerge)会失效渲染白屏。
15
- // 结构完整性由 __tests__/security/xss-sanitize.test.ts 的双向断言锁定。
16
- export function sanitizeSvg(svg: string): string {
17
- return DOMPurify.sanitize(svg)
18
- }
@@ -1 +0,0 @@
1
- export { cn } from "cn"
File without changes
File without changes
File without changes
File without changes