From d322f4773cdd2c3fb09859f3816bcaace40f997b Mon Sep 17 00:00:00 2001 From: dextmorgn Date: Fri, 14 Mar 2025 15:00:26 +0100 Subject: [PATCH] feat: default edges --- flowsint-web/src/app/dashboard/keys/page.tsx | 149 +++++++- flowsint-web/src/app/dashboard/layout.tsx | 28 +- flowsint-web/src/app/dashboard/page.tsx | 176 ++++++---- flowsint-web/src/components/app-sidebar.tsx | 332 ++++++------------ .../dashboard/investigation-list.tsx | 79 +++++ .../components/dashboard/investigation.tsx | 15 +- .../src/components/dashboard/view-toggle.tsx | 36 ++ .../investigations/floating-edge.tsx | 7 +- .../src/components/investigations/graph.tsx | 2 +- .../investigations/individual-modal.tsx | 2 +- .../src/components/investigations/layout.tsx | 3 +- .../components/investigations/nodes/email.tsx | 2 +- .../investigations/nodes/individual.tsx | 4 +- .../investigations/nodes/ip_address.tsx | 2 +- .../nodes/minimal_individual.tsx | 4 +- .../components/investigations/nodes/phone.tsx | 2 +- .../investigations/nodes/physical_address.tsx | 2 +- .../investigations/nodes/social.tsx | 2 +- flowsint-web/src/components/logo.tsx | 8 +- flowsint-web/src/components/team-switcher.tsx | 76 +--- flowsint-web/src/components/ui/avatar.tsx | 2 +- flowsint-web/src/store/flow-store.ts | 2 +- flowsint-web/styles/globals.css | 14 +- 23 files changed, 521 insertions(+), 428 deletions(-) create mode 100644 flowsint-web/src/components/dashboard/investigation-list.tsx create mode 100644 flowsint-web/src/components/dashboard/view-toggle.tsx diff --git a/flowsint-web/src/app/dashboard/keys/page.tsx b/flowsint-web/src/app/dashboard/keys/page.tsx index fbac352..5e45c54 100644 --- a/flowsint-web/src/app/dashboard/keys/page.tsx +++ b/flowsint-web/src/app/dashboard/keys/page.tsx @@ -1,9 +1,150 @@ -import React from 'react' +"use client" + +import { useState } from "react" +import { Button } from "@/components/ui/button" +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" +import { Trash2 } from "lucide-react" + +export default function TokensPage() { + const [tokens, setTokens] = useState([ + { + id: "1", + name: "My key", + key: "****************************CmDi", + expiration: "Jamais", + }, + ]) -const page = () => { return ( -
keys
+ <> +
+
+
+

Vos clés API

+

+ Gérez vos clés API personnelles pour votre espace de travail actuel +

+
+ +
+ +
+ +

+ Vous pouvez créer jusqu'à 10 clés API et les supprimer lorsque vous n'en avez plus besoin. +

+ + + + + Actives + + + Expirées + + + +
+ + + + + + + + + + + {tokens.map((token) => ( + + + + + + + ))} + +
NomCléExpiration
{token.name}{token.key}{token.expiration} + +
+
+
+ +
+ Aucune clé API expirée +
+
+
+
+
+
+
+

Vos clés de services tiers

+

+ Gérez vos clés de services tiers pour votre espace de travail actuel +

