diff --git a/web/package-lock.json b/web/package-lock.json index f34554639af..d071d5082f8 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -19,6 +19,7 @@ "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-icons": "^1.3.1", "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-navigation-menu": "^1.2.1", "@radix-ui/react-popover": "^1.1.2", "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-separator": "^1.1.0", @@ -4421,6 +4422,41 @@ } } }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.1.tgz", + "integrity": "sha512-egDo0yJD2IK8L17gC82vptkvW1jLeni1VuqCyzY727dSJdk5cDjINomouLoNk8RVF7g2aNIfENKWL4UzeU9c8Q==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-popover": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/@radix-ui/react-popover/-/react-popover-1.1.2.tgz", diff --git a/web/package.json b/web/package.json index f9173610d0e..f54dd04c126 100644 --- a/web/package.json +++ b/web/package.json @@ -30,6 +30,7 @@ "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-icons": "^1.3.1", "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-navigation-menu": "^1.2.1", "@radix-ui/react-popover": "^1.1.2", "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-separator": "^1.1.0", diff --git a/web/src/components/ui/navigation-menu.tsx b/web/src/components/ui/navigation-menu.tsx new file mode 100644 index 00000000000..b2cdae8f6a9 --- /dev/null +++ b/web/src/components/ui/navigation-menu.tsx @@ -0,0 +1,128 @@ +import * as NavigationMenuPrimitive from '@radix-ui/react-navigation-menu'; +import { cva } from 'class-variance-authority'; +import { ChevronDown } from 'lucide-react'; +import * as React from 'react'; + +import { cn } from '@/lib/utils'; + +const NavigationMenuViewport = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
+ +
+)); +NavigationMenuViewport.displayName = + NavigationMenuPrimitive.Viewport.displayName; + +const NavigationMenu = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + {children} + + +)); +NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName; + +const NavigationMenuList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName; + +const NavigationMenuItem = NavigationMenuPrimitive.Item; + +const navigationMenuTriggerStyle = cva( + 'group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50', +); + +const NavigationMenuTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + {children}{' '} + +)); +NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName; + +const NavigationMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName; + +const NavigationMenuLink = NavigationMenuPrimitive.Link; + +const NavigationMenuIndicator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +
+ +)); +NavigationMenuIndicator.displayName = + NavigationMenuPrimitive.Indicator.displayName; + +export { + NavigationMenu, + NavigationMenuContent, + NavigationMenuIndicator, + NavigationMenuItem, + NavigationMenuLink, + NavigationMenuList, + NavigationMenuTrigger, + NavigationMenuViewport, + navigationMenuTriggerStyle, +}; diff --git a/web/src/pages/home/applications.tsx b/web/src/pages/home/applications.tsx new file mode 100644 index 00000000000..bd67fc83dce --- /dev/null +++ b/web/src/pages/home/applications.tsx @@ -0,0 +1,80 @@ +import { Button } from '@/components/ui/button'; +import { Card, CardContent } from '@/components/ui/card'; +import { ChevronRight, Cpu, MessageSquare, Search } from 'lucide-react'; + +const applications = [ + { + id: 1, + title: 'Jarvis chatbot', + type: 'Chat app', + date: '11/24/2024', + icon: , + }, + { + id: 2, + title: 'Search app 01', + type: 'Search app', + date: '11/24/2024', + icon: , + }, + { + id: 3, + title: 'Chatbot 01', + type: 'Chat app', + date: '11/24/2024', + icon: , + }, + { + id: 4, + title: 'Workflow 01', + type: 'Agent', + date: '11/24/2024', + icon: , + }, +]; + +export function Applications() { + return ( +
+
+

Applications

+
+ + + + +
+
+
+ {[...Array(12)].map((_, i) => { + const app = applications[i % 4]; + return ( + + +
+ {app.icon} +
+
+

{app.title}

+

{app.type}

+

{app.date}

+
+ +
+
+ ); + })} +
+
+ ); +} diff --git a/web/src/pages/home/banner.tsx b/web/src/pages/home/banner.tsx index d55947e6353..8b33101a61d 100644 --- a/web/src/pages/home/banner.tsx +++ b/web/src/pages/home/banner.tsx @@ -1,5 +1,5 @@ import { Card, CardContent } from '@/components/ui/card'; -import { ArrowRight } from 'lucide-react'; +import { ArrowRight, X } from 'lucide-react'; function BannerCard() { return ( @@ -17,34 +17,22 @@ function BannerCard() { ); } -function MyCard() { - return ( -
-
-
-
- System -
-
-
- Setting up your LLM -
-
-
-
- ); -} - export function Banner() { return ( -
+
Welcome to RAGFlow
-
+
+ - +
); diff --git a/web/src/pages/home/card.tsx b/web/src/pages/home/card.tsx deleted file mode 100644 index 881b44a0bf3..00000000000 --- a/web/src/pages/home/card.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { Button } from '@/components/ui/button'; -import { - Card, - CardContent, - CardDescription, - CardFooter, - CardHeader, - CardTitle, -} from '@/components/ui/card'; -import { Input } from '@/components/ui/input'; -import { Label } from '@/components/ui/label'; - -export function CardWithForm() { - return ( - - - Create project - Deploy your new project in one-click. - - -
-
-
- - -
-
- -
-
-
-
- - - - -
- ); -} diff --git a/web/src/pages/home/datasets.tsx b/web/src/pages/home/datasets.tsx new file mode 100644 index 00000000000..fea9a01db82 --- /dev/null +++ b/web/src/pages/home/datasets.tsx @@ -0,0 +1,85 @@ +import { Button } from '@/components/ui/button'; +import { Card, CardContent } from '@/components/ui/card'; +import { ChevronRight, MoreHorizontal } from 'lucide-react'; + +const datasets = [ + { + id: 1, + title: 'Legal knowledge base', + files: '1,242 files', + size: '152 MB', + created: '12.02.2024', + image: '/image-3.png', + }, + { + id: 2, + title: 'HR knowledge base', + files: '1,242 files', + size: '152 MB', + created: '12.02.2024', + image: '/image.png', + }, + { + id: 3, + title: 'IT knowledge base', + files: '1,242 files', + size: '152 MB', + created: '12.02.2024', + image: '/rectangle-86.png', + }, + { + id: 4, + title: 'Legal knowledge base', + files: '1,242 files', + size: '152 MB', + created: '12.02.2024', + image: '/image-2.png', + }, +]; + +export function Datasets() { + return ( +
+

Datasets

+
+ {datasets.map((dataset) => ( + + +
+
+ +
+
+
+

+ {dataset.title} +

+

+ {dataset.files} | {dataset.size} +

+

+ Created {dataset.created} +

+
+ +
+ + + ))} + +
+
+ ); +} diff --git a/web/src/pages/home/header.tsx b/web/src/pages/home/header.tsx index 4479c346e5d..bb0dbd74d93 100644 --- a/web/src/pages/home/header.tsx +++ b/web/src/pages/home/header.tsx @@ -64,7 +64,7 @@ export function HomeHeader() { }, [navigate]); return ( -
+
{ return ( -
+
- + +
); diff --git a/web/src/pages/home/next-banner.tsx b/web/src/pages/home/next-banner.tsx deleted file mode 100644 index 53570d9d5ce..00000000000 --- a/web/src/pages/home/next-banner.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { Badge } from '@/components/ui/badge'; -import { Card, CardContent } from '@/components/ui/card'; -import { ArrowRight, X } from 'lucide-react'; - -const guideCards = [ - { - badge: 'System', - title: 'Setting up your LLM', - }, - { - badge: 'Chat app', - title: 'Configuration guides', - }, - { - badge: 'Search app', - title: 'Prompt setting guides', - }, -]; - -export default function WelcomeGuide(): JSX.Element { - return ( -
-
- -

- Welcome to RAGFlow -

- -
- {guideCards.map((card, index) => ( - - -
- - {card.badge} - -

- {card.title} -

-
- -
-
- ))} -
- - -
- ); -} diff --git a/web/tailwind.config.js b/web/tailwind.config.js index 94fd67e9a1f..619b1905e81 100644 --- a/web/tailwind.config.js +++ b/web/tailwind.config.js @@ -69,6 +69,75 @@ module.exports = { DEFAULT: 'var(--background-core-weak)', foreground: 'var(--background-core-weak-foreground)', }, + + 'color-background-brand-default': { + DEFAULT: 'var(--color-background-brand-default)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'color-background-positive-default': { + DEFAULT: 'var(--color-background-positive-default)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'colors-background-core-standard': { + DEFAULT: 'var(--colors-background-core-standard)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'colors-background-core-strong': { + DEFAULT: 'var(--colors-background-core-strong)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'colors-background-core-weak': { + DEFAULT: 'var(--colors-background-core-weak)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'colors-background-functional-solid-danger': { + DEFAULT: 'var(--colors-background-functional-solid-danger)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'colors-background-functional-solid-notice': { + DEFAULT: 'var(--colors-background-functional-solid-notice)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'colors-background-functional-solid-positive': { + DEFAULT: 'var(--colors-background-functional-solid-positive)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'colors-background-functional-transparent-danger': { + DEFAULT: 'var(--colors-background-functional-transparent-danger)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'colors-background-functional-transparent-notice': { + DEFAULT: 'var(--colors-background-functional-transparent-notice)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'colors-background-functional-transparent-positive': { + DEFAULT: 'var(--colors-background-functional-transparent-positive)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'colors-background-inverse-standard': { + DEFAULT: 'var(--colors-background-inverse-standard)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'colors-background-inverse-strong': { + DEFAULT: 'var(--colors-background-inverse-strong)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'colors-background-inverse-weak': { + DEFAULT: 'var(--colors-background-inverse-weak)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'colors-background-neutral-standard': { + DEFAULT: 'var(--colors-background-neutral-standard)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'colors-background-neutral-strong': { + DEFAULT: 'var(--colors-background-neutral-strong)', + foreground: 'var(--background-inverse-standard-foreground)', + }, + 'colors-background-neutral-weak': { + DEFAULT: 'var(--colors-background-neutral-weak)', + foreground: 'var(--background-inverse-standard-foreground)', + }, }, borderRadius: { lg: `var(--radius)`, diff --git a/web/tailwind.css b/web/tailwind.css index ed2e54ed969..3213eae8106 100644 --- a/web/tailwind.css +++ b/web/tailwind.css @@ -87,6 +87,27 @@ --background-core-weak: rgb(101, 75, 248); --background-core-weak-foreground: rgba(255, 255, 255, 1); + + --colors-background-core-standard: rgba(137, 126, 255, 1); + --colors-background-core-strong: rgba(152, 147, 255, 1); + --colors-background-core-weak: rgba(101, 75, 248, 1); + --colors-background-functional-solid-danger: rgba(255, 57, 92, 1); + --colors-background-functional-solid-notice: rgba(255, 208, 94, 1); + --colors-background-functional-solid-positive: rgba(74, 225, 145, 1); + --colors-background-functional-transparent-danger: rgba(234, 50, 83, 0.2); + --colors-background-functional-transparent-notice: rgba(248, 208, 111, 0.5); + --colors-background-functional-transparent-positive: rgba( + 65, + 203, + 130, + 0.5 + ); + --colors-background-inverse-standard: rgba(230, 227, 246, 0.15); + --colors-background-inverse-strong: rgba(255, 255, 255, 0.15); + --colors-background-inverse-weak: rgba(184, 181, 203, 0.15); + --colors-background-neutral-standard: rgba(11, 10, 18, 1); + --colors-background-neutral-strong: rgba(29, 26, 44, 1); + --colors-background-neutral-weak: rgba(17, 16, 23, 1); } }