@lobehub/lobehub 2.0.0-next.213 → 2.0.0-next.215
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/.github/workflows/e2e.yml +1 -1
- package/.github/workflows/pr-build-desktop.yml +2 -2
- package/.github/workflows/release-desktop-beta.yml +2 -2
- package/.github/workflows/release.yml +1 -1
- package/.github/workflows/test.yml +2 -2
- package/CHANGELOG.md +51 -0
- package/apps/desktop/package.json +3 -2
- package/apps/desktop/src/main/const/store.ts +1 -1
- package/apps/desktop/src/main/controllers/SystemCtr.ts +2 -3
- package/apps/desktop/src/main/core/App.ts +10 -3
- package/apps/desktop/src/main/types/store.ts +1 -1
- package/changelog/v1.json +14 -0
- package/package.json +4 -3
- package/packages/builtin-tool-knowledge-base/src/client/Render/SearchKnowledgeBase/Item/index.tsx +4 -2
- package/packages/builtin-tool-local-system/src/client/Intervention/EditLocalFile/index.tsx +3 -2
- package/packages/builtin-tool-local-system/src/client/Render/EditLocalFile/index.tsx +3 -2
- package/packages/const/src/theme.ts +0 -2
- package/packages/desktop-bridge/src/routeVariants.ts +2 -9
- package/packages/electron-client-ipc/src/types/system.ts +1 -1
- package/scripts/electronWorkflow/modifiers/nextConfig.mts +41 -13
- package/src/app/[variants]/(auth)/_layout/index.tsx +3 -2
- package/src/app/[variants]/(auth)/_layout/style.ts +8 -18
- package/src/app/[variants]/(auth)/layout.tsx +7 -3
- package/src/app/[variants]/(desktop)/desktop-onboarding/_layout/index.tsx +4 -2
- package/src/app/[variants]/(desktop)/desktop-onboarding/_layout/style.ts +3 -0
- package/src/app/[variants]/(main)/_layout/DesktopLayoutContainer.tsx +3 -2
- package/src/app/[variants]/(main)/chat/profile/features/ProfileEditor/PluginTag.tsx +3 -2
- package/src/app/[variants]/(main)/community/(list)/_layout/Footer.tsx +3 -2
- package/src/app/[variants]/(main)/group/features/Conversation/ChatItem/Thread.tsx +3 -2
- package/src/app/[variants]/(main)/group/profile/features/AgentBuilder/index.tsx +0 -1
- package/src/app/[variants]/(main)/group/profile/features/ProfileEditor/PluginTag.tsx +3 -2
- package/src/app/[variants]/(main)/home/_layout/Body/Agent/List/AgentItem/Editing.tsx +2 -2
- package/src/app/[variants]/(main)/home/_layout/Footer/index.tsx +1 -1
- package/src/app/[variants]/(main)/home/_layout/index.tsx +3 -2
- package/src/app/[variants]/(main)/home/features/CommunityAgents/Item.tsx +3 -2
- package/src/app/[variants]/(main)/image/_layout/ConfigPanel/components/AspectRatioSelect/index.tsx +4 -2
- package/src/app/[variants]/(main)/image/_layout/ConfigPanel/components/ModelSelect/ImageModelItem.tsx +3 -2
- package/src/app/[variants]/(main)/image/_layout/ConfigPanel/components/Select/index.tsx +4 -2
- package/src/app/[variants]/(main)/image/features/PromptInput/index.tsx +3 -2
- package/src/app/[variants]/(main)/memory/features/TimeLineView/index.tsx +9 -4
- package/src/app/[variants]/(main)/page/_layout/Body/List/Item/Editing.tsx +2 -2
- package/src/app/[variants]/(main)/settings/common/features/Common/Common.tsx +11 -11
- package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +3 -2
- package/src/app/[variants]/(main)/settings/stats/features/overview/ShareButton/TotalCard.tsx +4 -2
- package/src/app/[variants]/(mobile)/me/(home)/features/Header.tsx +6 -8
- package/src/app/[variants]/layout.tsx +10 -15
- package/src/app/[variants]/onboarding/_layout/index.tsx +3 -2
- package/src/app/[variants]/onboarding/features/ModeSelectionStep.tsx +3 -2
- package/src/app/[variants]/router/index.tsx +12 -8
- package/src/components/Cell/Divider.tsx +4 -2
- package/src/components/DataStyleModal/index.tsx +4 -2
- package/src/components/FeatureList/index.tsx +4 -2
- package/src/components/FileParsingStatus/EmbeddingStatus.tsx +3 -2
- package/src/components/FileParsingStatus/index.tsx +3 -2
- package/src/components/Notification/index.tsx +4 -2
- package/src/components/client/ClientOnly.tsx +17 -0
- package/src/features/AlertBanner/CloudBanner.tsx +4 -3
- package/src/features/CommandMenu/ThemeMenu.tsx +1 -1
- package/src/features/CommandMenu/types.ts +5 -2
- package/src/features/CommandMenu/useCommandMenu.ts +3 -2
- package/src/features/Conversation/Markdown/plugins/LobeArtifact/Render/index.tsx +3 -2
- package/src/features/Conversation/Messages/components/FileChunks/ChunkItem.tsx +3 -2
- package/src/features/Conversation/Messages/components/FileChunks/index.tsx +4 -2
- package/src/features/Conversation/Messages/components/SearchGrounding.tsx +3 -2
- package/src/features/ElectronTitlebar/hooks/useWatchThemeUpdate.ts +21 -38
- package/src/features/GroupChatSettings/AgentCard.tsx +3 -2
- package/src/features/GroupChatSettings/HostMemberCard.tsx +3 -2
- package/src/features/PageEditor/DiffAllToolbar.tsx +4 -2
- package/src/features/Portal/Document/Header.tsx +11 -9
- package/src/features/User/UserPanel/ThemeButton.tsx +18 -29
- package/src/hooks/useIsDark.ts +11 -0
- package/src/layout/AuthProvider/Clerk/useAppearance.ts +4 -2
- package/src/layout/AuthProvider/MarketAuth/MarketAuthConfirmModal.tsx +3 -2
- package/src/layout/GlobalProvider/AppTheme.tsx +15 -19
- package/src/layout/GlobalProvider/NextThemeProvider.tsx +22 -0
- package/src/layout/GlobalProvider/StyleRegistry.tsx +18 -13
- package/src/layout/GlobalProvider/index.tsx +38 -36
- package/src/libs/next/proxy/define-config.ts +2 -11
- package/src/store/global/action.test.ts +0 -15
- package/src/store/global/actions/__tests__/general.test.ts +0 -37
- package/src/store/global/actions/general.ts +0 -21
- package/src/store/global/initialState.ts +0 -6
- package/src/store/global/selectors/systemStatus.test.ts +0 -20
- package/src/store/global/selectors/systemStatus.ts +0 -2
- package/src/styles/global.ts +0 -2
- package/src/utils/server/routeVariants.test.ts +17 -51
- package/src/utils/server/routeVariants.ts +0 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Button, Flexbox, Text } from '@lobehub/ui';
|
|
2
|
-
import { createStaticStyles, cx
|
|
2
|
+
import { createStaticStyles, cx } from 'antd-style';
|
|
3
3
|
import { memo, useCallback, useState } from 'react';
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
|
5
5
|
|
|
6
6
|
import DefaultFooter from '@/features/Setting/Footer';
|
|
7
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
7
8
|
import { useMarketAuth } from '@/layout/AuthProvider/MarketAuth';
|
|
8
9
|
|
|
9
10
|
const styles = createStaticStyles(({ css }) => ({
|
|
@@ -27,7 +28,7 @@ const styles = createStaticStyles(({ css }) => ({
|
|
|
27
28
|
|
|
28
29
|
const Footer = memo(() => {
|
|
29
30
|
const { t } = useTranslation('discover');
|
|
30
|
-
const
|
|
31
|
+
const isDarkMode = useIsDark();
|
|
31
32
|
const { isAuthenticated, signIn } = useMarketAuth();
|
|
32
33
|
const [loading, setLoading] = useState(false);
|
|
33
34
|
const handleSignIn = useCallback(async () => {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Flexbox, Text } from '@lobehub/ui';
|
|
2
|
-
import { createStaticStyles, cx
|
|
2
|
+
import { createStaticStyles, cx } from 'antd-style';
|
|
3
3
|
import isEqual from 'fast-deep-equal';
|
|
4
4
|
import { type CSSProperties, memo } from 'react';
|
|
5
5
|
import { useTranslation } from 'react-i18next';
|
|
6
6
|
|
|
7
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
7
8
|
import { useChatStore } from '@/store/chat';
|
|
8
9
|
import { threadSelectors } from '@/store/chat/selectors';
|
|
9
10
|
|
|
@@ -32,7 +33,7 @@ interface ThreadProps {
|
|
|
32
33
|
|
|
33
34
|
const Thread = memo<ThreadProps>(({ id, placement, style }) => {
|
|
34
35
|
const { t } = useTranslation('chat');
|
|
35
|
-
const
|
|
36
|
+
const isDarkMode = useIsDark();
|
|
36
37
|
|
|
37
38
|
const threads = useChatStore(threadSelectors.getThreadsBySourceMsgId(id), isEqual);
|
|
38
39
|
|
|
@@ -16,7 +16,6 @@ const AgentBuilder = memo(() => {
|
|
|
16
16
|
const setChatPanelExpanded = useProfileStore((s) => s.setChatPanelExpanded);
|
|
17
17
|
const groupAgentBuilderId = useAgentStore(builtinAgentSelectors.groupAgentBuilderId);
|
|
18
18
|
|
|
19
|
-
console.log('groupAgentBuilderId', groupAgentBuilderId);
|
|
20
19
|
const [width, setWidth] = useState<string | number>(360);
|
|
21
20
|
|
|
22
21
|
const useInitBuiltinAgent = useAgentStore((s) => s.useInitBuiltinAgent);
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { KLAVIS_SERVER_TYPES, type KlavisServerType } from '@lobechat/const';
|
|
4
4
|
import { Avatar, Icon, Tag } from '@lobehub/ui';
|
|
5
|
-
import { createStaticStyles, cssVar
|
|
5
|
+
import { createStaticStyles, cssVar } from 'antd-style';
|
|
6
6
|
import isEqual from 'fast-deep-equal';
|
|
7
7
|
import { AlertCircle, X } from 'lucide-react';
|
|
8
8
|
import Image from 'next/image';
|
|
@@ -10,6 +10,7 @@ import React, { memo, useMemo } from 'react';
|
|
|
10
10
|
import { useTranslation } from 'react-i18next';
|
|
11
11
|
|
|
12
12
|
import PluginAvatar from '@/components/Plugins/PluginAvatar';
|
|
13
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
13
14
|
import { useDiscoverStore } from '@/store/discover';
|
|
14
15
|
import { serverConfigSelectors, useServerConfigStore } from '@/store/serverConfig';
|
|
15
16
|
import { useToolStore } from '@/store/tool';
|
|
@@ -53,7 +54,7 @@ interface PluginTagProps {
|
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
const PluginTag = memo<PluginTagProps>(({ pluginId, onRemove }) => {
|
|
56
|
-
const
|
|
57
|
+
const isDarkMode = useIsDark();
|
|
57
58
|
const { t } = useTranslation('setting');
|
|
58
59
|
|
|
59
60
|
// Extract identifier
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Avatar, Block, Flexbox, Input } from '@lobehub/ui';
|
|
2
2
|
import { Popover } from 'antd';
|
|
3
|
-
import { useThemeMode } from 'antd-style';
|
|
4
3
|
import { memo, useCallback, useState } from 'react';
|
|
5
4
|
|
|
6
5
|
import EmojiPicker from '@/components/EmojiPicker';
|
|
6
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
7
7
|
import { useAgentStore } from '@/store/agent';
|
|
8
8
|
import { useGlobalStore } from '@/store/global';
|
|
9
9
|
import { globalGeneralSelectors } from '@/store/global/selectors';
|
|
@@ -18,7 +18,7 @@ interface EditingProps {
|
|
|
18
18
|
|
|
19
19
|
const Editing = memo<EditingProps>(({ id, title, avatar, toggleEditing }) => {
|
|
20
20
|
const locale = useGlobalStore(globalGeneralSelectors.currentLanguage);
|
|
21
|
-
const
|
|
21
|
+
const isDarkMode = useIsDark();
|
|
22
22
|
|
|
23
23
|
const editing = useHomeStore((s) => s.agentRenamingId === id);
|
|
24
24
|
|
|
@@ -118,7 +118,7 @@ const Footer = memo(() => {
|
|
|
118
118
|
</a>
|
|
119
119
|
)}
|
|
120
120
|
</Flexbox>
|
|
121
|
-
<ThemeButton placement={'
|
|
121
|
+
<ThemeButton placement={'topCenter'} size={16} />
|
|
122
122
|
</Flexbox>
|
|
123
123
|
<LabsModal onClose={handleCloseLabsModal} open={isLabsModalOpen} />
|
|
124
124
|
<ChangelogModal
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Flexbox } from '@lobehub/ui';
|
|
2
|
-
import { useTheme
|
|
2
|
+
import { useTheme } from 'antd-style';
|
|
3
3
|
import { Activity, type FC, type ReactNode, useEffect, useMemo, useState } from 'react';
|
|
4
4
|
import { Outlet, useLocation, useNavigate } from 'react-router-dom';
|
|
5
5
|
|
|
6
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
6
7
|
import { useHomeStore } from '@/store/home';
|
|
7
8
|
|
|
8
9
|
import RecentHydration from './RecentHydration';
|
|
@@ -14,7 +15,7 @@ interface LayoutProps {
|
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
const Layout: FC<LayoutProps> = ({ children }) => {
|
|
17
|
-
const
|
|
18
|
+
const isDarkMode = useIsDark();
|
|
18
19
|
const theme = useTheme(); // Keep for colorBgContainerSecondary (not in cssVar)
|
|
19
20
|
const navigate = useNavigate();
|
|
20
21
|
const { pathname } = useLocation();
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { Avatar, Block, Flexbox, Text } from '@lobehub/ui';
|
|
2
|
-
import { cssVar
|
|
2
|
+
import { cssVar } from 'antd-style';
|
|
3
3
|
import { memo } from 'react';
|
|
4
4
|
|
|
5
5
|
import { RECENT_BLOCK_SIZE } from '@/app/[variants]/(main)/home/features/const';
|
|
6
6
|
import { DEFAULT_AVATAR } from '@/const/meta';
|
|
7
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
7
8
|
import { type DiscoverAssistantItem } from '@/types/discover';
|
|
8
9
|
|
|
9
10
|
const CommunityAgentItem = memo<DiscoverAssistantItem>(
|
|
10
11
|
({ title, avatar, backgroundColor, author, description }) => {
|
|
11
|
-
const
|
|
12
|
+
const isDarkMode = useIsDark();
|
|
12
13
|
|
|
13
14
|
return (
|
|
14
15
|
<Block
|
package/src/app/[variants]/(main)/image/_layout/ConfigPanel/components/AspectRatioSelect/index.tsx
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { Block, Center, Grid, type GridProps, Text } from '@lobehub/ui';
|
|
4
|
-
import { cssVar
|
|
4
|
+
import { cssVar } from 'antd-style';
|
|
5
5
|
import { memo } from 'react';
|
|
6
6
|
import useMergeState from 'use-merge-value';
|
|
7
7
|
|
|
8
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
9
|
+
|
|
8
10
|
export interface AspectRatioSelectProps extends Omit<GridProps, 'children' | 'onChange'> {
|
|
9
11
|
defaultValue?: string;
|
|
10
12
|
onChange?: (value: string) => void;
|
|
@@ -14,7 +16,7 @@ export interface AspectRatioSelectProps extends Omit<GridProps, 'children' | 'on
|
|
|
14
16
|
|
|
15
17
|
const AspectRatioSelect = memo<AspectRatioSelectProps>(
|
|
16
18
|
({ options, onChange, value, defaultValue, ...rest }) => {
|
|
17
|
-
const
|
|
19
|
+
const isDarkMode = useIsDark();
|
|
18
20
|
const [active, setActive] = useMergeState('1:1', {
|
|
19
21
|
defaultValue: defaultValue || '1:1',
|
|
20
22
|
onChange,
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { ModelIcon } from '@lobehub/icons';
|
|
2
2
|
import { Flexbox, Text } from '@lobehub/ui';
|
|
3
3
|
import { Popover } from 'antd';
|
|
4
|
-
import { createStaticStyles, cx
|
|
4
|
+
import { createStaticStyles, cx } from 'antd-style';
|
|
5
5
|
import { type AiModelForSelect } from 'model-bank';
|
|
6
6
|
import numeral from 'numeral';
|
|
7
7
|
import { memo, useMemo } from 'react';
|
|
8
8
|
|
|
9
9
|
import NewModelBadge from '@/components/ModelSelect/NewModelBadge';
|
|
10
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
10
11
|
|
|
11
12
|
const POPOVER_MAX_WIDTH = 320;
|
|
12
13
|
|
|
@@ -59,7 +60,7 @@ const ImageModelItem = memo<ImageModelItemProps>(
|
|
|
59
60
|
showBadge = true,
|
|
60
61
|
...model
|
|
61
62
|
}) => {
|
|
62
|
-
const
|
|
63
|
+
const isDarkMode = useIsDark();
|
|
63
64
|
|
|
64
65
|
const priceLabel = useMemo(() => {
|
|
65
66
|
// Priority 1: Use exact price
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { Block, Center, Grid, type GridProps, Select, Text } from '@lobehub/ui';
|
|
4
|
-
import { cssVar
|
|
4
|
+
import { cssVar } from 'antd-style';
|
|
5
5
|
import { type ReactNode, memo } from 'react';
|
|
6
6
|
import useMergeState from 'use-merge-value';
|
|
7
7
|
|
|
8
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
9
|
+
|
|
8
10
|
export interface SizeSelectProps extends Omit<GridProps, 'children' | 'onChange'> {
|
|
9
11
|
defaultValue?: 'auto' | string;
|
|
10
12
|
onChange?: (value: string) => void;
|
|
@@ -26,7 +28,7 @@ const canParseAsRatio = (value: string): boolean => {
|
|
|
26
28
|
};
|
|
27
29
|
|
|
28
30
|
const SizeSelect = memo<SizeSelectProps>(({ options, onChange, value, defaultValue, ...rest }) => {
|
|
29
|
-
const
|
|
31
|
+
const isDarkMode = useIsDark();
|
|
30
32
|
const [active, setActive] = useMergeState('auto', {
|
|
31
33
|
defaultValue,
|
|
32
34
|
onChange,
|
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
import { ChatInput } from '@lobehub/editor/react';
|
|
4
4
|
import { Button, Flexbox, TextArea } from '@lobehub/ui';
|
|
5
|
-
import { createStaticStyles, cx
|
|
5
|
+
import { createStaticStyles, cx } from 'antd-style';
|
|
6
6
|
import { Sparkles } from 'lucide-react';
|
|
7
7
|
import type { KeyboardEvent } from 'react';
|
|
8
8
|
import { useTranslation } from 'react-i18next';
|
|
9
9
|
|
|
10
10
|
import { loginRequired } from '@/components/Error/loginRequiredNotification';
|
|
11
11
|
import { useGeminiChineseWarning } from '@/hooks/useGeminiChineseWarning';
|
|
12
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
12
13
|
import { useImageStore } from '@/store/image';
|
|
13
14
|
import { createImageSelectors } from '@/store/image/selectors';
|
|
14
15
|
import { useGenerationConfigParam } from '@/store/image/slices/generationConfig/hooks';
|
|
@@ -39,7 +40,7 @@ const styles = createStaticStyles(({ css, cssVar }) => ({
|
|
|
39
40
|
}));
|
|
40
41
|
|
|
41
42
|
const PromptInput = ({ showTitle = false }: PromptInputProps) => {
|
|
42
|
-
const
|
|
43
|
+
const isDarkMode = useIsDark();
|
|
43
44
|
const { t } = useTranslation('image');
|
|
44
45
|
const { value, setValue } = useGenerationConfigParam('prompt');
|
|
45
46
|
const isCreating = useImageStore(createImageSelectors.isCreating);
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { createStaticStyles, cx
|
|
3
|
+
import { createStaticStyles, cx } from 'antd-style';
|
|
4
4
|
import dayjs from 'dayjs';
|
|
5
5
|
import { type ReactNode, memo, useMemo } from 'react';
|
|
6
6
|
import { GroupedVirtuoso } from 'react-virtuoso';
|
|
7
7
|
|
|
8
8
|
import Loading from '@/app/[variants]/(main)/memory/features/Loading';
|
|
9
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
9
10
|
|
|
10
11
|
import { useScrollParent } from './useScrollParent';
|
|
11
12
|
|
|
@@ -31,7 +32,9 @@ const styles = createStaticStyles(({ css, cssVar }) => ({
|
|
|
31
32
|
|
|
32
33
|
export type GroupBy = 'day' | 'month';
|
|
33
34
|
|
|
34
|
-
interface TimelineViewProps<
|
|
35
|
+
interface TimelineViewProps<
|
|
36
|
+
T extends { capturedAt?: Date | string; createdAt?: Date | string; id: string },
|
|
37
|
+
> {
|
|
35
38
|
data: T[];
|
|
36
39
|
/**
|
|
37
40
|
* Custom date field extractor for grouping
|
|
@@ -68,7 +71,9 @@ const getDateValue = <T extends { capturedAt?: Date | string; createdAt?: Date |
|
|
|
68
71
|
return item.capturedAt ?? item.createdAt ?? new Date();
|
|
69
72
|
};
|
|
70
73
|
|
|
71
|
-
function TimelineViewInner<
|
|
74
|
+
function TimelineViewInner<
|
|
75
|
+
T extends { capturedAt?: Date | string; createdAt?: Date | string; id: string },
|
|
76
|
+
>({
|
|
72
77
|
data,
|
|
73
78
|
groupBy = 'day',
|
|
74
79
|
getDateForGrouping,
|
|
@@ -78,7 +83,7 @@ function TimelineViewInner<T extends { capturedAt?: Date | string; createdAt?: D
|
|
|
78
83
|
renderHeader,
|
|
79
84
|
renderItem,
|
|
80
85
|
}: TimelineViewProps<T>) {
|
|
81
|
-
const
|
|
86
|
+
const isDarkMode = useIsDark();
|
|
82
87
|
const scrollParent = useScrollParent();
|
|
83
88
|
|
|
84
89
|
const { groupCounts, sortedPeriods, groupedItems } = useMemo(() => {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Block, Flexbox, Input } from '@lobehub/ui';
|
|
2
2
|
import { Popover } from 'antd';
|
|
3
|
-
import { useThemeMode } from 'antd-style';
|
|
4
3
|
import { memo, useCallback, useState } from 'react';
|
|
5
4
|
import { useTranslation } from 'react-i18next';
|
|
6
5
|
|
|
7
6
|
import EmojiPicker from '@/components/EmojiPicker';
|
|
7
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
8
8
|
import { useFileStore } from '@/store/file';
|
|
9
9
|
import { useGlobalStore } from '@/store/global';
|
|
10
10
|
import { globalGeneralSelectors } from '@/store/global/selectors';
|
|
@@ -18,7 +18,7 @@ interface EditingProps {
|
|
|
18
18
|
|
|
19
19
|
const Editing = memo<EditingProps>(({ documentId, title, currentEmoji, toggleEditing }) => {
|
|
20
20
|
const locale = useGlobalStore(globalGeneralSelectors.currentLanguage);
|
|
21
|
-
const
|
|
21
|
+
const isDarkMode = useIsDark();
|
|
22
22
|
const { t } = useTranslation('file');
|
|
23
23
|
|
|
24
24
|
const editing = useFileStore((s) => s.renamingPageId === documentId);
|
|
@@ -5,6 +5,7 @@ import { Select, Skeleton } from '@lobehub/ui';
|
|
|
5
5
|
import { Segmented, Switch } from 'antd';
|
|
6
6
|
import isEqual from 'fast-deep-equal';
|
|
7
7
|
import { Ban, Gauge, Loader2Icon, Monitor, Moon, Mouse, Sun, Waves } from 'lucide-react';
|
|
8
|
+
import { useTheme as useNextThemesTheme } from 'next-themes';
|
|
8
9
|
import { memo, useState } from 'react';
|
|
9
10
|
import { useTranslation } from 'react-i18next';
|
|
10
11
|
|
|
@@ -22,16 +23,15 @@ const Common = memo(() => {
|
|
|
22
23
|
const { t } = useTranslation('setting');
|
|
23
24
|
|
|
24
25
|
const general = useUserStore((s) => settingsSelectors.currentSettings(s).general, isEqual);
|
|
25
|
-
const
|
|
26
|
+
const { theme, setTheme } = useNextThemesTheme();
|
|
26
27
|
const language = useGlobalStore(systemStatusSelectors.language);
|
|
27
28
|
const [setSettings, isUserStateInit] = useUserStore((s) => [s.setSettings, s.isUserStateInit]);
|
|
28
|
-
const [
|
|
29
|
-
s.switchThemeMode,
|
|
30
|
-
s.switchLocale,
|
|
31
|
-
s.isStatusInit,
|
|
32
|
-
]);
|
|
29
|
+
const [switchLocale, isStatusInit] = useGlobalStore((s) => [s.switchLocale, s.isStatusInit]);
|
|
33
30
|
const [loading, setLoading] = useState(false);
|
|
34
31
|
|
|
32
|
+
// Use the theme value from next-themes, default to 'system'
|
|
33
|
+
const currentTheme = theme || 'system';
|
|
34
|
+
|
|
35
35
|
const handleLangChange = (value: LocaleMode) => {
|
|
36
36
|
switchLocale(value);
|
|
37
37
|
};
|
|
@@ -39,13 +39,13 @@ const Common = memo(() => {
|
|
|
39
39
|
if (!(isStatusInit && isUserStateInit))
|
|
40
40
|
return <Skeleton active paragraph={{ rows: 5 }} title={false} />;
|
|
41
41
|
|
|
42
|
-
const
|
|
42
|
+
const themeFormGroup: FormGroupItemType = {
|
|
43
43
|
children: [
|
|
44
44
|
{
|
|
45
45
|
children: (
|
|
46
46
|
<ImageSelect
|
|
47
47
|
height={60}
|
|
48
|
-
onChange={
|
|
48
|
+
onChange={(value) => setTheme(value === 'auto' ? 'system' : value)}
|
|
49
49
|
options={[
|
|
50
50
|
{
|
|
51
51
|
icon: Sun,
|
|
@@ -63,11 +63,11 @@ const Common = memo(() => {
|
|
|
63
63
|
icon: Monitor,
|
|
64
64
|
img: imageUrl('theme_auto.webp'),
|
|
65
65
|
label: t('settingCommon.themeMode.auto'),
|
|
66
|
-
value: '
|
|
66
|
+
value: 'system',
|
|
67
67
|
},
|
|
68
68
|
]}
|
|
69
69
|
unoptimized={isDesktop}
|
|
70
|
-
value={
|
|
70
|
+
value={currentTheme}
|
|
71
71
|
width={100}
|
|
72
72
|
/>
|
|
73
73
|
),
|
|
@@ -173,7 +173,7 @@ const Common = memo(() => {
|
|
|
173
173
|
<Form
|
|
174
174
|
collapsible={false}
|
|
175
175
|
initialValues={general}
|
|
176
|
-
items={[
|
|
176
|
+
items={[themeFormGroup]}
|
|
177
177
|
itemsType={'group'}
|
|
178
178
|
onValuesChange={async (v) => {
|
|
179
179
|
setLoading(true);
|
|
@@ -2,11 +2,12 @@ import { BRANDING_PROVIDER } from '@lobechat/business-const';
|
|
|
2
2
|
import { ProviderCombine, ProviderIcon } from '@lobehub/icons';
|
|
3
3
|
import { Avatar, Flexbox, Skeleton, Text } from '@lobehub/ui';
|
|
4
4
|
import { Divider } from 'antd';
|
|
5
|
-
import { cssVar, cx
|
|
5
|
+
import { cssVar, cx } from 'antd-style';
|
|
6
6
|
import { memo } from 'react';
|
|
7
7
|
import { useTranslation } from 'react-i18next';
|
|
8
8
|
|
|
9
9
|
import { BrandingProviderCard } from '@/business/client/features/BrandingProviderCard';
|
|
10
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
10
11
|
import { type AiProviderListItem } from '@/types/aiProvider';
|
|
11
12
|
|
|
12
13
|
import EnableSwitch from './EnableSwitch';
|
|
@@ -19,7 +20,7 @@ interface ProviderCardProps extends AiProviderListItem {
|
|
|
19
20
|
const ProviderCard = memo<ProviderCardProps>(
|
|
20
21
|
({ id, description, name, enabled, source, logo, loading, onProviderSelect }) => {
|
|
21
22
|
const { t } = useTranslation('providers');
|
|
22
|
-
const
|
|
23
|
+
const isDarkMode = useIsDark();
|
|
23
24
|
|
|
24
25
|
if (loading)
|
|
25
26
|
return (
|
package/src/app/[variants]/(main)/settings/stats/features/overview/ShareButton/TotalCard.tsx
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { Flexbox } from '@lobehub/ui';
|
|
2
|
-
import { cssVar
|
|
2
|
+
import { cssVar } from 'antd-style';
|
|
3
3
|
import { memo } from 'react';
|
|
4
4
|
|
|
5
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
6
|
+
|
|
5
7
|
interface TotalCardProps {
|
|
6
8
|
count: string | number;
|
|
7
9
|
title: string;
|
|
8
10
|
}
|
|
9
11
|
|
|
10
12
|
const TotalCard = memo<TotalCardProps>(({ title, count }) => {
|
|
11
|
-
const
|
|
13
|
+
const isDarkMode = useIsDark();
|
|
12
14
|
return (
|
|
13
15
|
<Flexbox
|
|
14
16
|
padding={12}
|
|
@@ -2,28 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
import { ActionIcon } from '@lobehub/ui';
|
|
4
4
|
import { ChatHeader } from '@lobehub/ui/mobile';
|
|
5
|
-
import { useThemeMode } from 'antd-style';
|
|
6
5
|
import { Moon, Sun } from 'lucide-react';
|
|
6
|
+
import { useTheme as useNextThemesTheme } from 'next-themes';
|
|
7
7
|
import { memo } from 'react';
|
|
8
8
|
|
|
9
9
|
import { MOBILE_HEADER_ICON_SIZE } from '@/const/layoutTokens';
|
|
10
|
-
import {
|
|
11
|
-
import { mobileHeaderSticky } from '@/styles/mobileHeader';
|
|
10
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
12
11
|
|
|
13
12
|
const Header = memo(() => {
|
|
14
|
-
const {
|
|
15
|
-
const
|
|
13
|
+
const { setTheme } = useNextThemesTheme();
|
|
14
|
+
const isDark = useIsDark();
|
|
16
15
|
|
|
17
16
|
return (
|
|
18
17
|
<ChatHeader
|
|
19
18
|
right={
|
|
20
19
|
<ActionIcon
|
|
21
|
-
icon={
|
|
22
|
-
onClick={() =>
|
|
20
|
+
icon={isDark ? Moon : Sun}
|
|
21
|
+
onClick={() => setTheme(isDark ? 'light' : 'dark')}
|
|
23
22
|
size={MOBILE_HEADER_ICON_SIZE}
|
|
24
23
|
/>
|
|
25
24
|
}
|
|
26
|
-
style={mobileHeaderSticky}
|
|
27
25
|
/>
|
|
28
26
|
);
|
|
29
27
|
});
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ENABLE_BUSINESS_FEATURES } from '@lobechat/business-const';
|
|
2
2
|
import { SpeedInsights } from '@vercel/speed-insights/next';
|
|
3
|
-
import { type ThemeAppearance } from 'antd-style';
|
|
4
3
|
import { type ResolvingViewport } from 'next';
|
|
5
4
|
import Script from 'next/script';
|
|
6
5
|
import { type ReactNode, Suspense } from 'react';
|
|
@@ -26,7 +25,7 @@ export interface RootLayoutProps extends DynamicLayoutProps {
|
|
|
26
25
|
const RootLayout = async ({ children, params }: RootLayoutProps) => {
|
|
27
26
|
const { variants } = await params;
|
|
28
27
|
|
|
29
|
-
const { locale, isMobile,
|
|
28
|
+
const { locale, isMobile, primaryColor, neutralColor } =
|
|
30
29
|
RouteVariants.deserializeVariants(variants);
|
|
31
30
|
|
|
32
31
|
const direction = isRtlLang(locale) ? 'rtl' : 'ltr';
|
|
@@ -34,7 +33,6 @@ const RootLayout = async ({ children, params }: RootLayoutProps) => {
|
|
|
34
33
|
const renderContent = () => {
|
|
35
34
|
return (
|
|
36
35
|
<GlobalProvider
|
|
37
|
-
appearance={theme}
|
|
38
36
|
isMobile={isMobile}
|
|
39
37
|
locale={locale}
|
|
40
38
|
neutralColor={neutralColor}
|
|
@@ -50,8 +48,9 @@ const RootLayout = async ({ children, params }: RootLayoutProps) => {
|
|
|
50
48
|
};
|
|
51
49
|
|
|
52
50
|
return (
|
|
53
|
-
<html dir={direction} lang={locale}>
|
|
51
|
+
<html dir={direction} lang={locale} suppressHydrationWarning>
|
|
54
52
|
<head>
|
|
53
|
+
{/* <script dangerouslySetInnerHTML={{ __html: 'setTimeout(() => {debugger}, 16)' }} /> */}
|
|
55
54
|
{process.env.DEBUG_REACT_SCAN === '1' && (
|
|
56
55
|
<Script
|
|
57
56
|
crossOrigin={'anonymous'}
|
|
@@ -99,7 +98,6 @@ export const generateViewport = async (props: DynamicLayoutProps): ResolvingView
|
|
|
99
98
|
};
|
|
100
99
|
|
|
101
100
|
export const generateStaticParams = () => {
|
|
102
|
-
const themes: ThemeAppearance[] = ['dark', 'light'];
|
|
103
101
|
const mobileOptions = isDesktop ? [false] : [true, false];
|
|
104
102
|
// only static for serveral page, other go to dynamtic
|
|
105
103
|
const staticLocales: Locales[] = [DEFAULT_LANG, 'zh-CN'];
|
|
@@ -107,16 +105,13 @@ export const generateStaticParams = () => {
|
|
|
107
105
|
const variants: { variants: string }[] = [];
|
|
108
106
|
|
|
109
107
|
for (const locale of staticLocales) {
|
|
110
|
-
for (const
|
|
111
|
-
|
|
112
|
-
variants.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}),
|
|
118
|
-
});
|
|
119
|
-
}
|
|
108
|
+
for (const isMobile of mobileOptions) {
|
|
109
|
+
variants.push({
|
|
110
|
+
variants: RouteVariants.serializeVariants({
|
|
111
|
+
isMobile,
|
|
112
|
+
locale,
|
|
113
|
+
}),
|
|
114
|
+
});
|
|
120
115
|
}
|
|
121
116
|
}
|
|
122
117
|
|
|
@@ -2,16 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
import { Center, Flexbox, Text } from '@lobehub/ui';
|
|
4
4
|
import { Divider } from 'antd';
|
|
5
|
-
import { cx
|
|
5
|
+
import { cx } from 'antd-style';
|
|
6
6
|
import type { FC, PropsWithChildren } from 'react';
|
|
7
7
|
|
|
8
8
|
import LangButton from '@/features/User/UserPanel/LangButton';
|
|
9
9
|
import ThemeButton from '@/features/User/UserPanel/ThemeButton';
|
|
10
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
10
11
|
|
|
11
12
|
import { styles } from './style';
|
|
12
13
|
|
|
13
14
|
const OnBoardingContainer: FC<PropsWithChildren> = ({ children }) => {
|
|
14
|
-
const
|
|
15
|
+
const isDarkMode = useIsDark();
|
|
15
16
|
return (
|
|
16
17
|
<Flexbox className={styles.outerContainer} height={'100%'} padding={8} width={'100%'}>
|
|
17
18
|
<Flexbox
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { Block, Button, Flexbox, Text } from '@lobehub/ui';
|
|
4
|
-
import { createStaticStyles, cssVar, cx
|
|
4
|
+
import { createStaticStyles, cssVar, cx } from 'antd-style';
|
|
5
5
|
import { Undo2Icon } from 'lucide-react';
|
|
6
6
|
import React, { memo, useMemo } from 'react';
|
|
7
7
|
import { useTranslation } from 'react-i18next';
|
|
8
8
|
import { useNavigate } from 'react-router-dom';
|
|
9
9
|
|
|
10
10
|
import LobeMessage from '@/app/[variants]/onboarding/components/LobeMessage';
|
|
11
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
11
12
|
import { useUserStore } from '@/store/user';
|
|
12
13
|
|
|
13
14
|
const styles = createStaticStyles(({ css, cssVar }) => ({
|
|
@@ -76,7 +77,7 @@ interface ModeSelectionStepProps {
|
|
|
76
77
|
const ModeSelectionStep = memo<ModeSelectionStepProps>(({ onBack, onNext }) => {
|
|
77
78
|
const { t } = useTranslation('onboarding');
|
|
78
79
|
const navigate = useNavigate();
|
|
79
|
-
const
|
|
80
|
+
const isDarkMode = useIsDark();
|
|
80
81
|
|
|
81
82
|
const imageStyles = useMemo<React.CSSProperties>(
|
|
82
83
|
() =>
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
4
|
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
const DesktopRouterClient = dynamic(() => import('./DesktopClientRouter'), {
|
|
8
|
-
loading: () => <Loading debugId="DesktopRouter" />,
|
|
9
|
-
ssr: false,
|
|
10
|
-
});
|
|
5
|
+
import DesktopClientRouter from './DesktopClientRouter';
|
|
11
6
|
|
|
7
|
+
const useIsClient = () => {
|
|
8
|
+
const [isClient, setIsClient] = useState(false);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
setIsClient(true);
|
|
11
|
+
}, []);
|
|
12
|
+
return isClient;
|
|
13
|
+
};
|
|
12
14
|
const DesktopRouter = () => {
|
|
13
|
-
|
|
15
|
+
const isClient = useIsClient();
|
|
16
|
+
if (!isClient) return null;
|
|
17
|
+
return <DesktopClientRouter />;
|
|
14
18
|
};
|
|
15
19
|
|
|
16
20
|
export default DesktopRouter;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { createStaticStyles
|
|
3
|
+
import { createStaticStyles } from 'antd-style';
|
|
4
4
|
import { memo } from 'react';
|
|
5
5
|
|
|
6
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
7
|
+
|
|
6
8
|
const styles = createStaticStyles(({ css, cssVar }) => ({
|
|
7
9
|
dividerDark: css`
|
|
8
10
|
flex: none;
|
|
@@ -19,7 +21,7 @@ const styles = createStaticStyles(({ css, cssVar }) => ({
|
|
|
19
21
|
}));
|
|
20
22
|
|
|
21
23
|
const Divider = memo(() => {
|
|
22
|
-
const
|
|
24
|
+
const isDarkMode = useIsDark();
|
|
23
25
|
|
|
24
26
|
return <div className={isDarkMode ? styles.dividerDark : styles.dividerLight} />;
|
|
25
27
|
});
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { Flexbox, Icon, Modal } from '@lobehub/ui';
|
|
2
|
-
import { createStaticStyles
|
|
2
|
+
import { createStaticStyles } from 'antd-style';
|
|
3
3
|
import { type LucideIcon } from 'lucide-react';
|
|
4
4
|
import { type ReactNode, memo } from 'react';
|
|
5
5
|
|
|
6
|
+
import { useIsDark } from '@/hooks/useIsDark';
|
|
7
|
+
|
|
6
8
|
const prefixCls = 'ant';
|
|
7
9
|
|
|
8
10
|
const styles = createStaticStyles(({ css, cssVar }) => ({
|
|
@@ -52,7 +54,7 @@ interface DataStyleModalProps {
|
|
|
52
54
|
|
|
53
55
|
const DataStyleModal = memo<DataStyleModalProps>(
|
|
54
56
|
({ icon, onOpenChange, title, open, children, width = 550, height }) => {
|
|
55
|
-
const
|
|
57
|
+
const isDarkMode = useIsDark();
|
|
56
58
|
|
|
57
59
|
return (
|
|
58
60
|
<Modal
|