+
+ {/* */} +
+ + + + Actives + + + Expirées + + + +
+ + + + + + + + + + + {tokens.map((token) => ( + + + + + + + ))} + +
NomCléExpiration
{token.name}{token.key}{token.expiration} + +
+
+
+ +
+ Aucune clé API expirée +
+
+
+
+ ) } -export default page \ No newline at end of file diff --git a/flowsint-web/src/app/dashboard/layout.tsx b/flowsint-web/src/app/dashboard/layout.tsx index e0d49b7..ad29387 100644 --- a/flowsint-web/src/app/dashboard/layout.tsx +++ b/flowsint-web/src/app/dashboard/layout.tsx @@ -1,14 +1,5 @@ import { AppSidebar } from "@/components/app-sidebar" import { createClient } from "@/lib/supabase/server"; -import { - Breadcrumb, - BreadcrumbItem, - BreadcrumbLink, - BreadcrumbList, - BreadcrumbPage, - BreadcrumbSeparator, -} from "@/components/ui/breadcrumb" -import { Separator } from "@/components/ui/separator" import { SidebarInset, SidebarProvider, @@ -33,26 +24,9 @@ const DashboardLayout = async ({
- {/* - - - - - Building Your Application - - - - - Data Fetching - - - */}
-
+
{children}
diff --git a/flowsint-web/src/app/dashboard/page.tsx b/flowsint-web/src/app/dashboard/page.tsx index 842eddc..030b79f 100644 --- a/flowsint-web/src/app/dashboard/page.tsx +++ b/flowsint-web/src/app/dashboard/page.tsx @@ -1,32 +1,59 @@ +"use client" + +import { useState, useEffect } from "react" import Investigation from "@/components/dashboard/investigation" +import InvestigationList from "@/components/dashboard/investigation-list" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" -import { AlertCircle, ChevronDown, Clock, Filter, Grid3X3, List, Lock, Plus, Search, Target } from "lucide-react" +import { AlertCircle, ChevronDown, Clock, Filter, Lock, Plus, Search, Target } from "lucide-react" import NewCase from "@/components/dashboard/new-case" -import { createClient } from "@/lib/supabase/server" +import { supabase } from "@/lib/supabase/client" import { Input } from "@/components/ui/input" import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@/components/ui/command" -import { unauthorized } from "next/navigation" +import ViewToggle from "@/components/dashboard/view-toggle" +import { useQueryState } from "nuqs" +import Loader from "@/components/loader" -const DashboardPage = async () => { - const supabase = await createClient() - const { data: investigations, error } = await supabase.from("investigations").select("*, relations_count:relationships!inner(count), individuals_counts:individuals!inner(count)") - if (error) return unauthorized() +type ViewMode = "grid" | "list" - // Compter les investigations par statut +const DashboardPage = () => { + const [viewMode, setViewMode] = useQueryState("view", { + defaultValue: "grid", + parse: (value) => (value === "grid" || value === "list" ? value : "grid") + }) + const [investigations, setInvestigations] = useState([]) + const [loading, setLoading] = useState(true) const activeCount = investigations.filter((inv) => inv.status === "active").length || 0 const pendingCount = investigations.filter((inv) => inv.status === "pending").length || 0 const archivedCount = investigations.filter((inv) => inv.status === "archived").length || 0 const totalCount = investigations.length + useEffect(() => { + const fetchInvestigations = async () => { + setLoading(true) + const { data, error } = await supabase + .from("investigations") + .select("*, relations_count:relationships!inner(count), individuals_counts:individuals!inner(count)") + if (error) { + console.error("Erreur lors de la récupération des investigations:", error) + } else { + setInvestigations(data || []) + } + setLoading(false) + } + fetchInvestigations() + }, []) + const getGridClasses = () => { + return viewMode === "grid" ? "grid gap-4 sm:grid-cols-1 lg:grid-cols-2 xl:grid-cols-3" : "grid gap-2 grid-cols-1" + } return (
-

Investigations

+

Investigations

Gérez et suivez vos investigations OSINT en cours.

@@ -38,7 +65,6 @@ const DashboardPage = async () => {
-
@@ -48,7 +74,6 @@ const DashboardPage = async () => { className="w-full rounded-lg bg-background pl-8 md:max-w-sm" />
-
@@ -83,88 +108,101 @@ const DashboardPage = async () => { - -
- - -
- - +
- Actives - {activeCount} + + {activeCount} + En cours - {pendingCount} + + {pendingCount} + Archivées - {archivedCount} + + {archivedCount} + Toutes - {totalCount} + + {totalCount} + - - -
- {investigations.map((investigation) => ( - - ))} + {loading ? ( +
+

Chargement des investigations...

- - - -
- {investigations - .filter((inv) => inv.status === "active") - .map((investigation) => ( - - ))} -
-
- - -
- {investigations - .filter((inv) => inv.status === "pending") - .map((investigation) => ( - - ))} -
-
- -
- {investigations - .filter((inv) => inv.status === "archived") - .map((investigation) => ( - - ))} -
-
+ ) : ( + <> + +
+ {investigations.map((investigation) => + viewMode === "grid" ? ( + + ) : ( + + ), + )} +
+
+ +
+ {investigations + .filter((inv) => inv.status === "active") + .map((investigation) => + viewMode === "grid" ? ( + + ) : ( + + ), + )} +
+
+ +
+ {investigations + .filter((inv) => inv.status === "pending") + .map((investigation) => + viewMode === "grid" ? ( + + ) : ( + + ), + )} +
+
+ +
+ {investigations + .filter((inv) => inv.status === "archived") + .map((investigation) => + viewMode === "grid" ? ( + + ) : ( + + ), + )} +
+
+ + )}
-
+
) } diff --git a/flowsint-web/src/components/app-sidebar.tsx b/flowsint-web/src/components/app-sidebar.tsx index e8262cd..6ee858a 100644 --- a/flowsint-web/src/components/app-sidebar.tsx +++ b/flowsint-web/src/components/app-sidebar.tsx @@ -1,31 +1,11 @@ "use client" -import * as React from "react" -import { - AudioWaveform, - BookOpen, - Bot, - Command, - FolderSearch, - Frame, - GalleryVerticalEnd, - Globe, - KeyIcon, - Map, - MapPin, - Network, - PieChart, - Settings2, - SettingsIcon, - SquareTerminal, - UserIcon, - Users, -} from "lucide-react" +import type * as React from "react" +import { usePathname } from "next/navigation" +import Link from "next/link" +import { FolderSearch, Globe, KeyIcon, MapPin, Network, SettingsIcon, UserIcon, Users } from "lucide-react" -import { NavMain } from "@/components/nav-main" -import { NavProjects } from "@/components/nav-projects" import { NavUser } from "@/components/nav-user" -import { TeamSwitcher } from "@/components/team-switcher" import { Sidebar, SidebarContent, @@ -39,224 +19,138 @@ import { SidebarRail, SidebarSeparator, } from "@/components/ui/sidebar" - -// This is sample data. -const data = { - user: { - name: "shadcn", - email: "m@example.com", - avatar: "/avatars/shadcn.jpg", - }, - teams: [ - { - name: "Acme Inc", - logo: GalleryVerticalEnd, - plan: "Enterprise", - }, - { - name: "Acme Corp.", - logo: AudioWaveform, - plan: "Startup", - }, - { - name: "Evil Corp.", - logo: Command, - plan: "Free", - }, - ], - navMain: [ - { - title: "Playground", - url: "#", - icon: SquareTerminal, - isActive: true, - items: [ - { - title: "History", - url: "#", - }, - { - title: "Starred", - url: "#", - }, - { - title: "Settings", - url: "#", - }, - ], - }, - { - title: "Models", - url: "#", - icon: Bot, - items: [ - { - title: "Genesis", - url: "#", - }, - { - title: "Explorer", - url: "#", - }, - { - title: "Quantum", - url: "#", - }, - ], - }, - { - title: "Documentation", - url: "#", - icon: BookOpen, - items: [ - { - title: "Introduction", - url: "#", - }, - { - title: "Get Started", - url: "#", - }, - { - title: "Tutorials", - url: "#", - }, - { - title: "Changelog", - url: "#", - }, - ], - }, - { - title: "Settings", - url: "#", - icon: Settings2, - items: [ - { - title: "General", - url: "#", - }, - { - title: "Team", - url: "#", - }, - { - title: "Billing", - url: "#", - }, - { - title: "Limits", - url: "#", - }, - ], - }, - ], - projects: [ - { - name: "Investigations", - url: "/dashboard", - icon: Frame, - }, - ], +import { TeamSwitcher } from "./team-switcher" +// Define navigation item type +interface NavItem { + title: string + href: string + icon: React.ElementType } interface AppSidebarProps extends React.ComponentProps { - user: any; + user: any } export function AppSidebar({ user, ...props }: AppSidebarProps) { + const pathname = usePathname() + + // Main navigation items + const mainNavItems: NavItem[] = [ + { + title: "Investigations", + href: "/dashboard", + icon: FolderSearch, + }, + { + title: "Networks", + href: "/networks", + icon: Network, + }, + { + title: "Entities", + href: "/entities", + icon: Users, + }, + { + title: "OSINT sources", + href: "/sources", + icon: Globe, + }, + { + title: "Map", + href: "/map", + icon: MapPin, + }, + ] + + // Team navigation items + const teamNavItems: NavItem[] = [ + { + title: "My account", + href: "/profile", + icon: UserIcon, + }, + { + title: "Team members", + href: "/team", + icon: Users, + }, + ] + + // Preferences navigation items + const preferencesNavItems: NavItem[] = [ + { + title: "Settings", + href: "/dashboard/settings", + icon: SettingsIcon, + }, + { + title: "API keys", + href: "/dashboard/keys", + icon: KeyIcon, + }, + ] + + // Function to check if a link is active + const isActive = (href: string) => { + // Exact match for dashboard + if (href === "/dashboard" && pathname === "/dashboard") { + return true + } + // For other routes, check if pathname starts with href (for nested routes) + return href !== "/dashboard" && pathname.startsWith(href) + } + return ( - + NAVIGATION - - - - - Investigations - - - - - - - - Networks - - - - - - - - Entities - - - - - - - - OSINT sources - - - - - - - - Map - - - + {mainNavItems.map((item) => ( + + + + + {item.title} + + + + ))} TEAMS - - - - - My account - - - - - - - - Team members - - - + {teamNavItems.map((item) => ( + + + + + {item.title} + + + + ))} Preferences - - - - - Settings - - - - - - - - API keys - - - + {preferencesNavItems.map((item) => ( + + + + + {item.title} + + + + ))} @@ -264,6 +158,6 @@ export function AppSidebar({ user, ...props }: AppSidebarProps) { - + ) -} +} \ No newline at end of file diff --git a/flowsint-web/src/components/dashboard/investigation-list.tsx b/flowsint-web/src/components/dashboard/investigation-list.tsx new file mode 100644 index 0000000..89e3db5 --- /dev/null +++ b/flowsint-web/src/components/dashboard/investigation-list.tsx @@ -0,0 +1,79 @@ +import { Badge } from "@/components/ui/badge" +import { Card, CardDescription, CardTitle } from "@/components/ui/card" +import { AlertCircle, Calendar, Users } from "lucide-react" +import Link from "next/link" + +interface Investigation { + id: string + title: string + description: string + status: string + priority: string + created_at: string + relations_count: { count: number } + individuals_counts: { count: number } +} + +export default function InvestigationList({ investigation }: { investigation: Investigation }) { + const priorityColors = { + high: "text-red-500", + medium: "text-amber-500", + low: "text-green-500", + } + + const statusColors = { + active: "bg-green-500/10 text-green-500 border-green-500/20", + pending: "bg-amber-500/10 text-amber-500 border-amber-500/20", + archived: "bg-slate-500/10 text-slate-500 border-slate-500/20", + } + + const statusText = { + active: "Actif", + pending: "En cours", + archived: "Archivé", + } + + const formattedDate = new Date(investigation.created_at).toLocaleDateString("fr-FR", { + day: "numeric", + month: "short", + year: "numeric", + }) + + return ( + +
+
+
+ + {investigation.title} + + + {statusText[investigation.status as keyof typeof statusText]} + +
+ {investigation.description} + +
+
+ + {formattedDate} +
+
+ + {investigation.individuals_counts.count} individus +
+
+ + + Priorité {investigation.priority} + +
+
+
+
+
+ ) +} + diff --git a/flowsint-web/src/components/dashboard/investigation.tsx b/flowsint-web/src/components/dashboard/investigation.tsx index b68c62c..8175a4d 100644 --- a/flowsint-web/src/components/dashboard/investigation.tsx +++ b/flowsint-web/src/components/dashboard/investigation.tsx @@ -94,9 +94,9 @@ export default function Investigation({ investigation }: { investigation: any }) description = "No description provided.", status = "active", progress = 35, - lastUpdated = new Date().toISOString(), + lastUpdated = investigation.created_at ?? new Date().toISOString(), tags = ["investigation", "osint", "pedo"], - team = ["E", "J"], + team = ["E"], priority = "medium", entities = investigation?.["individuals_counts"]?.[0]?.count || 0, connections = investigation?.["relations_counts"]?.[0]?.count || 0, @@ -124,17 +124,6 @@ export default function Investigation({ investigation }: { investigation: any })
- {/*
-
- Progression - {progress}% -
- -
*/} - {/*
- - {location} -
*/}
diff --git a/flowsint-web/src/components/dashboard/view-toggle.tsx b/flowsint-web/src/components/dashboard/view-toggle.tsx new file mode 100644 index 0000000..d743f1d --- /dev/null +++ b/flowsint-web/src/components/dashboard/view-toggle.tsx @@ -0,0 +1,36 @@ +"use client" +import { Button } from "@/components/ui/button" +import { Grid3X3, List } from "lucide-react" + +type ViewMode = "grid" | "list" + +interface ViewToggleProps { + onViewChange: (view: ViewMode) => void + currentView: ViewMode +} + +export default function ViewToggle({ onViewChange, currentView }: ViewToggleProps) { + return ( +
+ + +
+ ) +} + diff --git a/flowsint-web/src/components/investigations/floating-edge.tsx b/flowsint-web/src/components/investigations/floating-edge.tsx index 25ade3c..e5156b2 100644 --- a/flowsint-web/src/components/investigations/floating-edge.tsx +++ b/flowsint-web/src/components/investigations/floating-edge.tsx @@ -2,7 +2,7 @@ import { memo, useMemo } from "react" import { getEdgeParams } from "@/lib/utils" -import { EdgeLabelRenderer, getSmoothStepPath, getStraightPath, useInternalNode } from "@xyflow/react" +import { EdgeLabelRenderer, getBezierPath, getSmoothStepPath, getStraightPath, useInternalNode } from "@xyflow/react" import { useInvestigationStore } from "@/store/investigation-store" import { Badge } from "@/components/ui/badge" @@ -36,7 +36,7 @@ function FloatingEdge({ // Mémorisation du calcul du chemin et des coordonnées du label const pathData = useMemo(() => { const { sx, sy, tx, ty } = edgeParameters - return getStraightPath({ + return getBezierPath({ sourceX: sx, sourceY: sy, targetX: tx, @@ -51,8 +51,9 @@ function FloatingEdge({ transform: `translate(-50%, -50%) translate(${pathData[1]}px,${pathData[2]}px)`, pointerEvents: "all" as const, opacity: style?.opacity || 1, + stroke: style?.stroke || "#b1b1b750", }), - [pathData, style?.opacity], + [pathData, style?.opacity, style?.stroke], ) // Mémorisation du contenu du badge diff --git a/flowsint-web/src/components/investigations/graph.tsx b/flowsint-web/src/components/investigations/graph.tsx index b4ee7d2..065b888 100644 --- a/flowsint-web/src/components/investigations/graph.tsx +++ b/flowsint-web/src/components/investigations/graph.tsx @@ -254,7 +254,7 @@ const LayoutFlow = ({ refetch, theme }: LayoutFlowProps) => { proOptions={{ hideAttribution: true }} nodeTypes={nodeTypes} // @ts-ignore - edgeTypes={edgeTypes} + // edgeTypes={edgeTypes} className="!bg-background" > { - {relation.full_name[0]} + {relation.full_name?.[0] || "?"}

{relation.full_name}

diff --git a/flowsint-web/src/components/investigations/layout.tsx b/flowsint-web/src/components/investigations/layout.tsx index aa7edc1..2fb41f9 100644 --- a/flowsint-web/src/components/investigations/layout.tsx +++ b/flowsint-web/src/components/investigations/layout.tsx @@ -34,8 +34,7 @@ const InvestigationLayout = ({ {panelOpen &&
-
- +
diff --git a/flowsint-web/src/components/investigations/nodes/email.tsx b/flowsint-web/src/components/investigations/nodes/email.tsx index 30e8875..7aa47da 100644 --- a/flowsint-web/src/components/investigations/nodes/email.tsx +++ b/flowsint-web/src/components/investigations/nodes/email.tsx @@ -101,7 +101,7 @@ function EmailNode({ data }: any) { // Mémorisation de la poignée const handle = useMemo( - () => , + () => , [], ) diff --git a/flowsint-web/src/components/investigations/nodes/individual.tsx b/flowsint-web/src/components/investigations/nodes/individual.tsx index 7cde1d1..6aa7de8 100644 --- a/flowsint-web/src/components/investigations/nodes/individual.tsx +++ b/flowsint-web/src/components/investigations/nodes/individual.tsx @@ -134,12 +134,12 @@ function Custom(props: any) { ), diff --git a/flowsint-web/src/components/investigations/nodes/ip_address.tsx b/flowsint-web/src/components/investigations/nodes/ip_address.tsx index 04a703f..535865a 100644 --- a/flowsint-web/src/components/investigations/nodes/ip_address.tsx +++ b/flowsint-web/src/components/investigations/nodes/ip_address.tsx @@ -77,7 +77,7 @@ function IpNode({ data }: any) { // Mémorisation de la poignée const handle = useMemo( - () => , + () => , [], ) diff --git a/flowsint-web/src/components/investigations/nodes/minimal_individual.tsx b/flowsint-web/src/components/investigations/nodes/minimal_individual.tsx index f25d7a3..097988e 100644 --- a/flowsint-web/src/components/investigations/nodes/minimal_individual.tsx +++ b/flowsint-web/src/components/investigations/nodes/minimal_individual.tsx @@ -112,12 +112,12 @@ function Custom(props: any) { ), diff --git a/flowsint-web/src/components/investigations/nodes/phone.tsx b/flowsint-web/src/components/investigations/nodes/phone.tsx index 85cc938..491d5ce 100644 --- a/flowsint-web/src/components/investigations/nodes/phone.tsx +++ b/flowsint-web/src/components/investigations/nodes/phone.tsx @@ -71,7 +71,7 @@ function PhoneNode({ data }: any) { }, [settings.showNodeLabel, showContent, currentNode, data.id, data.label, settings.showCopyIcon]) const handle = useMemo( - () => , + () => , [], ) const contextMenu = useMemo( diff --git a/flowsint-web/src/components/investigations/nodes/physical_address.tsx b/flowsint-web/src/components/investigations/nodes/physical_address.tsx index 4f30641..311dbb9 100644 --- a/flowsint-web/src/components/investigations/nodes/physical_address.tsx +++ b/flowsint-web/src/components/investigations/nodes/physical_address.tsx @@ -53,7 +53,7 @@ function AddressNode({ data }: any) { }, [currentNode, data.id, data.label, settings.showCopyIcon]) const handle = useMemo( - () => , + () => , [], ) const contextMenu = useMemo( diff --git a/flowsint-web/src/components/investigations/nodes/social.tsx b/flowsint-web/src/components/investigations/nodes/social.tsx index 688ed20..461c9d9 100644 --- a/flowsint-web/src/components/investigations/nodes/social.tsx +++ b/flowsint-web/src/components/investigations/nodes/social.tsx @@ -97,7 +97,7 @@ function SocialNode({ data }: any) { // Mémorisation de la poignée const handle = useMemo( - () => , + () => , [], ) diff --git a/flowsint-web/src/components/logo.tsx b/flowsint-web/src/components/logo.tsx index 16833ac..2a92a9e 100644 --- a/flowsint-web/src/components/logo.tsx +++ b/flowsint-web/src/components/logo.tsx @@ -1,14 +1,8 @@ import React from 'react' import { HomeIcon } from 'lucide-react' -import Link from 'next/link' -import { Button } from './ui/button' const Logo = () => { return ( - - - + ) } diff --git a/flowsint-web/src/components/team-switcher.tsx b/flowsint-web/src/components/team-switcher.tsx index 88fabfa..4ca40ca 100644 --- a/flowsint-web/src/components/team-switcher.tsx +++ b/flowsint-web/src/components/team-switcher.tsx @@ -18,72 +18,20 @@ import { SidebarMenuItem, useSidebar, } from "@/components/ui/sidebar" +import Logo from "./logo" +import Link from "next/link" -export function TeamSwitcher({ - teams, -}: { - teams: { - name: string - logo: React.ElementType - plan: string - }[] -}) { - const { isMobile } = useSidebar() - const [activeTeam, setActiveTeam] = React.useState(teams[0]) +export function TeamSwitcher() { return ( - - - - - -
- -
-
- - {activeTeam.name} - - {activeTeam.plan} -
- -
-
- - - Teams - - {teams.map((team, index) => ( - setActiveTeam(team)} - className="gap-2 p-2" - > -
- -
- {team.name} - ⌘{index + 1} -
- ))} - - -
- -
-
Add team
-
-
-
-
-
+ +
+
+ +
+
+ ) } diff --git a/flowsint-web/src/components/ui/avatar.tsx b/flowsint-web/src/components/ui/avatar.tsx index 71e428b..3c67811 100644 --- a/flowsint-web/src/components/ui/avatar.tsx +++ b/flowsint-web/src/components/ui/avatar.tsx @@ -28,7 +28,7 @@ function AvatarImage({ return ( ) diff --git a/flowsint-web/src/store/flow-store.ts b/flowsint-web/src/store/flow-store.ts index f4a1de2..1f55dd9 100644 --- a/flowsint-web/src/store/flow-store.ts +++ b/flowsint-web/src/store/flow-store.ts @@ -128,7 +128,7 @@ const createStore = (initialNodes: AppNode[] = [], initialEdges: Edge[] = []) => set({ edges: get().edges.map(edge => ({ ...edge, - animated: false, // Désactive l'animation + animated: false, style: { ...edge.style, stroke: "#b1b1b750", diff --git a/flowsint-web/styles/globals.css b/flowsint-web/styles/globals.css index 044b37b..bda8e95 100644 --- a/flowsint-web/styles/globals.css +++ b/flowsint-web/styles/globals.css @@ -15,7 +15,7 @@ --card-foreground: hsl(0 0% 3.9%); --popover: hsl(0 0% 100%); --popover-foreground: hsl(0 0% 3.9%); - --primary: hsl(258.3 89.5% 66.3%); + --primary: hsl(24.6 95% 53.1%); --primary-foreground: hsl(0 0% 98%); --secondary: hsl(0 0% 96.1%); --secondary-foreground: hsl(0 0% 9%); @@ -28,7 +28,7 @@ --border: hsla(0, 0%, 90%, 0.807); --input: hsl(0 0% 89.8%); --ring: hsl(0 0% 3.9%); - --chart-1: hsl(258.3 89.5% 66.3%); + --chart-1: hsl(24.6 95% 53.1%); --chart-2: hsl(173 58% 39%); --chart-3: hsl(197 37% 24%); --chart-4: hsl(43 74% 66%); @@ -43,7 +43,7 @@ --sidebar-accent: hsl(240 4.8% 95.9%); --sidebar-accent-foreground: hsl(240 5.9% 10%); --sidebar-border: hsl(220 13% 91%); - --sidebar-ring: hsl(258.3 89.5% 66.3%); + --sidebar-ring: hsl(24.6 95% 53.1%); } .dark { @@ -53,7 +53,7 @@ --card-foreground: hsl(0 0% 98%); --popover: hsl(240 0% 9.9%); --popover-foreground: hsl(0 0% 98%); - --primary: hsl(258.3 89.5% 66.3%); + --primary: hsl(24.6 95% 53.1%); --primary-foreground: hsl(0, 0%, 100%); --secondary: hsl(0 0% 14.9%); --secondary-foreground: hsl(0 0% 98%); @@ -66,14 +66,14 @@ --border: hsla(0, 0%, 23%, 0.67); --input: hsl(0 0% 14.9%); --ring: hsl(0 0% 83.1%); - --chart-1: hsl(258.3 89.5% 66.3%); + --chart-1: hsl(24.6 95% 53.1%); --chart-2: hsl(160 60% 45%); --chart-3: hsl(30 80% 55%); - --chart-4: hsl(280 65% 60%); + --chart-4: hsl(24.6 95% 53.1%); --chart-5: hsl(340 75% 55%); --sidebar: hsl(240 0% 9.9%); --sidebar-foreground: hsl(240 4.8% 95.9%); - --sidebar-primary: hsl(262.1 83.3% 57.8%); + --sidebar-primary: hsl(24.6 95% 53.1%); --sidebar-primary-foreground: hsl(0 0% 100%); --sidebar-accent: hsl(240 3.7% 15.9%); --sidebar-accent-foreground: hsl(240 4.8% 95.9%);