xertica-ui 1.2.6 → 1.2.7

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.
@@ -0,0 +1,58 @@
1
+ import React from 'react';
2
+ import { Menu, ChevronRight } from 'lucide-react';
3
+ import { Button } from './ui/button';
4
+ import { ThemeToggle } from './ThemeToggle';
5
+ import { LanguageSelector } from './LanguageSelector';
6
+
7
+ interface HeaderProps {
8
+ sidebarExpanded: boolean;
9
+ onToggleSidebar: () => void;
10
+ title: string;
11
+ showLanguageSelector?: boolean;
12
+ showThemeToggle?: boolean;
13
+ className?: string;
14
+ }
15
+
16
+ export function Header({
17
+ sidebarExpanded,
18
+ onToggleSidebar,
19
+ title,
20
+ showLanguageSelector = true,
21
+ showThemeToggle = true,
22
+ className
23
+ }: HeaderProps) {
24
+
25
+ return (
26
+ <header className={`bg-card shadow-sm border-b border-border px-[24px] py-[14px] flex-shrink-0 ${className || ''}`}>
27
+ <div className="flex items-center justify-between p-[0px]">
28
+ <div className="flex items-center gap-2 text-muted-foreground">
29
+ {/* Botão menu para mobile */}
30
+ <Button
31
+ variant="ghost"
32
+ size="sm"
33
+ onClick={onToggleSidebar}
34
+ className="md:hidden mr-2 p-2"
35
+ >
36
+ <Menu className="w-5 h-5" />
37
+ </Button>
38
+ <span className="text-primary font-medium">Xertica.ai</span>
39
+ <ChevronRight className="w-4 h-4" />
40
+ <span className="text-foreground font-medium">{title}</span>
41
+ </div>
42
+
43
+ {/* Controles do usuário */}
44
+ <div className="flex items-center gap-3">
45
+ {/* Seletor de idioma */}
46
+ {showLanguageSelector && (
47
+ <LanguageSelector variant="minimal" showIcon={false} className="hidden sm:flex" />
48
+ )}
49
+
50
+ {/* Toggle de tema */}
51
+ {showThemeToggle && (
52
+ <ThemeToggle className="hover:bg-accent" />
53
+ )}
54
+ </div>
55
+ </div>
56
+ </header>
57
+ );
58
+ }
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { Card, CardContent, CardFooter, CardHeader, CardTitle } from './ui/card';
3
+ import { Header } from './Header';
3
4
  import { Button } from './ui/button';
4
5
  import { ChevronRight, Menu, FileText } from 'lucide-react';
5
6
  import { ScrollArea } from './ui/scroll-area';
