From 699cd1500740cc3459067b451fff1c952ce7a081 Mon Sep 17 00:00:00 2001 From: Subhajit Karmakar Date: Thu, 22 May 2025 22:29:55 +0530 Subject: [PATCH 01/11] component(layout): Universal Routing set --- client/src/App.tsx | 17 +++++++++++------ client/src/colors.css | 3 +++ client/src/components/Layout/Layout.tsx | 11 +++++++++++ client/src/global.css | 4 ++++ client/src/index.css | 2 ++ 5 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 client/src/colors.css diff --git a/client/src/App.tsx b/client/src/App.tsx index 0871e65..04dd68e 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -1,12 +1,17 @@ -import React from 'react'; +import React, { lazy } from 'react'; +import {BrowserRouter,Routes,Route,useLocation} from "react-router-dom"; +// COMPONENTS +const Layout = lazy(() => import ("./components/Layout/Layout")); +// ICONS +//STORE const App: React.FC = () => { return ( -
-
- SNIPPETLABS -
-
+ + + }/> + + ); }; diff --git a/client/src/colors.css b/client/src/colors.css new file mode 100644 index 0000000..e9f6d76 --- /dev/null +++ b/client/src/colors.css @@ -0,0 +1,3 @@ +.BLACK-PRIMARY { + @apply bg-[#0f0f0f] +} \ No newline at end of file diff --git a/client/src/components/Layout/Layout.tsx b/client/src/components/Layout/Layout.tsx index e69de29..d9fc9b4 100644 --- a/client/src/components/Layout/Layout.tsx +++ b/client/src/components/Layout/Layout.tsx @@ -0,0 +1,11 @@ +import React from 'react' + +const Layout: React.FC = () => { + return ( +
+ +
+ ) +} + +export default Layout diff --git a/client/src/global.css b/client/src/global.css index e69de29..f03635a 100644 --- a/client/src/global.css +++ b/client/src/global.css @@ -0,0 +1,4 @@ + +.CONTAINER { + @apply w-full h-screen ; +} \ No newline at end of file diff --git a/client/src/index.css b/client/src/index.css index f1d8c73..81eb643 100644 --- a/client/src/index.css +++ b/client/src/index.css @@ -1 +1,3 @@ @import "tailwindcss"; +@import "./global.css"; +@import "./colors.css" From 928b411c05db7c93aa6c97df3e7d793c624d3d95 Mon Sep 17 00:00:00 2001 From: SUVAJIT-KARMAKAR Date: Thu, 22 May 2025 23:15:19 +0530 Subject: [PATCH 02/11] component(navigation): add page loader; add layout routing --- client/src/App.tsx | 37 ++++++++++++++----- client/src/colors.css | 3 -- .../src/components/General/Footer/Footer.tsx | 7 ++++ .../General/NavigationBar/NavigationBar.tsx | 7 ++++ client/src/components/Layout/Layout.tsx | 21 ++++++++--- client/src/global.css | 8 ++-- client/src/index.css | 8 ++-- client/src/utils/Loader/Loader.styles.css | 3 ++ client/src/utils/Loader/Loader.tsx | 15 ++++++++ 9 files changed, 84 insertions(+), 25 deletions(-) delete mode 100644 client/src/colors.css create mode 100644 client/src/components/General/Footer/Footer.tsx create mode 100644 client/src/components/General/NavigationBar/NavigationBar.tsx create mode 100644 client/src/utils/Loader/Loader.styles.css create mode 100644 client/src/utils/Loader/Loader.tsx diff --git a/client/src/App.tsx b/client/src/App.tsx index 04dd68e..8eb01f8 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -1,17 +1,36 @@ -import React, { lazy } from 'react'; -import {BrowserRouter,Routes,Route,useLocation} from "react-router-dom"; -// COMPONENTS -const Layout = lazy(() => import ("./components/Layout/Layout")); +import React, { lazy, Suspense, useEffect, useState } from 'react'; +import { BrowserRouter, Routes, Route, useLocation } from 'react-router-dom'; +// COMPONENTS +import Loader from './utils/Loader/Loader'; +const Layout = lazy(() => import('./components/Layout/Layout')); // ICONS //STORE +const Content: React.FC = () => { + // STATES + const location = useLocation(); + const [isLoading, setIsLoading] = useState(() => false); + + useEffect(() => { + setIsLoading(true); + const loadingTime = setTimeout(() => { + setIsLoading(false); + }, 2000); + + return () => clearTimeout(loadingTime); + }, [location.pathname]); + return isLoading ? : ; +}; + const App: React.FC = () => { return ( - - - }/> - - + }> + + + } /> + + + ); }; diff --git a/client/src/colors.css b/client/src/colors.css deleted file mode 100644 index e9f6d76..0000000 --- a/client/src/colors.css +++ /dev/null @@ -1,3 +0,0 @@ -.BLACK-PRIMARY { - @apply bg-[#0f0f0f] -} \ No newline at end of file diff --git a/client/src/components/General/Footer/Footer.tsx b/client/src/components/General/Footer/Footer.tsx new file mode 100644 index 0000000..df8514b --- /dev/null +++ b/client/src/components/General/Footer/Footer.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const Footer: React.FC = () => { + return
; +}; + +export default Footer; diff --git a/client/src/components/General/NavigationBar/NavigationBar.tsx b/client/src/components/General/NavigationBar/NavigationBar.tsx new file mode 100644 index 0000000..6f7263b --- /dev/null +++ b/client/src/components/General/NavigationBar/NavigationBar.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const NavigationBar: React.FC = () => { + return
; +}; + +export default NavigationBar; diff --git a/client/src/components/Layout/Layout.tsx b/client/src/components/Layout/Layout.tsx index d9fc9b4..61cb699 100644 --- a/client/src/components/Layout/Layout.tsx +++ b/client/src/components/Layout/Layout.tsx @@ -1,11 +1,20 @@ -import React from 'react' +import React from 'react'; +import { Routes, Route } from 'react-router-dom'; + +// COMPONENTS +import NavigationBar from '../General/NavigationBar/NavigationBar'; +import Footer from '../General/Footer/Footer'; const Layout: React.FC = () => { return ( -
- +
+ + + } /> + +
- ) -} + ); +}; -export default Layout +export default Layout; diff --git a/client/src/global.css b/client/src/global.css index f03635a..3529e88 100644 --- a/client/src/global.css +++ b/client/src/global.css @@ -1,4 +1,4 @@ - -.CONTAINER { - @apply w-full h-screen ; -} \ No newline at end of file +/* COLORS */ +.BG-BLACK-PRIMARY { + @apply bg-[#0F0F0F]; +} diff --git a/client/src/index.css b/client/src/index.css index 81eb643..39c4ff1 100644 --- a/client/src/index.css +++ b/client/src/index.css @@ -1,3 +1,5 @@ -@import "tailwindcss"; -@import "./global.css"; -@import "./colors.css" +@import 'tailwindcss'; +@import './global.css'; + +/* LOADERS */ +@import './utils/Loader/Loader.styles.css'; diff --git a/client/src/utils/Loader/Loader.styles.css b/client/src/utils/Loader/Loader.styles.css new file mode 100644 index 0000000..7d6a63f --- /dev/null +++ b/client/src/utils/Loader/Loader.styles.css @@ -0,0 +1,3 @@ +.LOADER { + @apply h-screen w-full flex items-center justify-center; +} diff --git a/client/src/utils/Loader/Loader.tsx b/client/src/utils/Loader/Loader.tsx new file mode 100644 index 0000000..bdaa647 --- /dev/null +++ b/client/src/utils/Loader/Loader.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +// LDRS +import { Hatch } from 'ldrs/react'; +import 'ldrs/react/Hatch.css'; + +const Loader: React.FC = () => { + return ( +
+ +
+ ); +}; + +export default Loader; From ea48be045b40fdea96089e45ca8005d9f5f557e6 Mon Sep 17 00:00:00 2001 From: SUVAJIT-KARMAKAR Date: Fri, 23 May 2025 00:24:25 +0530 Subject: [PATCH 03/11] component(navigation): add navigation component; add favicon --- client/index.html | 7 ++- client/public/logos/__favicon.png | Bin 0 -> 54299 bytes .../NavigationBar/Navigation.styles.css | 3 ++ .../General/NavigationBar/NavigationBar.tsx | 19 +++++++- client/src/components/Layout/Layout.tsx | 12 +++-- .../data/NavigationLinks/NavigationLinks.ts | 41 ++++++++++++++++++ .../NavigationLinks/NavigationLinks.types.ts | 5 +++ client/src/global.css | 11 +++++ client/src/index.css | 8 ++++ 9 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 client/public/logos/__favicon.png create mode 100644 client/src/components/General/NavigationBar/Navigation.styles.css create mode 100644 client/src/data/NavigationLinks/NavigationLinks.ts create mode 100644 client/src/data/NavigationLinks/NavigationLinks.types.ts diff --git a/client/index.html b/client/index.html index 7cba1b9..5aaeea2 100644 --- a/client/index.html +++ b/client/index.html @@ -3,8 +3,13 @@ - + + + + + + SNIPPETLABS | Offical page diff --git a/client/public/logos/__favicon.png b/client/public/logos/__favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..ba8c0c8bb6a5e1826079f9107a09dcf5affbb120 GIT binary patch literal 54299 zcmYhiXFyZW^F5q|0Fjyi(n|Ncms<`uRN%Z^Dba_s-6qIdgVqH%dcIiIj+*2m}I=-c`nGfj|)8UkC_B0Q~HG zjhzBNU{@_Ac~JRR##Imq3A&4w)A2Ie@FUD%dz8A>@IYl&WmbArT1dLjG`1#=Qk0!G zq=P-9_68r1x2fI;Z$Iz0Im^b@LdUdWnv&p7uSBOAzez|3EyFbJa%7EkHe*xK^TzS# zZ@1Pjb!>T3$8MKA*1GlbkKg%0DACbH{oAdE<+Ekk=)!A|V2l_WoROKC`H@Q5LzOaA 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 O0000 { - return
; + return ( +
+
{`{?:}`}
+
+
    + {NAVIGATION_LINKS.map(({ name, path }, id) => ( +
  • + {name} +
  • + ))} +
+
+
+ ); }; export default NavigationBar; diff --git a/client/src/components/Layout/Layout.tsx b/client/src/components/Layout/Layout.tsx index 61cb699..96f25db 100644 --- a/client/src/components/Layout/Layout.tsx +++ b/client/src/components/Layout/Layout.tsx @@ -1,17 +1,21 @@ -import React from 'react'; +import React, {Suspense} from 'react'; import { Routes, Route } from 'react-router-dom'; // COMPONENTS import NavigationBar from '../General/NavigationBar/NavigationBar'; import Footer from '../General/Footer/Footer'; +import Loader from '../../utils/Loader/Loader'; const Layout: React.FC = () => { return (
- - } /> - + }> + + } /> + + +
); diff --git a/client/src/data/NavigationLinks/NavigationLinks.ts b/client/src/data/NavigationLinks/NavigationLinks.ts new file mode 100644 index 0000000..7b841b5 --- /dev/null +++ b/client/src/data/NavigationLinks/NavigationLinks.ts @@ -0,0 +1,41 @@ +import type { NavigationLinkProps } from "./NavigationLinks.types"; + +const NAVIGATION_LINKS: NavigationLinkProps[] = [ + { + id: 1, + name: "Home", + path: "/home" + }, + { + id: 2, + name: "AboutUs", + path: "/about-us" + }, + { + id: 3, + name: "TechStack", + path: "/tech-stack" + }, + { + id: 4, + name: "Client", + path: "/client-projects" + }, + { + id: 5, + name: "Products", + path: "/products" + }, + { + id: 6, + name: "Team", + path: "/team" + }, + { + id: 7, + name: "Contact", + path: '/contact-us' + } +]; + +export default NAVIGATION_LINKS; \ No newline at end of file diff --git a/client/src/data/NavigationLinks/NavigationLinks.types.ts b/client/src/data/NavigationLinks/NavigationLinks.types.ts new file mode 100644 index 0000000..2e631ee --- /dev/null +++ b/client/src/data/NavigationLinks/NavigationLinks.types.ts @@ -0,0 +1,5 @@ +export type NavigationLinkProps = { + id: number; + name: string; + path: string; +} \ No newline at end of file diff --git a/client/src/global.css b/client/src/global.css index 3529e88..82089e6 100644 --- a/client/src/global.css +++ b/client/src/global.css @@ -2,3 +2,14 @@ .BG-BLACK-PRIMARY { @apply bg-[#0F0F0F]; } +.TEXT-PRIMARY { + @apply text-white; +} + +/* UNIVERSAL */ +.FLEX-CENTER { + @apply flex items-center justify-center; +} +.FLEX-BETWEEN { + @apply flex items-center justify-between; +} \ No newline at end of file diff --git a/client/src/index.css b/client/src/index.css index 39c4ff1..c393cfc 100644 --- a/client/src/index.css +++ b/client/src/index.css @@ -1,5 +1,13 @@ @import 'tailwindcss'; @import './global.css'; +/* FONTS */ +@theme { + --font-style: 'Monoton', sans-serif; +} + /* LOADERS */ @import './utils/Loader/Loader.styles.css'; + +/* COMPONENTS */ +@import './components/General/NavigationBar/Navigation.styles.css'; From 41390b44434bf468dca389579de72d305f3e1ac3 Mon Sep 17 00:00:00 2001 From: SUVAJIT-KARMAKAR Date: Sat, 24 May 2025 00:49:21 +0530 Subject: [PATCH 04/11] component(navigation): cosmetic change in navigation bar --- client/src/App.tsx | 3 ++- .../NavigationBar/Navigation.styles.css | 5 ++++- .../General/NavigationBar/NavigationBar.tsx | 19 ++++++++++++----- client/src/components/Layout/Layout.tsx | 5 +++-- .../data/NavigationLinks/NavigationLinks.ts | 5 ----- client/src/global.css | 21 +++++++++++++++++-- client/src/index.css | 2 +- client/src/utils/Logo/Logo.tsx | 10 +++++++++ client/src/utils/Logo/Logo.types.tsx | 3 +++ 9 files changed, 56 insertions(+), 17 deletions(-) create mode 100644 client/src/utils/Logo/Logo.tsx create mode 100644 client/src/utils/Logo/Logo.types.tsx diff --git a/client/src/App.tsx b/client/src/App.tsx index 8eb01f8..6890057 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -1,8 +1,9 @@ import React, { lazy, Suspense, useEffect, useState } from 'react'; import { BrowserRouter, Routes, Route, useLocation } from 'react-router-dom'; // COMPONENTS -import Loader from './utils/Loader/Loader'; const Layout = lazy(() => import('./components/Layout/Layout')); +// UTILS +import Loader from './utils/Loader/Loader'; // ICONS //STORE diff --git a/client/src/components/General/NavigationBar/Navigation.styles.css b/client/src/components/General/NavigationBar/Navigation.styles.css index 9cd4d73..19a8df1 100644 --- a/client/src/components/General/NavigationBar/Navigation.styles.css +++ b/client/src/components/General/NavigationBar/Navigation.styles.css @@ -1,3 +1,6 @@ .LINKS { - @apply border-1 border-white rounded-md px-3 py-2; + @apply rounded-2xl bg-white/20 shadow-lg ring-2 ring-black/10 px-3 py-4; +} +.LINKS-ACTIVE { + @apply text-black rounded-xl shadow-lg border-1 p-3; } diff --git a/client/src/components/General/NavigationBar/NavigationBar.tsx b/client/src/components/General/NavigationBar/NavigationBar.tsx index 7a8077e..fc11ce6 100644 --- a/client/src/components/General/NavigationBar/NavigationBar.tsx +++ b/client/src/components/General/NavigationBar/NavigationBar.tsx @@ -1,18 +1,27 @@ import React from 'react'; import { NavLink } from 'react-router-dom'; +// UTILS +import Logo from '../../../utils/Logo/Logo'; // DATA import NAVIGATION_LINKS from '../../../data/NavigationLinks/NavigationLinks'; const NavigationBar: React.FC = () => { return ( -
-
{`{?:}`}
+
+
-
    +
      {NAVIGATION_LINKS.map(({ name, path }, id) => ( -
    • - {name} +
    • + + isActive ? 'LINKS-ACTIVE BG-WHITE-PRIMARY' : '' + } + > + {name} +
    • ))}
    diff --git a/client/src/components/Layout/Layout.tsx b/client/src/components/Layout/Layout.tsx index 96f25db..1ddf1cc 100644 --- a/client/src/components/Layout/Layout.tsx +++ b/client/src/components/Layout/Layout.tsx @@ -1,16 +1,17 @@ -import React, {Suspense} from 'react'; +import React, { Suspense } from 'react'; import { Routes, Route } from 'react-router-dom'; // COMPONENTS import NavigationBar from '../General/NavigationBar/NavigationBar'; import Footer from '../General/Footer/Footer'; +// UTILS import Loader from '../../utils/Loader/Loader'; const Layout: React.FC = () => { return (
    - }> + }> } /> diff --git a/client/src/data/NavigationLinks/NavigationLinks.ts b/client/src/data/NavigationLinks/NavigationLinks.ts index 7b841b5..0490ba4 100644 --- a/client/src/data/NavigationLinks/NavigationLinks.ts +++ b/client/src/data/NavigationLinks/NavigationLinks.ts @@ -30,11 +30,6 @@ const NAVIGATION_LINKS: NavigationLinkProps[] = [ id: 6, name: "Team", path: "/team" - }, - { - id: 7, - name: "Contact", - path: '/contact-us' } ]; diff --git a/client/src/global.css b/client/src/global.css index 82089e6..32b565e 100644 --- a/client/src/global.css +++ b/client/src/global.css @@ -2,9 +2,22 @@ .BG-BLACK-PRIMARY { @apply bg-[#0F0F0F]; } -.TEXT-PRIMARY { +.BG-WHITE-PRIMARY { + @apply bg-white; +} +.BG-WHITE-SECONDARY { + @apply bg-white/80; +} + +.TEXT-COLOR-PRIMARY { @apply text-white; } +.TEXT-COLOR-PRIMARY-HOVER { + @apply hover:text-white; +} +.GRAY-300 { + @apply text-gray-300; +} /* UNIVERSAL */ .FLEX-CENTER { @@ -12,4 +25,8 @@ } .FLEX-BETWEEN { @apply flex items-center justify-between; -} \ No newline at end of file +} + +.PADDING { + @apply px-5; +} diff --git a/client/src/index.css b/client/src/index.css index c393cfc..4ced832 100644 --- a/client/src/index.css +++ b/client/src/index.css @@ -3,7 +3,7 @@ /* FONTS */ @theme { - --font-style: 'Monoton', sans-serif; + --font-style-logo: 'Monoton', sans-serif; } /* LOADERS */ diff --git a/client/src/utils/Logo/Logo.tsx b/client/src/utils/Logo/Logo.tsx new file mode 100644 index 0000000..6822798 --- /dev/null +++ b/client/src/utils/Logo/Logo.tsx @@ -0,0 +1,10 @@ +import React from 'react'; + +// TYPES +import type { LogoProps } from './Logo.types'; + +const Logo: React.FC = ({ className }) => { + return
    {`{?:}`}
    ; +}; + +export default Logo; diff --git a/client/src/utils/Logo/Logo.types.tsx b/client/src/utils/Logo/Logo.types.tsx new file mode 100644 index 0000000..b5d2a88 --- /dev/null +++ b/client/src/utils/Logo/Logo.types.tsx @@ -0,0 +1,3 @@ +export interface LogoProps { + className: string; +} From 85eae3bbae7180115ce12bbe323858581b67930f Mon Sep 17 00:00:00 2001 From: SUVAJIT-KARMAKAR Date: Sat, 24 May 2025 01:06:20 +0530 Subject: [PATCH 05/11] component(navigation): add contact button --- .../NavigationBar/Navigation.styles.css | 6 +++- .../General/NavigationBar/NavigationBar.tsx | 33 ++++++++++--------- client/src/global.css | 10 +++++- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/client/src/components/General/NavigationBar/Navigation.styles.css b/client/src/components/General/NavigationBar/Navigation.styles.css index 19a8df1..a3d242a 100644 --- a/client/src/components/General/NavigationBar/Navigation.styles.css +++ b/client/src/components/General/NavigationBar/Navigation.styles.css @@ -2,5 +2,9 @@ @apply rounded-2xl bg-white/20 shadow-lg ring-2 ring-black/10 px-3 py-4; } .LINKS-ACTIVE { - @apply text-black rounded-xl shadow-lg border-1 p-3; + @apply text-black rounded-xl shadow-lg border-1 p-3; +} + +.BUTTON { + @apply rounded-2xl bg-white shadow-lg ring-2 px-4 py-4; } diff --git a/client/src/components/General/NavigationBar/NavigationBar.tsx b/client/src/components/General/NavigationBar/NavigationBar.tsx index fc11ce6..02661ec 100644 --- a/client/src/components/General/NavigationBar/NavigationBar.tsx +++ b/client/src/components/General/NavigationBar/NavigationBar.tsx @@ -10,21 +10,24 @@ const NavigationBar: React.FC = () => { return (
    -
    -
      - {NAVIGATION_LINKS.map(({ name, path }, id) => ( -
    • - - isActive ? 'LINKS-ACTIVE BG-WHITE-PRIMARY' : '' - } - > - {name} - -
    • - ))} -
    +
    +
    +
      + {NAVIGATION_LINKS.map(({ name, path }, id) => ( +
    • + + isActive ? 'LINKS-ACTIVE BG-WHITE-PRIMARY' : '' + } + > + {name} + +
    • + ))} +
    +
    +
    Contract
    ); diff --git a/client/src/global.css b/client/src/global.css index 32b565e..5c0fd8e 100644 --- a/client/src/global.css +++ b/client/src/global.css @@ -1,4 +1,4 @@ -/* COLORS */ +/* BACKGROUND */ .BG-BLACK-PRIMARY { @apply bg-[#0F0F0F]; } @@ -9,12 +9,16 @@ @apply bg-white/80; } +/* COLORS */ .TEXT-COLOR-PRIMARY { @apply text-white; } .TEXT-COLOR-PRIMARY-HOVER { @apply hover:text-white; } +.TEXT-BLACK-PRIMARY { + @apply text-black; +} .GRAY-300 { @apply text-gray-300; } @@ -30,3 +34,7 @@ .PADDING { @apply px-5; } + +.POINTER { + @apply hover:cursor-pointer; +} From e02acab502bca2df020eff8ddb462201f32801b8 Mon Sep 17 00:00:00 2001 From: SUVAJIT-KARMAKAR Date: Sat, 24 May 2025 01:12:52 +0530 Subject: [PATCH 06/11] component(navigation): add cosmetic change for font text --- .../components/General/NavigationBar/Navigation.styles.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/components/General/NavigationBar/Navigation.styles.css b/client/src/components/General/NavigationBar/Navigation.styles.css index a3d242a..6a6d49e 100644 --- a/client/src/components/General/NavigationBar/Navigation.styles.css +++ b/client/src/components/General/NavigationBar/Navigation.styles.css @@ -1,10 +1,10 @@ .LINKS { - @apply rounded-2xl bg-white/20 shadow-lg ring-2 ring-black/10 px-3 py-4; + @apply font-semibold rounded-2xl bg-white/20 shadow-lg ring-2 ring-black/10 px-3 py-4; } .LINKS-ACTIVE { @apply text-black rounded-xl shadow-lg border-1 p-3; } .BUTTON { - @apply rounded-2xl bg-white shadow-lg ring-2 px-4 py-4; + @apply font-semibold rounded-2xl bg-white shadow-lg ring-2 px-4 py-4; } From 0a4673d9205206798db3801275cce6100dfc59e0 Mon Sep 17 00:00:00 2001 From: SUVAJIT-KARMAKAR Date: Sat, 24 May 2025 01:50:49 +0530 Subject: [PATCH 07/11] component(navigation): add responsive block for navigation --- client/src/App.tsx | 2 +- .../components/General/NavigationBar/NavigationBar.tsx | 6 +++--- client/src/global.css | 9 +++++++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/client/src/App.tsx b/client/src/App.tsx index 6890057..70987b9 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -16,7 +16,7 @@ const Content: React.FC = () => { setIsLoading(true); const loadingTime = setTimeout(() => { setIsLoading(false); - }, 2000); + }, 1000); return () => clearTimeout(loadingTime); }, [location.pathname]); diff --git a/client/src/components/General/NavigationBar/NavigationBar.tsx b/client/src/components/General/NavigationBar/NavigationBar.tsx index 02661ec..a64c0e2 100644 --- a/client/src/components/General/NavigationBar/NavigationBar.tsx +++ b/client/src/components/General/NavigationBar/NavigationBar.tsx @@ -9,12 +9,12 @@ import NAVIGATION_LINKS from '../../../data/NavigationLinks/NavigationLinks'; const NavigationBar: React.FC = () => { return (
    - -
    + +
      {NAVIGATION_LINKS.map(({ name, path }, id) => ( -
    • +
    • diff --git a/client/src/global.css b/client/src/global.css index 5c0fd8e..9a57e4f 100644 --- a/client/src/global.css +++ b/client/src/global.css @@ -10,10 +10,10 @@ } /* COLORS */ -.TEXT-COLOR-PRIMARY { +.TEXT-WHITE-PRIMARY { @apply text-white; } -.TEXT-COLOR-PRIMARY-HOVER { +.TEXT-WHITE-PRIMARY-HOVER { @apply hover:text-white; } .TEXT-BLACK-PRIMARY { @@ -38,3 +38,8 @@ .POINTER { @apply hover:cursor-pointer; } + +/* RESPONSIVE */ +.RESPONSIVE-CENTER-BLOCK { + @apply hidden lg:flex items-center justify-center; +} From 87625b5b0dc31259371b70c819951015317f9c91 Mon Sep 17 00:00:00 2001 From: SUVAJIT-KARMAKAR Date: Sat, 24 May 2025 12:59:36 +0530 Subject: [PATCH 08/11] component(navigation)(DS1): add contact button with routing; DS1 navigation component complete --- .../src/components/General/NavigationBar/NavigationBar.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/components/General/NavigationBar/NavigationBar.tsx b/client/src/components/General/NavigationBar/NavigationBar.tsx index a64c0e2..e0dd5dc 100644 --- a/client/src/components/General/NavigationBar/NavigationBar.tsx +++ b/client/src/components/General/NavigationBar/NavigationBar.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { NavLink } from 'react-router-dom'; +import { NavLink, Link } from 'react-router-dom'; // UTILS import Logo from '../../../utils/Logo/Logo'; @@ -27,7 +27,9 @@ const NavigationBar: React.FC = () => { ))}
    -
    Contract
    + + Contract +
    ); From ac16f2705b1e86fc526706c06b87ac247911bb5d Mon Sep 17 00:00:00 2001 From: SUVAJIT-KARMAKAR Date: Sat, 24 May 2025 13:54:46 +0530 Subject: [PATCH 09/11] component(navigation)(MS1): add mobile navigation icon --- .../General/NavigationBar/Navigation.styles.css | 9 +++++++-- .../General/NavigationBar/NavigationBar.tsx | 13 ++++++++++--- client/src/global.css | 11 ++++++----- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/client/src/components/General/NavigationBar/Navigation.styles.css b/client/src/components/General/NavigationBar/Navigation.styles.css index 6a6d49e..df65a08 100644 --- a/client/src/components/General/NavigationBar/Navigation.styles.css +++ b/client/src/components/General/NavigationBar/Navigation.styles.css @@ -1,10 +1,15 @@ -.LINKS { +/* Desktop and Mobile Navigation links */ +.DESKTOP-LINKS { @apply font-semibold rounded-2xl bg-white/20 shadow-lg ring-2 ring-black/10 px-3 py-4; } -.LINKS-ACTIVE { +.DESKTOP-LINKS-ACTIVE { @apply text-black rounded-xl shadow-lg border-1 p-3; } +.MOBILE-LINKS { + @apply font-semibold rounded-xl bg-white/20 shadow-lg ring-2 ring-black/10 p-3; +} +/* Button */ .BUTTON { @apply font-semibold rounded-2xl bg-white shadow-lg ring-2 px-4 py-4; } diff --git a/client/src/components/General/NavigationBar/NavigationBar.tsx b/client/src/components/General/NavigationBar/NavigationBar.tsx index e0dd5dc..44ee296 100644 --- a/client/src/components/General/NavigationBar/NavigationBar.tsx +++ b/client/src/components/General/NavigationBar/NavigationBar.tsx @@ -1,6 +1,8 @@ import React from 'react'; import { NavLink, Link } from 'react-router-dom'; +// ICONS +import { HiMenuAlt3 } from 'react-icons/hi'; // UTILS import Logo from '../../../utils/Logo/Logo'; // DATA @@ -10,15 +12,16 @@ const NavigationBar: React.FC = () => { return (
    -
    -
    + {/* Desktop Navigation Bar */} +
    +
      {NAVIGATION_LINKS.map(({ name, path }, id) => (
    • - isActive ? 'LINKS-ACTIVE BG-WHITE-PRIMARY' : '' + isActive ? 'DESKTOP-LINKS-ACTIVE BG-WHITE-PRIMARY' : '' } > {name} @@ -31,6 +34,10 @@ const NavigationBar: React.FC = () => { Contract
    + {/* Mobile Navigation Bar */} +
    + +
    ); }; diff --git a/client/src/global.css b/client/src/global.css index 9a57e4f..3003b6d 100644 --- a/client/src/global.css +++ b/client/src/global.css @@ -27,9 +27,15 @@ .FLEX-CENTER { @apply flex items-center justify-center; } +.FLEX-CENTER-LG { + @apply lg:flex items-center justify-center; +} .FLEX-BETWEEN { @apply flex items-center justify-between; } +.FLEX-END { + @apply flex items-center justify-end; +} .PADDING { @apply px-5; @@ -38,8 +44,3 @@ .POINTER { @apply hover:cursor-pointer; } - -/* RESPONSIVE */ -.RESPONSIVE-CENTER-BLOCK { - @apply hidden lg:flex items-center justify-center; -} From 98ae85c6d978ef163decb1d5e1f66a833c09546a Mon Sep 17 00:00:00 2001 From: SUVAJIT-KARMAKAR Date: Sat, 24 May 2025 23:13:09 +0530 Subject: [PATCH 10/11] component(navigation)(MS1): add sidebar for mobile; cosmetic change in globals --- .../NavigationBar/Navigation.styles.css | 10 +- .../General/NavigationBar/NavigationBar.tsx | 141 ++++++++++++++---- client/src/global.css | 61 ++++++++ 3 files changed, 183 insertions(+), 29 deletions(-) diff --git a/client/src/components/General/NavigationBar/Navigation.styles.css b/client/src/components/General/NavigationBar/Navigation.styles.css index df65a08..1efc225 100644 --- a/client/src/components/General/NavigationBar/Navigation.styles.css +++ b/client/src/components/General/NavigationBar/Navigation.styles.css @@ -6,10 +6,18 @@ @apply text-black rounded-xl shadow-lg border-1 p-3; } .MOBILE-LINKS { - @apply font-semibold rounded-xl bg-white/20 shadow-lg ring-2 ring-black/10 p-3; + @apply font-semibold rounded-xl bg-white/20 shadow-lg ring-2 ring-black/10 p-2; +} +.MOBILE-LINKS-HOVER { + @apply font-semibold rounded-xl hover:bg-white/20 hover:shadow-lg hover:ring-2 hover:ring-black/10 p-2; } /* Button */ .BUTTON { @apply font-semibold rounded-2xl bg-white shadow-lg ring-2 px-4 py-4; } + +/* Border */ +.BORDER-LEFT-CORNER-3XL { + @apply border-l-3 border-white rounded-l-2xl; +} diff --git a/client/src/components/General/NavigationBar/NavigationBar.tsx b/client/src/components/General/NavigationBar/NavigationBar.tsx index 44ee296..6c830c6 100644 --- a/client/src/components/General/NavigationBar/NavigationBar.tsx +++ b/client/src/components/General/NavigationBar/NavigationBar.tsx @@ -1,44 +1,129 @@ -import React from 'react'; +import React, { useState } from 'react'; import { NavLink, Link } from 'react-router-dom'; // ICONS -import { HiMenuAlt3 } from 'react-icons/hi'; +import { HiMenuAlt3, HiX } from 'react-icons/hi'; // UTILS import Logo from '../../../utils/Logo/Logo'; // DATA import NAVIGATION_LINKS from '../../../data/NavigationLinks/NavigationLinks'; const NavigationBar: React.FC = () => { + // STATES + const [toggleSidebar, setToggleSidebar] = useState(() => false); + + // STATE HANDLER FUNCTION + const handleOpenSidebar = () => { + setToggleSidebar(!toggleSidebar); + }; + const handleCloseSidebar = () => { + setToggleSidebar(false); + }; + + // RENDER return ( -
    - - {/* Desktop Navigation Bar */} -
    -
    -
      - {NAVIGATION_LINKS.map(({ name, path }, id) => ( -
    • - - isActive ? 'DESKTOP-LINKS-ACTIVE BG-WHITE-PRIMARY' : '' - } - > - {name} - -
    • - ))} -
    + <> +
    + + {/* Desktop Navigation Bar */} +
    +
    +
      + {NAVIGATION_LINKS.map(({ name, path }, id) => ( +
    • + + isActive ? 'DESKTOP-LINKS-ACTIVE BG-WHITE-PRIMARY' : '' + } + > + {name} + +
    • + ))} +
    +
    + + Contract +
    - - Contract - + {/* Mobile Navigation Bar */} +
    - {/* Mobile Navigation Bar */} -
    - + + {/* Mobile Sidebar Toggle with Overlay */} +
    + {/* Backdrop */} +
    + + {/* Sidebar */} +
    + {/* Sidebar Header */} +
    + + +
    + + {/* Sidebar Content */} +
    + {/* Navigation Links */} + + + {/* Contact Button */} + + Contract + +
    +
    -
    + ); }; diff --git a/client/src/global.css b/client/src/global.css index 3003b6d..c8f7931 100644 --- a/client/src/global.css +++ b/client/src/global.css @@ -16,6 +16,12 @@ .TEXT-WHITE-PRIMARY-HOVER { @apply hover:text-white; } +.WHITE-20 { + @apply bg-white/20; +} +.WHITE-20-HOVER { + @apply hover:bg-white/20; +} .TEXT-BLACK-PRIMARY { @apply text-black; } @@ -23,7 +29,34 @@ @apply text-gray-300; } +/* FONT */ +.SEMIBOLD { + @apply font-semibold; +} + /* UNIVERSAL */ +.ABSOLUTE { + @apply absolute; +} +.FIXED { + @apply fixed; +} +.FULL { + @apply w-full; +} +.BLOCK { + @apply block; +} + +/* POSITION */ +.T0 { + @apply top-0; +} +.R0 { + @apply right-0; +} + +/* FLEX */ .FLEX-CENTER { @apply flex items-center justify-center; } @@ -37,10 +70,38 @@ @apply flex items-center justify-end; } +/* ALIGNMENT */ +.CENTER { + @apply text-center; +} + +/* PADDING */ .PADDING { @apply px-5; } +/* HOVER */ .POINTER { @apply hover:cursor-pointer; } + +/* EASE MOTION */ +.EASE { + @apply ease-in-out; +} + +/* DURATION */ +.D-300 { + @apply duration-300; +} + +/* TRANSITION */ +.TRANSFORM { + @apply transition-transform; +} +.COLORS { + @apply transition-colors; +} +.ALL { + @apply transition-all; +} From 60b7fb3905270c3375ba80456b5e4cf1a8c536d7 Mon Sep 17 00:00:00 2001 From: SUVAJIT-KARMAKAR Date: Sun, 25 May 2025 10:08:17 +0530 Subject: [PATCH 11/11] component(navigation)(MS1): add requested changes --- client/src/data/NavigationLinks/NavigationLinks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/data/NavigationLinks/NavigationLinks.ts b/client/src/data/NavigationLinks/NavigationLinks.ts index 0490ba4..2cfe130 100644 --- a/client/src/data/NavigationLinks/NavigationLinks.ts +++ b/client/src/data/NavigationLinks/NavigationLinks.ts @@ -4,7 +4,7 @@ const NAVIGATION_LINKS: NavigationLinkProps[] = [ { id: 1, name: "Home", - path: "/home" + path: "/" }, { id: 2,