From 0a0bbad77f31782c3bca52421091464563920ce7 Mon Sep 17 00:00:00 2001 From: MyPrototypeWhat Date: Fri, 9 May 2025 16:36:50 +0800 Subject: [PATCH] feat: integrate Tailwind CSS and add store page functionality - Introduced Tailwind CSS for styling by adding a new configuration file and global styles. - Created a new Store page with a button to test configuration success. - Updated routing to include the Store page and added corresponding sidebar icon. - Enhanced the settings store to include the new Store icon in the sidebar. - Updated translations for the Store page in Chinese. - Added utility functions for class name management using Tailwind CSS. --- components.json | 21 + electron.vite.config.ts | 5 +- package.json | 11 +- src/renderer/src/App.tsx | 2 + src/renderer/src/assets/styles/tailwind.css | 123 ++++++ src/renderer/src/components/app/Sidebar.tsx | 7 +- src/renderer/src/entryPoint.tsx | 1 + src/renderer/src/i18n/locales/zh-cn.json | 7 + src/renderer/src/pages/store/index.tsx | 28 ++ src/renderer/src/store/index.ts | 2 +- src/renderer/src/store/migrate.ts | 16 + src/renderer/src/store/settings.ts | 13 +- src/renderer/src/ui/button.tsx | 59 +++ src/renderer/src/ui/sonner.tsx | 23 + src/renderer/src/utils/index.ts | 7 +- tsconfig.json | 8 +- tsconfig.node.json | 2 + yarn.lock | 458 +++++++++++++++++++- 18 files changed, 777 insertions(+), 16 deletions(-) create mode 100644 components.json create mode 100644 src/renderer/src/assets/styles/tailwind.css create mode 100644 src/renderer/src/pages/store/index.tsx create mode 100644 src/renderer/src/ui/button.tsx create mode 100644 src/renderer/src/ui/sonner.tsx diff --git a/components.json b/components.json new file mode 100644 index 0000000000..25d52d4e93 --- /dev/null +++ b/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/styles/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@renderer", + "utils": "@renderer/utils", + "ui": "@renderer/ui", + "lib": "@renderer/lib", + "hooks": "@renderer/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/electron.vite.config.ts b/electron.vite.config.ts index 416d04b385..49a2e824ad 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -1,8 +1,8 @@ +import tailwindcss from '@tailwindcss/vite' import react from '@vitejs/plugin-react-swc' import { defineConfig, externalizeDepsPlugin } from 'electron-vite' import { resolve } from 'path' import { visualizer } from 'rollup-plugin-visualizer' - const visualizerPlugin = (type: 'renderer' | 'main') => { return process.env[`VISUALIZER_${type.toUpperCase()}`] ? [visualizer({ open: true })] : [] } @@ -64,7 +64,8 @@ export default defineConfig({ ] ] }), - ...visualizerPlugin('renderer') + ...visualizerPlugin('renderer'), + tailwindcss() ], resolve: { alias: { diff --git a/package.json b/package.json index 843465d5db..36b6a49484 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,7 @@ "@electron-toolkit/utils": "^3.0.0", "@electron/notarize": "^2.5.0", "@langchain/community": "^0.3.36", + "@radix-ui/react-slot": "^1.2.2", "@strongtz/win32-arm64-msvc": "^0.4.7", "@tanstack/react-query": "^5.27.0", "@types/react-infinite-scroll-component": "^5.0.0", @@ -77,6 +78,8 @@ "archiver": "^7.0.1", "async-mutex": "^0.5.0", "bufferutil": "^4.0.9", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", "color": "^5.0.0", "diff": "^7.0.0", "docx": "^9.0.2", @@ -92,14 +95,18 @@ "got-scraping": "^4.1.1", "jsdom": "^26.0.0", "markdown-it": "^14.1.0", + "next-themes": "^0.4.6", "node-stream-zip": "^1.15.0", "officeparser": "^4.1.1", "opendal": "^0.47.11", "os-proxy-config": "^1.1.2", "proxy-agent": "^6.5.0", + "sonner": "^2.0.3", + "tailwind-merge": "^3.2.0", "tar": "^7.4.3", "turndown": "^7.2.0", "turndown-plugin-gfm": "^1.0.2", + "tw-animate-css": "^1.2.9", "undici": "^7.4.0", "webdav": "^5.8.0", "ws": "^8.18.1", @@ -128,6 +135,7 @@ "@reduxjs/toolkit": "^2.2.5", "@shikijs/markdown-it": "^3.2.2", "@swc/plugin-styled-components": "^7.1.3", + "@tailwindcss/vite": "^4.1.5", "@tavily/core": "patch:@tavily/core@npm%3A0.3.1#~/.yarn/patches/@tavily-core-npm-0.3.1-fe69bf2bea.patch", "@tryfabric/martian": "^1.2.4", "@types/adm-zip": "^0", @@ -173,7 +181,7 @@ "lint-staged": "^15.5.0", "lodash": "^4.17.21", "lru-cache": "^11.1.0", - "lucide-react": "^0.487.0", + "lucide-react": "^0.508.0", "mime": "^4.0.4", "npx-scope-finder": "^1.2.0", "openai": "patch:openai@npm%3A4.96.0#~/.yarn/patches/openai-npm-4.96.0-0665b05cb9.patch", @@ -203,6 +211,7 @@ "shiki": "^3.2.2", "string-width": "^7.2.0", "styled-components": "^6.1.11", + "tailwindcss": "^4.1.5", "tiny-pinyin": "^1.3.2", "tinycolor2": "^1.6.0", "tokenx": "^0.4.1", diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 52b098c957..258aacad46 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -19,6 +19,7 @@ import HomePage from './pages/home/HomePage' import KnowledgePage from './pages/knowledge/KnowledgePage' import PaintingsRoutePage from './pages/paintings/PaintingsRoutePage' import SettingsPage from './pages/settings/SettingsPage' +import StorePage from './pages/store' import TranslatePage from './pages/translate/TranslatePage' function App(): React.ReactElement { @@ -42,6 +43,7 @@ function App(): React.ReactElement { } /> } /> } /> + } /> diff --git a/src/renderer/src/assets/styles/tailwind.css b/src/renderer/src/assets/styles/tailwind.css new file mode 100644 index 0000000000..02687bd0b8 --- /dev/null +++ b/src/renderer/src/assets/styles/tailwind.css @@ -0,0 +1,123 @@ +@import 'tailwindcss'; +@import 'tw-animate-css'; + +@custom-variant dark (&:is(.dark *)); + +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --destructive-foreground: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --radius: 0.625rem; + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.145 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.145 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.985 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.396 0.141 25.723); + --destructive-foreground: oklch(0.637 0.237 25.331); + --border: oklch(0.269 0 0); + --input: oklch(0.269 0 0); + --ring: oklch(0.439 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(0.269 0 0); + --sidebar-ring: oklch(0.439 0 0); +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/src/renderer/src/components/app/Sidebar.tsx b/src/renderer/src/components/app/Sidebar.tsx index 8b50bdd7d2..7f58de9f5f 100644 --- a/src/renderer/src/components/app/Sidebar.tsx +++ b/src/renderer/src/components/app/Sidebar.tsx @@ -11,6 +11,7 @@ import { isEmoji } from '@renderer/utils' import type { MenuProps } from 'antd' import { Avatar, Dropdown, Tooltip } from 'antd' import { + Box, CircleHelp, FileSearch, Folder, @@ -143,7 +144,8 @@ const MainMenus: FC = () => { translate: , minapp: , knowledge: , - files: + files: , + store: } const pathMap = { @@ -153,7 +155,8 @@ const MainMenus: FC = () => { translate: '/translate', minapp: '/apps', knowledge: '/knowledge', - files: '/files' + files: '/files', + store: '/store' } return sidebarIcons.visible.map((icon) => { diff --git a/src/renderer/src/entryPoint.tsx b/src/renderer/src/entryPoint.tsx index bf6a3cb6a5..fc5769da91 100644 --- a/src/renderer/src/entryPoint.tsx +++ b/src/renderer/src/entryPoint.tsx @@ -1,5 +1,6 @@ import './assets/styles/index.scss' import '@ant-design/v5-patch-for-react-19' +import './assets/styles/tailwind.css' import { createRoot } from 'react-dom/client' diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 6ea64e00f5..236f2d6b55 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -1546,6 +1546,13 @@ "enable_privacy_mode": "匿名发送错误报告和数据统计" } }, + "store": { + "title": "应用商店", + "install": "安装", + "uninstall": "卸载", + "update": "更新", + "update_all": "全部更新" + }, "translate": { "any.language": "任意语言", "button.translate": "翻译", diff --git a/src/renderer/src/pages/store/index.tsx b/src/renderer/src/pages/store/index.tsx new file mode 100644 index 0000000000..323addc1f4 --- /dev/null +++ b/src/renderer/src/pages/store/index.tsx @@ -0,0 +1,28 @@ +import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar' +import { Button } from '@renderer/ui/button' +import { Toaster } from '@renderer/ui/sonner' +import { useTranslation } from 'react-i18next' +import { toast } from 'sonner' + +export default function Store() { + const { t } = useTranslation() + return ( +
+ + {t('store.title')} + +
+ +
+ +
+ ) +} diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index e8f4c2ac32..df7af60f69 100644 --- a/src/renderer/src/store/index.ts +++ b/src/renderer/src/store/index.ts @@ -46,7 +46,7 @@ const persistedReducer = persistReducer( { key: 'cherry-studio', storage, - version: 98, + version: 99, blacklist: ['runtime', 'messages', 'messageBlocks'], migrate }, diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index f09ce39536..921de83efb 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -1252,6 +1252,22 @@ const migrateConfig = { } catch (error) { return state } + }, + '99': (state: RootState) => { + try { + return { + ...state, + settings: { + ...state.settings, + sidebarIcons: { + ...state.settings.sidebarIcons, + visible: [...state.settings.sidebarIcons.visible, 'store'] + } + } + } + } catch (error) { + return state + } } } diff --git a/src/renderer/src/store/settings.ts b/src/renderer/src/store/settings.ts index 166ed81d6e..f473ae40a4 100644 --- a/src/renderer/src/store/settings.ts +++ b/src/renderer/src/store/settings.ts @@ -6,7 +6,15 @@ import { WebDAVSyncState } from './backup' export type SendMessageShortcut = 'Enter' | 'Shift+Enter' | 'Ctrl+Enter' | 'Command+Enter' -export type SidebarIcon = 'assistants' | 'agents' | 'paintings' | 'translate' | 'minapp' | 'knowledge' | 'files' +export type SidebarIcon = + | 'assistants' + | 'agents' + | 'paintings' + | 'translate' + | 'minapp' + | 'knowledge' + | 'files' + | 'store' export const DEFAULT_SIDEBAR_ICONS: SidebarIcon[] = [ 'assistants', @@ -15,7 +23,8 @@ export const DEFAULT_SIDEBAR_ICONS: SidebarIcon[] = [ 'translate', 'minapp', 'knowledge', - 'files' + 'files', + 'store' ] export interface NutstoreSyncRuntime extends WebDAVSyncState {} diff --git a/src/renderer/src/ui/button.tsx b/src/renderer/src/ui/button.tsx new file mode 100644 index 0000000000..e48aff75d8 --- /dev/null +++ b/src/renderer/src/ui/button.tsx @@ -0,0 +1,59 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@renderer/utils/index" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", + destructive: + "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", + secondary: + "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80", + ghost: + "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2 has-[>svg]:px-3", + sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", + lg: "h-10 rounded-md px-6 has-[>svg]:px-4", + icon: "size-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +function Button({ + className, + variant, + size, + asChild = false, + ...props +}: React.ComponentProps<"button"> & + VariantProps & { + asChild?: boolean + }) { + const Comp = asChild ? Slot : "button" + + return ( + + ) +} + +export { Button, buttonVariants } diff --git a/src/renderer/src/ui/sonner.tsx b/src/renderer/src/ui/sonner.tsx new file mode 100644 index 0000000000..cd62aff2b3 --- /dev/null +++ b/src/renderer/src/ui/sonner.tsx @@ -0,0 +1,23 @@ +import { useTheme } from "next-themes" +import { Toaster as Sonner, ToasterProps } from "sonner" + +const Toaster = ({ ...props }: ToasterProps) => { + const { theme = "system" } = useTheme() + + return ( + + ) +} + +export { Toaster } diff --git a/src/renderer/src/utils/index.ts b/src/renderer/src/utils/index.ts index c8d5abe934..910e510b7e 100644 --- a/src/renderer/src/utils/index.ts +++ b/src/renderer/src/utils/index.ts @@ -1,8 +1,9 @@ import { Model } from '@renderer/types' import { ModalFuncProps } from 'antd/es/modal/interface' +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' // @ts-ignore next-line` import { v4 as uuidv4 } from 'uuid' - /** * 异步执行一个函数。 * @param fn 要执行的函数 @@ -208,6 +209,10 @@ export function getMcpConfigSampleFromReadme(readme: string) { return null } +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} + export * from './file' export * from './image' export * from './json' diff --git a/tsconfig.json b/tsconfig.json index b1d115b86f..631b62cad3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,5 +7,11 @@ { "path": "./tsconfig.web.json" } - ] + ], + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@renderer/*": ["src/renderer/src/*"], + } + } } diff --git a/tsconfig.node.json b/tsconfig.node.json index ec30dcfec7..11e2bf70de 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -10,6 +10,7 @@ ], "compilerOptions": { "composite": true, + "moduleResolution": "bundler", "types": [ "electron-vite/node" ], @@ -17,6 +18,7 @@ "paths": { "@main/*": ["src/main/*"], "@types": ["src/renderer/src/types/index.ts"], + "@components/*": ["packages/components/*"], "@shared/*": ["packages/shared/*"] } } diff --git a/yarn.lock b/yarn.lock index c29ea2251c..8a374033f1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -876,6 +876,34 @@ __metadata: languageName: node linkType: hard +"@emnapi/core@npm:^1.4.0, @emnapi/core@npm:^1.4.3": + version: 1.4.3 + resolution: "@emnapi/core@npm:1.4.3" + dependencies: + "@emnapi/wasi-threads": "npm:1.0.2" + tslib: "npm:^2.4.0" + checksum: 10c0/e30101d16d37ef3283538a35cad60e22095aff2403fb9226a35330b932eb6740b81364d525537a94eb4fb51355e48ae9b10d779c0dd1cdcd55d71461fe4b45c7 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.4.0, @emnapi/runtime@npm:^1.4.3": + version: 1.4.3 + resolution: "@emnapi/runtime@npm:1.4.3" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/3b7ab72d21cb4e034f07df80165265f85f445ef3f581d1bc87b67e5239428baa00200b68a7d5e37a0425c3a78320b541b07f76c5530f6f6f95336a6294ebf30b + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.0.2, @emnapi/wasi-threads@npm:^1.0.2": + version: 1.0.2 + resolution: "@emnapi/wasi-threads@npm:1.0.2" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/f0621b1fc715221bd2d8332c0ca922617bcd77cdb3050eae50a124eb8923c54fa425d23982dc8f29d505c8798a62d1049bace8b0686098ff9dd82270e06d772e + languageName: node + linkType: hard + "@emotion/hash@npm:^0.8.0": version: 0.8.0 resolution: "@emotion/hash@npm:0.8.0" @@ -2685,6 +2713,17 @@ __metadata: languageName: node linkType: hard +"@napi-rs/wasm-runtime@npm:^0.2.9": + version: 0.2.9 + resolution: "@napi-rs/wasm-runtime@npm:0.2.9" + dependencies: + "@emnapi/core": "npm:^1.4.0" + "@emnapi/runtime": "npm:^1.4.0" + "@tybys/wasm-util": "npm:^0.9.0" + checksum: 10c0/1cc40b854b255f84e12ade634456ba489f6bf90659ef8164a16823c515c294024c96ee2bb81ab51f35493ba9496f62842b960f915dbdcdc1791f221f989e9e59 + languageName: node + linkType: hard + "@neon-rs/load@npm:^0.0.4": version: 0.0.4 resolution: "@neon-rs/load@npm:0.0.4" @@ -2973,6 +3012,34 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-compose-refs@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-compose-refs@npm:1.1.2" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/d36a9c589eb75d634b9b139c80f916aadaf8a68a7c1c4b8c6c6b88755af1a92f2e343457042089f04cc3f23073619d08bb65419ced1402e9d4e299576d970771 + languageName: node + linkType: hard + +"@radix-ui/react-slot@npm:^1.2.2": + version: 1.2.2 + resolution: "@radix-ui/react-slot@npm:1.2.2" + dependencies: + "@radix-ui/react-compose-refs": "npm:1.1.2" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/74489f5ad11b17444560a1cdd664c01308206ce5cb9fcd46121b45281ece20273948479711411223c1081f709c15409242d51ca6cc57ff81f6335d70e0cbe0b5 + languageName: node + linkType: hard + "@rc-component/async-validator@npm:^5.0.3": version: 5.0.4 resolution: "@rc-component/async-validator@npm:5.0.4" @@ -3549,6 +3616,167 @@ __metadata: languageName: node linkType: hard +"@tailwindcss/node@npm:4.1.5": + version: 4.1.5 + resolution: "@tailwindcss/node@npm:4.1.5" + dependencies: + enhanced-resolve: "npm:^5.18.1" + jiti: "npm:^2.4.2" + lightningcss: "npm:1.29.2" + tailwindcss: "npm:4.1.5" + checksum: 10c0/0db690b8e84b90d0447d26f6f17a496476cf7b075e699aef51dbf6e52669bb28d95618c2e9a1176793be2a98be7ca6dafb3c238628e9963a77c81e334aac26b4 + languageName: node + linkType: hard + +"@tailwindcss/oxide-android-arm64@npm:4.1.5": + version: 4.1.5 + resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-darwin-arm64@npm:4.1.5": + version: 4.1.5 + resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-darwin-x64@npm:4.1.5": + version: 4.1.5 + resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-freebsd-x64@npm:4.1.5": + version: 4.1.5 + resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.5": + version: 4.1.5 + resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.5": + version: 4.1.5 + resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.5" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.5": + version: 4.1.5 + resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.5" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-x64-gnu@npm:4.1.5": + version: 4.1.5 + resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.1.5" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-x64-musl@npm:4.1.5": + version: 4.1.5 + resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.1.5" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@tailwindcss/oxide-wasm32-wasi@npm:4.1.5": + version: 4.1.5 + resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.1.5" + dependencies: + "@emnapi/core": "npm:^1.4.3" + "@emnapi/runtime": "npm:^1.4.3" + "@emnapi/wasi-threads": "npm:^1.0.2" + "@napi-rs/wasm-runtime": "npm:^0.2.9" + "@tybys/wasm-util": "npm:^0.9.0" + tslib: "npm:^2.8.0" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.5": + version: 4.1.5 + resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-win32-x64-msvc@npm:4.1.5": + version: 4.1.5 + resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.1.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide@npm:4.1.5": + version: 4.1.5 + resolution: "@tailwindcss/oxide@npm:4.1.5" + dependencies: + "@tailwindcss/oxide-android-arm64": "npm:4.1.5" + "@tailwindcss/oxide-darwin-arm64": "npm:4.1.5" + "@tailwindcss/oxide-darwin-x64": "npm:4.1.5" + "@tailwindcss/oxide-freebsd-x64": "npm:4.1.5" + "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.1.5" + "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.1.5" + "@tailwindcss/oxide-linux-arm64-musl": "npm:4.1.5" + "@tailwindcss/oxide-linux-x64-gnu": "npm:4.1.5" + "@tailwindcss/oxide-linux-x64-musl": "npm:4.1.5" + "@tailwindcss/oxide-wasm32-wasi": "npm:4.1.5" + "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.1.5" + "@tailwindcss/oxide-win32-x64-msvc": "npm:4.1.5" + dependenciesMeta: + "@tailwindcss/oxide-android-arm64": + optional: true + "@tailwindcss/oxide-darwin-arm64": + optional: true + "@tailwindcss/oxide-darwin-x64": + optional: true + "@tailwindcss/oxide-freebsd-x64": + optional: true + "@tailwindcss/oxide-linux-arm-gnueabihf": + optional: true + "@tailwindcss/oxide-linux-arm64-gnu": + optional: true + "@tailwindcss/oxide-linux-arm64-musl": + optional: true + "@tailwindcss/oxide-linux-x64-gnu": + optional: true + "@tailwindcss/oxide-linux-x64-musl": + optional: true + "@tailwindcss/oxide-wasm32-wasi": + optional: true + "@tailwindcss/oxide-win32-arm64-msvc": + optional: true + "@tailwindcss/oxide-win32-x64-msvc": + optional: true + checksum: 10c0/46d076f58839786007c500e627620f7aed33aa446ce7b09a10df21c0471128744c2a3afb9955061e62254f9d701c437deea67e40471cf036900d5b30e5ea653c + languageName: node + linkType: hard + +"@tailwindcss/vite@npm:^4.1.5": + version: 4.1.5 + resolution: "@tailwindcss/vite@npm:4.1.5" + dependencies: + "@tailwindcss/node": "npm:4.1.5" + "@tailwindcss/oxide": "npm:4.1.5" + tailwindcss: "npm:4.1.5" + peerDependencies: + vite: ^5.2.0 || ^6 + checksum: 10c0/588879114108b7e0f1f0c7b191281f0c332469c45d493826048378ee162f12a10c7f650428ad03a8005af3c720e208f951f7f5d3736f7740250fa037dd0f059d + languageName: node + linkType: hard + "@tanstack/query-core@npm:5.75.5": version: 5.75.5 resolution: "@tanstack/query-core@npm:5.75.5" @@ -3621,6 +3849,15 @@ __metadata: languageName: node linkType: hard +"@tybys/wasm-util@npm:^0.9.0": + version: 0.9.0 + resolution: "@tybys/wasm-util@npm:0.9.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/f9fde5c554455019f33af6c8215f1a1435028803dc2a2825b077d812bed4209a1a64444a4ca0ce2ea7e1175c8d88e2f9173a36a33c199e8a5c671aa31de8242d + languageName: node + linkType: hard + "@types/adm-zip@npm:^0": version: 0.5.7 resolution: "@types/adm-zip@npm:0.5.7" @@ -4400,10 +4637,12 @@ __metadata: "@modelcontextprotocol/sdk": "npm:^1.10.2" "@mozilla/readability": "npm:^0.6.0" "@notionhq/client": "npm:^2.2.15" + "@radix-ui/react-slot": "npm:^1.2.2" "@reduxjs/toolkit": "npm:^2.2.5" "@shikijs/markdown-it": "npm:^3.2.2" "@strongtz/win32-arm64-msvc": "npm:^0.4.7" "@swc/plugin-styled-components": "npm:^7.1.3" + "@tailwindcss/vite": "npm:^4.1.5" "@tanstack/react-query": "npm:^5.27.0" "@tavily/core": "patch:@tavily/core@npm%3A0.3.1#~/.yarn/patches/@tavily-core-npm-0.3.1-fe69bf2bea.patch" "@tryfabric/martian": "npm:^1.2.4" @@ -4433,6 +4672,8 @@ __metadata: babel-plugin-styled-components: "npm:^2.1.4" browser-image-compression: "npm:^2.0.2" bufferutil: "npm:^4.0.9" + class-variance-authority: "npm:^0.7.1" + clsx: "npm:^2.1.1" color: "npm:^5.0.0" dayjs: "npm:^1.11.11" dexie: "npm:^4.0.8" @@ -4468,9 +4709,10 @@ __metadata: lint-staged: "npm:^15.5.0" lodash: "npm:^4.17.21" lru-cache: "npm:^11.1.0" - lucide-react: "npm:^0.487.0" + lucide-react: "npm:^0.508.0" markdown-it: "npm:^14.1.0" mime: "npm:^4.0.4" + next-themes: "npm:^0.4.6" node-stream-zip: "npm:^1.15.0" npx-scope-finder: "npm:^1.2.0" officeparser: "npm:^4.1.1" @@ -4502,14 +4744,18 @@ __metadata: rollup-plugin-visualizer: "npm:^5.12.0" sass: "npm:^1.77.2" shiki: "npm:^3.2.2" + sonner: "npm:^2.0.3" string-width: "npm:^7.2.0" styled-components: "npm:^6.1.11" + tailwind-merge: "npm:^3.2.0" + tailwindcss: "npm:^4.1.5" tar: "npm:^7.4.3" tiny-pinyin: "npm:^1.3.2" tinycolor2: "npm:^1.6.0" tokenx: "npm:^0.4.1" turndown: "npm:^7.2.0" turndown-plugin-gfm: "npm:^1.0.2" + tw-animate-css: "npm:^1.2.9" typescript: "npm:^5.6.2" undici: "npm:^7.4.0" uuid: "npm:^10.0.0" @@ -5752,6 +5998,15 @@ __metadata: languageName: node linkType: hard +"class-variance-authority@npm:^0.7.1": + version: 0.7.1 + resolution: "class-variance-authority@npm:0.7.1" + dependencies: + clsx: "npm:^2.1.1" + checksum: 10c0/0f438cea22131808b99272de0fa933c2532d5659773bfec0c583de7b3f038378996d3350683426b8e9c74a6286699382106d71fbec52f0dd5fbb191792cccb5b + languageName: node + linkType: hard + "classcat@npm:^5.0.3": version: 5.0.5 resolution: "classcat@npm:5.0.5" @@ -5856,6 +6111,13 @@ __metadata: languageName: node linkType: hard +"clsx@npm:^2.1.1": + version: 2.1.1 + resolution: "clsx@npm:2.1.1" + checksum: 10c0/c4c8eb865f8c82baab07e71bfa8897c73454881c4f99d6bc81585aecd7c441746c1399d08363dc096c550cceaf97bd4ce1e8854e1771e9998d9f94c4fe075839 + languageName: node + linkType: hard + "code-point-at@npm:^1.0.0": version: 1.1.0 resolution: "code-point-at@npm:1.1.0" @@ -6705,6 +6967,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.3": + version: 2.0.4 + resolution: "detect-libc@npm:2.0.4" + checksum: 10c0/c15541f836eba4b1f521e4eecc28eefefdbc10a94d3b8cb4c507689f332cc111babb95deda66f2de050b22122113189986d5190be97d51b5a2b23b938415e67c + languageName: node + linkType: hard + "detect-node@npm:^2.0.4": version: 2.1.0 resolution: "detect-node@npm:2.1.0" @@ -7200,6 +7469,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.18.1": + version: 5.18.1 + resolution: "enhanced-resolve@npm:5.18.1" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10c0/4cffd9b125225184e2abed9fdf0ed3dbd2224c873b165d0838fd066cde32e0918626cba2f1f4bf6860762f13a7e2364fd89a82b99566be2873d813573ac71846 + languageName: node + linkType: hard + "entities@npm:^4.2.0, entities@npm:^4.4.0, entities@npm:^4.5.0": version: 4.5.0 resolution: "entities@npm:4.5.0" @@ -10227,6 +10506,15 @@ __metadata: languageName: node linkType: hard +"jiti@npm:^2.4.2": + version: 2.4.2 + resolution: "jiti@npm:2.4.2" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10c0/4ceac133a08c8faff7eac84aabb917e85e8257f5ad659e843004ce76e981c457c390a220881748ac67ba1b940b9b729b30fb85cbaf6e7989f04b6002c94da331 + languageName: node + linkType: hard + "jpeg-js@npm:^0.4.2": version: 0.4.4 resolution: "jpeg-js@npm:0.4.4" @@ -10780,6 +11068,116 @@ __metadata: languageName: node linkType: hard +"lightningcss-darwin-arm64@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-darwin-arm64@npm:1.29.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-x64@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-darwin-x64@npm:1.29.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-freebsd-x64@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-freebsd-x64@npm:1.29.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-linux-arm-gnueabihf@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.29.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"lightningcss-linux-arm64-gnu@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-linux-arm64-gnu@npm:1.29.2" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-arm64-musl@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-linux-arm64-musl@npm:1.29.2" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-linux-x64-gnu@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-linux-x64-gnu@npm:1.29.2" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-x64-musl@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-linux-x64-musl@npm:1.29.2" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-win32-arm64-msvc@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-win32-arm64-msvc@npm:1.29.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-win32-x64-msvc@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-win32-x64-msvc@npm:1.29.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"lightningcss@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss@npm:1.29.2" + dependencies: + detect-libc: "npm:^2.0.3" + lightningcss-darwin-arm64: "npm:1.29.2" + lightningcss-darwin-x64: "npm:1.29.2" + lightningcss-freebsd-x64: "npm:1.29.2" + lightningcss-linux-arm-gnueabihf: "npm:1.29.2" + lightningcss-linux-arm64-gnu: "npm:1.29.2" + lightningcss-linux-arm64-musl: "npm:1.29.2" + lightningcss-linux-x64-gnu: "npm:1.29.2" + lightningcss-linux-x64-musl: "npm:1.29.2" + lightningcss-win32-arm64-msvc: "npm:1.29.2" + lightningcss-win32-x64-msvc: "npm:1.29.2" + dependenciesMeta: + lightningcss-darwin-arm64: + optional: true + lightningcss-darwin-x64: + optional: true + lightningcss-freebsd-x64: + optional: true + lightningcss-linux-arm-gnueabihf: + optional: true + lightningcss-linux-arm64-gnu: + optional: true + lightningcss-linux-arm64-musl: + optional: true + lightningcss-linux-x64-gnu: + optional: true + lightningcss-linux-x64-musl: + optional: true + lightningcss-win32-arm64-msvc: + optional: true + lightningcss-win32-x64-msvc: + optional: true + checksum: 10c0/e06bb99c98e9f56cfcf37b5ce0e0198cdeeac2993ef2e5b878b6b0934fff54c7528f38bf8875e7bd71e64c9b20b29c0cada222d1e0089c8f94c1159bbb5d611f + languageName: node + linkType: hard + "lilconfig@npm:^3.1.3": version: 3.1.3 resolution: "lilconfig@npm:3.1.3" @@ -11014,12 +11412,12 @@ __metadata: languageName: node linkType: hard -"lucide-react@npm:^0.487.0": - version: 0.487.0 - resolution: "lucide-react@npm:0.487.0" +"lucide-react@npm:^0.508.0": + version: 0.508.0 + resolution: "lucide-react@npm:0.508.0" peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/7177778c584b8e9545957bef28e95841c4be1b3bf473f9e2e64454c3e183d7ed0bc977c9f7b5446088023c7000151b7a3b27398d4f70025bf343782192f653ca + checksum: 10c0/8eb9bc74ebeba85967328c236c5300aa2070d073e79cb88b6c968fd5d805d028aa3a64649d6b7711e92b5e2e873d8c961641d691e135e0e43056d3be1e3e7f87 languageName: node linkType: hard @@ -12493,6 +12891,16 @@ __metadata: languageName: node linkType: hard +"next-themes@npm:^0.4.6": + version: 0.4.6 + resolution: "next-themes@npm:0.4.6" + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + checksum: 10c0/83590c11d359ce7e4ced14f6ea9dd7a691d5ce6843fe2dc520fc27e29ae1c535118478d03e7f172609c41b1ef1b8da6b8dd2d2acd6cd79cac1abbdbd5b99f2c4 + languageName: node + linkType: hard + "node-abi@npm:^2.7.0": version: 2.30.1 resolution: "node-abi@npm:2.30.1" @@ -15833,6 +16241,16 @@ __metadata: languageName: node linkType: hard +"sonner@npm:^2.0.3": + version: 2.0.3 + resolution: "sonner@npm:2.0.3" + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + checksum: 10c0/59f84142f7a692dd1ec90e6df2003a70ff0b325eaef1d5dd17ad250e7f992b71053824f1a7ab3912f8c4caa5ce30523a096b5f5108b3e8ae13f906048691aca1 + languageName: node + linkType: hard + "source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" @@ -16355,6 +16773,27 @@ __metadata: languageName: node linkType: hard +"tailwind-merge@npm:^3.2.0": + version: 3.2.0 + resolution: "tailwind-merge@npm:3.2.0" + checksum: 10c0/294f6c2db0df74405bff126107107426c3126a70a1717d78e8d6811db65546c9bb3d61282bdb8d9fbded23f6bc8ec3e8e61031a4f53265f90b7f3dba558f88f4 + languageName: node + linkType: hard + +"tailwindcss@npm:4.1.5, tailwindcss@npm:^4.1.5": + version: 4.1.5 + resolution: "tailwindcss@npm:4.1.5" + checksum: 10c0/19fd0709f8c8d706d28a936f6ae7ad371d8586ea38e17a68ab5ba1c1c5d97ffcc8eba144f1b5c91c1534aa8df053a26c298863272a3357161a1dd9849b89339c + languageName: node + linkType: hard + +"tapable@npm:^2.2.0": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 + languageName: node + linkType: hard + "tar-fs@npm:^2.0.0": version: 2.1.2 resolution: "tar-fs@npm:2.1.2" @@ -16794,7 +17233,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2, tslib@npm:^2.8.1": +"tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2, tslib@npm:^2.8.0, tslib@npm:^2.8.1": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -16826,6 +17265,13 @@ __metadata: languageName: node linkType: hard +"tw-animate-css@npm:^1.2.9": + version: 1.2.9 + resolution: "tw-animate-css@npm:1.2.9" + checksum: 10c0/ffbd6dfbb34490a8752b185b40192168ce4bfa69949d153dc831d9471dec2758501f27f1784b6615de7da73a546d01d7201ed691f5220fe3e0a53694cb275a3a + languageName: node + linkType: hard + "tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": version: 0.14.5 resolution: "tweetnacl@npm:0.14.5"