@@ -19,7 +20,7 @@ interface HomeContentProps {
19
20
  export function HomeContent({ sidebarExpanded, assistenteExpanded = false, onToggleSidebar, onToggleAssistente }: HomeContentProps) {
20
21
  const location = useLocation();
21
22
  const navigate = useNavigate();
22
-
23
+
23
24
  // Tradução direta para português
24
25
  const labelTranslations: Record<string, string> = {
25
26
  'home': 'Início',
@@ -28,48 +29,23 @@ export function HomeContent({ sidebarExpanded, assistenteExpanded = false, onTog
28
29
 
29
30
  // Get current route info
30
31
  const currentRoute = getRouteByPath(location.pathname);
31
- const breadcrumbLabel = currentRoute?.label
32
+ const breadcrumbLabel = currentRoute?.label
32
33
  ? labelTranslations[currentRoute.label.toLowerCase()] || currentRoute.label
33
34
  : 'Início';
34
35
 
35
36
 
36
37
 
37
38
  return (
38
- <div
39
- className={`flex-1 flex flex-col overflow-hidden transition-all duration-300 ${
40
- sidebarExpanded ? 'md:pl-64' : 'md:pl-20'
41
- } ${
42
- assistenteExpanded ? 'md:pr-[420px]' : 'md:pr-20'
43
- }`}
39
+ <div
40
+ className={`flex-1 flex flex-col overflow-hidden transition-all duration-300 ${sidebarExpanded ? 'md:pl-64' : 'md:pl-20'
41
+ } ${assistenteExpanded ? 'md:pr-[420px]' : 'md:pr-20'
42
+ }`}
44
43
  >
45
- {/* Header fixo */}
46
- <header className="bg-card shadow-sm border-b border-border px-[24px] py-[14px] flex-shrink-0">
47
- <div className="flex items-center justify-between p-[0px]">
48
- <div className="flex items-center gap-2 text-muted-foreground">
49
- {/* Botão menu para mobile */}
50
- <Button
51
- variant="ghost"
52
- size="sm"
53
- onClick={onToggleSidebar}
54
- className="md:hidden mr-2 p-2"
55
- >
56
- <Menu className="w-5 h-5" />
57
- </Button>
58
- <span className="text-primary font-medium">Xertica.ai</span>
59
- <ChevronRight className="w-4 h-4" />
60
- <span className="text-foreground font-medium">{breadcrumbLabel}</span>
61
- </div>
62
-
63
- {/* Controles do usuário */}
64
- <div className="flex items-center gap-3">
65
- {/* Seletor de idioma */}
66
- <LanguageSelector variant="minimal" showIcon={false} className="hidden sm:flex" />
67
-
68
- {/* Toggle de tema */}
69
- <ThemeToggle className="hover:bg-accent" />
70
- </div>
71
- </div>
72
- </header>
44
+ <Header
45
+ sidebarExpanded={sidebarExpanded}
46
+ onToggleSidebar={onToggleSidebar || (() => { })}
47
+ title={breadcrumbLabel}
48
+ />
73
49
 
74
50
  {/* Área de conteúdo */}
75
51
  <main className="flex-1 overflow-hidden bg-muted">
@@ -104,7 +80,7 @@ export function HomeContent({ sidebarExpanded, assistenteExpanded = false, onTog
104
80
  </p>
105
81
  </CardContent>
106
82
  <CardFooter>
107
- <Button
83
+ <Button
108
84
  variant="outline"
109
85
  className="w-full"
110
86
  onClick={() => navigate('/template')}
@@ -3,6 +3,7 @@ import { useLocation, useNavigate } from 'react-router';
3
3
  import { Sidebar } from './Sidebar';
4
4
  import { HomeContent } from './HomeContent';
5
5
  import { AssistenteXertica } from './AssistenteXertica';
6
+ import { routes } from '../routes';
6
7
 
7
8
  interface HomePageProps {
8
9
  user: { email: string } | null;
@@ -46,15 +47,16 @@ export function HomePage({ user, onLogout }: HomePageProps) {
46
47
 
47
48
  return (
48
49
  <div className="h-screen flex bg-muted overflow-hidden relative">
49
- <Sidebar
50
+ <Sidebar
50
51
  expanded={sidebarExpanded}
51
52
  onToggle={handleToggleSidebar}
52
53
  user={user}
53
54
  onLogout={onLogout}
54
55
  location={location}
55
56
  navigate={navigate}
57
+ routes={routes}
56
58
  />
57
- <HomeContent
59
+ <HomeContent
58
60
  sidebarExpanded={sidebarExpanded}
59
61
  assistenteExpanded={assistenteExpanded}
60
62
  onToggleSidebar={handleToggleSidebar}
@@ -7,7 +7,7 @@ import {
7
7
  MoreHorizontal,
8
8
  ChevronRight,
9
9
  } from "lucide-react";
10
- import { routes } from "../routes";
10
+ // routes import removed to make it reusable
11
11
  import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar";
12
12
  import { Popover, PopoverContent, PopoverTrigger } from "./ui/popover";
13
13
  import { Tooltip, TooltipProvider, TooltipTrigger } from "./ui/tooltip";
@@ -15,8 +15,9 @@ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
15
15
  import { cn } from "./ui/utils";
16
16
  import { XerticaLogo } from "./XerticaLogo";
17
17
  import { XerticaXLogo } from "./XerticaXLogo";
18
+ import { Button } from "./ui/button";
18
19
 
19
- // TooltipContent customizado para a Sidebar com seta branca
20
+ // Validar se SidebarTooltipContent existe em outro lugar ou manter aqui
20
21
  function SidebarTooltipContent({
21
22
  className,
22
23
  sideOffset = 0,
@@ -34,15 +35,23 @@ function SidebarTooltipContent({
34
35
  {...props}
35
36
  >
36
37
  {children}
37
- <TooltipPrimitive.Arrow
38
- className="fill-popover z-50 drop-shadow-sm"
39
- width={8}
38
+ <TooltipPrimitive.Arrow
39
+ className="fill-popover z-50 drop-shadow-sm"
40
+ width={8}
40
41
  height={4}
41
42
  />
42
43
  </TooltipPrimitive.Content>
43
44
  );
44
45
  }
45
46
 
47
+ // Interface for Route Config (copied/imported type)
48
+ export interface RouteConfig {
49
+ path: string;
50
+ label: string;
51
+ icon: React.ComponentType<any>;
52
+ component?: React.ComponentType<any>;
53
+ }
54
+
46
55
  interface SubMenuItem {
47
56
  id: string;
48
57
  label: string;
@@ -64,6 +73,7 @@ interface SidebarProps {
64
73
  onLogout: () => void;
65
74
  location: { pathname: string };
66
75
  navigate: (path: string) => void;
76
+ routes: RouteConfig[];
67
77
  }
68
78
 
69
79
  export function Sidebar({
@@ -73,6 +83,7 @@ export function Sidebar({
73
83
  onLogout,
74
84
  location,
75
85
  navigate,
86
+ routes,
76
87
  }: SidebarProps) {
77
88
  const navRef = useRef<HTMLDivElement>(null);
78
89
  const [hasOverflow, setHasOverflow] = useState(false);
@@ -154,9 +165,9 @@ export function Sidebar({
154
165
  ? "w-full h-10 flex items-center gap-3 px-3 justify-start rounded-[var(--radius-button)] transition-all duration-200 bg-sidebar-foreground/15 text-sidebar-foreground shadow-sm"
155
166
  : "w-full h-10 flex items-center gap-3 px-3 justify-start rounded-[var(--radius-button)] transition-all duration-200 text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground"
156
167
  : "w-full h-10 flex items-center justify-center px-0 rounded-[var(--radius-button)] transition-all duration-200 " +
157
- (item.active
158
- ? "bg-sidebar-foreground/15 text-sidebar-foreground shadow-sm"
159
- : "text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground")
168
+ (item.active
169
+ ? "bg-sidebar-foreground/15 text-sidebar-foreground shadow-sm"
170
+ : "text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground")
160
171
  }
161
172
  >
162
173
  <Icon className="w-5 h-5 flex-shrink-0" />
@@ -210,7 +221,7 @@ export function Sidebar({
210
221
  <span className="truncate">{item.label}</span>
211
222
  </button>
212
223
  )}
213
-
224
+
214
225
  {/* Subitens */}
215
226
  {hasSubItems && item.subItems && (
216
227
  <>
@@ -246,9 +257,9 @@ export function Sidebar({
246
257
  ? "w-full h-10 flex items-center gap-3 px-3 justify-start rounded-[var(--radius-button)] transition-all duration-200 bg-sidebar-foreground/15 text-sidebar-foreground shadow-sm"
247
258
  : "w-full h-10 flex items-center gap-3 px-3 justify-start rounded-[var(--radius-button)] transition-all duration-200 text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground"
248
259
  : "w-full h-10 flex items-center justify-center px-0 rounded-[var(--radius-button)] transition-all duration-200 " +
249
- (item.active
250
- ? "bg-sidebar-foreground/15 text-sidebar-foreground shadow-sm"
251
- : "text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground")
260
+ (item.active
261
+ ? "bg-sidebar-foreground/15 text-sidebar-foreground shadow-sm"
262
+ : "text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground")
252
263
  }
253
264
  >
254
265
  <Icon className="w-5 h-5 flex-shrink-0" />
@@ -281,11 +292,10 @@ export function Sidebar({
281
292
  <TooltipProvider delayDuration={300}>
282
293
  {/* Sidebar */}
283
294
  <div
284
- className={`bg-sidebar text-sidebar-foreground transition-all duration-300 ease-in-out flex flex-col z-50 ${
285
- expanded
286
- ? "fixed inset-0 md:fixed md:inset-y-0 md:left-0 md:w-64"
287
- : "fixed inset-y-0 left-0 w-20 -translate-x-full md:translate-x-0"
288
- }`}
295
+ className={`bg-sidebar text-sidebar-foreground transition-all duration-300 ease-in-out flex flex-col z-50 ${expanded
296
+ ? "fixed inset-0 md:fixed md:inset-y-0 md:left-0 md:w-64"
297
+ : "fixed inset-y-0 left-0 w-20 -translate-x-full md:translate-x-0"
298
+ }`}
289
299
  >
290
300
  {/* Botão Toggle Menu */}
291
301
  <div className="p-[14px] pt-[13px] pr-[14px] pb-[12px] pl-[14px]">
@@ -3,6 +3,7 @@ import { useLocation, useNavigate } from 'react-router';
3
3
  import { Sidebar } from './Sidebar';
4
4
  import { TemplateContent } from './TemplateContent';
5
5
  import { AssistenteXertica } from './AssistenteXertica';
6
+ import { routes } from '../routes';
6
7
 
7
8
  interface TemplatePageProps {
8
9
  user: { email: string } | null;
@@ -46,15 +47,16 @@ export function TemplatePage({ user, onLogout }: TemplatePageProps) {
46
47
 
47
48
  return (
48
49
  <div className="h-screen flex bg-muted overflow-hidden relative">
49
- <Sidebar
50
+ <Sidebar
50
51
  expanded={sidebarExpanded}
51
52
  onToggle={handleToggleSidebar}
52
53
  user={user}
53
54
  onLogout={onLogout}
54
55
  location={location}
55
56
  navigate={navigate}
57
+ routes={routes}
56
58
  />
57
- <TemplateContent
59
+ <TemplateContent
58
60
  sidebarExpanded={sidebarExpanded}
59
61
  assistenteExpanded={assistenteExpanded}
60
62
  onToggleSidebar={handleToggleSidebar}
@@ -42,4 +42,20 @@ export { XerticaOrbe } from './XerticaOrbe';
42
42
  // Layout
43
43
  export { Sidebar } from './Sidebar';
44
44
  export { ThemeToggle } from './ThemeToggle';
45
- export { LanguageSelector } from './LanguageSelector';
45
+ export { LanguageSelector } from './LanguageSelector';
46
+
47
+ // Connected Components (require Providers)
48
+ export { AssistenteXertica } from './AssistenteXertica';
49
+
50
+ // State Management & Contexts
51
+ export * from '../contexts';
52
+
53
+ // Layout & Common Components
54
+ export { Header } from './Header';
55
+ export { DocumentEditor } from './DocumentEditor';
56
+
57
+ // Media Components
58
+ export { VideoPlayer } from './media/VideoPlayer';
59
+ export { AudioPlayer } from './media/AudioPlayer';
60
+ export { FloatingMediaWrapper } from './media/FloatingMediaWrapper';
61
+ export { PodcastPlayer } from './PodcastPlayer';
@@ -0,0 +1,6 @@
1
+ export * from './ThemeContext';
2
+ export * from './LanguageContext';
3
+ export * from './BrandColorsContext';
4
+ export * from './AssistenteContext';
5
+ export * from './ApiKeyContext';
6
+ export * from './theme-data';
@@ -0,0 +1,10 @@
1
+ interface HeaderProps {
2
+ sidebarExpanded: boolean;
3
+ onToggleSidebar: () => void;
4
+ title: string;
5
+ showLanguageSelector?: boolean;
6
+ showThemeToggle?: boolean;
7
+ className?: string;
8
+ }
9
+ export declare function Header({ sidebarExpanded, onToggleSidebar, title, showLanguageSelector, showThemeToggle, className }: HeaderProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -1,3 +1,10 @@
1
+ import React from "react";
2
+ export interface RouteConfig {
3
+ path: string;
4
+ label: string;
5
+ icon: React.ComponentType<any>;
6
+ component?: React.ComponentType<any>;
7
+ }
1
8
  interface SidebarProps {
2
9
  expanded: boolean;
3
10
  onToggle: () => void;
@@ -9,6 +16,7 @@ interface SidebarProps {
9
16
  pathname: string;
10
17
  };
11
18
  navigate: (path: string) => void;
19
+ routes: RouteConfig[];
12
20
  }
13
- export declare function Sidebar({ expanded, onToggle, user, onLogout, location, navigate, }: SidebarProps): import("react/jsx-runtime").JSX.Element;
21
+ export declare function Sidebar({ expanded, onToggle, user, onLogout, location, navigate, routes, }: SidebarProps): import("react/jsx-runtime").JSX.Element;
14
22
  export {};
@@ -13,3 +13,11 @@ export { XerticaOrbe } from './XerticaOrbe';
13
13
  export { Sidebar } from './Sidebar';
14
14
  export { ThemeToggle } from './ThemeToggle';
15
15
  export { LanguageSelector } from './LanguageSelector';
16
+ export { AssistenteXertica } from './AssistenteXertica';
17
+ export * from '../contexts';
18
+ export { Header } from './Header';
19
+ export { DocumentEditor } from './DocumentEditor';
20
+ export { VideoPlayer } from './media/VideoPlayer';
21
+ export { AudioPlayer } from './media/AudioPlayer';
22
+ export { FloatingMediaWrapper } from './media/FloatingMediaWrapper';
23
+ export { PodcastPlayer } from './PodcastPlayer';
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { BrandColors, ColorTheme } from './theme-data';
3
+ interface BrandColorsContextType {
4
+ colors: BrandColors;
5
+ currentTheme: string;
6
+ themes: ColorTheme[];
7
+ setTheme: (themeId: string) => void;
8
+ radius: number;
9
+ setRadius: (radius: number) => void;
10
+ }
11
+ export declare const BrandColorsProvider: React.FC<{
12
+ children: React.ReactNode;
13
+ }>;
14
+ export declare const useBrandColors: () => BrandColorsContextType;
15
+ export {};
@@ -0,0 +1,6 @@
1
+ export * from './ThemeContext';
2
+ export * from './LanguageContext';
3
+ export * from './BrandColorsContext';
4
+ export * from './AssistenteContext';
5
+ export * from './ApiKeyContext';
6
+ export * from './theme-data';
@@ -0,0 +1,81 @@
1
+ export interface BrandColors {
2
+ primary: string;
3
+ primaryForeground: string;
4
+ primaryLight: string;
5
+ primaryDarkMode: string;
6
+ primaryForegroundDark: string;
7
+ sidebarLight: string;
8
+ sidebarDark: string;
9
+ gradientStart: string;
10
+ gradientEnd: string;
11
+ gradientStartDark: string;
12
+ gradientEndDark: string;
13
+ chart1: string;
14
+ chart2: string;
15
+ chart3: string;
16
+ chart4: string;
17
+ chart5: string;
18
+ radius?: string;
19
+ }
20
+ export interface ColorTheme {
21
+ id: string;
22
+ name: string;
23
+ description: string;
24
+ colors: BrandColors;
25
+ preview: {
26
+ primary: string;
27
+ secondary: string;
28
+ accent: string;
29
+ };
30
+ }
31
+ export declare const PALETTE: {
32
+ zinc: {
33
+ 900: string;
34
+ 50: string;
35
+ };
36
+ slate: {
37
+ 900: string;
38
+ 50: string;
39
+ };
40
+ stone: {
41
+ 900: string;
42
+ 50: string;
43
+ };
44
+ gray: {
45
+ 900: string;
46
+ 50: string;
47
+ };
48
+ neutral: {
49
+ 900: string;
50
+ 50: string;
51
+ };
52
+ red: {
53
+ 600: string;
54
+ 500: string;
55
+ };
56
+ rose: {
57
+ 600: string;
58
+ 500: string;
59
+ };
60
+ orange: {
61
+ 600: string;
62
+ 500: string;
63
+ };
64
+ green: {
65
+ 600: string;
66
+ 500: string;
67
+ };
68
+ blue: {
69
+ 600: string;
70
+ 500: string;
71
+ };
72
+ yellow: {
73
+ 600: string;
74
+ 500: string;
75
+ };
76
+ violet: {
77
+ 600: string;
78
+ 500: string;
79
+ };
80
+ };
81
+ export declare const colorThemes: ColorTheme[];