@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.
- package/package.json +12 -10
- package/public/favicon.ico +0 -0
- package/src/__tests__/paraglide.test.ts +43 -0
- package/src/__tests__/setup.ts +27 -9
- package/src/assets/illustrations/empty-states/workspace-empty.svg +5 -0
- package/src/assets/illustrations/knowledge/law-card-illustration.svg +5 -0
- package/src/assets/logo/logo.tsx +53 -36
- package/src/components/agents/agent-card.tsx +7 -7
- package/src/components/agents/agent-form-dialog.tsx +41 -42
- package/src/components/agents/agent-selector.tsx +6 -8
- package/src/components/agents/agents-page.tsx +26 -28
- package/src/components/agents/skill-card.tsx +1 -4
- package/src/components/agents/skill-form-dialog.tsx +19 -21
- package/src/components/agents/slash-skill-menu.tsx +5 -7
- package/src/components/agents/use-agent-handlers.ts +5 -8
- package/src/components/ai/ai-chat-prompt.tsx +26 -33
- package/src/components/ai/global-chat-panel.tsx +10 -11
- package/src/components/ai/use-knowledge-bases.ts +2 -2
- package/src/components/anyhub/anyhub-app-card.tsx +13 -15
- package/src/components/anyhub/anyhub-app-runner.tsx +5 -7
- package/src/components/anyhub/anyhub-install-dialog.tsx +16 -18
- package/src/components/anyhub/anyhub-management-view.tsx +9 -11
- package/src/components/anyhub/anyhub-marketplace-view.tsx +14 -17
- package/src/components/anyhub/anyhub-permission-panel.tsx +8 -11
- package/src/components/anyhub/anyhub-provider.tsx +0 -1
- package/src/components/anyhub/anyhub-top-nav.tsx +5 -8
- package/src/components/auth/auth-header.tsx +2 -2
- package/src/components/auth/icon-input.tsx +0 -1
- package/src/components/auth/oauth-section.tsx +3 -5
- package/src/components/auth/password-input.tsx +2 -4
- package/src/components/auth/session-guard.tsx +0 -1
- package/src/components/auth/sso-section.tsx +3 -4
- package/src/components/billing/__tests__/seats-manager.test.tsx +5 -9
- package/src/components/billing/billing-panel.tsx +5 -6
- package/src/components/billing/checkout-redirect.ts +6 -10
- package/src/components/billing/feature-gate.tsx +2 -3
- package/src/components/billing/invoice-history.tsx +9 -11
- package/src/components/billing/login-prompt-dialog.tsx +10 -11
- package/src/components/billing/pricing-card.tsx +6 -7
- package/src/components/billing/pricing-page.tsx +4 -5
- package/src/components/billing/seats-manager.tsx +19 -20
- package/src/components/billing/subscription-card.tsx +13 -14
- package/src/components/billing/upgrade-prompt.tsx +11 -13
- package/src/components/changelog/changelog-page.tsx +36 -26
- package/src/components/chat/ai-chat-history/components/conversation-header.tsx +4 -5
- package/src/components/chat/ai-chat-history/components/conversation-item.tsx +15 -17
- package/src/components/chat/ai-chat-history/components/conversation-search.tsx +3 -4
- package/src/components/chat/ai-chat-history/components/empty-state.tsx +5 -6
- package/src/components/chat/ai-chat-history/index.tsx +11 -15
- package/src/components/chat/ai-chat-history/utils/group-conversations.ts +9 -2
- package/src/components/chat/ai-citations/components/citation-item.tsx +3 -5
- package/src/components/chat/ai-citations/components/citations-list.tsx +4 -6
- package/src/components/chat/ai-citations/components/inline-citation.tsx +2 -4
- package/src/components/chat/ai-citations/components/source-components.tsx +6 -10
- package/src/components/chat/ai-citations/index.tsx +3 -4
- package/src/components/chat/ai-citations/utils.ts +15 -3
- package/src/components/chat/ai-conversation.tsx +10 -12
- package/src/components/chat/ai-message/components/message-actions.tsx +7 -9
- package/src/components/chat/ai-message/components/streaming-indicator.tsx +3 -4
- package/src/components/chat/ai-message/index.tsx +5 -5
- package/src/components/chat/ai-message/utils/dom-utils.ts +1 -1
- package/src/components/chat/ai-prompt-input/components/action-buttons.tsx +14 -16
- package/src/components/chat/ai-prompt-input/components/agent-mode-select.tsx +10 -5
- package/src/components/chat/ai-prompt-input/components/context-badge.tsx +2 -3
- package/src/components/chat/ai-prompt-input/components/kb-context-selector.tsx +6 -8
- package/src/components/chat/ai-prompt-input/components/model-select.tsx +14 -7
- package/src/components/chat/ai-prompt-input/components/page-user-context-selector.tsx +6 -8
- package/src/components/chat/ai-prompt-input/index.tsx +18 -11
- package/src/components/chat/ai-prompt-input/types.ts +6 -5
- package/src/components/chat/ai-thinking.tsx +6 -9
- package/src/components/chat/chat-thread-page.tsx +4 -5
- package/src/components/chat/interrupt-approval.tsx +6 -8
- package/src/components/command/command-palette.tsx +7 -10
- package/src/components/design/project-card.tsx +2 -3
- package/src/components/design/sketch/code-preview.tsx +3 -4
- package/src/components/design/sketch/export-panel.tsx +3 -4
- package/src/components/design/sketch/property-panel.tsx +16 -17
- package/src/components/error/global-error-boundary.tsx +65 -0
- package/src/components/forms/app-array-field.tsx +3 -4
- package/src/components/forms/app-combobox.tsx +2 -3
- package/src/components/forms/app-date-picker.tsx +2 -3
- package/src/components/forms/app-form-dialog.tsx +3 -4
- package/src/components/forms/app-select.tsx +2 -3
- package/src/components/forms/hooks/use-form-submit.ts +2 -2
- package/src/components/forms/schemas/common.ts +4 -6
- package/src/components/hotkeys/shortcuts-panel.tsx +2 -3
- package/src/components/iteration/auto-schedule-dialog.tsx +12 -13
- package/src/components/iteration/burndown-chart.tsx +6 -8
- package/src/components/iteration/constants.ts +5 -4
- package/src/components/iteration/create-iteration-dialog.tsx +14 -15
- package/src/components/iteration/iteration-card.tsx +3 -4
- package/src/components/iteration/iteration-editor.tsx +7 -8
- package/src/components/iteration/iteration-progress-bar.tsx +3 -5
- package/src/components/iteration/iteration-status-badge.tsx +1 -3
- package/src/components/kibo-ui/contribution-graph/index.tsx +37 -9
- package/src/components/knowledge/dialog/knowledge-form-dialog.tsx +8 -9
- package/src/components/knowledge/doc-properties.tsx +12 -13
- package/src/components/knowledge/editor/doc-header.tsx +7 -8
- package/src/components/knowledge/editor/knowledge-doc-editor.tsx +9 -9
- package/src/components/knowledge/knowledge-homepage.tsx +6 -7
- package/src/components/knowledge/knowledge-tag-input.tsx +3 -4
- package/src/components/knowledge/knowledge-toolbar.tsx +38 -40
- package/src/components/knowledge/knowledge-tree-item.tsx +21 -22
- package/src/components/knowledge/knowledge-tree.tsx +15 -16
- package/src/components/knowledge-public/bookmark-card.tsx +13 -14
- package/src/components/knowledge-public/bookmark-form-dialog.tsx +25 -26
- package/src/components/knowledge-public/knowledge-card-grid.tsx +3 -3
- package/src/components/knowledge-public/knowledge-filters.tsx +9 -10
- package/src/components/knowledge-public/knowledge-form-dialog.tsx +62 -63
- package/src/components/knowledge-public/knowledge-search-bar.tsx +3 -4
- package/src/components/knowledge-public/legal-compliance-editor.tsx +30 -31
- package/src/components/knowledge-public/markdown-editor.tsx +3 -4
- package/src/components/knowledge-public/markdown-view.tsx +2 -3
- package/src/components/knowledge-public/sharers-avatar-group.tsx +3 -4
- package/src/components/knowledge-public/tag-filter.tsx +3 -4
- package/src/components/layout/sidebar-03/__tests__/nav-workspace.test.tsx +42 -79
- package/src/components/layout/sidebar-03/__tests__/user-menu-anonymous.test.tsx +51 -0
- package/src/components/layout/sidebar-03/app-sidebar.tsx +3 -4
- package/src/components/layout/sidebar-03/index.tsx +0 -1
- package/src/components/layout/sidebar-03/nav-anyhub.tsx +4 -5
- package/src/components/layout/sidebar-03/nav-knowledge.tsx +80 -37
- package/src/components/layout/sidebar-03/nav-main.tsx +10 -12
- package/src/components/layout/sidebar-03/nav-notifications.tsx +19 -28
- package/src/components/layout/sidebar-03/nav-search-trigger.tsx +3 -5
- package/src/components/layout/sidebar-03/nav-workspace.tsx +32 -12
- package/src/components/layout/sidebar-03/team-switcher.tsx +0 -1
- package/src/components/layout/sidebar-03/user-menu.tsx +33 -13
- package/src/components/magicui/components/animate/avatar-group.tsx +0 -1
- package/src/components/magicui/primitives/animate/avatar-group.tsx +0 -1
- package/src/components/magicui/primitives/animate/slot.tsx +0 -1
- package/src/components/magicui/primitives/animate/tooltip.tsx +0 -1
- package/src/components/magicui/sparkles-text.tsx +0 -1
- package/src/components/mindmap/mindmap-doc-editor.tsx +15 -15
- package/src/components/notifications/settings-notifications.tsx +22 -23
- package/src/components/notifications/team-notifications.tsx +27 -29
- package/src/components/plugin-slots/__tests__/plugin-settings-tabs.test.tsx +4 -4
- package/src/components/plugin-slots/plugin-settings-tabs.tsx +15 -11
- package/src/components/project/create-project-dialog.tsx +60 -34
- package/src/components/project/invite-member-dialog.tsx +20 -21
- package/src/components/project/project-activity-list.tsx +19 -24
- package/src/components/project/project-member-manager.tsx +27 -28
- package/src/components/project/project-module-card.tsx +5 -6
- package/src/components/project/schemas/create-project.ts +3 -5
- package/src/components/prototype/component/GenericPrototype.tsx +0 -1
- package/src/components/prototype/component-preview.tsx +0 -1
- package/src/components/settings/ai/api-key-field.tsx +8 -10
- package/src/components/settings/ai/create-custom-model-dialog.tsx +28 -21
- package/src/components/settings/ai/create-custom-provider-dialog.tsx +15 -16
- package/src/components/settings/ai/model-card.tsx +25 -10
- package/src/components/settings/ai/model-manager.tsx +24 -16
- package/src/components/settings/ai/provider-card.tsx +9 -11
- package/src/components/settings/ai/provider-detail-form.tsx +24 -26
- package/src/components/settings/ai/provider-grid.tsx +23 -13
- package/src/components/settings/language-selector.tsx +13 -15
- package/src/components/settings/personal-team/account/account-client.tsx +14 -16
- package/src/components/settings/personal-team/account/avatar/notion-avatar-editor.tsx +36 -28
- package/src/components/settings/personal-team/account/settings-profile.tsx +39 -40
- package/src/components/settings/personal-team/team/team-client.tsx +45 -50
- package/src/components/settings/personal-team/team/team-invitations.tsx +89 -95
- package/src/components/settings/personal-team/team/team-member-list.tsx +50 -47
- package/src/components/shadcn-space/blocks/pricing-01/pricing.tsx +170 -172
- package/src/components/shared-kit/data-viz/contribution-graph-tooltip.tsx +128 -15
- package/src/components/shared-kit/dialogs/name-confirm-dialog.tsx +16 -16
- package/src/components/shared-kit/i18n/language-switcher.tsx +6 -9
- package/src/components/shared-kit/i18n/translator-text.tsx +2 -4
- package/src/components/shared-kit/icons/lucide-icon-picker/panel.tsx +7 -8
- package/src/components/shared-kit/logos/logo-icon.tsx +64 -0
- package/src/components/shared-kit/navigation/nav-float-button.tsx +3 -5
- package/src/components/shared-kit/pages/placeholder-page.tsx +2 -4
- package/src/components/shared-kit/theme/animated-theme-toggler.tsx +0 -1
- package/src/components/shared-kit/theme/theme-toggle.tsx +0 -1
- package/src/components/shared-kit/timezone/timezone-select.tsx +6 -7
- package/src/components/story/__tests__/constants.test.ts +7 -7
- package/src/components/story/__tests__/dependency-type-badge.test.ts +5 -5
- package/src/components/story/ai/action-registry.ts +12 -11
- package/src/components/story/ai/handlers/more-popover.tsx +5 -6
- package/src/components/story/ai/prototype-dialog.tsx +9 -10
- package/src/components/story/ai/split-dialog.tsx +22 -23
- package/src/components/story/ai/story-ai-panel.tsx +29 -30
- package/src/components/story/ai/story-ai-preview-list.tsx +16 -9
- package/src/components/story/ai/story-ai-toolbar.tsx +12 -13
- package/src/components/story/columns.tsx +33 -17
- package/src/components/story/constants.ts +73 -69
- package/src/components/story/create-story-dialog.tsx +13 -14
- package/src/components/story/detail/__tests__/categories.test.tsx +8 -10
- package/src/components/story/detail/__tests__/dependencies-button.test.tsx +3 -5
- package/src/components/story/detail/activity-tabs.tsx +6 -7
- package/src/components/story/detail/activity-timeline.tsx +33 -35
- package/src/components/story/detail/comment-input.tsx +7 -8
- package/src/components/story/detail/comment-item.tsx +15 -16
- package/src/components/story/detail/comment-thread.tsx +6 -7
- package/src/components/story/detail/reaction-bar.tsx +2 -3
- package/src/components/story/detail/story-detail-body.tsx +26 -28
- package/src/components/story/detail/story-detail-toolbar/associated-attachments-panel.tsx +42 -45
- package/src/components/story/detail/story-detail-toolbar/categories.tsx +13 -14
- package/src/components/story/detail/story-detail-toolbar/children.tsx +19 -22
- package/src/components/story/detail/story-detail-toolbar/dependencies.tsx +3 -5
- package/src/components/story/detail/story-detail-toolbar/dependency-panel.tsx +30 -20
- package/src/components/story/detail/story-detail-toolbar.tsx +16 -11
- package/src/components/story/detail/story-properties.tsx +7 -8
- package/src/components/story/display/__tests__/display-dropdown.test.tsx +3 -5
- package/src/components/story/display/__tests__/use-paged-story-groups.test.ts +2 -0
- package/src/components/story/display/constants.ts +27 -26
- package/src/components/story/display/display-dropdown.tsx +20 -26
- package/src/components/story/display/group-resolver.tsx +12 -14
- package/src/components/story/display/use-grouped-stories.ts +3 -5
- package/src/components/story/display/use-paged-story-groups.ts +12 -13
- package/src/components/story/filters/add-filter-dropdown.tsx +4 -5
- package/src/components/story/filters/applied-filters.tsx +7 -9
- package/src/components/story/filters/filter-condition.tsx +9 -12
- package/src/components/story/filters/filter-row.tsx +5 -6
- package/src/components/story/filters/filter-toggle.tsx +2 -3
- package/src/components/story/filters/filter-types.ts +24 -23
- package/src/components/story/filters/filter-value-input.tsx +3 -4
- package/src/components/story/infinite-scroll-sentinel.tsx +2 -3
- package/src/components/story/inline-editors/__tests__/dependency-type-select.test.tsx +18 -23
- package/src/components/story/inline-editors/__tests__/labels-editor.test.tsx +9 -11
- package/src/components/story/inline-editors/__tests__/priority-editor.test.tsx +21 -25
- package/src/components/story/inline-editors/__tests__/state-editor.test.tsx +21 -25
- package/src/components/story/inline-editors/assignee-editor.tsx +8 -9
- package/src/components/story/inline-editors/date-editor.tsx +4 -5
- package/src/components/story/inline-editors/dependency-type-select.tsx +15 -12
- package/src/components/story/inline-editors/inline-trigger.tsx +2 -3
- package/src/components/story/inline-editors/labels-editor.tsx +16 -17
- package/src/components/story/inline-editors/parent-story-editor.tsx +3 -4
- package/src/components/story/inline-editors/priority-editor.tsx +6 -8
- package/src/components/story/inline-editors/state-editor.tsx +6 -7
- package/src/components/story/inline-editors/story-select-dialog.tsx +25 -26
- package/src/components/story/inline-editors/title-editor.tsx +2 -3
- package/src/components/story/peek-panel.tsx +6 -7
- package/src/components/story/relations/__tests__/knowledge-select-dialog.test.tsx +2 -0
- package/src/components/story/relations/__tests__/link-manage-dialog.test.tsx +2 -0
- package/src/components/story/relations/attachment-manage-dialog.tsx +23 -24
- package/src/components/story/relations/general-groups.ts +12 -29
- package/src/components/story/relations/knowledge-select-dialog.tsx +21 -22
- package/src/components/story/relations/link-manage-dialog.tsx +12 -13
- package/src/components/story/relations/story-ref-row.tsx +20 -21
- package/src/components/story/schemas/story-create.ts +3 -5
- package/src/components/story/search-popover.tsx +5 -6
- package/src/components/story/story-list-table.tsx +3 -4
- package/src/components/story/story-list-view.tsx +9 -10
- package/src/components/story/story-panel-header.tsx +27 -28
- package/src/components/story/story-toolbar.tsx +11 -12
- package/src/components/story/transfer-story-popover.tsx +15 -16
- package/src/components/story/views/calendar-view.tsx +12 -14
- package/src/components/story/views/create-view-dialog.tsx +19 -52
- package/src/components/story/views/kanban-board.tsx +9 -12
- package/src/components/story/views/kanban-card.tsx +1 -3
- package/src/components/story/views/story-list/__tests__/batch-toolbar.test.tsx +9 -2
- package/src/components/story/views/story-list/__tests__/group-header.test.tsx +15 -17
- package/src/components/story/views/story-list/batch-preview-dialog.tsx +26 -28
- package/src/components/story/views/story-list/batch-toolbar.tsx +12 -13
- package/src/components/story/views/story-list/group.tsx +9 -11
- package/src/components/story/views/story-list/index.tsx +13 -14
- package/src/components/story/views/story-list/inline-story-creator.tsx +6 -7
- package/src/components/story/views/story-list/row.tsx +6 -7
- package/src/components/story/views/timeline-view.tsx +7 -8
- package/src/components/story/views/view-list-section.tsx +14 -16
- package/src/components/story/views/view-selector-button.tsx +6 -7
- package/src/components/story/views/view-switcher.tsx +9 -10
- package/src/components/story/views/view-types.ts +15 -15
- package/src/components/tiptap/extension/code-block-ellipsis-input-extension.ts +0 -1
- package/src/components/tiptap/hooks/use-composed-ref.ts +0 -1
- package/src/components/tiptap/hooks/use-cursor-visibility.ts +0 -1
- package/src/components/tiptap/hooks/use-floating-element.ts +0 -1
- package/src/components/tiptap/hooks/use-is-breakpoint.ts +0 -1
- package/src/components/tiptap/hooks/use-isomorphic-layout-effect.ts +0 -1
- package/src/components/tiptap/hooks/use-menu-navigation.ts +0 -1
- package/src/components/tiptap/hooks/use-on-click-outside.ts +0 -1
- package/src/components/tiptap/hooks/use-tiptap-editor.ts +0 -1
- package/src/components/tiptap/hooks/use-ui-editor-state.ts +0 -1
- package/src/components/tiptap/mindmap/lib/__tests__/default-mindmap-data.test.ts +3 -2
- package/src/components/tiptap/mindmap/lib/default-mindmap-data.ts +2 -2
- package/src/components/tiptap/mindmap/mind-map.tsx +36 -39
- package/src/components/tiptap/mindmap/mindmap-fullscreen-dialog.tsx +2 -3
- package/src/components/tiptap/node/annotation-node/annotation-node-view.tsx +11 -12
- package/src/components/tiptap/node/doc-card-extension.tsx +8 -10
- package/src/components/tiptap/node/image-node/image-node-floating.tsx +2 -3
- package/src/components/tiptap/node/image-upload-node/image-upload-node.tsx +0 -1
- package/src/components/tiptap/node/mention-extension.ts +5 -5
- package/src/components/tiptap/node/table-node/hooks/use-table-handle-state.ts +0 -1
- package/src/components/tiptap/node/table-node/ui/table-add-row-column-button/table-add-row-column-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-add-row-column-button/use-table-add-row-column.ts +5 -6
- package/src/components/tiptap/node/table-node/ui/table-align-cell-button/table-align-cell-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-align-cell-button/use-table-align-cell.ts +8 -9
- package/src/components/tiptap/node/table-node/ui/table-alignment-menu/table-alignment-menu.tsx +2 -4
- package/src/components/tiptap/node/table-node/ui/table-cell-handle-menu/table-cell-handle-menu.tsx +2 -5
- package/src/components/tiptap/node/table-node/ui/table-clear-row-column-content-button/table-clear-row-column-content-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-clear-row-column-content-button/use-table-clear-row-column-content.ts +4 -5
- package/src/components/tiptap/node/table-node/ui/table-delete-row-column-button/table-delete-row-column-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-delete-row-column-button/use-table-delete-row-column.ts +3 -4
- package/src/components/tiptap/node/table-node/ui/table-duplicate-row-column-button/table-duplicate-row-column-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-duplicate-row-column-button/use-table-duplicate-row-column.ts +3 -4
- package/src/components/tiptap/node/table-node/ui/table-extend-row-column-button/table-extend-row-column-button.tsx +2 -4
- package/src/components/tiptap/node/table-node/ui/table-fit-to-width-button/table-fit-to-width-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-fit-to-width-button/use-table-fit-to-width.ts +3 -4
- package/src/components/tiptap/node/table-node/ui/table-handle/table-handle.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-handle-menu/table-handle-menu.tsx +3 -5
- package/src/components/tiptap/node/table-node/ui/table-header-row-column-button/table-header-row-column-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-header-row-column-button/use-table-header-row-column.ts +3 -4
- package/src/components/tiptap/node/table-node/ui/table-merge-split-cell-button/table-merge-split-cell-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-merge-split-cell-button/use-table-merge-split-cell.ts +3 -4
- package/src/components/tiptap/node/table-node/ui/table-move-row-column-button/table-move-row-column-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-move-row-column-button/use-table-move-row-column.ts +9 -10
- package/src/components/tiptap/node/table-node/ui/table-selection-overlay/table-selection-overlay.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-selection-overlay/use-resize-overlay.ts +0 -1
- package/src/components/tiptap/node/table-node/ui/table-sort-row-column-button/table-sort-row-column-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-sort-row-column-button/use-table-sort-row-column.ts +5 -6
- package/src/components/tiptap/node/table-node/ui/table-trigger-button/table-grid-selector.tsx +2 -3
- package/src/components/tiptap/node/table-node/ui/table-trigger-button/table-trigger-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-trigger-button/use-table-trigger.ts +3 -4
- package/src/components/tiptap/node/toc-node/toc-node.tsx +2 -4
- package/src/components/tiptap/node/toc-node/ui/toc-show-title-button/toc-show-title-button.tsx +0 -1
- package/src/components/tiptap/node/toc-node/ui/toc-show-title-button/toc-show-title.ts +2 -3
- package/src/components/tiptap/node/toc-node/ui/toc-sidebar/toc-sidebar.tsx +2 -5
- package/src/components/tiptap/notion-like/notion-like-editor-header.tsx +2 -4
- package/src/components/tiptap/notion-like/notion-like-editor-mobile-toolbar.tsx +17 -23
- package/src/components/tiptap/notion-like/notion-like-editor-theme-toggle.tsx +2 -5
- package/src/components/tiptap/notion-like/notion-like-editor-toolbar-floating.tsx +16 -12
- package/src/components/tiptap/notion-like/notion-like-editor.tsx +2 -7
- package/src/components/tiptap/notion-like/setup-error-message/setup-error-message.tsx +0 -1
- package/src/components/tiptap/ui/ai-ask-button/ai-ask-button.tsx +0 -1
- package/src/components/tiptap/ui/ai-ask-button/use-ai-ask.ts +2 -3
- package/src/components/tiptap/ui/ai-menu/ai-menu-actions/ai-menu-actions.tsx +4 -6
- package/src/components/tiptap/ui/ai-menu/ai-menu-input/ai-menu-input.tsx +6 -10
- package/src/components/tiptap/ui/ai-menu/ai-menu-items/ai-menu-items-constants.ts +36 -36
- package/src/components/tiptap/ui/ai-menu/ai-menu-items/ai-menu-items.tsx +13 -16
- package/src/components/tiptap/ui/ai-menu/ai-menu-items/language-selection-submenu.tsx +3 -4
- package/src/components/tiptap/ui/ai-menu/ai-menu-items/tone-selection-submenu.tsx +2 -3
- package/src/components/tiptap/ui/ai-menu/ai-menu-utils.ts +3 -3
- package/src/components/tiptap/ui/ai-menu/ai-menu.tsx +3 -5
- package/src/components/tiptap/ui/blockquote-button/blockquote-button.tsx +2 -6
- package/src/components/tiptap/ui/blockquote-button/use-blockquote.ts +2 -3
- package/src/components/tiptap/ui/code-block-button/code-block-button.tsx +2 -6
- package/src/components/tiptap/ui/code-block-button/use-code-block.ts +2 -3
- package/src/components/tiptap/ui/color-highlight-button/color-highlight-button.tsx +0 -1
- package/src/components/tiptap/ui/color-highlight-button/use-color-highlight.ts +14 -14
- package/src/components/tiptap/ui/color-highlight-popover/color-highlight-popover.tsx +9 -11
- package/src/components/tiptap/ui/color-menu/color-menu.tsx +5 -11
- package/src/components/tiptap/ui/color-text-button/color-text-button.tsx +2 -3
- package/src/components/tiptap/ui/color-text-button/use-color-text.ts +12 -13
- package/src/components/tiptap/ui/color-text-popover/color-text-popover.tsx +6 -10
- package/src/components/tiptap/ui/color-text-popover/use-color-text-popover.ts +2 -3
- package/src/components/tiptap/ui/copy-anchor-link-button/copy-anchor-link-button.tsx +2 -6
- package/src/components/tiptap/ui/copy-anchor-link-button/use-copy-anchor-link.ts +2 -3
- package/src/components/tiptap/ui/copy-anchor-link-button/use-scroll-to-hash.ts +0 -1
- package/src/components/tiptap/ui/copy-to-clipboard-button/copy-to-clipboard-button.tsx +2 -6
- package/src/components/tiptap/ui/copy-to-clipboard-button/use-copy-to-clipboard.ts +2 -3
- package/src/components/tiptap/ui/delete-node-button/delete-node-button.tsx +2 -6
- package/src/components/tiptap/ui/delete-node-button/use-delete-node.ts +2 -3
- package/src/components/tiptap/ui/doc-reference-floating/doc-reference-floating.tsx +10 -11
- package/src/components/tiptap/ui/doc-reference-interaction/doc-reference-interaction.tsx +10 -11
- package/src/components/tiptap/ui/drag-context-menu/drag-context-menu.tsx +7 -9
- package/src/components/tiptap/ui/duplicate-button/duplicate-button.tsx +2 -6
- package/src/components/tiptap/ui/duplicate-button/use-duplicate.ts +2 -3
- package/src/components/tiptap/ui/emoji-dropdown-menu/emoji-dropdown-menu.tsx +0 -1
- package/src/components/tiptap/ui/emoji-menu/emoji-menu.tsx +2 -5
- package/src/components/tiptap/ui/emoji-trigger-button/emoji-trigger-button.tsx +2 -6
- package/src/components/tiptap/ui/emoji-trigger-button/use-emoji-trigger.ts +2 -3
- package/src/components/tiptap/ui/heading-button/heading-button.tsx +0 -1
- package/src/components/tiptap/ui/heading-button/use-heading.ts +7 -8
- package/src/components/tiptap/ui/image-align-button/image-align-button.tsx +0 -1
- package/src/components/tiptap/ui/image-align-button/use-image-align.ts +4 -5
- package/src/components/tiptap/ui/image-caption-button/image-caption-button.tsx +0 -1
- package/src/components/tiptap/ui/image-caption-button/use-image-caption.ts +2 -3
- package/src/components/tiptap/ui/image-download-button/image-download-button.tsx +0 -1
- package/src/components/tiptap/ui/image-download-button/use-image-download.ts +2 -3
- package/src/components/tiptap/ui/image-upload-button/image-upload-button.tsx +0 -1
- package/src/components/tiptap/ui/image-upload-button/use-image-upload.ts +2 -3
- package/src/components/tiptap/ui/improve-dropdown/improve-dropdown.tsx +14 -17
- package/src/components/tiptap/ui/improve-dropdown/use-improve-dropdown.ts +2 -3
- package/src/components/tiptap/ui/indent-button/indent-button.tsx +0 -1
- package/src/components/tiptap/ui/indent-button/use-indent.ts +3 -4
- package/src/components/tiptap/ui/link-popover/link-popover.tsx +7 -12
- package/src/components/tiptap/ui/link-popover/use-link-popover.ts +2 -3
- package/src/components/tiptap/ui/list-button/list-button.tsx +0 -1
- package/src/components/tiptap/ui/list-button/use-list.ts +4 -5
- package/src/components/tiptap/ui/mark-button/mark-button.tsx +0 -1
- package/src/components/tiptap/ui/mark-button/use-mark.ts +8 -9
- package/src/components/tiptap/ui/mention-dropdown-menu/mention-dropdown-menu.tsx +0 -2
- package/src/components/tiptap/ui/mention-trigger-button/mention-trigger-button.tsx +0 -1
- package/src/components/tiptap/ui/mention-trigger-button/use-mention-trigger.ts +2 -3
- package/src/components/tiptap/ui/move-node-button/move-node-button.tsx +2 -6
- package/src/components/tiptap/ui/move-node-button/use-move-node.ts +2 -3
- package/src/components/tiptap/ui/reference-dropdown-menu/reference-dropdown-menu.tsx +6 -10
- package/src/components/tiptap/ui/reset-all-formatting-button/reset-all-formatting-button.tsx +2 -6
- package/src/components/tiptap/ui/reset-all-formatting-button/use-reset-all-formatting.ts +2 -3
- package/src/components/tiptap/ui/slash-command-trigger-button/slash-command-trigger-button.tsx +0 -1
- package/src/components/tiptap/ui/slash-command-trigger-button/use-slash-command-trigger.ts +2 -3
- package/src/components/tiptap/ui/slash-dropdown-menu/slash-dropdown-menu.tsx +2 -5
- package/src/components/tiptap/ui/slash-dropdown-menu/use-slash-dropdown-menu.ts +78 -79
- package/src/components/tiptap/ui/text-align-button/text-align-button.tsx +0 -1
- package/src/components/tiptap/ui/text-align-button/use-text-align.ts +5 -6
- package/src/components/tiptap/ui/text-button/text-button.tsx +2 -6
- package/src/components/tiptap/ui/text-button/use-text.ts +2 -3
- package/src/components/tiptap/ui/turn-into-dropdown/turn-into-dropdown.tsx +4 -7
- package/src/components/tiptap/ui/turn-into-dropdown/use-turn-into-dropdown.ts +11 -12
- package/src/components/tiptap/ui/undo-redo-button/undo-redo-button.tsx +0 -1
- package/src/components/tiptap/ui/undo-redo-button/use-undo-redo.ts +3 -4
- package/src/components/tiptap/ui-primitive/avatar/avatar.tsx +0 -1
- package/src/components/tiptap/ui-primitive/badge/badge.tsx +0 -1
- package/src/components/tiptap/ui-primitive/button/button.tsx +0 -1
- package/src/components/tiptap/ui-primitive/card/card.tsx +0 -1
- package/src/components/tiptap/ui-primitive/combobox/combobox.tsx +0 -1
- package/src/components/tiptap/ui-primitive/dropdown-menu/dropdown-menu.tsx +0 -1
- package/src/components/tiptap/ui-primitive/input/input.tsx +0 -1
- package/src/components/tiptap/ui-primitive/input-group/input-group.tsx +0 -1
- package/src/components/tiptap/ui-primitive/label/label.tsx +0 -1
- package/src/components/tiptap/ui-primitive/menu/menu-context.ts +0 -1
- package/src/components/tiptap/ui-primitive/menu/menu-hooks.ts +0 -1
- package/src/components/tiptap/ui-primitive/menu/menu-types.ts +0 -1
- package/src/components/tiptap/ui-primitive/menu/menu-utils.ts +0 -1
- package/src/components/tiptap/ui-primitive/menu/menu.tsx +0 -1
- package/src/components/tiptap/ui-primitive/popover/popover.tsx +0 -1
- package/src/components/tiptap/ui-primitive/separator/separator.tsx +0 -1
- package/src/components/tiptap/ui-primitive/sidebar/sidebar.tsx +0 -1
- package/src/components/tiptap/ui-primitive/spacer/spacer.tsx +0 -1
- package/src/components/tiptap/ui-primitive/textarea/textarea.tsx +0 -1
- package/src/components/tiptap/ui-primitive/textarea-autosize/textarea-autosize.tsx +0 -1
- package/src/components/tiptap/ui-primitive/toolbar/toolbar.tsx +0 -1
- package/src/components/tiptap/ui-primitive/tooltip/tooltip.tsx +0 -1
- package/src/components/tiptap/ui-utils/floating-element/floating-element.tsx +0 -1
- package/src/components/tiptap/ui-utils/suggestion-menu/suggestion-menu.tsx +0 -1
- package/src/components/ui/field.tsx +1 -1
- package/src/components/ui/radio-group.tsx +2 -3
- package/src/components/ui/spinner.tsx +2 -2
- package/src/components/workspace/create-workspace-dialog.tsx +12 -13
- package/src/components/workspace/delete-workspace-options.tsx +177 -0
- package/src/components/workspace/edit-workspace-dialog.tsx +153 -0
- package/src/components/workspace/schemas/create-workspace.ts +2 -2
- package/src/components/workspace/workspace-activity-card.tsx +60 -0
- package/src/components/workspace/workspace-contribution-card.tsx +37 -0
- package/src/components/workspace/workspace-header.tsx +100 -0
- package/src/components/workspace/workspace-kb-card.tsx +31 -0
- package/src/components/workspace/workspace-member-item.tsx +80 -0
- package/src/components/workspace/workspace-members-manager.tsx +291 -0
- package/src/components/workspace/workspace-project-list.tsx +129 -0
- package/src/config/sidebar-routes.tsx +25 -24
- package/src/config/sidebar-teams.ts +4 -4
- package/src/hooks/__tests__/use-commands.test.tsx +0 -10
- package/src/hooks/use-commands.ts +3 -7
- package/src/hooks/use-entity-subscription.ts +0 -1
- package/src/hooks/use-notifications.ts +5 -6
- package/src/hooks/useTranslator.ts +0 -1
- package/src/lib/__tests__/edition.test.ts +9 -0
- package/src/lib/analytics.ts +0 -1
- package/src/lib/anyhub/anyhub-message-bridge.ts +1 -1
- package/src/lib/auth/__tests__/anonymous-safe.test.ts +89 -0
- package/src/lib/auth/__tests__/page-gate.test.ts +29 -0
- package/src/lib/auth/anonymous-safe.ts +39 -0
- package/src/lib/auth/page-gate.ts +18 -0
- package/src/lib/changelog/sdk-versions.ts +19 -19
- package/src/lib/collections/knowledge/knowledge-bases-collection.ts +1 -1
- package/src/lib/collections/reference/bookmark-categories-collection.ts +1 -1
- package/src/lib/collections/reference/labels-collection.ts +1 -1
- package/src/lib/collections/reference/projects-collection.ts +1 -1
- package/src/lib/collections/reference/users-brief-collection.ts +1 -1
- package/src/lib/collections/reference/workspaces-collection.ts +3 -3
- package/src/lib/commands/__tests__/registry.test.ts +3 -3
- package/src/lib/commands/registry.ts +22 -21
- package/src/lib/commands/types.ts +1 -1
- package/src/lib/edition.ts +7 -0
- package/src/lib/router-context.ts +1 -2
- package/src/plugins/.gen-manifest.json +13 -0
- package/src/plugins/core/inspiration/pages/inspiration-page.tsx +2 -3
- package/src/plugins/core/inspiration/ui.tsx +2 -3
- package/src/plugins/core/prd/components/agent-input.tsx +7 -8
- package/src/plugins/core/prd/components/component-editor/content-section.tsx +3 -3
- package/src/plugins/core/prd/components/component-editor/position-section.tsx +3 -4
- package/src/plugins/core/prd/components/component-editor/style-fields.tsx +13 -16
- package/src/plugins/core/prd/components/dialog/create-prd-dialog.tsx +11 -12
- package/src/plugins/core/prd/components/dialog/prd-detail-client.tsx +7 -9
- package/src/plugins/core/prd/components/page-version-panel/components/create-version-dialog.tsx +7 -8
- package/src/plugins/core/prd/components/page-version-panel/components/delete-version-dialog.tsx +5 -6
- package/src/plugins/core/prd/components/page-version-panel/components/edit-version-dialog.tsx +7 -8
- package/src/plugins/core/prd/components/page-version-panel/constants.tsx +3 -2
- package/src/plugins/core/prd/components/page-version-panel.tsx +43 -45
- package/src/plugins/core/prd/components/page-version-tree.tsx +6 -8
- package/src/plugins/core/prd/components/prd-agent-panel.tsx +29 -23
- package/src/plugins/core/prd/components/prd-comment-review-panel.tsx +21 -23
- package/src/plugins/core/prd/components/prd-component-editor-content.tsx +6 -7
- package/src/plugins/core/prd/components/prd-dashboard.tsx +28 -23
- package/src/plugins/core/prd/components/prd-doc-panel.tsx +6 -9
- package/src/plugins/core/prd/components/prd-editor-layout.tsx +11 -13
- package/src/plugins/core/prd/components/prd-filter-bar.tsx +2 -3
- package/src/plugins/core/prd/components/prd-left-sidebar.tsx +19 -20
- package/src/plugins/core/prd/components/prd-navigation.tsx +12 -14
- package/src/plugins/core/prd/components/prd-outline-tab.tsx +3 -4
- package/src/plugins/core/prd/components/prd-prototype-panel.tsx +8 -10
- package/src/plugins/core/prd/components/prd-right-sidebar.tsx +10 -12
- package/src/plugins/core/prd/components/prd-share-panel/components/single-version-share-card.tsx +13 -14
- package/src/plugins/core/prd/components/prd-share-panel/constants.ts +5 -3
- package/src/plugins/core/prd/components/prd-share-panel.tsx +58 -60
- package/src/plugins/core/prd/components/prd-tree-page-tab.tsx +20 -22
- package/src/plugins/core/prd/components/prototype/PrototypeCanvas.tsx +2 -4
- package/src/plugins/core/prd/components/prototype/PrototypeElement.tsx +3 -5
- package/src/plugins/core/prd/components/prototype/ResizeHandles.tsx +0 -1
- package/src/plugins/core/prd/components/prototype/icon-components.ts +19 -21
- package/src/plugins/core/prd/components/prototype/index.ts +3 -0
- package/src/plugins/core/prd/components/restore-version-dialog.tsx +5 -7
- package/src/plugins/core/prd/components/share/prd-share-client.tsx +7 -9
- package/src/plugins/core/prd/components/share/share-annotation-overlay.tsx +0 -1
- package/src/plugins/core/prd/components/share/share-comment-panel.tsx +15 -16
- package/src/plugins/core/prd/components/share/share-comment-review-panel.tsx +7 -9
- package/src/plugins/core/prd/components/share/share-directory-tree.tsx +3 -5
- package/src/plugins/core/prd/components/share/share-doc-view.tsx +3 -5
- package/src/plugins/core/prd/components/share/share-layout.tsx +3 -5
- package/src/plugins/core/prd/components/share/share-nav-bar.tsx +3 -5
- package/src/plugins/core/prd/components/share/share-password-gate.tsx +8 -9
- package/src/plugins/core/prd/components/share/share-prototype-view.tsx +3 -5
- package/src/plugins/core/prd/components/share/share-review-panel.tsx +9 -11
- package/src/plugins/core/prd/components/share/share-sse-listener.tsx +0 -1
- package/src/plugins/core/prd/components/share/version-share-client.tsx +3 -5
- package/src/plugins/core/prd/pages/prd-detail-page.tsx +9 -21
- package/src/plugins/core/prd/pages/share-prd-page.tsx +6 -16
- package/src/plugins/core/prd/prd-nav.tsx +2 -3
- package/src/plugins/core/tags/nav-tag.tsx +14 -15
- package/src/plugins/core/tags/pages/tag-detail-page.tsx +3 -5
- package/src/plugins/core/tags/pages/tag-settings-page.tsx +3 -5
- package/src/plugins/core/tags/pages/tags-index-page.tsx +3 -5
- package/src/plugins/core/tags/tag-badge.tsx +2 -3
- package/src/plugins/core/tags/tag-color-picker.tsx +2 -4
- package/src/plugins/core/tags/tag-manager.tsx +23 -25
- package/src/plugins/core/tags/tag-selector.tsx +4 -5
- package/src/plugins/modules.gen.ts +21 -0
- package/src/plugins/plugins.gen.ts +20 -0
- package/src/plugins/ui.gen.ts +8 -0
- package/src/providers/index.tsx +3 -14
- package/src/routeTree.gen.ts +27 -0
- package/src/router.tsx +16 -6
- package/src/routes/__desktop/onboarding/route.lazy.tsx +22 -23
- package/src/routes/__root.tsx +13 -36
- package/src/routes/__tests__/-edition-routing.test.tsx +151 -0
- package/src/routes/_login/forgot-password/route.lazy.tsx +14 -15
- package/src/routes/_login/login/route.lazy.tsx +26 -25
- package/src/routes/_login/register/route.lazy.tsx +23 -24
- package/src/routes/_login/reset-password/route.lazy.tsx +16 -17
- package/src/routes/_login/schemas/-auth.ts +11 -13
- package/src/routes/_nav/acceptance-criteria/route.tsx +2 -3
- package/src/routes/_nav/apps/anyhub/$id/route.tsx +2 -3
- package/src/routes/_nav/chat/route.lazy.tsx +9 -10
- package/src/routes/_nav/dashboard/-components/activity-feed.tsx +3 -4
- package/src/routes/_nav/dashboard/-components/quick-actions.tsx +3 -4
- package/src/routes/_nav/dashboard/-components/stats-grid.tsx +5 -6
- package/src/routes/_nav/dashboard/route.lazy.tsx +7 -8
- package/src/routes/_nav/design/$projectId/$artboardId/route.lazy.tsx +7 -9
- package/src/routes/_nav/design/$projectId/route.lazy.tsx +3 -5
- package/src/routes/_nav/design/index.lazy.tsx +26 -27
- package/src/routes/_nav/inspiration/route.tsx +8 -0
- package/src/routes/_nav/knowledge/$kbId/doc/$docId/route.lazy.tsx +4 -5
- package/src/routes/_nav/knowledge/$kbId/route.lazy.tsx +3 -4
- package/src/routes/_nav/knowledge/bookmarks/$id.lazy.tsx +29 -30
- package/src/routes/_nav/knowledge/bookmarks/index.lazy.tsx +12 -13
- package/src/routes/_nav/knowledge/compliance/$id.lazy.tsx +22 -23
- package/src/routes/_nav/knowledge/compliance/index.lazy.tsx +18 -19
- package/src/routes/_nav/knowledge/dictionaries/$id.lazy.tsx +5 -6
- package/src/routes/_nav/knowledge/dictionaries/index.lazy.tsx +17 -18
- package/src/routes/_nav/knowledge/index.lazy.tsx +248 -40
- package/src/routes/_nav/knowledge/laws/$id.lazy.tsx +22 -23
- package/src/routes/_nav/knowledge/laws/index.lazy.tsx +14 -15
- package/src/routes/_nav/knowledge/summary/index.lazy.tsx +31 -32
- package/src/routes/_nav/notifications/route.lazy.tsx +3 -4
- package/src/routes/_nav/notifications/route.tsx +2 -0
- package/src/routes/_nav/notion-like/route.tsx +2 -3
- package/src/routes/_nav/prd/$id/route.tsx +9 -0
- package/src/routes/_nav/prd/index.tsx +9 -0
- package/src/routes/_nav/prd/route.tsx +8 -0
- package/src/routes/_nav/pricing-02/route.tsx +2 -3
- package/src/routes/_nav/projects/$projectId/$storyId/route.lazy.tsx +23 -24
- package/src/routes/_nav/projects/$projectId/index.lazy.tsx +54 -74
- package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy.tsx +27 -30
- package/src/routes/_nav/projects/$projectId/iterations/index.lazy.tsx +9 -10
- package/src/routes/_nav/projects/$projectId/route.tsx +4 -2
- package/src/routes/_nav/projects/$projectId/settings/route.lazy.tsx +40 -41
- package/src/routes/_nav/route.tsx +13 -16
- package/src/routes/_nav/settings/-settings-tabs.tsx +24 -51
- package/src/routes/_nav/settings/account/route.lazy.tsx +1 -9
- package/src/routes/_nav/settings/ai/index/route.lazy.tsx +5 -6
- package/src/routes/_nav/settings/billing/route.lazy.tsx +4 -5
- package/src/routes/_nav/settings/connection/route.lazy.tsx +14 -10
- package/src/routes/_nav/settings/design/route.lazy.tsx +21 -22
- package/src/routes/_nav/settings/general/route.lazy.tsx +10 -11
- package/src/routes/_nav/settings/notifications/route.lazy.tsx +3 -5
- package/src/routes/_nav/settings/privacy/route.lazy.tsx +15 -16
- package/src/routes/_nav/settings/route.lazy.tsx +2 -3
- package/src/routes/_nav/settings/route.tsx +10 -15
- package/src/routes/_nav/settings/team/route.lazy.tsx +1 -9
- package/src/routes/_nav/tags/$id/route.tsx +8 -0
- package/src/routes/_nav/tags/index.tsx +8 -0
- package/src/routes/_nav/tags/route.tsx +8 -0
- package/src/routes/_nav/tags/settings/route.tsx +9 -0
- package/src/routes/_nav/test-cases/route.tsx +2 -3
- package/src/routes/_nav/workspaces/$workspaceId/activities/route.lazy.tsx +69 -0
- package/src/routes/_nav/workspaces/$workspaceId/activities/route.tsx +28 -0
- package/src/routes/_nav/workspaces/$workspaceId/route.lazy.tsx +194 -99
- package/src/routes/_nav/workspaces/$workspaceId/route.tsx +12 -3
- package/src/routes/_nav/workspaces/$workspaceId/settings/route.lazy.tsx +75 -61
- package/src/routes/_nav/workspaces/index.lazy.tsx +196 -22
- package/src/routes/_nav/workspaces/route.tsx +2 -0
- package/src/routes/_public/index/route.tsx +5 -1
- package/src/routes/invite/$token/route.lazy.tsx +36 -37
- package/src/routes/share/$versionId/route.lazy.tsx +4 -11
- package/src/routes/share/compliance/$id/route.lazy.tsx +6 -8
- package/src/routes/share/law/$id/route.lazy.tsx +6 -8
- package/src/routes/share/prd/$prdId/route.tsx +10 -0
- package/src/server/__tests__/agent-client-graph.test.ts +4 -8
- package/src/server/ai-ports.ts +7 -6
- package/src/server/builtin-project.ts +43 -0
- package/src/server/design/sketch/file-storage.ts +1 -1
- package/src/server/pro-services.ts +1 -1
- package/src/server/serverFns/__tests__/workspace.test.ts +101 -0
- package/src/server/serverFns/activity.ts +15 -9
- package/src/server/serverFns/knowledge-public/bookmarks/list.ts +1 -1
- package/src/server/serverFns/knowledge-public/bookmarks/share.ts +3 -3
- package/src/server/serverFns/knowledge-public/compliance/share.ts +3 -3
- package/src/server/serverFns/knowledge-public/dictionary/share.ts +3 -3
- package/src/server/serverFns/knowledge-public/legal/share.ts +3 -3
- package/src/server/serverFns/knowledge.ts +27 -2
- package/src/server/serverFns/notifications.ts +3 -0
- package/src/server/serverFns/project.ts +48 -35
- package/src/server/serverFns/story/story-crud/bulk.ts +2 -2
- package/src/server/serverFns/story/story-crud.ts +9 -7
- package/src/server/serverFns/story/story-groups.ts +6 -6
- package/src/server/serverFns/workspace.ts +334 -13
- package/src/server-entry.ts +29 -0
- package/vite.shared.ts +4 -1
- package/src/components/layout/sidebar-03/logo.tsx +0 -41
- package/src/i18n/__tests__/detect.test.ts +0 -48
- package/src/i18n/__tests__/integration.test.tsx +0 -32
- package/src/i18n/__tests__/server.test.ts +0 -33
- package/src/i18n/client.ts +0 -32
- package/src/i18n/config.ts +0 -116
- package/src/i18n/detect.ts +0 -43
- package/src/i18n/locales/en/agents.json +0 -134
- package/src/i18n/locales/en/apps.json +0 -6
- package/src/i18n/locales/en/auth.json +0 -90
- package/src/i18n/locales/en/billing.json +0 -78
- package/src/i18n/locales/en/chat.json +0 -194
- package/src/i18n/locales/en/common.json +0 -242
- package/src/i18n/locales/en/dashboard.json +0 -38
- package/src/i18n/locales/en/design.json +0 -70
- package/src/i18n/locales/en/desktop.json +0 -35
- package/src/i18n/locales/en/display.json +0 -37
- package/src/i18n/locales/en/editor.json +0 -304
- package/src/i18n/locales/en/enterprise.json +0 -1
- package/src/i18n/locales/en/invite.json +0 -56
- package/src/i18n/locales/en/iterations.json +0 -92
- package/src/i18n/locales/en/knowledge.json +0 -462
- package/src/i18n/locales/en/mindmap.json +0 -28
- package/src/i18n/locales/en/notifications.json +0 -79
- package/src/i18n/locales/en/prd.json +0 -51
- package/src/i18n/locales/en/projects.json +0 -140
- package/src/i18n/locales/en/settings.json +0 -428
- package/src/i18n/locales/en/share.json +0 -20
- package/src/i18n/locales/en/story.json +0 -923
- package/src/i18n/locales/en/tags.json +0 -42
- package/src/i18n/locales/en/workspace.json +0 -90
- package/src/i18n/locales/zh/agents.json +0 -134
- package/src/i18n/locales/zh/apps.json +0 -6
- package/src/i18n/locales/zh/auth.json +0 -90
- package/src/i18n/locales/zh/billing.json +0 -78
- package/src/i18n/locales/zh/chat.json +0 -194
- package/src/i18n/locales/zh/common.json +0 -242
- package/src/i18n/locales/zh/dashboard.json +0 -38
- package/src/i18n/locales/zh/design.json +0 -70
- package/src/i18n/locales/zh/desktop.json +0 -35
- package/src/i18n/locales/zh/display.json +0 -37
- package/src/i18n/locales/zh/editor.json +0 -304
- package/src/i18n/locales/zh/enterprise.json +0 -1
- package/src/i18n/locales/zh/invite.json +0 -56
- package/src/i18n/locales/zh/iterations.json +0 -92
- package/src/i18n/locales/zh/knowledge.json +0 -462
- package/src/i18n/locales/zh/mindmap.json +0 -28
- package/src/i18n/locales/zh/notifications.json +0 -79
- package/src/i18n/locales/zh/prd.json +0 -51
- package/src/i18n/locales/zh/projects.json +0 -140
- package/src/i18n/locales/zh/settings.json +0 -428
- package/src/i18n/locales/zh/share.json +0 -20
- package/src/i18n/locales/zh/story.json +0 -923
- package/src/i18n/locales/zh/tags.json +0 -42
- package/src/i18n/locales/zh/workspace.json +0 -90
- package/src/i18n/server.ts +0 -18
- package/src/i18n/types.ts +0 -5
- package/src/server/serverFns/locale.ts +0 -20
|
@@ -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, useMemo, useEffect } from "react";
|
|
20
|
-
import {
|
|
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 { Badge } from "@/components/ui/badge";
|
|
@@ -83,7 +82,6 @@ interface PageVersionTreeProps {
|
|
|
83
82
|
}
|
|
84
83
|
|
|
85
84
|
export function PageVersionTree({ versions, onRestore }: PageVersionTreeProps) {
|
|
86
|
-
const { t } = useTranslation("prd");
|
|
87
85
|
const [expandedVersionId, setExpandedVersionId] = useState<string | null>(null);
|
|
88
86
|
const [expandedNodes, setExpandedNodes] = useState<Set<string>>(new Set());
|
|
89
87
|
const timezone = useTimezone();
|
|
@@ -149,7 +147,7 @@ export function PageVersionTree({ versions, onRestore }: PageVersionTreeProps) {
|
|
|
149
147
|
<span className="flex-1 truncate">
|
|
150
148
|
{node.name}
|
|
151
149
|
{isPlaceholder && (
|
|
152
|
-
<span className="text-[10px] text-muted-foreground/40 ml-1">{
|
|
150
|
+
<span className="text-[10px] text-muted-foreground/40 ml-1">{m.version_unpublished()}</span>
|
|
153
151
|
)}
|
|
154
152
|
</span>
|
|
155
153
|
|
|
@@ -170,7 +168,7 @@ export function PageVersionTree({ versions, onRestore }: PageVersionTreeProps) {
|
|
|
170
168
|
</Button>
|
|
171
169
|
</TooltipTrigger>
|
|
172
170
|
<TooltipContent>
|
|
173
|
-
<p>{
|
|
171
|
+
<p>{m.version_restoreToCurrent()}</p>
|
|
174
172
|
</TooltipContent>
|
|
175
173
|
</Tooltip>
|
|
176
174
|
</>
|
|
@@ -255,11 +253,11 @@ export function PageVersionTree({ versions, onRestore }: PageVersionTreeProps) {
|
|
|
255
253
|
)}
|
|
256
254
|
<span className="font-medium">{v.versionLabel}</span>
|
|
257
255
|
{v.id === latestUpdatedVersionId && (
|
|
258
|
-
<Badge variant="secondary" className="text-[10px] h-4 px-1.5 leading-none font-normal">{
|
|
256
|
+
<Badge variant="secondary" className="text-[10px] h-4 px-1.5 leading-none font-normal">{m.version_recentlyUpdated()}</Badge>
|
|
259
257
|
)}
|
|
260
258
|
<span className="text-muted-foreground ml-auto text-[10px] flex items-center gap-1">
|
|
261
259
|
{v.updatedAt ? (
|
|
262
|
-
<span>{
|
|
260
|
+
<span>{m.version_updatedAt()} {formatDate(new Date(v.updatedAt), timezone, 'yyyy-MM-dd')}</span>
|
|
263
261
|
) : (
|
|
264
262
|
formatDate(new Date(v.createdAt), timezone, 'yyyy-MM-dd')
|
|
265
263
|
)}
|
|
@@ -293,7 +291,7 @@ export function PageVersionTree({ versions, onRestore }: PageVersionTreeProps) {
|
|
|
293
291
|
</Button>
|
|
294
292
|
</TooltipTrigger>
|
|
295
293
|
<TooltipContent>
|
|
296
|
-
<p>{
|
|
294
|
+
<p>{m.version_restoreToCurrent()}</p>
|
|
297
295
|
</TooltipContent>
|
|
298
296
|
</Tooltip>
|
|
299
297
|
</div>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { m } from '@/paraglide/messages.js'
|
|
1
2
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
3
|
// AllBlue - 理想之海
|
|
3
4
|
// Copyright (C) 2026 AllBlue Contributors
|
|
@@ -16,11 +17,11 @@
|
|
|
16
17
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
18
|
|
|
18
19
|
import { useState, useRef, useEffect, useCallback } from "react"
|
|
19
|
-
import { useTranslation } from "react-i18next"
|
|
20
20
|
import { Bot, Loader2, User, Plus, Trash2, ChevronDown, MessageSquare } from "lucide-react"
|
|
21
21
|
import { cn } from "@/lib/utils"
|
|
22
22
|
import { toast } from '@/components/ui/sonner'
|
|
23
23
|
import type { CanvasElement } from "@allbluecn/kernel"
|
|
24
|
+
import type { PrototypeComponentConfig } from "@/components/prototype"
|
|
24
25
|
import { getAllComponents } from "@/lib/prototype-registry"
|
|
25
26
|
import { generatePrototypeFn, type GeneratedComponent } from "@/plugins/core/prd/serverFns/ai/generate-prototype"
|
|
26
27
|
import { computeStackPositions } from "@/lib/prd/stack-layout"
|
|
@@ -67,13 +68,13 @@ interface PRDAgentPanelProps {
|
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
/** 将会话按 updatedAt 分组(今天/昨天/本周/更早) */
|
|
70
|
-
function groupConversations(conversations: ConversationItem[]
|
|
71
|
+
function groupConversations(conversations: ConversationItem[]): Array<{ label: string; items: ConversationItem[] }> {
|
|
71
72
|
const now = new Date()
|
|
72
73
|
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate())
|
|
73
74
|
const yesterday = new Date(today.getTime() - 86400000)
|
|
74
75
|
const weekAgo = new Date(today.getTime() - 7 * 86400000)
|
|
75
76
|
|
|
76
|
-
const groupKeys = ["
|
|
77
|
+
const groupKeys = ["today", "yesterday", "thisWeek", "earlier"]
|
|
77
78
|
const groups: Record<string, ConversationItem[]> = {
|
|
78
79
|
[groupKeys[0]]: [],
|
|
79
80
|
[groupKeys[1]]: [],
|
|
@@ -87,7 +88,13 @@ function groupConversations(conversations: ConversationItem[], t: (key: string)
|
|
|
87
88
|
else if (d >= weekAgo) groups[groupKeys[2]].push(conv)
|
|
88
89
|
else groups[groupKeys[3]].push(conv)
|
|
89
90
|
}
|
|
90
|
-
|
|
91
|
+
const LABELS: Record<string, () => string> = {
|
|
92
|
+
today: m.chat_groups_today,
|
|
93
|
+
yesterday: m.chat_groups_yesterday,
|
|
94
|
+
thisWeek: m.chat_groups_thisWeek,
|
|
95
|
+
earlier: m.chat_groups_earlier,
|
|
96
|
+
}
|
|
97
|
+
return groupKeys.map((key) => ({ label: LABELS[key]?.() ?? key, items: groups[key] }))
|
|
91
98
|
}
|
|
92
99
|
|
|
93
100
|
/** 将 AI 生成的组件规格转换为 CanvasElement[] */
|
|
@@ -99,7 +106,7 @@ function generatedToElements(
|
|
|
99
106
|
|
|
100
107
|
// 先确定每个组件最终采用的尺寸,再按实际高度纵向堆叠
|
|
101
108
|
const resolved = components.map((comp) => {
|
|
102
|
-
const config = allComponents.find((c) => c.type === comp.type)
|
|
109
|
+
const config = allComponents.find((c: PrototypeComponentConfig) => c.type === comp.type)
|
|
103
110
|
const width = comp.width ?? config?.defaultWidth ?? 160
|
|
104
111
|
// 未注册的自定义组件(如表格)通常内容较多,给更大的默认高度避免被压缩到不可见
|
|
105
112
|
const height = comp.height ?? config?.defaultHeight ?? (config ? 48 : 120)
|
|
@@ -137,7 +144,6 @@ function generatedToElements(
|
|
|
137
144
|
}
|
|
138
145
|
|
|
139
146
|
export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel, onModelChange }: PRDAgentPanelProps) {
|
|
140
|
-
const { t } = useTranslation("prd")
|
|
141
147
|
const [messages, setMessages] = useState<ChatMessage[]>([])
|
|
142
148
|
const [input, setInput] = useState("")
|
|
143
149
|
const [loading, setLoading] = useState(false)
|
|
@@ -176,7 +182,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
|
|
|
176
182
|
return
|
|
177
183
|
}
|
|
178
184
|
getAgentMessagesFn({ data: { conversationId } })
|
|
179
|
-
.then((msgs) => {
|
|
185
|
+
.then((msgs: unknown[]) => {
|
|
180
186
|
setMessages(
|
|
181
187
|
(msgs as Array<{ id: string; role: string; content: string; isError: boolean }>).map((m) => ({
|
|
182
188
|
id: m.id,
|
|
@@ -197,7 +203,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
|
|
|
197
203
|
|
|
198
204
|
useEffect(() => {
|
|
199
205
|
listEnabledModelsFn()
|
|
200
|
-
.then((data) => {
|
|
206
|
+
.then((data: ModelOption[]) => {
|
|
201
207
|
const typed = data as ModelOption[]
|
|
202
208
|
setModels(typed)
|
|
203
209
|
if (typed.length > 0 && !selectedModel) onModelChange(typed[0].model)
|
|
@@ -220,8 +226,8 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
|
|
|
220
226
|
setConversationId(convId)
|
|
221
227
|
refreshConversations()
|
|
222
228
|
} catch (err) {
|
|
223
|
-
const errMsg = err instanceof Error ? err.message :
|
|
224
|
-
toast.error(
|
|
229
|
+
const errMsg = err instanceof Error ? err.message : m.agent_createFailed()
|
|
230
|
+
toast.error(m.agent_createFailed(), { description: errMsg })
|
|
225
231
|
return
|
|
226
232
|
}
|
|
227
233
|
}
|
|
@@ -240,7 +246,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
|
|
|
240
246
|
data: { conversationId: convId, role: "user", content: trimmed },
|
|
241
247
|
})
|
|
242
248
|
|
|
243
|
-
const catalog = getAllComponents().map((c) => ({
|
|
249
|
+
const catalog = getAllComponents().map((c: PrototypeComponentConfig) => ({
|
|
244
250
|
type: c.type,
|
|
245
251
|
name: c.name,
|
|
246
252
|
category: c.category,
|
|
@@ -255,7 +261,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
|
|
|
255
261
|
onElementsChange([...elements, ...newElements])
|
|
256
262
|
}
|
|
257
263
|
|
|
258
|
-
const assistantContent = `${result.message}${
|
|
264
|
+
const assistantContent = `${result.message}${m.agent_addedToCanvas({ count: newElements.length })}`
|
|
259
265
|
const assistantMsg: ChatMessage = {
|
|
260
266
|
id: `a_${Date.now()}`,
|
|
261
267
|
role: "assistant",
|
|
@@ -273,8 +279,8 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
|
|
|
273
279
|
})
|
|
274
280
|
refreshConversations()
|
|
275
281
|
} catch (err) {
|
|
276
|
-
const errMsg = err instanceof Error ? err.message :
|
|
277
|
-
const errorContent = `${
|
|
282
|
+
const errMsg = err instanceof Error ? err.message : m.agent_generateFailed()
|
|
283
|
+
const errorContent = `${m.agent_generateFailed()}:${errMsg}`
|
|
278
284
|
const errorMsg: ChatMessage = {
|
|
279
285
|
id: `e_${Date.now()}`,
|
|
280
286
|
role: "assistant",
|
|
@@ -285,7 +291,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
|
|
|
285
291
|
await saveAgentMessageFn({
|
|
286
292
|
data: { conversationId: convId, role: "assistant", content: errorContent, isError: true },
|
|
287
293
|
}).catch(() => {})
|
|
288
|
-
toast.error(
|
|
294
|
+
toast.error(m.agent_prototypeFailed(), { description: errMsg })
|
|
289
295
|
} finally {
|
|
290
296
|
setLoading(false)
|
|
291
297
|
}
|
|
@@ -301,14 +307,14 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
|
|
|
301
307
|
<MessageSquare className="size-3 shrink-0" />
|
|
302
308
|
<span className="truncate">
|
|
303
309
|
{conversationId
|
|
304
|
-
? conversations.find((c) => c.id === conversationId)?.title ??
|
|
305
|
-
:
|
|
310
|
+
? conversations.find((c) => c.id === conversationId)?.title ?? m.agent_unknownConv()
|
|
311
|
+
: m.agent_newConv()}
|
|
306
312
|
</span>
|
|
307
313
|
<ChevronDown className="size-3 shrink-0" />
|
|
308
314
|
</button>
|
|
309
315
|
</DropdownMenuTrigger>
|
|
310
316
|
<DropdownMenuContent align="start" className="min-w-56 max-h-80 overflow-y-auto rounded-lg p-1">
|
|
311
|
-
{groupConversations(conversations
|
|
317
|
+
{groupConversations(conversations).map(({ label, items }) => (
|
|
312
318
|
items.length > 0 && (
|
|
313
319
|
<DropdownMenuGroup key={label}>
|
|
314
320
|
<DropdownMenuLabel className="text-[10px] text-muted-foreground/60">{label}</DropdownMenuLabel>
|
|
@@ -338,7 +344,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
|
|
|
338
344
|
)
|
|
339
345
|
))}
|
|
340
346
|
{conversations.length === 0 && (
|
|
341
|
-
<div className="px-2 py-3 text-center text-xs text-muted-foreground">{
|
|
347
|
+
<div className="px-2 py-3 text-center text-xs text-muted-foreground">{m.agent_noConversations()}</div>
|
|
342
348
|
)}
|
|
343
349
|
<DropdownMenuSeparator />
|
|
344
350
|
<DropdownMenuItem
|
|
@@ -348,7 +354,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
|
|
|
348
354
|
setMessages([])
|
|
349
355
|
}}
|
|
350
356
|
>
|
|
351
|
-
<Plus className="size-3" /> {
|
|
357
|
+
<Plus className="size-3" /> {m.agent_newConversation()}
|
|
352
358
|
</DropdownMenuItem>
|
|
353
359
|
{conversations.length > 0 && (
|
|
354
360
|
<DropdownMenuItem
|
|
@@ -361,7 +367,7 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
|
|
|
361
367
|
})
|
|
362
368
|
}}
|
|
363
369
|
>
|
|
364
|
-
<Trash2 className="size-3" /> {
|
|
370
|
+
<Trash2 className="size-3" /> {m.agent_clearAll()}
|
|
365
371
|
</DropdownMenuItem>
|
|
366
372
|
)}
|
|
367
373
|
</DropdownMenuContent>
|
|
@@ -372,8 +378,8 @@ export function PRDAgentPanel({ prdId, elements, onElementsChange, selectedModel
|
|
|
372
378
|
{messages.length === 0 ? (
|
|
373
379
|
<div className="flex flex-col items-center justify-center h-full text-center gap-2 text-muted-foreground">
|
|
374
380
|
<Bot className="size-8 opacity-40" />
|
|
375
|
-
<p className="text-xs">{
|
|
376
|
-
<p className="text-[10px] opacity-60">{
|
|
381
|
+
<p className="text-xs">{m.agent_emptyHint()}</p>
|
|
382
|
+
<p className="text-[10px] opacity-60">{m.agent_emptyExample()}</p>
|
|
377
383
|
</div>
|
|
378
384
|
) : (
|
|
379
385
|
messages.map((msg) => (
|
|
@@ -15,9 +15,7 @@
|
|
|
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 { useState, useEffect } from "react";
|
|
20
|
-
import { useTranslation } from "react-i18next";
|
|
21
19
|
import { cn } from "@/lib/utils";
|
|
22
20
|
import { Badge } from "@/components/ui/badge";
|
|
23
21
|
import { Button } from "@/components/ui/button";
|
|
@@ -29,10 +27,11 @@ import { maskEmail, formatTime, formatEditedTime } from "@/lib/comment-utils";
|
|
|
29
27
|
import { UserAvatar } from "@/components/shared-kit";
|
|
30
28
|
import type { AvatarConfig, ShapeType } from "@allbluecn/kernel";
|
|
31
29
|
import { listCommentsFn, ignoreCommentFn } from "@/plugins/core/prd/serverFns/comments";
|
|
30
|
+
import { m } from "@/paraglide/messages.js";
|
|
32
31
|
|
|
33
32
|
const SUBTABS = [
|
|
34
|
-
{ key: "comment", label:
|
|
35
|
-
{ key: "review", label:
|
|
33
|
+
{ key: "comment", label: m.comment_subtabComment, icon: <MessageSquare className="size-3.5" /> },
|
|
34
|
+
{ key: "review", label: m.comment_subtabReview, icon: <ClipboardCheck className="size-3.5" /> },
|
|
36
35
|
] as const;
|
|
37
36
|
|
|
38
37
|
interface CommentUser {
|
|
@@ -57,7 +56,6 @@ interface PRDCommentReviewPanelProps {
|
|
|
57
56
|
}
|
|
58
57
|
|
|
59
58
|
export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
|
|
60
|
-
const { t } = useTranslation("prd");
|
|
61
59
|
const { data: session } = useSession();
|
|
62
60
|
const [activeSubTab, setActiveSubTab] = useState("comment");
|
|
63
61
|
const [comments, setComments] = useState<Comment[]>([]);
|
|
@@ -67,15 +65,15 @@ export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
|
|
|
67
65
|
useEffect(() => {
|
|
68
66
|
if (!session?.user?.id) {
|
|
69
67
|
listCommentsFn({ data: { prdId } })
|
|
70
|
-
.then((all) => setComments(all.map((c) => ({ ...c, createdAt: c.createdAt.toISOString(), updatedAt: c.updatedAt?.toISOString() ?? '', user: { ...c.user, avatarConfig: c.user.avatarConfig as AvatarConfig | null, bgShape: c.user.bgShape as ShapeType | null, bgColor: c.user.bgColor } }))))
|
|
68
|
+
.then((all: Awaited<ReturnType<typeof listCommentsFn>>) => setComments(all.map((c: any) => ({ ...c, createdAt: c.createdAt.toISOString(), updatedAt: c.updatedAt?.toISOString() ?? '', user: { ...c.user, avatarConfig: c.user.avatarConfig as AvatarConfig | null, bgShape: c.user.bgShape as ShapeType | null, bgColor: c.user.bgColor } }))))
|
|
71
69
|
.catch(() => {});
|
|
72
70
|
return;
|
|
73
71
|
}
|
|
74
72
|
listCommentsFn({ data: { prdId, includeResolved: true } })
|
|
75
|
-
.then((all) => {
|
|
76
|
-
const mapped = all.map((c) => ({ ...c, createdAt: c.createdAt.toISOString(), updatedAt: c.updatedAt?.toISOString() ?? '', user: { ...c.user, avatarConfig: c.user.avatarConfig as AvatarConfig | null, bgShape: c.user.bgShape as ShapeType | null, bgColor: c.user.bgColor } }));
|
|
77
|
-
setComments(mapped.filter((c) => !c.resolved));
|
|
78
|
-
setIgnoredIds(new Set(mapped.filter((c) => c.resolved).map((c) => c.id)));
|
|
73
|
+
.then((all: Awaited<ReturnType<typeof listCommentsFn>>) => {
|
|
74
|
+
const mapped = all.map((c: any) => ({ ...c, createdAt: c.createdAt.toISOString(), updatedAt: c.updatedAt?.toISOString() ?? '', user: { ...c.user, avatarConfig: c.user.avatarConfig as AvatarConfig | null, bgShape: c.user.bgShape as ShapeType | null, bgColor: c.user.bgColor } }));
|
|
75
|
+
setComments(mapped.filter((c: any) => !c.resolved));
|
|
76
|
+
setIgnoredIds(new Set(mapped.filter((c: any) => c.resolved).map((c: any) => c.id)));
|
|
79
77
|
})
|
|
80
78
|
.catch(() => {});
|
|
81
79
|
}, [prdId, session?.user?.id]);
|
|
@@ -130,12 +128,12 @@ export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
|
|
|
130
128
|
: "text-muted-foreground hover:text-foreground"
|
|
131
129
|
)}
|
|
132
130
|
>
|
|
133
|
-
{tab.icon} {
|
|
131
|
+
{tab.icon} {tab.label()}{tab.key === "comment" && commentCount > 0 && (
|
|
134
132
|
<Tooltip>
|
|
135
133
|
<TooltipTrigger asChild>
|
|
136
134
|
<span className="text-[10px] text-muted-foreground ml-0.5">({commentCount})</span>
|
|
137
135
|
</TooltipTrigger>
|
|
138
|
-
<TooltipContent side="top" className="text-xs">{
|
|
136
|
+
<TooltipContent side="top" className="text-xs">{m.comment_countTooltip({ count: commentCount })}</TooltipContent>
|
|
139
137
|
</Tooltip>
|
|
140
138
|
)}
|
|
141
139
|
</button>
|
|
@@ -146,7 +144,7 @@ export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
|
|
|
146
144
|
<div className="flex-1 overflow-y-auto p-3 space-y-3">
|
|
147
145
|
{/* <span className="text-xs font-medium text-muted-foreground">评论</span> */}
|
|
148
146
|
{comments.length === 0 ? (
|
|
149
|
-
<p className="text-xs text-muted-foreground text-center py-4">{
|
|
147
|
+
<p className="text-xs text-muted-foreground text-center py-4">{m.comment_noComments()}</p>
|
|
150
148
|
) : (
|
|
151
149
|
<div className="space-y-3">
|
|
152
150
|
{comments.map((c) => {
|
|
@@ -167,7 +165,7 @@ export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
|
|
|
167
165
|
<button onClick={() => toggleExpand(c.id)} className="flex-1 min-w-0 flex items-center gap-1.5 text-left cursor-pointer hover:bg-muted/30 rounded px-1 -mx-1 py-0.5 transition-colors">
|
|
168
166
|
<span className="text-sm font-medium">{c.user.username}</span>
|
|
169
167
|
<span className="text-[10px] text-muted-foreground">{maskEmail(c.user.email)}</span>
|
|
170
|
-
<Badge variant="outline" className="text-[9px] h-3.5 px-1 leading-none font-normal text-muted-foreground">{
|
|
168
|
+
<Badge variant="outline" className="text-[9px] h-3.5 px-1 leading-none font-normal text-muted-foreground">{m.prd_comment_ignored()}</Badge>
|
|
171
169
|
<span className="text-[10px] text-muted-foreground ml-auto">
|
|
172
170
|
{isEdited ? formatEditedTime(c.updatedAt) : formatTime(c.createdAt)}
|
|
173
171
|
</span>
|
|
@@ -177,10 +175,10 @@ export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
|
|
|
177
175
|
<div className="flex items-center gap-1.5 flex-wrap">
|
|
178
176
|
<span className="text-sm font-medium">{c.user.username}</span>
|
|
179
177
|
{isEdited && (
|
|
180
|
-
<Badge variant="secondary" className="text-[9px] h-3.5 px-1 leading-none font-normal">{
|
|
178
|
+
<Badge variant="secondary" className="text-[9px] h-3.5 px-1 leading-none font-normal">{m.comment_modified()}</Badge>
|
|
181
179
|
)}
|
|
182
180
|
{isIgnored && (
|
|
183
|
-
<Badge variant="outline" className="text-[9px] h-3.5 px-1 leading-none font-normal text-muted-foreground">{
|
|
181
|
+
<Badge variant="outline" className="text-[9px] h-3.5 px-1 leading-none font-normal text-muted-foreground">{m.prd_comment_ignored()}</Badge>
|
|
184
182
|
)}
|
|
185
183
|
<span className="text-[10px] text-muted-foreground ml-auto">
|
|
186
184
|
{isEdited ? formatEditedTime(c.updatedAt) : formatTime(c.createdAt)}
|
|
@@ -189,22 +187,22 @@ export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
|
|
|
189
187
|
<span className="text-[10px] text-muted-foreground block">{maskEmail(c.user.email)}</span>
|
|
190
188
|
<p className=" break-words">{c.content}</p>
|
|
191
189
|
<div className="flex items-center gap-1 pt-0.5">
|
|
192
|
-
<Button variant="ghost" size="sm" className="h-5 text-[10px] px-1.5 gap-0.5 text-muted-foreground hover:text-green-600 disabled:opacity-40" disabled={isIgnored} onClick={() => toast.success(
|
|
190
|
+
<Button variant="ghost" size="sm" className="h-5 text-[10px] px-1.5 gap-0.5 text-muted-foreground hover:text-green-600 disabled:opacity-40" disabled={isIgnored} onClick={() => toast.success(m.comment_accepted())}>
|
|
193
191
|
<Check className="size-2.5" />
|
|
194
|
-
{
|
|
192
|
+
{m.comment_accept()}
|
|
195
193
|
</Button>
|
|
196
|
-
<Button variant="ghost" size="sm" className="h-5 text-[10px] px-1.5 gap-0.5 text-muted-foreground hover:text-foreground disabled:opacity-40" disabled={isIgnored} onClick={() => toast.info(
|
|
194
|
+
<Button variant="ghost" size="sm" className="h-5 text-[10px] px-1.5 gap-0.5 text-muted-foreground hover:text-foreground disabled:opacity-40" disabled={isIgnored} onClick={() => toast.info(m.comment_replyComingSoon())}>
|
|
197
195
|
<Reply className="size-2.5" />
|
|
198
|
-
{
|
|
196
|
+
{m.story_comment_reply()}
|
|
199
197
|
</Button>
|
|
200
198
|
<Button variant="ghost" size="sm" className="h-5 text-[10px] px-1.5 gap-0.5 text-muted-foreground hover:text-red-600" onClick={() => toggleIgnore(c.id)}>
|
|
201
199
|
<X className="size-2.5" />
|
|
202
|
-
{isIgnored ?
|
|
200
|
+
{isIgnored ? m.comment_unignore() : m.comment_ignore()}
|
|
203
201
|
</Button>
|
|
204
202
|
{isIgnored && (
|
|
205
203
|
<Button variant="ghost" size="sm" className="h-5 text-[10px] px-1.5 gap-0.5 text-muted-foreground hover:text-foreground" onClick={() => toggleExpand(c.id)}>
|
|
206
204
|
<ChevronUp className="size-2.5" />
|
|
207
|
-
{
|
|
205
|
+
{m.comment_collapse()}
|
|
208
206
|
</Button>
|
|
209
207
|
)}
|
|
210
208
|
</div>
|
|
@@ -219,7 +217,7 @@ export function PRDCommentReviewPanel({ prdId }: PRDCommentReviewPanelProps) {
|
|
|
219
217
|
) : (
|
|
220
218
|
<div className="flex-1 overflow-y-auto p-3 space-y-3">
|
|
221
219
|
{/* <span className="text-xs font-medium text-muted-foreground">评审</span> */}
|
|
222
|
-
<p className="text-xs text-muted-foreground text-center py-4">{
|
|
220
|
+
<p className="text-xs text-muted-foreground text-center py-4">{m.comment_reviewComingSoon()}</p>
|
|
223
221
|
</div>
|
|
224
222
|
)}
|
|
225
223
|
</div>
|
|
@@ -15,8 +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
|
-
import { useTranslation } from "react-i18next";
|
|
19
18
|
import { Trash2, Package } from "lucide-react";
|
|
19
|
+
import { m } from '@/paraglide/messages.js'
|
|
20
20
|
import type { CanvasElement } from "@allbluecn/kernel";
|
|
21
21
|
import { getComponent } from "@/lib/prototype-registry";
|
|
22
22
|
import { Button } from "@/components/ui/button";
|
|
@@ -37,7 +37,6 @@ export function PRDComponentEditorContent({
|
|
|
37
37
|
onElementChange,
|
|
38
38
|
onDeleteElement,
|
|
39
39
|
}: PRDComponentEditorContentProps) {
|
|
40
|
-
const { t } = useTranslation("prd");
|
|
41
40
|
if (!element) {
|
|
42
41
|
return (
|
|
43
42
|
<div className="flex-1 flex flex-col justify-center px-4 overflow-auto mt-160">
|
|
@@ -46,8 +45,8 @@ export function PRDComponentEditorContent({
|
|
|
46
45
|
<Skeleton className="h-5 w-[65%] mx-auto rounded-md opacity-40" />
|
|
47
46
|
<Skeleton className="h-5 w-[80%] mx-auto rounded-md opacity-40" />
|
|
48
47
|
<div className="pt-5 text-center">
|
|
49
|
-
<p className="text-sm text-muted-foreground">{
|
|
50
|
-
<p className="text-xs text-muted-foreground/50 mt-1">{
|
|
48
|
+
<p className="text-sm text-muted-foreground">{m.editor_noSelection()}</p>
|
|
49
|
+
<p className="text-xs text-muted-foreground/50 mt-1">{m.editor_noSelectionHint()}</p>
|
|
51
50
|
</div>
|
|
52
51
|
</div>
|
|
53
52
|
</div>
|
|
@@ -71,18 +70,18 @@ export function PRDComponentEditorContent({
|
|
|
71
70
|
</div>
|
|
72
71
|
|
|
73
72
|
{editableProps && editableProps.length > 0 && (
|
|
74
|
-
<CollapsibleSection title={
|
|
73
|
+
<CollapsibleSection title={m.editor_tabContent()} defaultOpen>
|
|
75
74
|
<ContentSection fields={editableProps} element={element} onElementChange={onElementChange} />
|
|
76
75
|
</CollapsibleSection>
|
|
77
76
|
)}
|
|
78
77
|
|
|
79
|
-
<CollapsibleSection title={
|
|
78
|
+
<CollapsibleSection title={m.editor_tabStyle()} defaultOpen>
|
|
80
79
|
{STYLE_FIELDS.map((field) => (
|
|
81
80
|
<StyleFieldRow key={field.key} field={field} element={element} onElementChange={onElementChange} />
|
|
82
81
|
))}
|
|
83
82
|
</CollapsibleSection>
|
|
84
83
|
|
|
85
|
-
<CollapsibleSection title={
|
|
84
|
+
<CollapsibleSection title={m.editor_tabPosition()} defaultOpen={false}>
|
|
86
85
|
<PositionSection element={element} />
|
|
87
86
|
</CollapsibleSection>
|
|
88
87
|
</div>
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
import { cn } from "@/lib/utils"
|
|
19
19
|
import { useEffect, useMemo, useState } from "react";
|
|
20
|
-
import {
|
|
20
|
+
import { m } from '@/paraglide/messages.js'
|
|
21
21
|
import { Link } from "@tanstack/react-router";
|
|
22
22
|
import { Card } from "@/components/ui/card";
|
|
23
23
|
import { Button } from "@/components/ui/button";
|
|
@@ -63,22 +63,27 @@ interface StatCard {
|
|
|
63
63
|
accent: string;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
function formatRelative(dateStr: string, timezone: string
|
|
66
|
+
function formatRelative(dateStr: string, timezone: string): string {
|
|
67
67
|
const date = new Date(dateStr);
|
|
68
68
|
const now = new Date();
|
|
69
69
|
const diffMs = now.getTime() - date.getTime();
|
|
70
70
|
const minutes = Math.floor(diffMs / 60000);
|
|
71
71
|
const hours = Math.floor(minutes / 60);
|
|
72
72
|
const days = Math.floor(hours / 24);
|
|
73
|
-
if (minutes < 1) return
|
|
74
|
-
if (minutes < 60) return
|
|
75
|
-
if (hours < 24) return
|
|
76
|
-
if (days < 7) return
|
|
73
|
+
if (minutes < 1) return m.dashboard_dashboard_justNow();
|
|
74
|
+
if (minutes < 60) return m.dashboard_dashboard_minutesAgo({ count: minutes });
|
|
75
|
+
if (hours < 24) return m.dashboard_dashboard_hoursAgo({ count: hours });
|
|
76
|
+
if (days < 7) return m.dashboard_dashboard_daysAgo({ count: days });
|
|
77
77
|
return formatDate(date, timezone, 'yyyy-MM-dd');
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
const STAT_LABELS: Record<string, () => string> = {
|
|
81
|
+
"dashboard:dashboard.totalCount": m.dashboard_dashboard_totalCount,
|
|
82
|
+
"dashboard:dashboard.weekNew": m.dashboard_dashboard_weekNew,
|
|
83
|
+
"dashboard:dashboard.updated24h": m.dashboard_dashboard_updated24h,
|
|
84
|
+
};
|
|
85
|
+
|
|
80
86
|
export function PRDDashboard() {
|
|
81
|
-
const { t } = useTranslation(["prd", "common", "dashboard"]);
|
|
82
87
|
const [prds, setPrds] = useState<PRDItem[]>([]);
|
|
83
88
|
const [loading, setLoading] = useState(true);
|
|
84
89
|
const [search, setSearch] = useState("");
|
|
@@ -183,29 +188,29 @@ export function PRDDashboard() {
|
|
|
183
188
|
<LayoutPanelTopIcon size={56} className="mb-4 text-primary" />
|
|
184
189
|
<h1 className="text-2xl font-semibold">PRD</h1>
|
|
185
190
|
<p className="mt-2 max-w-2xl text-sm text-muted-foreground">
|
|
186
|
-
{
|
|
191
|
+
{m.dashboard_dashboard_subtitle()}
|
|
187
192
|
</p>
|
|
188
193
|
<div className="mx-auto mt-6 flex w-full max-w-2xl flex-col items-center gap-3">
|
|
189
194
|
<div className="relative w-full">
|
|
190
195
|
<Search className="absolute left-6 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
|
|
191
196
|
<Input
|
|
192
197
|
value={search}
|
|
193
|
-
onChange={(e) => setSearch(e.target.value)}
|
|
194
|
-
placeholder={
|
|
198
|
+
onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearch(e.target.value)}
|
|
199
|
+
placeholder={m.common_button_search()}
|
|
195
200
|
className="h-14 rounded-3xl bg-background/60 pl-12 dark:border-primary/40"
|
|
196
201
|
/>
|
|
197
202
|
</div>
|
|
198
203
|
</div>
|
|
199
204
|
<Button onClick={() => setCreateOpen(true)} className="mt-6">
|
|
200
205
|
<Plus className="size-4" />
|
|
201
|
-
{
|
|
206
|
+
{m.dashboard_dashboard_newPrd()}
|
|
202
207
|
</Button>
|
|
203
208
|
</div>
|
|
204
209
|
|
|
205
210
|
<div className="grid gap-4 sm:grid-cols-3">
|
|
206
211
|
{stats.map((stat) => (
|
|
207
212
|
<Card key={stat.title} className="p-5">
|
|
208
|
-
<p className="text-sm font-medium text-muted-foreground">{
|
|
213
|
+
<p className="text-sm font-medium text-muted-foreground">{STAT_LABELS[stat.title]?.() ?? stat.title}</p>
|
|
209
214
|
<div className={`mt-2 text-3xl font-bold ${stat.accent}`}>{stat.value}</div>
|
|
210
215
|
</Card>
|
|
211
216
|
))}
|
|
@@ -214,14 +219,14 @@ export function PRDDashboard() {
|
|
|
214
219
|
{loading ? (
|
|
215
220
|
<Card className="mt-6 flex flex-col items-center gap-2 p-16 text-muted-foreground">
|
|
216
221
|
<LoaderPinwheel className="size-6 animate-spin" />
|
|
217
|
-
<span>{
|
|
222
|
+
<span>{m.common_status_loading()}</span>
|
|
218
223
|
</Card>
|
|
219
224
|
) : filtered.length === 0 ? (
|
|
220
225
|
<Card className="mt-6 flex flex-col items-center justify-center gap-4 p-16 text-center">
|
|
221
226
|
<div>
|
|
222
|
-
<h2 className="text-lg font-medium">{
|
|
227
|
+
<h2 className="text-lg font-medium">{m.dashboard_dashboard_noPrd()}</h2>
|
|
223
228
|
<p className="mt-1 text-sm text-muted-foreground">
|
|
224
|
-
{search.trim() ?
|
|
229
|
+
{search.trim() ? m.dashboard_dashboard_noMatch() : m.dashboard_dashboard_noPrdHint()}
|
|
225
230
|
</p>
|
|
226
231
|
</div>
|
|
227
232
|
</Card>
|
|
@@ -240,7 +245,7 @@ export function PRDDashboard() {
|
|
|
240
245
|
variant="ghost"
|
|
241
246
|
size="icon"
|
|
242
247
|
className="relative z-10 size-7 opacity-0 group-hover:opacity-100"
|
|
243
|
-
aria-label={
|
|
248
|
+
aria-label={m.dashboard_dashboard_deletePrd()}
|
|
244
249
|
onClick={() => setPendingDeleteId(prd.id)}
|
|
245
250
|
>
|
|
246
251
|
<Trash2 className="size-4 text-muted-foreground" />
|
|
@@ -255,12 +260,12 @@ export function PRDDashboard() {
|
|
|
255
260
|
</div>
|
|
256
261
|
)}
|
|
257
262
|
<p className="mt-1 line-clamp-2 min-h-10 text-sm text-muted-foreground">
|
|
258
|
-
{prd.description?.trim() ||
|
|
263
|
+
{prd.description?.trim() || m.dashboard_dashboard_noDescription()}
|
|
259
264
|
</p>
|
|
260
265
|
<div className="mt-4 flex items-center gap-4 text-xs text-muted-foreground">
|
|
261
266
|
<span className="flex items-center gap-1">
|
|
262
267
|
<Clock className="size-3.5" />
|
|
263
|
-
{
|
|
268
|
+
{m.dashboard_dashboard_updatedAt()} {formatRelative(prd.updatedAt, timezone)}
|
|
264
269
|
</span>
|
|
265
270
|
</div>
|
|
266
271
|
</Card>
|
|
@@ -278,21 +283,21 @@ export function PRDDashboard() {
|
|
|
278
283
|
|
|
279
284
|
<AlertDialog
|
|
280
285
|
open={!!pendingDeleteId}
|
|
281
|
-
onOpenChange={(open) => {
|
|
286
|
+
onOpenChange={(open: boolean) => {
|
|
282
287
|
if (!open) setPendingDeleteId(null);
|
|
283
288
|
}}
|
|
284
289
|
>
|
|
285
290
|
<AlertDialogContent>
|
|
286
291
|
<AlertDialogHeader>
|
|
287
|
-
<AlertDialogTitle>{
|
|
292
|
+
<AlertDialogTitle>{m.dashboard_dashboard_confirmDeleteTitle()}</AlertDialogTitle>
|
|
288
293
|
<AlertDialogDescription>
|
|
289
|
-
{
|
|
294
|
+
{m.dashboard_dashboard_confirmDeleteDesc()}
|
|
290
295
|
</AlertDialogDescription>
|
|
291
296
|
</AlertDialogHeader>
|
|
292
297
|
<AlertDialogFooter>
|
|
293
|
-
<AlertDialogCancel disabled={deleting}>{
|
|
298
|
+
<AlertDialogCancel disabled={deleting}>{m.common_button_cancel()}</AlertDialogCancel>
|
|
294
299
|
<AlertDialogAction onClick={handleConfirmDelete} disabled={deleting}>
|
|
295
|
-
{deleting ?
|
|
300
|
+
{deleting ? m.common_status_deleting() : m.dashboard_dashboard_confirmDeleteTitle()}
|
|
296
301
|
</AlertDialogAction>
|
|
297
302
|
</AlertDialogFooter>
|
|
298
303
|
</AlertDialogContent>
|
|
@@ -15,17 +15,15 @@
|
|
|
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 from "react";
|
|
19
|
+
import { m } from '@/paraglide/messages.js'
|
|
20
20
|
import { lazy } from "react";
|
|
21
|
-
import { useTranslation } from "react-i18next";
|
|
22
21
|
import { cn } from "@/lib/utils";
|
|
23
22
|
import { Maximize2, Minimize2, } from "lucide-react";
|
|
24
23
|
|
|
25
24
|
const NotionDocEditor = lazy(() => import("@/components/tiptap/notion-like").then(m => ({ default: m.NotionDocEditor })));
|
|
26
25
|
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
|
|
27
26
|
|
|
28
|
-
|
|
29
27
|
interface PRDDocPanelProps {
|
|
30
28
|
className?: string;
|
|
31
29
|
content?: { html: string; markdown: string } | { text: string } | string;
|
|
@@ -39,14 +37,13 @@ interface PRDDocPanelProps {
|
|
|
39
37
|
}
|
|
40
38
|
|
|
41
39
|
export function PRDDocPanel({ className, content, onContentChange, autoSaveTime, saving, widthMode, onWidthModeChange, readOnly, onEditorReady }: PRDDocPanelProps) {
|
|
42
|
-
const { t } = useTranslation("prd");
|
|
43
40
|
return (
|
|
44
41
|
<div className={cn("flex flex-col h-full", className)}>
|
|
45
42
|
<div className="shrink-0 flex items-center justify-between gap-1 px-4 h-10 border-b bg-muted/5">
|
|
46
43
|
<div className="flex items-center gap-2">
|
|
47
|
-
<span className="text-xs font-medium text-muted-foreground">{
|
|
44
|
+
<span className="text-xs font-medium text-muted-foreground">{m.docPanel_title()}</span>
|
|
48
45
|
{saving ? (
|
|
49
|
-
<span className="text-[10px] text-muted-foreground/40">{
|
|
46
|
+
<span className="text-[10px] text-muted-foreground/40">{m.docPanel_saving()}</span>
|
|
50
47
|
) : autoSaveTime ? (
|
|
51
48
|
<span className="text-[10px] text-muted-foreground/40">{autoSaveTime}</span>
|
|
52
49
|
) : null}
|
|
@@ -68,7 +65,7 @@ export function PRDDocPanel({ className, content, onContentChange, autoSaveTime,
|
|
|
68
65
|
</button>
|
|
69
66
|
</TooltipTrigger>
|
|
70
67
|
<TooltipContent>
|
|
71
|
-
<p>{
|
|
68
|
+
<p>{m.docPanel_wider()}</p>
|
|
72
69
|
</TooltipContent>
|
|
73
70
|
</Tooltip>
|
|
74
71
|
|
|
@@ -87,7 +84,7 @@ export function PRDDocPanel({ className, content, onContentChange, autoSaveTime,
|
|
|
87
84
|
</button>
|
|
88
85
|
</TooltipTrigger>
|
|
89
86
|
<TooltipContent>
|
|
90
|
-
<p>{
|
|
87
|
+
<p>{m.docPanel_defaultWidth()}</p>
|
|
91
88
|
</TooltipContent>
|
|
92
89
|
</Tooltip>
|
|
93
90
|
</div>
|
|
@@ -105,7 +102,7 @@ export function PRDDocPanel({ className, content, onContentChange, autoSaveTime,
|
|
|
105
102
|
<NotionDocEditor
|
|
106
103
|
content={content}
|
|
107
104
|
onChange={onContentChange}
|
|
108
|
-
placeholder={
|
|
105
|
+
placeholder={m.docPanel_placeholder()}
|
|
109
106
|
readOnly={readOnly}
|
|
110
107
|
onEditorReady={onEditorReady}
|
|
111
108
|
showHeader={false}
|