(null);
+
+ useEffect(() => {
+ const handleEscape = (event: KeyboardEvent) => {
+ if (event.key === "Escape") {
+ onClose();
+ }
+ };
+
+ if (isOpen) {
+ document.addEventListener("keydown", handleEscape);
+ }
+
+ return () => {
+ document.removeEventListener("keydown", handleEscape);
+ };
+ }, [isOpen, onClose]);
+
+ useEffect(() => {
+ if (isOpen) {
+ document.body.style.overflow = "hidden";
+ } else {
+ document.body.style.overflow = "unset";
+ }
+
+ return () => {
+ document.body.style.overflow = "unset";
+ };
+ }, [isOpen]);
+
+ if (!isOpen) return null;
+
+ const contentClasses = isFullscreen
+ ? "w-full h-full"
+ : "relative w-full rounded-3xl bg-white dark:bg-gray-900";
+
+ return (
+
+ {!isFullscreen && (
+
+ )}
+
e.stopPropagation()}
+ >
+ {showCloseButton && (
+
+ )}
+
{children}
+
+
+ );
+};
diff --git a/geradoresfe/src/components/ui/table/index.tsx b/geradoresfe/src/components/ui/table/index.tsx
new file mode 100644
index 0000000..2a5b2ee
--- /dev/null
+++ b/geradoresfe/src/components/ui/table/index.tsx
@@ -0,0 +1,64 @@
+import React, { ReactNode } from "react";
+
+// Props for Table
+interface TableProps {
+ children: ReactNode; // Table content (thead, tbody, etc.)
+ className?: string; // Optional className for styling
+}
+
+// Props for TableHeader
+interface TableHeaderProps {
+ children: ReactNode; // Header row(s)
+ className?: string; // Optional className for styling
+}
+
+// Props for TableBody
+interface TableBodyProps {
+ children: ReactNode; // Body row(s)
+ className?: string; // Optional className for styling
+}
+
+// Props for TableRow
+interface TableRowProps {
+ children: ReactNode; // Cells (th or td)
+ className?: string; // Optional className for styling
+}
+
+// Props for TableCell
+interface TableCellProps {
+ children: ReactNode; // Cell content
+ isHeader?: boolean; // If true, renders as , otherwise |
+ className?: string; // Optional className for styling
+}
+
+// Table Component
+const Table: React.FC = ({ children, className }) => {
+ return ;
+};
+
+// TableHeader Component
+const TableHeader: React.FC = ({ children, className }) => {
+ return {children};
+};
+
+// TableBody Component
+const TableBody: React.FC = ({ children, className }) => {
+ return {children};
+};
+
+// TableRow Component
+const TableRow: React.FC = ({ children, className }) => {
+ return {children} ;
+};
+
+// TableCell Component
+const TableCell: React.FC = ({
+ children,
+ isHeader = false,
+ className,
+}) => {
+ const CellTag = isHeader ? "th" : "td";
+ return {children};
+};
+
+export { Table, TableHeader, TableBody, TableRow, TableCell };
diff --git a/geradoresfe/src/components/ui/videos/AspectRatioVideo.tsx b/geradoresfe/src/components/ui/videos/AspectRatioVideo.tsx
new file mode 100644
index 0000000..ddbc0df
--- /dev/null
+++ b/geradoresfe/src/components/ui/videos/AspectRatioVideo.tsx
@@ -0,0 +1,28 @@
+import React from "react";
+
+type AspectRatioVideoProps = {
+ videoUrl: string; // URL of the video
+ aspectRatio?: string; // Aspect ratio in the format "width/height", default is "16/9"
+ title?: string; // Video title, default is "Embedded Video"
+};
+
+const AspectRatioVideo: React.FC = ({
+ videoUrl,
+ aspectRatio = "video", // Default aspect ratio
+ title = "Embedded Video",
+}) => {
+ return (
+
+
+
+ );
+};
+
+export default AspectRatioVideo;
diff --git a/geradoresfe/src/components/ui/videos/FourIsToThree.tsx b/geradoresfe/src/components/ui/videos/FourIsToThree.tsx
new file mode 100644
index 0000000..5730c0a
--- /dev/null
+++ b/geradoresfe/src/components/ui/videos/FourIsToThree.tsx
@@ -0,0 +1,16 @@
+import React from "react";
+
+export default function FourIsToThree() {
+ return (
+
+
+
+ );
+}
diff --git a/geradoresfe/src/components/ui/videos/OneIsToOne.tsx b/geradoresfe/src/components/ui/videos/OneIsToOne.tsx
new file mode 100644
index 0000000..68fcc46
--- /dev/null
+++ b/geradoresfe/src/components/ui/videos/OneIsToOne.tsx
@@ -0,0 +1,16 @@
+import React from "react";
+
+export default function OneIsToOne() {
+ return (
+
+
+
+ );
+}
diff --git a/geradoresfe/src/components/ui/videos/SixteenIsToNine.tsx b/geradoresfe/src/components/ui/videos/SixteenIsToNine.tsx
new file mode 100644
index 0000000..dfe66a2
--- /dev/null
+++ b/geradoresfe/src/components/ui/videos/SixteenIsToNine.tsx
@@ -0,0 +1,16 @@
+import React from "react";
+
+export default function SixteenIsToNine() {
+ return (
+
+
+
+ );
+}
diff --git a/geradoresfe/src/components/ui/videos/TwentyOneIsToNine.tsx b/geradoresfe/src/components/ui/videos/TwentyOneIsToNine.tsx
new file mode 100644
index 0000000..cb27c3b
--- /dev/null
+++ b/geradoresfe/src/components/ui/videos/TwentyOneIsToNine.tsx
@@ -0,0 +1,16 @@
+import React from "react";
+
+export default function TwentyOneIsToNine() {
+ return (
+
+
+
+ );
+}
diff --git a/geradoresfe/src/context/SidebarContext.tsx b/geradoresfe/src/context/SidebarContext.tsx
new file mode 100644
index 0000000..dae7ce2
--- /dev/null
+++ b/geradoresfe/src/context/SidebarContext.tsx
@@ -0,0 +1,83 @@
+import React, { createContext, useContext, useState, useEffect } from "react";
+
+type SidebarContextType = {
+ isExpanded: boolean;
+ isMobileOpen: boolean;
+ isHovered: boolean;
+ activeItem: string | null;
+ openSubmenu: string | null;
+ toggleSidebar: () => void;
+ toggleMobileSidebar: () => void;
+ setIsHovered: (isHovered: boolean) => void;
+ setActiveItem: (item: string | null) => void;
+ toggleSubmenu: (item: string) => void;
+};
+
+const SidebarContext = createContext(undefined);
+
+export const useSidebar = () => {
+ const context = useContext(SidebarContext);
+ if (!context) {
+ throw new Error("useSidebar must be used within a SidebarProvider");
+ }
+ return context;
+};
+
+export const SidebarProvider: React.FC<{ children: React.ReactNode }> = ({
+ children,
+}) => {
+ const [isExpanded, setIsExpanded] = useState(true);
+ const [isMobileOpen, setIsMobileOpen] = useState(false);
+ const [isMobile, setIsMobile] = useState(false);
+ const [isHovered, setIsHovered] = useState(false);
+ const [activeItem, setActiveItem] = useState(null);
+ const [openSubmenu, setOpenSubmenu] = useState(null);
+
+ useEffect(() => {
+ const handleResize = () => {
+ const mobile = window.innerWidth < 768;
+ setIsMobile(mobile);
+ if (!mobile) {
+ setIsMobileOpen(false);
+ }
+ };
+
+ handleResize();
+ window.addEventListener("resize", handleResize);
+
+ return () => {
+ window.removeEventListener("resize", handleResize);
+ };
+ }, []);
+
+ const toggleSidebar = () => {
+ setIsExpanded((prev) => !prev);
+ };
+
+ const toggleMobileSidebar = () => {
+ setIsMobileOpen((prev) => !prev);
+ };
+
+ const toggleSubmenu = (item: string) => {
+ setOpenSubmenu((prev) => (prev === item ? null : item));
+ };
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/geradoresfe/src/context/ThemeContext.tsx b/geradoresfe/src/context/ThemeContext.tsx
new file mode 100644
index 0000000..1e6cc7d
--- /dev/null
+++ b/geradoresfe/src/context/ThemeContext.tsx
@@ -0,0 +1,58 @@
+"use client";
+
+import type React from "react";
+import { createContext, useState, useContext, useEffect } from "react";
+
+type Theme = "light" | "dark";
+
+type ThemeContextType = {
+ theme: Theme;
+ toggleTheme: () => void;
+};
+
+const ThemeContext = createContext(undefined);
+
+export const ThemeProvider: React.FC<{ children: React.ReactNode }> = ({
+ children,
+}) => {
+ const [theme, setTheme] = useState("light");
+ const [isInitialized, setIsInitialized] = useState(false);
+
+ useEffect(() => {
+ // This code will only run on the client side
+ const savedTheme = localStorage.getItem("theme") as Theme | null;
+ const initialTheme = savedTheme || "light"; // Default to light theme
+
+ setTheme(initialTheme);
+ setIsInitialized(true);
+ }, []);
+
+ useEffect(() => {
+ if (isInitialized) {
+ localStorage.setItem("theme", theme);
+ if (theme === "dark") {
+ document.documentElement.classList.add("dark");
+ } else {
+ document.documentElement.classList.remove("dark");
+ }
+ }
+ }, [theme, isInitialized]);
+
+ const toggleTheme = () => {
+ setTheme((prevTheme) => (prevTheme === "light" ? "dark" : "light"));
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useTheme = () => {
+ const context = useContext(ThemeContext);
+ if (context === undefined) {
+ throw new Error("useTheme must be used within a ThemeProvider");
+ }
+ return context;
+};
diff --git a/geradoresfe/src/hooks/useGoBack.ts b/geradoresfe/src/hooks/useGoBack.ts
new file mode 100644
index 0000000..beeb5f0
--- /dev/null
+++ b/geradoresfe/src/hooks/useGoBack.ts
@@ -0,0 +1,17 @@
+import { useNavigate } from "react-router";
+
+const useGoBack = () => {
+ const navigate = useNavigate();
+
+ const goBack = () => {
+ if (window.history.state && window.history.state.idx > 0) {
+ navigate(-1); // Go back to the previous page
+ } else {
+ navigate("/"); // Redirect to home if no history exists
+ }
+ };
+
+ return goBack;
+};
+
+export default useGoBack;
diff --git a/geradoresfe/src/hooks/useModal.ts b/geradoresfe/src/hooks/useModal.ts
new file mode 100644
index 0000000..a2014ae
--- /dev/null
+++ b/geradoresfe/src/hooks/useModal.ts
@@ -0,0 +1,11 @@
+import { useState, useCallback } from "react";
+
+export const useModal = (initialState: boolean = false) => {
+ const [isOpen, setIsOpen] = useState(initialState);
+
+ const openModal = useCallback(() => setIsOpen(true), []);
+ const closeModal = useCallback(() => setIsOpen(false), []);
+ const toggleModal = useCallback(() => setIsOpen((prev) => !prev), []);
+
+ return { isOpen, openModal, closeModal, toggleModal };
+};
diff --git a/geradoresfe/src/icons/alert.svg b/geradoresfe/src/icons/alert.svg
new file mode 100644
index 0000000..7405654
--- /dev/null
+++ b/geradoresfe/src/icons/alert.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/angle-down.svg b/geradoresfe/src/icons/angle-down.svg
new file mode 100644
index 0000000..32e9557
--- /dev/null
+++ b/geradoresfe/src/icons/angle-down.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/angle-left.svg b/geradoresfe/src/icons/angle-left.svg
new file mode 100644
index 0000000..e69de29
diff --git a/geradoresfe/src/icons/angle-right.svg b/geradoresfe/src/icons/angle-right.svg
new file mode 100644
index 0000000..e69de29
diff --git a/geradoresfe/src/icons/angle-up.svg b/geradoresfe/src/icons/angle-up.svg
new file mode 100644
index 0000000..71f074a
--- /dev/null
+++ b/geradoresfe/src/icons/angle-up.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/arrow-down.svg b/geradoresfe/src/icons/arrow-down.svg
new file mode 100644
index 0000000..56c75ce
--- /dev/null
+++ b/geradoresfe/src/icons/arrow-down.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/arrow-right.svg b/geradoresfe/src/icons/arrow-right.svg
new file mode 100644
index 0000000..714774e
--- /dev/null
+++ b/geradoresfe/src/icons/arrow-right.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/arrow-up.svg b/geradoresfe/src/icons/arrow-up.svg
new file mode 100644
index 0000000..2bb39bd
--- /dev/null
+++ b/geradoresfe/src/icons/arrow-up.svg
@@ -0,0 +1,16 @@
+
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/audio.svg b/geradoresfe/src/icons/audio.svg
new file mode 100644
index 0000000..3ae4383
--- /dev/null
+++ b/geradoresfe/src/icons/audio.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/bolt.svg b/geradoresfe/src/icons/bolt.svg
new file mode 100644
index 0000000..ecb02a3
--- /dev/null
+++ b/geradoresfe/src/icons/bolt.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/box-cube.svg b/geradoresfe/src/icons/box-cube.svg
new file mode 100644
index 0000000..5a36ea4
--- /dev/null
+++ b/geradoresfe/src/icons/box-cube.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/box-line.svg b/geradoresfe/src/icons/box-line.svg
new file mode 100644
index 0000000..57432fe
--- /dev/null
+++ b/geradoresfe/src/icons/box-line.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/box.svg b/geradoresfe/src/icons/box.svg
new file mode 100644
index 0000000..0fa3c19
--- /dev/null
+++ b/geradoresfe/src/icons/box.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/calendar.svg b/geradoresfe/src/icons/calendar.svg
new file mode 100644
index 0000000..b424736
--- /dev/null
+++ b/geradoresfe/src/icons/calendar.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/calender-line.svg b/geradoresfe/src/icons/calender-line.svg
new file mode 100644
index 0000000..227b0fe
--- /dev/null
+++ b/geradoresfe/src/icons/calender-line.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/chat.svg b/geradoresfe/src/icons/chat.svg
new file mode 100644
index 0000000..678886a
--- /dev/null
+++ b/geradoresfe/src/icons/chat.svg
@@ -0,0 +1,3 @@
+
diff --git a/geradoresfe/src/icons/check-circle.svg b/geradoresfe/src/icons/check-circle.svg
new file mode 100644
index 0000000..ba47a8c
--- /dev/null
+++ b/geradoresfe/src/icons/check-circle.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/check-line.svg b/geradoresfe/src/icons/check-line.svg
new file mode 100644
index 0000000..17b4786
--- /dev/null
+++ b/geradoresfe/src/icons/check-line.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/chevron-down.svg b/geradoresfe/src/icons/chevron-down.svg
new file mode 100644
index 0000000..88775fd
--- /dev/null
+++ b/geradoresfe/src/icons/chevron-down.svg
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/geradoresfe/src/icons/chevron-left.svg b/geradoresfe/src/icons/chevron-left.svg
new file mode 100644
index 0000000..9409d16
--- /dev/null
+++ b/geradoresfe/src/icons/chevron-left.svg
@@ -0,0 +1,16 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/chevron-up.svg b/geradoresfe/src/icons/chevron-up.svg
new file mode 100644
index 0000000..9bb13b9
--- /dev/null
+++ b/geradoresfe/src/icons/chevron-up.svg
@@ -0,0 +1,3 @@
+
diff --git a/geradoresfe/src/icons/close-line.svg b/geradoresfe/src/icons/close-line.svg
new file mode 100644
index 0000000..8ed1b2e
--- /dev/null
+++ b/geradoresfe/src/icons/close-line.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/close.svg b/geradoresfe/src/icons/close.svg
new file mode 100644
index 0000000..6692f84
--- /dev/null
+++ b/geradoresfe/src/icons/close.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/copy.svg b/geradoresfe/src/icons/copy.svg
new file mode 100644
index 0000000..951dde4
--- /dev/null
+++ b/geradoresfe/src/icons/copy.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/docs.svg b/geradoresfe/src/icons/docs.svg
new file mode 100644
index 0000000..316264a
--- /dev/null
+++ b/geradoresfe/src/icons/docs.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/dollar-line.svg b/geradoresfe/src/icons/dollar-line.svg
new file mode 100644
index 0000000..843955f
--- /dev/null
+++ b/geradoresfe/src/icons/dollar-line.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/download.svg b/geradoresfe/src/icons/download.svg
new file mode 100644
index 0000000..a588935
--- /dev/null
+++ b/geradoresfe/src/icons/download.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/envelope.svg b/geradoresfe/src/icons/envelope.svg
new file mode 100644
index 0000000..128cb87
--- /dev/null
+++ b/geradoresfe/src/icons/envelope.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/eye-close.svg b/geradoresfe/src/icons/eye-close.svg
new file mode 100644
index 0000000..cd5ef67
--- /dev/null
+++ b/geradoresfe/src/icons/eye-close.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/eye.svg b/geradoresfe/src/icons/eye.svg
new file mode 100644
index 0000000..9e378b0
--- /dev/null
+++ b/geradoresfe/src/icons/eye.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/file.svg b/geradoresfe/src/icons/file.svg
new file mode 100644
index 0000000..840edf2
--- /dev/null
+++ b/geradoresfe/src/icons/file.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/folder.svg b/geradoresfe/src/icons/folder.svg
new file mode 100644
index 0000000..ba7056d
--- /dev/null
+++ b/geradoresfe/src/icons/folder.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/grid.svg b/geradoresfe/src/icons/grid.svg
new file mode 100644
index 0000000..a66ab76
--- /dev/null
+++ b/geradoresfe/src/icons/grid.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/group.svg b/geradoresfe/src/icons/group.svg
new file mode 100644
index 0000000..5d2898b
--- /dev/null
+++ b/geradoresfe/src/icons/group.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/horizontal-dots.svg b/geradoresfe/src/icons/horizontal-dots.svg
new file mode 100644
index 0000000..d523459
--- /dev/null
+++ b/geradoresfe/src/icons/horizontal-dots.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/index.ts b/geradoresfe/src/icons/index.ts
new file mode 100644
index 0000000..94bf029
--- /dev/null
+++ b/geradoresfe/src/icons/index.ts
@@ -0,0 +1,107 @@
+import { ReactComponent as PlusIcon } from "./plus.svg";
+import { ReactComponent as CloseIcon } from "./close.svg";
+import { ReactComponent as BoxIcon } from "./box.svg";
+import { ReactComponent as CheckCircleIcon } from "./check-circle.svg";
+import { ReactComponent as AlertIcon } from "./alert.svg";
+import { ReactComponent as InfoIcon } from "./info.svg";
+import { ReactComponent as ErrorIcon } from "./info-hexa.svg";
+import { ReactComponent as BoltIcon } from "./bolt.svg";
+import { ReactComponent as ArrowUpIcon } from "./arrow-up.svg";
+import { ReactComponent as ArrowDownIcon } from "./arrow-down.svg";
+import { ReactComponent as FolderIcon } from "./folder.svg";
+import { ReactComponent as VideoIcon } from "./videos.svg";
+import { ReactComponent as AudioIcon } from "./audio.svg";
+import { ReactComponent as GridIcon } from "./grid.svg";
+import { ReactComponent as FileIcon } from "./file.svg";
+import { ReactComponent as DownloadIcon } from "./download.svg";
+import { ReactComponent as ArrowRightIcon } from "./arrow-right.svg";
+import { ReactComponent as GroupIcon } from "./group.svg";
+import { ReactComponent as BoxIconLine } from "./box-line.svg";
+import { ReactComponent as ShootingStarIcon } from "./shooting-star.svg";
+import { ReactComponent as DollarLineIcon } from "./dollar-line.svg";
+import { ReactComponent as TrashBinIcon } from "./trash.svg";
+import { ReactComponent as AngleUpIcon } from "./angle-up.svg";
+import { ReactComponent as AngleDownIcon } from "./angle-down.svg";
+import { ReactComponent as PencilIcon } from "./pencil.svg";
+import { ReactComponent as CheckLineIcon } from "./check-line.svg";
+import { ReactComponent as CloseLineIcon } from "./close-line.svg";
+import { ReactComponent as ChevronDownIcon } from "./chevron-down.svg";
+import { ReactComponent as ChevronUpIcon } from "./chevron-up.svg";
+import { ReactComponent as PaperPlaneIcon } from "./paper-plane.svg";
+import { ReactComponent as LockIcon } from "./lock.svg";
+import { ReactComponent as EnvelopeIcon } from "./envelope.svg";
+import { ReactComponent as UserIcon } from "./user-line.svg";
+import { ReactComponent as CalenderIcon } from "./calender-line.svg";
+import { ReactComponent as EyeIcon } from "./eye.svg";
+import { ReactComponent as EyeCloseIcon } from "./eye-close.svg";
+import { ReactComponent as TimeIcon } from "./time.svg";
+import { ReactComponent as CopyIcon } from "./copy.svg";
+import { ReactComponent as ChevronLeftIcon } from "./chevron-left.svg";
+import { ReactComponent as UserCircleIcon } from "./user-circle.svg";
+import { ReactComponent as TaskIcon } from "./task-icon.svg";
+import { ReactComponent as ListIcon } from "./list.svg";
+import { ReactComponent as TableIcon } from "./table.svg";
+import { ReactComponent as PageIcon } from "./page.svg";
+import { ReactComponent as PieChartIcon } from "./pie-chart.svg";
+import { ReactComponent as BoxCubeIcon } from "./box-cube.svg";
+import { ReactComponent as PlugInIcon } from "./plug-in.svg";
+import { ReactComponent as DocsIcon } from "./docs.svg";
+import { ReactComponent as MailIcon } from "./mail-line.svg";
+import { ReactComponent as HorizontaLDots } from "./horizontal-dots.svg";
+import { ReactComponent as ChatIcon } from "./chat.svg";
+import { ReactComponent as MoreDotIcon } from "./more-dot.svg";
+
+export {
+ DownloadIcon,
+ FileIcon,
+ GridIcon,
+ AudioIcon,
+ VideoIcon,
+ BoltIcon,
+ PlusIcon,
+ BoxIcon,
+ CloseIcon,
+ CheckCircleIcon,
+ AlertIcon,
+ InfoIcon,
+ ErrorIcon,
+ ArrowUpIcon,
+ FolderIcon,
+ ArrowDownIcon,
+ ArrowRightIcon,
+ GroupIcon,
+ BoxIconLine,
+ ShootingStarIcon,
+ DollarLineIcon,
+ TrashBinIcon,
+ AngleUpIcon,
+ AngleDownIcon,
+ PencilIcon,
+ CheckLineIcon,
+ CloseLineIcon,
+ ChevronDownIcon,
+ PaperPlaneIcon,
+ EnvelopeIcon,
+ LockIcon,
+ UserIcon,
+ CalenderIcon,
+ EyeIcon,
+ EyeCloseIcon,
+ TimeIcon,
+ CopyIcon,
+ ChevronLeftIcon,
+ UserCircleIcon,
+ TaskIcon,
+ ListIcon,
+ TableIcon,
+ PageIcon,
+ PieChartIcon,
+ BoxCubeIcon,
+ PlugInIcon,
+ DocsIcon,
+ MailIcon,
+ HorizontaLDots,
+ ChevronUpIcon,
+ ChatIcon,
+ MoreDotIcon,
+};
diff --git a/geradoresfe/src/icons/info-hexa.svg b/geradoresfe/src/icons/info-hexa.svg
new file mode 100644
index 0000000..1d1ed5d
--- /dev/null
+++ b/geradoresfe/src/icons/info-hexa.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/info.svg b/geradoresfe/src/icons/info.svg
new file mode 100644
index 0000000..26473bb
--- /dev/null
+++ b/geradoresfe/src/icons/info.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/list.svg b/geradoresfe/src/icons/list.svg
new file mode 100644
index 0000000..93060bd
--- /dev/null
+++ b/geradoresfe/src/icons/list.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/lock.svg b/geradoresfe/src/icons/lock.svg
new file mode 100644
index 0000000..a9afbe6
--- /dev/null
+++ b/geradoresfe/src/icons/lock.svg
@@ -0,0 +1,19 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/mail-line.svg b/geradoresfe/src/icons/mail-line.svg
new file mode 100644
index 0000000..2e8a46b
--- /dev/null
+++ b/geradoresfe/src/icons/mail-line.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/more-dot.svg b/geradoresfe/src/icons/more-dot.svg
new file mode 100644
index 0000000..d99c76b
--- /dev/null
+++ b/geradoresfe/src/icons/more-dot.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/page.svg b/geradoresfe/src/icons/page.svg
new file mode 100644
index 0000000..862c68a
--- /dev/null
+++ b/geradoresfe/src/icons/page.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/paper-plane.svg b/geradoresfe/src/icons/paper-plane.svg
new file mode 100644
index 0000000..1e00196
--- /dev/null
+++ b/geradoresfe/src/icons/paper-plane.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/pencil.svg b/geradoresfe/src/icons/pencil.svg
new file mode 100644
index 0000000..6b94796
--- /dev/null
+++ b/geradoresfe/src/icons/pencil.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/pie-chart.svg b/geradoresfe/src/icons/pie-chart.svg
new file mode 100644
index 0000000..8917ca9
--- /dev/null
+++ b/geradoresfe/src/icons/pie-chart.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/plug-in.svg b/geradoresfe/src/icons/plug-in.svg
new file mode 100644
index 0000000..958e3e9
--- /dev/null
+++ b/geradoresfe/src/icons/plug-in.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/plus.svg b/geradoresfe/src/icons/plus.svg
new file mode 100644
index 0000000..d27b9df
--- /dev/null
+++ b/geradoresfe/src/icons/plus.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/shooting-star.svg b/geradoresfe/src/icons/shooting-star.svg
new file mode 100644
index 0000000..519f5d2
--- /dev/null
+++ b/geradoresfe/src/icons/shooting-star.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/table.svg b/geradoresfe/src/icons/table.svg
new file mode 100644
index 0000000..889bd89
--- /dev/null
+++ b/geradoresfe/src/icons/table.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/task-icon.svg b/geradoresfe/src/icons/task-icon.svg
new file mode 100644
index 0000000..9f1d092
--- /dev/null
+++ b/geradoresfe/src/icons/task-icon.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/time.svg b/geradoresfe/src/icons/time.svg
new file mode 100644
index 0000000..e8df420
--- /dev/null
+++ b/geradoresfe/src/icons/time.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/trash.svg b/geradoresfe/src/icons/trash.svg
new file mode 100644
index 0000000..e42ce25
--- /dev/null
+++ b/geradoresfe/src/icons/trash.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/user-circle.svg b/geradoresfe/src/icons/user-circle.svg
new file mode 100644
index 0000000..fa6c14a
--- /dev/null
+++ b/geradoresfe/src/icons/user-circle.svg
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/geradoresfe/src/icons/user-line.svg b/geradoresfe/src/icons/user-line.svg
new file mode 100644
index 0000000..28280ae
--- /dev/null
+++ b/geradoresfe/src/icons/user-line.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/icons/videos.svg b/geradoresfe/src/icons/videos.svg
new file mode 100644
index 0000000..b8d69f1
--- /dev/null
+++ b/geradoresfe/src/icons/videos.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/geradoresfe/src/index.css b/geradoresfe/src/index.css
index b5c61c9..5381684 100644
--- a/geradoresfe/src/index.css
+++ b/geradoresfe/src/index.css
@@ -1,3 +1,609 @@
+@import url("https://fonts.googleapis.com/css2?family=Outfit:wght@100..900&display=swap");
+
@tailwind base;
@tailwind components;
@tailwind utilities;
+
+@layer base {
+ body {
+ @apply relative text-base font-normal z-1 bg-gray-50 font-outfit;
+ }
+}
+
+/* @layer components {
+ .menu-item {
+ @apply relative flex items-center gap-3 px-3 py-2 font-medium rounded-lg text-theme-sm;
+ }
+ .menu-item-active {
+ @apply bg-brand-50 text-brand-500 dark:bg-brand-500/[0.12] dark:text-brand-400;
+ }
+ .menu-item-inactive {
+ @apply text-gray-700 hover:bg-gray-100 hover:text-gray-700 dark:text-gray-300 dark:hover:bg-white/5 dark:hover:text-gray-300;
+ }
+
+ .menu-item-icon-active {
+ @apply text-brand-500 dark:text-brand-400;
+ }
+ .menu-item-icon-inactive {
+ @apply text-gray-500 group-hover:text-gray-700 dark:text-gray-400 dark:group-hover:text-gray-300;
+ }
+
+ .menu-item-arrow {
+ @apply absolute right-2.5 top-1/2 -translate-y-1/2;
+ }
+ .menu-item-arrow-active {
+ @apply rotate-180 stroke-brand-500 dark:stroke-brand-400;
+ }
+ .menu-item-arrow-inactive {
+ @apply stroke-gray-500 group-hover:stroke-gray-700 dark:stroke-gray-400 dark:group-hover:stroke-gray-300;
+ }
+
+ .menu-dropdown-item {
+ @apply relative flex items-center gap-3 rounded-lg px-3 py-2.5 text-theme-sm font-medium;
+ }
+ .menu-dropdown-item-active {
+ @apply bg-brand-50 text-brand-500 dark:bg-brand-500/[0.12] dark:text-brand-400;
+ }
+ .menu-dropdown-item-inactive {
+ @apply text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-white/5;
+ }
+
+ .menu-dropdown-badge {
+ @apply block rounded-full px-2.5 py-0.5 text-xs font-medium uppercase text-brand-500 dark:text-brand-400;
+ }
+ .menu-dropdown-badge-active {
+ @apply bg-brand-100 dark:bg-brand-500/20;
+ }
+ .menu-dropdown-badge-inactive {
+ @apply bg-brand-50 group-hover:bg-brand-100 dark:bg-brand-500/15 dark:group-hover:bg-brand-500/20;
+ }
+} */
+@layer components {
+ .menu-item {
+ @apply relative flex items-center w-full gap-3 px-3 py-2 font-medium rounded-lg text-theme-sm;
+ }
+ .menu-item-active {
+ @apply bg-brand-50 text-brand-500 dark:bg-brand-500/[0.12] dark:text-brand-400;
+ }
+ .menu-item-inactive {
+ @apply text-gray-700 hover:bg-gray-100 group-hover:text-gray-700 dark:text-gray-300 dark:hover:bg-white/5 dark:hover:text-gray-300;
+ }
+ .menu-item-icon {
+ @apply text-gray-500 group-hover:text-gray-700 dark:text-gray-400;
+ }
+ .menu-item-icon-active {
+ @apply text-brand-500 dark:text-brand-400;
+ }
+ .menu-item-icon-inactive {
+ @apply text-gray-500 group-hover:text-gray-700 dark:text-gray-400 dark:group-hover:text-gray-300;
+ }
+
+ .menu-item-arrow {
+ @apply relative;
+ }
+ .menu-item-arrow-active {
+ @apply rotate-180 text-brand-500 dark:text-brand-400;
+ }
+ .menu-item-arrow-inactive {
+ @apply text-gray-500 group-hover:text-gray-700 dark:text-gray-400 dark:group-hover:text-gray-300;
+ }
+
+ .menu-dropdown-item {
+ @apply relative flex items-center gap-3 rounded-lg px-3 py-2.5 text-theme-sm font-medium;
+ }
+ .menu-dropdown-item-active {
+ @apply bg-brand-50 text-brand-500 dark:bg-brand-500/[0.12] dark:text-brand-400;
+ }
+ .menu-dropdown-item-inactive {
+ @apply text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-white/5;
+ }
+
+ .menu-dropdown-badge {
+ @apply block rounded-full px-2.5 py-0.5 text-xs font-medium uppercase text-brand-500 dark:text-brand-400;
+ }
+ .menu-dropdown-badge-active {
+ @apply bg-brand-100 dark:bg-brand-500/20;
+ }
+ .menu-dropdown-badge-inactive {
+ @apply bg-brand-50 group-hover:bg-brand-100 dark:bg-brand-500/15 dark:group-hover:bg-brand-500/20;
+ }
+}
+@layer utilities {
+ /* Chrome, Safari and Opera */
+ .no-scrollbar::-webkit-scrollbar {
+ display: none;
+ }
+
+ .no-scrollbar {
+ -ms-overflow-style: none; /* IE and Edge */
+ scrollbar-width: none; /* Firefox */
+ }
+
+ .custom-scrollbar::-webkit-scrollbar {
+ @apply size-1.5;
+ }
+
+ .custom-scrollbar::-webkit-scrollbar-track {
+ @apply rounded-full;
+ }
+
+ .custom-scrollbar::-webkit-scrollbar-thumb {
+ @apply bg-gray-200 rounded-full dark:bg-gray-700;
+ }
+ /* For Remove Date Icon */
+ input[type="date"]::-webkit-inner-spin-button,
+ input[type="time"]::-webkit-inner-spin-button,
+ input[type="date"]::-webkit-calendar-picker-indicator,
+ input[type="time"]::-webkit-calendar-picker-indicator {
+ display: none;
+ -webkit-appearance: none;
+ }
+}
+
+.tableCheckbox:checked ~ span span {
+ @apply opacity-100;
+}
+.tableCheckbox:checked ~ span {
+ @apply border-brand-500 bg-brand-500;
+}
+
+/* third-party libraries CSS */
+.apexcharts-legend-text {
+ @apply !text-gray-700 dark:!text-gray-400;
+}
+
+.apexcharts-text {
+ @apply !fill-gray-700 dark:!fill-gray-400;
+}
+
+.apexcharts-tooltip.apexcharts-theme-light {
+ @apply gap-1 !rounded-lg !border-gray-200 p-3 !shadow-theme-sm dark:!border-gray-800 dark:!bg-gray-900;
+}
+
+.apexcharts-tooltip-marker {
+ @apply !mr-1.5 !h-1.5 !w-1.5;
+}
+.apexcharts-legend-text {
+ @apply !pl-5 !text-gray-700 dark:!text-gray-400;
+}
+.apexcharts-tooltip-series-group {
+ @apply !p-0;
+}
+.apexcharts-tooltip-y-group {
+ @apply !p-0;
+}
+.apexcharts-tooltip-title {
+ @apply !mb-0 !border-b-0 !bg-transparent !p-0 !text-[10px] !leading-4 !text-gray-800 dark:!text-white/90;
+}
+.apexcharts-tooltip-text {
+ @apply !text-theme-xs !text-gray-700 dark:!text-white/90;
+}
+.apexcharts-tooltip-text-y-value {
+ @apply !font-medium;
+}
+
+.apexcharts-gridline {
+ @apply !stroke-gray-100 dark:!stroke-gray-800;
+}
+#chartTwo .apexcharts-datalabels-group {
+ @apply !-translate-y-24;
+}
+#chartTwo .apexcharts-datalabels-group .apexcharts-text {
+ @apply !fill-gray-800 !font-semibold dark:!fill-white/90;
+}
+
+#chartSixteen .apexcharts-legend {
+ @apply !p-0 !pl-6;
+}
+
+.jvectormap-container {
+ @apply !bg-gray-50 dark:!bg-gray-900;
+}
+.jvectormap-region.jvectormap-element {
+ @apply !fill-gray-300 hover:!fill-brand-500 dark:!fill-gray-700 dark:hover:!fill-brand-500;
+}
+.jvectormap-marker.jvectormap-element {
+ @apply !stroke-gray-200 dark:!stroke-gray-800;
+}
+.jvectormap-tip {
+ @apply !bg-brand-500 !border-none !px-2 !py-1;
+}
+.jvectormap-zoomin,
+.jvectormap-zoomout {
+ @apply !hidden;
+}
+
+.stocks-slider-outer .swiper-button-next:after,
+.stocks-slider-outer .swiper-button-prev:after {
+ @apply hidden;
+}
+
+.stocks-slider-outer .swiper-button-next,
+.stocks-slider-outer .swiper-button-prev {
+ @apply !static mt-0 h-8 w-9 rounded-full border dark:hover:bg-white/[0.05] border-gray-200 !text-gray-700 transition hover:bg-gray-100 dark:border-white/[0.03] dark:bg-gray-800 dark:!text-gray-400 dark:hover:!text-white/90;
+}
+
+.stocks-slider-outer .swiper-button-next.swiper-button-disabled,
+.stocks-slider-outer .swiper-button-prev.swiper-button-disabled {
+ @apply bg-white opacity-50 dark:bg-gray-900;
+}
+
+.stocks-slider-outer .swiper-button-next svg,
+.stocks-slider-outer .swiper-button-prev svg {
+ @apply !h-auto !w-auto;
+}
+
+.flatpickr-wrapper {
+ @apply w-full;
+}
+.flatpickr-calendar {
+ @apply mt-2 !bg-white !rounded-xl !p-5 !border !border-gray-200 !text-gray-500 dark:!bg-gray-dark dark:!text-gray-400 dark:!shadow-theme-xl 2xsm:!w-auto;
+}
+
+.flatpickr-months .flatpickr-prev-month:hover svg,
+.flatpickr-months .flatpickr-next-month:hover svg {
+ @apply stroke-brand-500;
+}
+.flatpickr-calendar.arrowTop:before,
+.flatpickr-calendar.arrowTop:after {
+ @apply hidden;
+}
+
+.flatpickr-current-month {
+ @apply !p-0;
+}
+.flatpickr-current-month .cur-month,
+.flatpickr-current-month input.cur-year {
+ @apply !h-auto !pt-0 !text-lg !font-medium !text-gray-800 dark:!text-white/90;
+}
+
+.flatpickr-prev-month,
+.flatpickr-next-month {
+ @apply !p-0;
+}
+
+.flatpickr-weekdays {
+ @apply h-auto mt-6 mb-4 !bg-transparent;
+}
+
+.flatpickr-weekday {
+ @apply !text-theme-sm !font-medium !text-gray-500 dark:!text-gray-400 !bg-transparent;
+}
+
+.flatpickr-day {
+ @apply !flex !items-center !text-theme-sm !font-medium !text-gray-800 dark:!text-white/90 dark:hover:!border-gray-300 dark:hover:!bg-gray-900;
+}
+.flatpickr-day.nextMonthDay,
+.flatpickr-day.prevMonthDay {
+ @apply !text-gray-400;
+}
+
+.flatpickr-months > .flatpickr-month {
+ background: none !important;
+}
+.flatpickr-month .flatpickr-current-month .flatpickr-monthDropdown-months {
+ background: none !important;
+ appearance: none;
+ background-image: none !important;
+ font-weight: 500;
+}
+.flatpickr-month
+ .flatpickr-current-month
+ .flatpickr-monthDropdown-months:focus {
+ outline: none !important;
+ border: 0 !important;
+}
+.flatpickr-months .flatpickr-prev-month,
+.flatpickr-months .flatpickr-next-month {
+ @apply !top-7 dark:!fill-white dark:!text-white !bg-transparent;
+}
+.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,
+.flatpickr-months .flatpickr-next-month.flatpickr-prev-month {
+ @apply !left-7;
+}
+.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,
+.flatpickr-months .flatpickr-next-month.flatpickr-next-month {
+ @apply !right-7;
+}
+.flatpickr-days {
+ @apply !border-0;
+}
+span.flatpickr-weekday,
+.flatpickr-months .flatpickr-month {
+ @apply dark:!fill-white dark:!text-white !bg-none;
+}
+.flatpickr-innerContainer {
+ @apply !border-b-0;
+}
+.flatpickr-months .flatpickr-month {
+ @apply !bg-none;
+}
+.flatpickr-day.inRange {
+ box-shadow: -5px 0 0 #f9fafb, 5px 0 0 #f9fafb !important;
+ @apply dark:!shadow-datepicker;
+}
+.flatpickr-day.inRange,
+.flatpickr-day.prevMonthDay.inRange,
+.flatpickr-day.nextMonthDay.inRange,
+.flatpickr-day.today.inRange,
+.flatpickr-day.prevMonthDay.today.inRange,
+.flatpickr-day.nextMonthDay.today.inRange,
+.flatpickr-day:hover,
+.flatpickr-day.prevMonthDay:hover,
+.flatpickr-day.nextMonthDay:hover,
+.flatpickr-day:focus,
+.flatpickr-day.prevMonthDay:focus,
+.flatpickr-day.nextMonthDay:focus {
+ @apply !border-gray-50 !bg-gray-50 dark:!border-0 dark:!border-white/5 dark:!bg-white/5;
+}
+.flatpickr-day.selected,
+.flatpickr-day.startRange,
+.flatpickr-day.selected,
+.flatpickr-day.endRange {
+ @apply !text-white dark:!text-white;
+}
+.flatpickr-day.selected,
+.flatpickr-day.startRange,
+.flatpickr-day.endRange,
+.flatpickr-day.selected.inRange,
+.flatpickr-day.startRange.inRange,
+.flatpickr-day.endRange.inRange,
+.flatpickr-day.selected:focus,
+.flatpickr-day.startRange:focus,
+.flatpickr-day.endRange:focus,
+.flatpickr-day.selected:hover,
+.flatpickr-day.startRange:hover,
+.flatpickr-day.endRange:hover,
+.flatpickr-day.selected.prevMonthDay,
+.flatpickr-day.startRange.prevMonthDay,
+.flatpickr-day.endRange.prevMonthDay,
+.flatpickr-day.selected.nextMonthDay,
+.flatpickr-day.startRange.nextMonthDay,
+.flatpickr-day.endRange.nextMonthDay {
+ background: #465fff;
+ @apply !border-brand-500 !bg-brand-500 hover:!border-brand-500 hover:!bg-brand-500;
+}
+.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n + 1)),
+.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n + 1)),
+.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n + 1)) {
+ box-shadow: -10px 0 0 #465fff;
+}
+
+.flatpickr-months .flatpickr-prev-month svg,
+.flatpickr-months .flatpickr-next-month svg,
+.flatpickr-months .flatpickr-prev-month,
+.flatpickr-months .flatpickr-next-month {
+ @apply hover:!fill-none;
+}
+.flatpickr-months .flatpickr-prev-month:hover svg,
+.flatpickr-months .flatpickr-next-month:hover svg {
+ fill: none !important;
+}
+
+.flatpickr-calendar.static {
+ @apply right-0;
+}
+
+.fc .fc-view-harness {
+ @apply max-w-full overflow-x-auto custom-scrollbar;
+}
+.fc-dayGridMonth-view.fc-view.fc-daygrid {
+ @apply min-w-[718px];
+}
+.fc .fc-scrollgrid-section > * {
+ border-right-width: 0;
+ border-bottom-width: 0;
+}
+.fc .fc-scrollgrid {
+ border-left-width: 0;
+}
+.fc .fc-toolbar.fc-header-toolbar {
+ @apply flex-col gap-4 px-6 pt-6 sm:flex-row;
+}
+.fc-button-group {
+ @apply gap-2;
+}
+.fc-button-group .fc-button {
+ @apply flex h-10 w-10 items-center justify-center !rounded-lg border border-gray-200 bg-transparent hover:border-gray-200 hover:bg-gray-50 focus:shadow-none active:!border-gray-200 active:!bg-transparent active:!shadow-none dark:border-gray-800 dark:hover:border-gray-800 dark:hover:bg-gray-900 dark:active:!border-gray-800;
+}
+
+.fc-button-group .fc-button.fc-prev-button:before {
+ @apply inline-block mt-1;
+ content: url("data:image/svg+xml,%3Csvg width='25' height='24' viewBox='0 0 25 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.0068 6L9.75684 12.25L16.0068 18.5' stroke='%23344054' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
+}
+.fc-button-group .fc-button.fc-next-button:before {
+ @apply inline-block mt-1;
+ content: url("data:image/svg+xml,%3Csvg width='25' height='24' viewBox='0 0 25 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.50684 19L15.7568 12.75L9.50684 6.5' stroke='%23344054' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
+}
+.dark .fc-button-group .fc-button.fc-prev-button:before {
+ content: url("data:image/svg+xml,%3Csvg width='25' height='24' viewBox='0 0 25 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.0068 6L9.75684 12.25L16.0068 18.5' stroke='%2398A2B3' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
+}
+.dark .fc-button-group .fc-button.fc-next-button:before {
+ content: url("data:image/svg+xml,%3Csvg width='25' height='24' viewBox='0 0 25 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.50684 19L15.7568 12.75L9.50684 6.5' stroke='%2398A2B3' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
+}
+.fc-button-group .fc-button .fc-icon {
+ @apply hidden;
+}
+.fc-addEventButton-button {
+ @apply !rounded-lg !border-0 !bg-brand-500 !px-4 !py-2.5 !text-sm !font-medium hover:!bg-brand-600 focus:!shadow-none;
+}
+.fc-toolbar-title {
+ @apply !text-lg !font-medium text-gray-800 dark:text-white/90;
+}
+.fc-header-toolbar.fc-toolbar .fc-toolbar-chunk:last-child {
+ @apply rounded-lg bg-gray-100 p-0.5 dark:bg-gray-900;
+}
+.fc-header-toolbar.fc-toolbar .fc-toolbar-chunk:last-child .fc-button {
+ @apply !h-auto !w-auto rounded-md !border-0 bg-transparent !px-5 !py-2 text-sm font-medium text-gray-500 hover:text-gray-700 focus:!shadow-none dark:text-gray-400;
+}
+.fc-header-toolbar.fc-toolbar
+ .fc-toolbar-chunk:last-child
+ .fc-button.fc-button-active {
+ @apply text-gray-900 bg-white dark:bg-gray-800 dark:text-white;
+}
+.fc-theme-standard th {
+ @apply !border-x-0 border-t !border-gray-200 bg-gray-50 !text-left dark:!border-gray-800 dark:bg-gray-900;
+}
+.fc-theme-standard td,
+.fc-theme-standard .fc-scrollgrid {
+ @apply !border-gray-200 dark:!border-gray-800;
+}
+.fc .fc-col-header-cell-cushion {
+ @apply !px-5 !py-4 text-sm font-medium uppercase text-gray-400;
+}
+.fc .fc-daygrid-day.fc-day-today {
+ @apply bg-transparent;
+}
+.fc .fc-daygrid-day {
+ @apply p-2;
+}
+.fc .fc-daygrid-day.fc-day-today .fc-scrollgrid-sync-inner {
+ @apply rounded bg-gray-100 dark:bg-white/[0.03];
+}
+.fc .fc-daygrid-day-number {
+ @apply !p-3 text-sm font-medium text-gray-700 dark:text-gray-400;
+}
+.fc .fc-daygrid-day-top {
+ @apply !flex-row;
+}
+.fc .fc-day-other .fc-daygrid-day-top {
+ opacity: 1;
+}
+.fc .fc-day-other .fc-daygrid-day-top .fc-daygrid-day-number {
+ @apply text-gray-400 dark:text-white/30;
+}
+.event-fc-color {
+ @apply rounded-lg py-2.5 pl-4 pr-3;
+}
+.event-fc-color .fc-event-title {
+ @apply p-0 text-sm font-normal text-gray-700;
+}
+.fc-daygrid-event-dot {
+ @apply w-1 h-5 ml-0 mr-3 border-none rounded;
+}
+.fc-event {
+ @apply focus:shadow-none;
+}
+.fc-daygrid-event.fc-event-start {
+ @apply !ml-3;
+}
+.event-fc-color.fc-bg-success {
+ @apply border-success-50 bg-success-50;
+}
+.event-fc-color.fc-bg-danger {
+ @apply border-error-50 bg-error-50;
+}
+.event-fc-color.fc-bg-primary {
+ @apply border-brand-50 bg-brand-50;
+}
+.event-fc-color.fc-bg-warning {
+ @apply border-orange-50 bg-orange-50;
+}
+.event-fc-color.fc-bg-success .fc-daygrid-event-dot {
+ @apply bg-success-500;
+}
+.event-fc-color.fc-bg-danger .fc-daygrid-event-dot {
+ @apply bg-error-500;
+}
+.event-fc-color.fc-bg-primary .fc-daygrid-event-dot {
+ @apply bg-brand-500;
+}
+.event-fc-color.fc-bg-warning .fc-daygrid-event-dot {
+ @apply bg-orange-500;
+}
+.fc-direction-ltr .fc-timegrid-slot-label-frame {
+ @apply px-3 py-1.5 text-left text-sm font-medium text-gray-500 dark:text-gray-400;
+}
+.fc .fc-timegrid-axis-cushion {
+ @apply text-sm font-medium text-gray-500 dark:text-gray-400;
+}
+
+.input-date-icon::-webkit-inner-spin-button,
+.input-date-icon::-webkit-calendar-picker-indicator {
+ opacity: 0;
+ -webkit-appearance: none;
+}
+
+.swiper-button-prev svg,
+.swiper-button-next svg {
+ @apply !h-auto !w-auto;
+}
+
+.carouselTwo .swiper-button-next:after,
+.carouselTwo .swiper-button-prev:after,
+.carouselFour .swiper-button-next:after,
+.carouselFour .swiper-button-prev:after {
+ @apply hidden;
+}
+.carouselTwo .swiper-button-next.swiper-button-disabled,
+.carouselTwo .swiper-button-prev.swiper-button-disabled,
+.carouselFour .swiper-button-next.swiper-button-disabled,
+.carouselFour .swiper-button-prev.swiper-button-disabled {
+ @apply bg-white/60 !opacity-100;
+}
+.carouselTwo .swiper-button-next,
+.carouselTwo .swiper-button-prev,
+.carouselFour .swiper-button-next,
+.carouselFour .swiper-button-prev {
+ @apply h-10 w-10 rounded-full border-[0.5px] border-white/10 bg-white/90 !text-gray-700 shadow-slider-navigation backdrop-blur-[10px];
+}
+
+.carouselTwo .swiper-button-prev,
+.carouselFour .swiper-button-prev {
+ @apply !left-3 sm:!left-4;
+}
+
+.carouselTwo .swiper-button-next,
+.carouselFour .swiper-button-next {
+ @apply !right-3 sm:!right-4;
+}
+
+.carouselThree .swiper-pagination,
+.carouselFour .swiper-pagination {
+ @apply !bottom-3 !left-1/2 inline-flex !w-auto -translate-x-1/2 items-center gap-1.5 rounded-[40px] border-[0.5px] border-white/10 bg-white/60 px-2 py-1.5 shadow-slider-navigation backdrop-blur-[10px] sm:!bottom-5;
+}
+
+.carouselThree .swiper-pagination-bullet,
+.carouselFour .swiper-pagination-bullet {
+ @apply !m-0 h-2.5 w-2.5 bg-white opacity-100 shadow-theme-xs duration-200 ease-in-out;
+}
+
+.carouselThree .swiper-pagination-bullet-active,
+.carouselFour .swiper-pagination-bullet-active {
+ @apply w-6.5 rounded-xl;
+}
+
+.form-check-input:checked ~ span {
+ @apply border-[6px] border-brand-500 bg-brand-500 dark:border-brand-500;
+}
+
+.taskCheckbox:checked ~ .box span {
+ @apply opacity-100 bg-brand-500;
+}
+.taskCheckbox:checked ~ p {
+ @apply text-gray-400 line-through;
+}
+.taskCheckbox:checked ~ .box {
+ @apply border-brand-500 bg-brand-500 dark:border-brand-500;
+}
+
+.task {
+ transition: all 0.2s ease; /* Smooth transition for visual effects */
+}
+
+.task {
+ border-radius: 0.75rem;
+ box-shadow: 0px 1px 3px 0px rgba(16, 24, 40, 0.1),
+ 0px 1px 2px 0px rgba(16, 24, 40, 0.06);
+ opacity: 0.8;
+ cursor: grabbing; /* Changes the cursor to indicate dragging */
+}
+
+.custom-calendar .fc-h-event {
+ background-color: transparent;
+ border: none;
+ color: black;
+}
+.fc.fc-media-screen {
+ @apply min-h-screen;
+}
diff --git a/geradoresfe/src/index.tsx b/geradoresfe/src/index.tsx
index 4423804..5830e29 100644
--- a/geradoresfe/src/index.tsx
+++ b/geradoresfe/src/index.tsx
@@ -1,16 +1,25 @@
-import React from 'react';
-import ReactDOM from 'react-dom/client';
-import './index.css';
-import App from './App';
-import reportWebVitals from './reportWebVitals';
-//import { Helmet } from 'react-helmet'
+import React from "react";
+import ReactDOM from "react-dom/client";
+import "./index.css";
+import "swiper/css";
+import "swiper/css/navigation";
+import "swiper/css/pagination";
+import "swiper/css/autoplay";
+import reportWebVitals from "./reportWebVitals";
+import App from "./App";
+import { ThemeProvider } from "./context/ThemeContext";
+import { AppWrapper } from "./components/common/PageMeta";
const root = ReactDOM.createRoot(
- document.getElementById('root') as HTMLElement
+ document.getElementById("root") as HTMLElement
);
root.render(
-
+
+
+
+
+
);
diff --git a/geradoresfe/src/layout/AppHeader.tsx b/geradoresfe/src/layout/AppHeader.tsx
new file mode 100644
index 0000000..e64e598
--- /dev/null
+++ b/geradoresfe/src/layout/AppHeader.tsx
@@ -0,0 +1,101 @@
+"use client";
+
+import React, { useState } from "react";
+import { motion, AnimatePresence } from "framer-motion";
+import { Menu, X, Moon, Sun } from "lucide-react";
+import { useTheme } from "../context/ThemeContext";
+import { Link, useLocation } from "react-router"; // Use useLocation para pegar a rota atual
+
+// Array de links com o nome e a rota
+const links = [
+ { name: "Home", path: "/" },
+ { name: "NIF", path: "/nif#nif" },
+ { name: "NISS", path: "/niss" },
+ { name: "CC", path: "/cc" },
+];
+
+const AppHeader = () => {
+ const [isMobileOpen, setIsMobileOpen] = useState(false);
+ const { theme, toggleTheme } = useTheme();
+ const location = useLocation(); // Obtendo a localização atual
+
+ const toggleMenu = () => setIsMobileOpen(!isMobileOpen);
+
+ return (
+
+ );
+};
+
+export default AppHeader;
diff --git a/geradoresfe/src/layout/AppLayout.tsx b/geradoresfe/src/layout/AppLayout.tsx
new file mode 100644
index 0000000..bb26618
--- /dev/null
+++ b/geradoresfe/src/layout/AppLayout.tsx
@@ -0,0 +1,26 @@
+import React from "react";
+import { SidebarProvider, useSidebar } from "../context/SidebarContext";
+import { Outlet } from "react-router";
+import AppHeader from "./AppHeader";
+import Backdrop from "./Backdrop";
+import AppSidebar from "./AppSidebar";
+
+const LayoutContent: React.FC = () => {
+
+ return (
+
+ );
+};
+
+const AppLayout: React.FC = () => {
+ return (
+
+ );
+};
+
+export default AppLayout;
diff --git a/geradoresfe/src/layout/AppSidebar.tsx b/geradoresfe/src/layout/AppSidebar.tsx
new file mode 100644
index 0000000..2834c81
--- /dev/null
+++ b/geradoresfe/src/layout/AppSidebar.tsx
@@ -0,0 +1,378 @@
+import React, { useEffect, useCallback, useRef, useState } from "react";
+import { Link, useLocation } from "react-router";
+
+// Assume these icons are imported from an icon library
+import { useSidebar } from "../context/SidebarContext";
+import {
+ BoxCubeIcon,
+ CalenderIcon,
+ ChevronDownIcon,
+ GridIcon,
+ HorizontaLDots,
+ ListIcon,
+ PageIcon,
+ PieChartIcon,
+ PlugInIcon,
+ TableIcon,
+ UserCircleIcon,
+} from "../icons";
+import SidebarWidget from "./SidebarWidget";
+
+type NavItem = {
+ name: string;
+ icon: React.ReactNode;
+ path?: string;
+ subItems?: { name: string; path: string; pro?: boolean; new?: boolean }[];
+};
+
+const navItems: NavItem[] = [
+ {
+ icon: ,
+ name: "Dashboard",
+ subItems: [{ name: "Ecommerce", path: "/", pro: false }],
+ },
+ {
+ icon: ,
+ name: "Calendar",
+ path: "/calendar",
+ },
+ {
+ icon: ,
+ name: "User Profile",
+ path: "/profile",
+ },
+
+ {
+ name: "Forms",
+ icon: ,
+ subItems: [{ name: "Form Elements", path: "/form-elements", pro: false }],
+ },
+ {
+ name: "Tables",
+ icon: ,
+ subItems: [{ name: "Basic Tables", path: "/basic-tables", pro: false }],
+ },
+ {
+ name: "Pages",
+ icon: ,
+ subItems: [
+ { name: "404 Error", path: "/404", pro: false },
+ { name: "Blank Page", path: "/blank", pro: false },
+ ],
+ },
+];
+
+const othersItems: NavItem[] = [
+ {
+ icon: ,
+ name: "Charts",
+ subItems: [
+ { name: "Line Chart", path: "/line-chart", pro: false },
+ { name: "Bar Chart", path: "/bar-chart", pro: false },
+ ],
+ },
+ {
+ icon: ,
+ name: "UI Elements",
+ subItems: [
+ { name: "Alerts", path: "/alerts", pro: false },
+ { name: "Avatar", path: "/avatars", pro: false },
+ { name: "Badge", path: "/badges", pro: false },
+ { name: "Buttons", path: "/buttons", pro: false },
+ { name: "Images", path: "/images", pro: false },
+ { name: "Videos", path: "/videos", pro: false },
+ ],
+ },
+ {
+ icon: ,
+ name: "Authentication",
+ subItems: [
+ { name: "Sign In", path: "/signin", pro: false },
+ { name: "Sign Up", path: "/signup", pro: false },
+ ],
+ },
+];
+
+const AppSidebar: React.FC = () => {
+ const { isExpanded, isMobileOpen, isHovered, setIsHovered } = useSidebar();
+ const location = useLocation();
+
+ const [openSubmenu, setOpenSubmenu] = useState<{
+ type: "main" | "others";
+ index: number;
+ } | null>(null);
+ const [subMenuHeight, setSubMenuHeight] = useState>(
+ {}
+ );
+ const subMenuRefs = useRef>({});
+
+ const isActive = useCallback(
+ (path: string) => location.pathname === path,
+ [location.pathname]
+ );
+
+ useEffect(() => {
+ let submenuMatched = false;
+ ["main", "others"].forEach((menuType) => {
+ const items = menuType === "main" ? navItems : othersItems;
+ items.forEach((nav, index) => {
+ if (nav.subItems) {
+ nav.subItems.forEach((subItem) => {
+ if (isActive(subItem.path)) {
+ setOpenSubmenu({
+ type: menuType as "main" | "others",
+ index,
+ });
+ submenuMatched = true;
+ }
+ });
+ }
+ });
+ });
+
+ if (!submenuMatched) {
+ setOpenSubmenu(null);
+ }
+ }, [location, isActive]);
+
+ useEffect(() => {
+ if (openSubmenu !== null) {
+ const key = `${openSubmenu.type}-${openSubmenu.index}`;
+ if (subMenuRefs.current[key]) {
+ setSubMenuHeight((prevHeights) => ({
+ ...prevHeights,
+ [key]: subMenuRefs.current[key]?.scrollHeight || 0,
+ }));
+ }
+ }
+ }, [openSubmenu]);
+
+ const handleSubmenuToggle = (index: number, menuType: "main" | "others") => {
+ setOpenSubmenu((prevOpenSubmenu) => {
+ if (
+ prevOpenSubmenu &&
+ prevOpenSubmenu.type === menuType &&
+ prevOpenSubmenu.index === index
+ ) {
+ return null;
+ }
+ return { type: menuType, index };
+ });
+ };
+
+ const renderMenuItems = (items: NavItem[], menuType: "main" | "others") => (
+
+ {items.map((nav, index) => (
+ -
+ {nav.subItems ? (
+
+ ) : (
+ nav.path && (
+
+
+ {nav.icon}
+
+ {(isExpanded || isHovered || isMobileOpen) && (
+ {nav.name}
+ )}
+
+ )
+ )}
+ {nav.subItems && (isExpanded || isHovered || isMobileOpen) && (
+
{
+ subMenuRefs.current[`${menuType}-${index}`] = el;
+ }}
+ className="overflow-hidden transition-all duration-300"
+ style={{
+ height:
+ openSubmenu?.type === menuType && openSubmenu?.index === index
+ ? `${subMenuHeight[`${menuType}-${index}`]}px`
+ : "0px",
+ }}
+ >
+
+ {nav.subItems.map((subItem) => (
+ -
+
+ {subItem.name}
+
+ {subItem.new && (
+
+ new
+
+ )}
+ {subItem.pro && (
+
+ pro
+
+ )}
+
+
+
+ ))}
+
+
+ )}
+
+ ))}
+
+ );
+
+ return (
+
+ );
+};
+
+export default AppSidebar;
diff --git a/geradoresfe/src/layout/AuthLayout.tsx b/geradoresfe/src/layout/AuthLayout.tsx
new file mode 100644
index 0000000..f847f36
--- /dev/null
+++ b/geradoresfe/src/layout/AuthLayout.tsx
@@ -0,0 +1,10 @@
+import React from "react";
+import { Outlet } from "react-router";
+
+export default function AuthLayout() {
+ return (
+ <>
+
+ >
+ );
+}
diff --git a/geradoresfe/src/layout/Backdrop.tsx b/geradoresfe/src/layout/Backdrop.tsx
new file mode 100644
index 0000000..82b2b97
--- /dev/null
+++ b/geradoresfe/src/layout/Backdrop.tsx
@@ -0,0 +1,17 @@
+import React from "react";
+import { useSidebar } from "../context/SidebarContext";
+
+const Backdrop: React.FC = () => {
+ const { isMobileOpen, toggleMobileSidebar } = useSidebar();
+
+ if (!isMobileOpen) return null;
+
+ return (
+
+ );
+};
+
+export default Backdrop;
diff --git a/geradoresfe/src/layout/SidebarWidget.tsx b/geradoresfe/src/layout/SidebarWidget.tsx
new file mode 100644
index 0000000..5ffcfe4
--- /dev/null
+++ b/geradoresfe/src/layout/SidebarWidget.tsx
@@ -0,0 +1,25 @@
+import React from "react";
+
+export default function SidebarWidget() {
+ return (
+
+
+ #1 Tailwind CSS Dashboard
+
+
+ Leading Tailwind CSS Admin Template with 400+ UI Component and Pages.
+
+
+ Upgrade To Pro
+
+
+ );
+}
diff --git a/geradoresfe/src/pages/AuthPages/SignIn.tsx b/geradoresfe/src/pages/AuthPages/SignIn.tsx
new file mode 100644
index 0000000..274f0c9
--- /dev/null
+++ b/geradoresfe/src/pages/AuthPages/SignIn.tsx
@@ -0,0 +1,175 @@
+import { useState } from "react";
+import GridShape from "../../components/common/GridShape";
+import Input from "../../components/form/input/InputField";
+import Label from "../../components/form/Label";
+import { Link } from "react-router";
+import { ChevronLeftIcon, EyeCloseIcon, EyeIcon } from "../../icons";
+import Checkbox from "../../components/form/input/Checkbox";
+import Button from "../../components/ui/button/Button";
+import PageMeta from "../../components/common/PageMeta";
+
+export default function SignIn() {
+ const [showPassword, setShowPassword] = useState(false);
+ const [isChecked, setIsChecked] = useState(false);
+ return (
+ <>
+
+
+
+
+
+
+ Back to dashboard
+
+
+
+
+
+
+ Sign In
+
+
+ Enter your email and password to sign in!
+
+
+
+
+
+
+
+
+
+
+
+
+ Don't have an account? {""}
+
+ Sign Up
+
+
+
+
+
+
+
+
+ {/* */}
+
+
+
+ 
+
+
+ Free and Open-Source Tailwind CSS Admin Dashboard Template
+
+
+
+
+ >
+ );
+}
diff --git a/geradoresfe/src/pages/AuthPages/SignUp.tsx b/geradoresfe/src/pages/AuthPages/SignUp.tsx
new file mode 100644
index 0000000..ff464b4
--- /dev/null
+++ b/geradoresfe/src/pages/AuthPages/SignUp.tsx
@@ -0,0 +1,225 @@
+import React, { useState } from "react";
+import { Link } from "react-router";
+import GridShape from "../../components/common/GridShape";
+import Input from "../../components/form/input/InputField";
+import Label from "../../components/form/Label";
+import { EyeCloseIcon, EyeIcon } from "../../icons";
+import Checkbox from "../../components/form/input/Checkbox";
+import PageMeta from "../../components/common/PageMeta";
+
+export default function SignUp() {
+ const [showPassword, setShowPassword] = useState(false);
+ const [isChecked, setIsChecked] = useState(false);
+ return (
+ <>
+
+
+
+
+
+
+ Back to dashboard
+
+
+
+
+
+ Sign Up
+
+
+ Enter your email and password to sign up!
+
+
+
+
+
+
+
+
+
+
+
+ Already have an account?
+
+ Sign In
+
+
+
+
+
+
+
+ {/* */}
+
+ {/* */}
+
+
+ 
+
+
+ Free and Open-Source Tailwind CSS Admin Dashboard Template
+
+
+
+
+ >
+ );
+}
diff --git a/geradoresfe/src/pages/Blank.tsx b/geradoresfe/src/pages/Blank.tsx
new file mode 100644
index 0000000..477ad32
--- /dev/null
+++ b/geradoresfe/src/pages/Blank.tsx
@@ -0,0 +1,28 @@
+import React from "react";
+import PageBreadcrumb from "../components/common/PageBreadCrumb";
+import PageMeta from "../components/common/PageMeta";
+
+export default function Blank() {
+ console.log("inicalizar componente");
+ return (
+
+
+
+
+
+
+ Card Title Here
+
+
+
+ Start putting content on grids or panels, you can also use different
+ combinations of grids.Please check out the dashboard and other pages
+
+
+
+
+ );
+}
diff --git a/geradoresfe/src/pages/GenerateCC.tsx b/geradoresfe/src/pages/GenerateCC.tsx
new file mode 100644
index 0000000..c3a88ed
--- /dev/null
+++ b/geradoresfe/src/pages/GenerateCC.tsx
@@ -0,0 +1,91 @@
+import React, { useState } from "react";
+import ComponentCard from "../components/common/ComponentCard"; // Importando ComponentCard
+import { Clipboard } from "lucide-react"; // Ãcone de clipboard
+import PageMeta from "../components/common/PageMeta"; // Importando PageMeta
+import Select from "../components/form/Select"; // Importando Select para dropdown
+
+// Simulando um serviço de geração de NIF (apenas para fins de demonstração)
+const generateNIFFromService = (type: string): string => {
+ // Apenas retorna números fictÃcios baseados no tipo (como exemplo)
+ return type === "Tipo 1" ? "123456789" : "987654321";
+};
+
+// Tipos de NIF disponÃveis para seleção
+const NifTypes = [
+ { value: "Tipo 1", label: "Tipo 1 - Pessoa Singular" },
+ { value: "Tipo 2", label: "Tipo 2 - Pessoa Coletiva" },
+ { value: "Tipo 3", label: "Tipo 3 - Outros" },
+];
+
+const GenerateCC = () => {
+ const [nif, setNif] = useState("123456789");
+ const [selectedType, setSelectedType] = useState(NifTypes[0].value);
+
+ // Função para gerar o NIF chamando o serviço com base no tipo selecionado
+ const handleGenerateNIF = () => {
+ const generatedNIF = generateNIFFromService(selectedType);
+ setNif(generatedNIF);
+ };
+
+ // Função para copiar o NIF para o clipboard
+ const handleCopyToClipboard = () => {
+ if (nif) {
+ navigator.clipboard.writeText(nif);
+ alert("NIF copiado para o clipboard!");
+ }
+ };
+
+ // Função para lidar com a mudança do tipo selecionado no Select
+ const handleSelectChange = (value: string) => {
+ setSelectedType(value);
+ };
+
+ return (
+ <>
+ {/* Definindo o tÃtulo e a descrição da página */}
+
+
+ {/* Card com o tÃtulo alterado e os ajustes visuais */}
+
+
+
+ {/* Número gerado */}
+ {nif}
+
+ {/* Botão de copiar */}
+
+
+ {/* Dropdown para seleção do tipo de NIF */}
+
+
+
+
+ {/* Botão para gerar NIF */}
+
+
+
+
+ >
+ );
+};
+
+export default GenerateCC;
diff --git a/geradoresfe/src/pages/GenerateNIF.tsx b/geradoresfe/src/pages/GenerateNIF.tsx
new file mode 100644
index 0000000..9fc7420
--- /dev/null
+++ b/geradoresfe/src/pages/GenerateNIF.tsx
@@ -0,0 +1,92 @@
+import React, { useState } from "react";
+import ComponentCard from "../components/common/ComponentCard"; // Importando ComponentCard
+import { Clipboard } from "lucide-react"; // Ãcone de clipboard
+import PageMeta from "../components/common/PageMeta"; // Importando PageMeta
+import Select from "../components/form/Select"; // Importando Select para dropdown
+
+// Simulando um serviço de geração de NIF (apenas para fins de demonstração)
+const generateNIFFromService = (type: string): string => {
+ // Apenas retorna números fictÃcios baseados no tipo (como exemplo)
+ return type === "Tipo 1" ? "123456789" : "987654321";
+};
+
+// Tipos de NIF disponÃveis para seleção
+const NifTypes = [
+ { value: "Tipo 1", label: "Tipo 1 - Pessoa Singular" },
+ { value: "Tipo 2", label: "Tipo 2 - Pessoa Coletiva" },
+ { value: "Tipo 3", label: "Tipo 3 - Outros" },
+];
+
+const GenerateNIF = () => {
+ const [nif, setNif] = useState("123456789");
+ const [selectedType, setSelectedType] = useState(NifTypes[0].value);
+
+ // Função para gerar o NIF chamando o serviço com base no tipo selecionado
+ const handleGenerateNIF = () => {
+ const generatedNIF = generateNIFFromService(selectedType);
+ setNif(generatedNIF);
+ };
+
+ // Função para copiar o NIF para o clipboard
+ const handleCopyToClipboard = () => {
+ if (nif) {
+ navigator.clipboard.writeText(nif);
+ alert("NIF copiado para o clipboard!");
+ }
+ };
+
+ // Função para lidar com a mudança do tipo selecionado no Select
+ const handleSelectChange = (value: string) => {
+ setSelectedType(value);
+ };
+
+ return (
+ <>
+ {/* Definindo o tÃtulo e a descrição da página */}
+
+
+ {/* Card com o tÃtulo alterado e os ajustes visuais */}
+
+
+
+ {/* Número gerado */}
+ {nif}
+
+ {/* Botão de copiar */}
+
+
+
+ {/* Dropdown para seleção do tipo de NIF */}
+
+
+
+
+ {/* Botão para gerar NIF */}
+
+
+
+
+ >
+ );
+};
+
+export default GenerateNIF;
diff --git a/geradoresfe/src/pages/GenerateNISS.tsx b/geradoresfe/src/pages/GenerateNISS.tsx
new file mode 100644
index 0000000..bed8f9e
--- /dev/null
+++ b/geradoresfe/src/pages/GenerateNISS.tsx
@@ -0,0 +1,91 @@
+import React, { useState } from "react";
+import ComponentCard from "../components/common/ComponentCard"; // Importando ComponentCard
+import { Clipboard } from "lucide-react"; // Ãcone de clipboard
+import PageMeta from "../components/common/PageMeta"; // Importando PageMeta
+import Select from "../components/form/Select"; // Importando Select para dropdown
+
+// Simulando um serviço de geração de NIF (apenas para fins de demonstração)
+const generateNIFFromService = (type: string): string => {
+ // Apenas retorna números fictÃcios baseados no tipo (como exemplo)
+ return type === "Tipo 1" ? "123456789" : "987654321";
+};
+
+// Tipos de NIF disponÃveis para seleção
+const NifTypes = [
+ { value: "Tipo 1", label: "Tipo 1 - Pessoa Singular" },
+ { value: "Tipo 2", label: "Tipo 2 - Pessoa Coletiva" },
+ { value: "Tipo 3", label: "Tipo 3 - Outros" },
+];
+
+const GenerateNISS = () => {
+ const [nif, setNif] = useState("123456789");
+ const [selectedType, setSelectedType] = useState(NifTypes[0].value);
+
+ // Função para gerar o NIF chamando o serviço com base no tipo selecionado
+ const handleGenerateNIF = () => {
+ const generatedNIF = generateNIFFromService(selectedType);
+ setNif(generatedNIF);
+ };
+
+ // Função para copiar o NIF para o clipboard
+ const handleCopyToClipboard = () => {
+ if (nif) {
+ navigator.clipboard.writeText(nif);
+ alert("NIF copiado para o clipboard!");
+ }
+ };
+
+ // Função para lidar com a mudança do tipo selecionado no Select
+ const handleSelectChange = (value: string) => {
+ setSelectedType(value);
+ };
+
+ return (
+ <>
+ {/* Definindo o tÃtulo e a descrição da página */}
+
+
+ {/* Card com o tÃtulo alterado e os ajustes visuais */}
+
+
+
+ {/* Número gerado */}
+ {nif}
+
+ {/* Botão de copiar */}
+
+
+ {/* Dropdown para seleção do tipo de NIF */}
+
+
+
+
+ {/* Botão para gerar NIF */}
+
+
+
+
+ >
+ );
+};
+
+export default GenerateNISS;
diff --git a/geradoresfe/src/pages/Home.tsx b/geradoresfe/src/pages/Home.tsx
new file mode 100644
index 0000000..d8a9373
--- /dev/null
+++ b/geradoresfe/src/pages/Home.tsx
@@ -0,0 +1,56 @@
+import React, { useEffect } from "react";
+import PageBreadcrumb from "../components/common/PageBreadCrumb";
+import PageMeta from "../components/common/PageMeta";
+import { motion } from "framer-motion";
+import { Link, useLocation } from "react-router";
+import GenerateNIF from "./GenerateNIF";
+import GenerateNISS from "./GenerateNISS";
+import GenerateCC from "./GenerateCC";
+
+export default function Home() {
+ const location = useLocation(); // Pegando a rota atual
+
+ // Efeito para rolar até a seção correspondente ao path
+ useEffect(() => {
+ const featuresSection = document.getElementById(location.hash.substring(1));
+ if (featuresSection) {
+ featuresSection.scrollIntoView({ behavior: "smooth" });
+ }
+
+ }, [location]);
+
+ return (
+
+
+
+ {/* Seção de Introdução */}
+
+
+ Generate Your NIF, NISS, and Cartão de Cidadão Easily
+
+
+ Welcome to our platform where you can easily generate your NIF, NISS, and Cartão de Cidadão without the hassle. Get started now and simplify your documentation process!
+
+
+
+ {/* Seção de Funcionalidades */}
+
+
+
+ );
+}
diff --git a/geradoresfe/tailwind.config.js b/geradoresfe/tailwind.config.js
index a16363e..0e6043c 100644
--- a/geradoresfe/tailwind.config.js
+++ b/geradoresfe/tailwind.config.js
@@ -1,11 +1,189 @@
-/** @type {import('tailwindcss').Config} */
+const defaultTheme = require("tailwindcss/defaultTheme");
+// @type {import('tailwindcss').Config}
module.exports = {
- darkMode: 'class', // Enable dark mode with a class
- content: [
- "./src/**/*.{js,jsx,ts,tsx}",
- ],
+ content: ["./src/**/*.{js,jsx,ts,tsx}"],
+ darkMode: "class",
theme: {
- extend: {},
+ fontFamily: {
+ outfit: ["Outfit", "sans-serif"],
+ },
+ screens: {
+ "2xsm": "375px",
+ xsm: "425px",
+ "3xl": "2000px",
+ ...defaultTheme.screens,
+ },
+ extend: {
+ fontSize: {
+ "title-2xl": ["72px", "90px"],
+ "title-xl": ["60px", "72px"],
+ "title-lg": ["48px", "60px"],
+ "title-md": ["36px", "44px"],
+ "title-sm": ["30px", "38px"],
+ "theme-xl": ["20px", "30px"],
+ "theme-sm": ["14px", "20px"],
+ "theme-xs": ["12px", "18px"],
+ },
+ colors: {
+ current: "currentColor",
+ transparent: "transparent",
+ white: "#FFFFFF",
+ black: "#101828",
+ brand: {
+ 25: "#F2F7FF",
+ 50: "#ECF3FF",
+ 100: "#DDE9FF",
+ 200: "#C2D6FF",
+ 300: "#9CB9FF",
+ 400: "#7592FF",
+ 500: "#465FFF",
+ 600: "#3641F5",
+ 700: "#2A31D8",
+ 800: "#252DAE",
+ 900: "#262E89",
+ 950: "#161950",
+ },
+ "blue-light": {
+ 25: "#F5FBFF",
+ 50: "#F0F9FF",
+ 100: "#E0F2FE",
+ 200: "#B9E6FE",
+ 300: "#7CD4FD",
+ 400: "#36BFFA",
+ 500: "#0BA5EC",
+ 600: "#0086C9",
+ 700: "#026AA2",
+ 800: "#065986",
+ 900: "#0B4A6F",
+ 950: "#062C41",
+ },
+ gray: {
+ dark: "#1A2231",
+ 25: "#FCFCFD",
+ 50: "#F9FAFB",
+ 100: "#F2F4F7",
+ 200: "#E4E7EC",
+ 300: "#D0D5DD",
+ 400: "#98A2B3",
+ 500: "#667085",
+ 600: "#475467",
+ 700: "#344054",
+ 800: "#1D2939",
+ 900: "#101828",
+ 950: "#0C111D",
+ },
+ orange: {
+ 25: "#FFFAF5",
+ 50: "#FFF6ED",
+ 100: "#FFEAD5",
+ 200: "#FDDCAB",
+ 300: "#FEB273",
+ 400: "#FD853A",
+ 500: "#FB6514",
+ 600: "#EC4A0A",
+ 700: "#C4320A",
+ 800: "#9C2A10",
+ 900: "#7E2410",
+ 950: "#511C10",
+ },
+ success: {
+ 25: "#F6FEF9",
+ 50: "#ECFDF3",
+ 100: "#D1FADF",
+ 200: "#A6F4C5",
+ 300: "#6CE9A6",
+ 400: "#32D583",
+ 500: "#12B76A",
+ 600: "#039855",
+ 700: "#027A48",
+ 800: "#05603A",
+ 900: "#054F31",
+ 950: "#053321",
+ },
+ error: {
+ 25: "#FFFBFA",
+ 50: "#FEF3F2",
+ 100: "#FEE4E2",
+ 200: "#FECDCA",
+ 300: "#FDA29B",
+ 400: "#F97066",
+ 500: "#F04438",
+ 600: "#D92D20",
+ 700: "#B42318",
+ 800: "#912018",
+ 900: "#7A271A",
+ 950: "#55160C",
+ },
+ warning: {
+ 25: "#FFFCF5",
+ 50: "#FFFAEB",
+ 100: "#FEF0C7",
+ 200: "#FEDF89",
+ 300: "#FEC84B",
+ 400: "#FDB022",
+ 500: "#F79009",
+ 600: "#DC6803",
+ 700: "#B54708",
+ 800: "#93370D",
+ 900: "#7A2E0E",
+ 950: "#4E1D09",
+ },
+ "theme-pink": {
+ 500: "#EE46BC",
+ },
+ "theme-purple": {
+ 500: "#7A5AF8",
+ },
+ },
+ boxShadow: {
+ "theme-md":
+ "0px 4px 8px -2px rgba(16, 24, 40, 0.10), 0px 2px 4px -2px rgba(16, 24, 40, 0.06)",
+ "theme-lg":
+ "0px 12px 16px -4px rgba(16, 24, 40, 0.08), 0px 4px 6px -2px rgba(16, 24, 40, 0.03)",
+
+ "theme-sm":
+ "0px 1px 3px 0px rgba(16, 24, 40, 0.10), 0px 1px 2px 0px rgba(16, 24, 40, 0.06)",
+ "theme-xs": "0px 1px 2px 0px rgba(16, 24, 40, 0.05)",
+ "theme-xl":
+ "0px 20px 24px -4px rgba(16, 24, 40, 0.08), 0px 8px 8px -4px rgba(16, 24, 40, 0.03)",
+ datepicker: "-5px 0 0 #262d3c, 5px 0 0 #262d3c",
+ "focus-ring": "0px 0px 0px 4px rgba(70, 95, 255, 0.12)",
+ "slider-navigation":
+ "0px 1px 2px 0px rgba(16, 24, 40, 0.10), 0px 1px 3px 0px rgba(16, 24, 40, 0.10)",
+ tooltip:
+ "0px 4px 6px -2px rgba(16, 24, 40, 0.05), -8px 0px 20px 8px rgba(16, 24, 40, 0.05)",
+ },
+ dropShadow: {
+ "4xl": [
+ "0 35px 35px rgba(0, 0, 0, 0.25)",
+ "0 45px 65px rgba(0, 0, 0, 0.15)",
+ ],
+ },
+ zIndex: {
+ 999999: "999999",
+ 99999: "99999",
+ 9999: "9999",
+ 999: "999",
+ 99: "99",
+ 9: "9",
+ 1: "1",
+ },
+ spacing: {
+ 4.5: "1.125rem",
+ 5.5: "1.375rem",
+ 6.5: "1.625rem",
+ 7.5: "1.875rem",
+ 8.5: "2.125rem",
+ 9.5: "2.375rem",
+ 10.5: "2.625rem",
+ 11.5: "2.875rem",
+ 12.5: "3.125rem",
+ 13: "3.25rem",
+ 13.5: "3.375rem",
+ 14.5: "3.625rem",
+ 15: "3.75rem",
+ },
+ },
},
- plugins: [],
-}
\ No newline at end of file
+ plugins: [require("@tailwindcss/forms"), require("autoprefixer")],
+};
diff --git a/geradoresfe/tsconfig.json b/geradoresfe/tsconfig.json
index a273b0c..70ca855 100644
--- a/geradoresfe/tsconfig.json
+++ b/geradoresfe/tsconfig.json
@@ -1,11 +1,7 @@
{
"compilerOptions": {
"target": "es5",
- "lib": [
- "dom",
- "dom.iterable",
- "esnext"
- ],
+ "lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
@@ -20,7 +16,5 @@
"noEmit": true,
"jsx": "react-jsx"
},
- "include": [
- "src"
- ]
+ "include": ["src/**/*"]
}
|