diff --git a/domain.code-workspace b/domain.code-workspace index e312ba8..5a09e19 100644 --- a/domain.code-workspace +++ b/domain.code-workspace @@ -72,25 +72,9 @@ "javascript": "javascriptreact" }, "eslint.options": { - "extensions": [ - ".js", - ".jsx", - ".md", - ".mdx", - ".ts", - ".tsx", - ".astro" - ] + "extensions": [".js", ".jsx", ".md", ".mdx", ".ts", ".tsx", ".astro"] }, - "eslint.validate": [ - "mdx", - "markdown", - "javascript", - "javascriptreact", - "typescript", - "typescriptreact", - "astro" - ], + "eslint.validate": ["mdx", "markdown", "javascript", "javascriptreact", "typescript", "typescriptreact", "astro"], "explorer.compactFolders": false, "explorer.confirmDelete": false, "explorer.confirmDragAndDrop": false, @@ -127,10 +111,7 @@ }, "git.autofetch": true, "git.branchPrefix": "feature/", - "git.branchProtection": [ - "develop", - "main" - ], + "git.branchProtection": ["develop", "main"], "git.branchRandomName.enable": true, "git.confirmSync": false, "git.enableCommitSigning": false, @@ -141,9 +122,7 @@ "js/ts.implicitProjectConfig.checkJs": true, "peacock.affectSideBarBorder": true, "peacock.color": "#010010", - "prettier.documentSelectors": [ - "**/*.astro" - ], + "prettier.documentSelectors": ["**/*.astro"], "prettier.printWidth": 120, "prettier.quoteProps": "consistent", "prettier.singleQuote": false, @@ -169,11 +148,7 @@ "*.log": "default" }, "zenMode.centerLayout": false, - "cSpell.words": [ - "Poorna", - "Socie", - "withastro" - ], + "cSpell.words": ["Poorna", "Socie", "withastro"], "workbench.editor.limit.excludeDirty": true, "workbench.colorCustomizations": { "activityBar.activeBackground": "#040043", @@ -195,6 +170,6 @@ "titleBar.inactiveBackground": "#01001099", "titleBar.inactiveForeground": "#e7e7e799", "tab.activeBorder": "#040043" - }, + } } -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index cf75da6..63ddaa9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,10 @@ "@astrojs/react": "4.1.2", "@astrojs/rss": "4.0.11", "@astrojs/tailwind": "5.1.4", + "@fontsource/orbitron": "5.2.8", "@fontsource/roboto": "5.1.0", + "@fontsource/sora": "5.2.8", + "@fontsource/space-grotesk": "5.2.10", "@radix-ui/react-slot": "1.1.1", "astro": "5.1.1", "astro-aws-amplify": "0.1.0", @@ -1248,12 +1251,39 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fontsource/orbitron": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource/orbitron/-/orbitron-5.2.8.tgz", + "integrity": "sha512-ruzrDl5vnqNykk5DZWY0Ezj4aeFZSbCnwJTc/98ojNJHSsHhlhT2r7rwQrA5sptmF8JtB8TQTAvlfRvcV28RPw==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, "node_modules/@fontsource/roboto": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.1.0.tgz", "integrity": "sha512-cFRRC1s6RqPygeZ8Uw/acwVHqih8Czjt6Q0MwoUoDe9U3m4dH1HmNDRBZyqlMSFwgNAUKgFImncKdmDHyKpwdg==", "license": "Apache-2.0" }, + "node_modules/@fontsource/sora": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource/sora/-/sora-5.2.8.tgz", + "integrity": "sha512-1G6iTXUx8rcCKzi3mjaTQ1DE8PQz0OmW3Qnku+64S+bqRr1o/gGeiw8fxIQhhBU9ZP8ZofIqai7o00DNOPnlDw==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/space-grotesk": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/@fontsource/space-grotesk/-/space-grotesk-5.2.10.tgz", + "integrity": "sha512-XNXEbT74OIITPqw2H6HXwPDp85fy43uxfBwFR5PU+9sLnjuLj12KlhVM9nZVN6q6dlKjkuN8JisW/OBxwxgUew==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", diff --git a/package.json b/package.json index 21ae18b..570de51 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,10 @@ "@astrojs/react": "4.1.2", "@astrojs/rss": "4.0.11", "@astrojs/tailwind": "5.1.4", + "@fontsource/orbitron": "5.2.8", "@fontsource/roboto": "5.1.0", + "@fontsource/sora": "5.2.8", + "@fontsource/space-grotesk": "5.2.10", "@radix-ui/react-slot": "1.1.1", "astro": "5.1.1", "astro-aws-amplify": "0.1.0", @@ -102,4 +105,4 @@ "prettier-plugin-astro": "0.14.1", "prettier-plugin-tailwindcss": "0.6.8" } -} \ No newline at end of file +} diff --git a/public/theme.js b/public/theme.js index 3578f4a..c84aa95 100644 --- a/public/theme.js +++ b/public/theme.js @@ -1,7 +1,7 @@ -(function () { - const savedTheme = localStorage.getItem("theme"); - console.log("Saved theme:", savedTheme); - if (savedTheme) { - document.documentElement.setAttribute("data-theme", savedTheme); - } -})(); +(function () { + const savedTheme = localStorage.getItem("theme"); + console.log("Saved theme:", savedTheme); + if (savedTheme) { + document.documentElement.setAttribute("data-theme", savedTheme); + } +})(); diff --git a/src/assets/images/logo.png b/src/assets/images/logo.png new file mode 100644 index 0000000..5c7f213 Binary files /dev/null and b/src/assets/images/logo.png differ diff --git a/src/assets/projects/abcdkbd.png b/src/assets/projects/abcdkbd.png new file mode 100644 index 0000000..1024521 Binary files /dev/null and b/src/assets/projects/abcdkbd.png differ diff --git a/src/assets/projects/letter.png b/src/assets/projects/letter.png new file mode 100644 index 0000000..fc3e821 Binary files /dev/null and b/src/assets/projects/letter.png differ diff --git a/src/assets/projects/threadzip.png b/src/assets/projects/threadzip.png new file mode 100644 index 0000000..2ed86e2 Binary files /dev/null and b/src/assets/projects/threadzip.png differ diff --git a/src/assets/styles/card.css b/src/assets/styles/card.css index 254d778..560325e 100644 --- a/src/assets/styles/card.css +++ b/src/assets/styles/card.css @@ -2,42 +2,67 @@ list-style: none; display: flex; padding: 1px; - background-color: #23262d; - background-image: none; - background-size: 400%; - border-radius: 7px; - background-position: 100%; - transition: background-position 0.6s cubic-bezier(0.22, 1, 0.36, 1); - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1); + + /* ๐ŸŒ— Theme based background */ + background-color: hsl(var(--background)); + + border-radius: 8px; + overflow: hidden; + + /* subtle border effect */ + box-shadow: inset 0 0 0 1px hsl(var(--foreground) / 0.1); + + transition: all 0.3s ease; } .link-card > a { width: 100%; text-decoration: none; line-height: 1.4; + padding: calc(1.5rem - 1px); border-radius: 8px; - color: white; - background-color: #23262d; - opacity: 0.8; + + /* ๐ŸŒ— Theme colors */ + background-color: hsl(var(--background)); + color: hsl(var(--foreground)); + + transition: all 0.3s ease; } -h2 { +/* Title */ +.link-card h2 { margin: 0; font-size: 1.25rem; - transition: color 0.6s cubic-bezier(0.22, 1, 0.36, 1); + font-weight: 600; + + color: hsl(var(--foreground)); + + transition: color 0.3s ease; } -p { +/* Description */ +.link-card p { margin-top: 0.5rem; margin-bottom: 0; -} -.link-card:is(:hover, :focus-within) { - background-position: 0; - background-image: var(--accent-gradient); + color: hsl(var(--foreground) / 0.7); + font-size: 0.95rem; + line-height: 1.6; } -.link-card:is(:hover, :focus-within) h2 { - color: rgb(var(--accent-light)); +/* Hover effect */ +.link-card:hover, +.link-card:focus-within { + transform: translateY(-4px); + + /* subtle highlight */ + box-shadow: + inset 0 0 0 1px hsl(var(--foreground) / 0.15), + 0 10px 30px -10px hsl(var(--foreground) / 0.2); } + +/* Hover title color */ +.link-card:hover h2 { + color: rgb(var(--accent)); +} \ No newline at end of file diff --git a/src/assets/styles/career.css b/src/assets/styles/career.css index f9d7ddb..8d3b0db 100644 --- a/src/assets/styles/career.css +++ b/src/assets/styles/career.css @@ -121,4 +121,4 @@ .careers__container { padding: 0 2rem; } -} \ No newline at end of file +} diff --git a/src/assets/styles/globals.css b/src/assets/styles/globals.css index d1326e7..967578f 100644 --- a/src/assets/styles/globals.css +++ b/src/assets/styles/globals.css @@ -1,22 +1,31 @@ -/*@import "./custom-font.css";*/ @tailwind base; @tailwind components; @tailwind utilities; @layer base { :root { - --font-size-min: 16; --font-size-max: 20; --font-ratio-min: 1.2; --font-ratio-max: 1.33; --font-width-min: 375; --font-width-max: 1500; + + /* ๐ŸŽจ LIGHT THEME */ + --background: 0 0% 100%; + --foreground: 222 47% 11%; + --accent: 136, 58, 234; --accent-light: 224, 204, 250; --accent-dark: 49, 10, 101; } - + + /* ๐ŸŒ™ DARK THEME */ + .dark { + --background: 222 47% 11%; + --foreground: 0 0% 100%; + } + html { color-scheme: light dark; height: 100%; @@ -39,28 +48,38 @@ overflow-x: hidden; display: block; font-family: "Roboto", "SF Pro Text", "Helvetica Neue", Arial, sans-serif; - transition: background-color 0.3s ease; - + + background: hsl(var(--background)); + color: hsl(var(--foreground)); + + transition: background-color 0.3s ease, color 0.3s ease; } - /* Grid Background */ + /* โŒ LIGHT MODE โ†’ NO GRID */ body::before { - --size: 45px; - --line: rgba(255, 255, 255, 0.06); + display: none; + } + + /* โœ… DARK MODE โ†’ GRID */ + .dark body::before { content: ""; position: fixed; inset: 0; width: 100%; height: 100%; - background: - linear-gradient(90deg, var(--line) 1px, transparent 1px), + + --size: 45px; + --line: rgba(255, 255, 255, 0.06); + + background: linear-gradient(90deg, var(--line) 1px, transparent 1px), linear-gradient(var(--line) 1px, transparent 1px); + background-size: var(--size) var(--size); + pointer-events: none; z-index: -1; } - /* MAIN FIX */ main { display: block !important; width: 100% !important; @@ -90,16 +109,6 @@ resize: none; } - .whiteBg { - background: #ffffff; - color: #111111; - } - - .darkBg { - background: #050505; - color: #ffffff; - } - .yellowBtnHover:hover { background-color: #d4a900; } diff --git a/src/assets/styles/menu.css b/src/assets/styles/menu.css index 459d9d4..df26ea1 100644 --- a/src/assets/styles/menu.css +++ b/src/assets/styles/menu.css @@ -8,25 +8,27 @@ --header-height: 80px; --sidebar-width: 16ch; --timing: 0.42s; - --ease: linear(0 0%, - 0.0036 9.62%, - 0.0185 16.66%, - 0.0489 23.03%, - 0.0962 28.86%, - 0.1705 34.93%, - 0.269 40.66%, - 0.3867 45.89%, - 0.5833 52.95%, - 0.683 57.05%, - 0.7829 62.14%, - 0.8621 67.46%, - 0.8991 70.68%, - 0.9299 74.03%, - 0.9545 77.52%, - 0.9735 81.21%, - 0.9865 85%, - 0.9949 89.15%, - 1 100%); + --ease: linear( + 0 0%, + 0.0036 9.62%, + 0.0185 16.66%, + 0.0489 23.03%, + 0.0962 28.86%, + 0.1705 34.93%, + 0.269 40.66%, + 0.3867 45.89%, + 0.5833 52.95%, + 0.683 57.05%, + 0.7829 62.14%, + 0.8621 67.46%, + 0.8991 70.68%, + 0.9299 74.03%, + 0.9545 77.52%, + 0.9735 81.21%, + 0.9865 85%, + 0.9949 89.15%, + 1 100% + ); } .layout { @@ -339,7 +341,6 @@ } } - [data-theme="system"] .theme-toggle use[href="#icon-system"], [data-theme="light"] .theme-toggle use[href="#icon-sun"], [data-theme="dark"] .theme-toggle use[href="#icon-moon"] { @@ -369,8 +370,6 @@ display: none; } - - [data-theme="light"] .placement-toggle, [data-theme="system"] .placement-toggle { color: black; @@ -383,4 +382,4 @@ [data-debug="false"] .debug-toggle g:first-of-type { display: block; } -} \ No newline at end of file +} diff --git a/src/assets/styles/theme.css b/src/assets/styles/theme.css index f79d78a..3482627 100644 --- a/src/assets/styles/theme.css +++ b/src/assets/styles/theme.css @@ -1,70 +1,67 @@ -@layer normalize, base, demo, inversion; - -@layer inversion { - - /* ::before === clouds, ::after === stars */ - @media (prefers-color-scheme: light) { - - [data-invert='true']::after, - [data-invert='false']::before { - opacity: 1; - } - - [data-invert='true']::before, - [data-invert='false']::after { - opacity: 0.1; - } - } - - @media (prefers-color-scheme: dark) { - - [data-invert='true']::before, - [data-invert='false']::after { - opacity: 1; - background-position: 0% 50%; - } - - [data-invert='true']::after, - [data-invert='false']::before { - opacity: 0; - } - } - - [data-invert='true'][data-theme='light']::before { - opacity: 0.1; - background-position: 50% 50%; - } - - [data-invert='true'][data-theme='dark']::before { - opacity: 1; - background-position: 0% 50%; - } - - [data-invert='true'][data-theme='light']::after, - [data-invert='false'][data-theme='dark']::after { - opacity: 1; - } - - [data-invert='false'][data-theme='light']::after, - [data-invert='true'][data-theme='dark']::after { - opacity: 0; - } - - [data-invert='false'][data-theme='light']::before { - opacity: 1; - background-position: 50% 50%; - } - - [data-invert='false'][data-theme='dark']::before { - opacity: 0.1; - background-position: 0% 50%; - } - - [data-invert='true'] { - background: light-dark(#01022e, #34d0ff); - } - - [data-invert='false'] { - background: light-dark(#34d0ff, #01022e); - } -} \ No newline at end of file +@layer normalize, base, demo, inversion; + +@layer inversion { + /* ::before === clouds, ::after === stars */ + @media (prefers-color-scheme: light) { + [data-invert="true"]::after, + [data-invert="false"]::before { + opacity: 1; + } + + [data-invert="true"]::before, + [data-invert="false"]::after { + opacity: 0.1; + } + } + + @media (prefers-color-scheme: dark) { + [data-invert="true"]::before, + [data-invert="false"]::after { + opacity: 1; + background-position: 0% 50%; + } + + [data-invert="true"]::after, + [data-invert="false"]::before { + opacity: 0; + } + } + + [data-invert="true"][data-theme="light"]::before { + opacity: 0.1; + background-position: 50% 50%; + } + + [data-invert="true"][data-theme="dark"]::before { + opacity: 1; + background-position: 0% 50%; + } + + [data-invert="true"][data-theme="light"]::after, + [data-invert="false"][data-theme="dark"]::after { + opacity: 1; + } + + [data-invert="false"][data-theme="light"]::after, + [data-invert="true"][data-theme="dark"]::after { + opacity: 0; + } + + [data-invert="false"][data-theme="light"]::before { + opacity: 1; + background-position: 50% 50%; + } + + [data-invert="false"][data-theme="dark"]::before { + opacity: 0.1; + background-position: 0% 50%; + } + + [data-invert="true"] { + background: light-dark(#01022e, #34d0ff); + } + + [data-invert="false"] { + background: light-dark(#34d0ff, #01022e); + } +} diff --git a/src/components/AboutSection.astro b/src/components/AboutSection.astro index c00809e..3e110de 100644 --- a/src/components/AboutSection.astro +++ b/src/components/AboutSection.astro @@ -3,11 +3,10 @@ import image from "@/assets/images/about.jpg"; import { Image } from "astro:assets"; --- -
+
-
- +

@@ -20,31 +19,30 @@ import { Image } from "astro:assets"; Drive Results. -

- Recursive Zero crafts high-performance web apps, internal tools, - and scalable digital solutions that simplify operations and - accelerate business growth. +

+ Recursive Zero crafts high-performance web apps, internal tools, and scalable digital solutions that simplify + operations and accelerate business growth.

-
+
โœ“ Fast Delivery โœ“ Scalable โœ“ Client-Focused @@ -60,10 +58,9 @@ import { Image } from "astro:assets"; src={image} width={1000} alt="Dashboard Preview" - class="relative z-10 w-full rounded-3xl border border-white/10 object-cover shadow-2xl" + class="relative z-10 w-full rounded-3xl border border-foreground/10 object-cover shadow-2xl" />
-
\ No newline at end of file diff --git a/src/components/AppsSimplifySection.astro b/src/components/AppsSimplifySection.astro index f64704d..ad73127 100644 --- a/src/components/AppsSimplifySection.astro +++ b/src/components/AppsSimplifySection.astro @@ -1,63 +1,12 @@ - - - --- import workplace from "@/assets/images/workplace.jpg"; import { Image } from "astro:assets"; --- -
+
-
- +

@@ -69,39 +18,40 @@ import { Image } from "astro:assets"; with handy mini apps -

- Based in Bengaluru, Recursive Zero creates compact yet powerful apps - designed to streamline your workflow, improve storage efficiency, - and enhance everyday productivity. +

+ Based in Bengaluru, Recursive Zero creates compact yet powerful apps designed to streamline your workflow, + improve storage efficiency, and enhance everyday productivity.

-

- Our solutions combine simplicity with smart technology, helping - users and businesses achieve more with less effort. +

+ Our solutions combine simplicity with smart technology, helping users and businesses achieve more with less + effort.

-
-

Fast & Lightweight

-

+ +

+

Fast & Lightweight

+

Built for speed and smooth performance.

-
-

Easy to Use

-

+

+

Easy to Use

+

Clean UI focused on user productivity.

+
Explore Apps โ†’ @@ -110,7 +60,7 @@ import { Image } from "astro:assets";
-
+
-
\ No newline at end of file diff --git a/src/components/BlogCard.astro b/src/components/BlogCard.astro index a083d57..200282e 100644 --- a/src/components/BlogCard.astro +++ b/src/components/BlogCard.astro @@ -8,21 +8,22 @@ interface Props { date?: string; } -const { - url, - title, - description, - image, - author, - date -} = Astro.props; +const { url, title, description, image, author, date } = Astro.props; const imageUrl = image; --- \ No newline at end of file diff --git a/src/components/BlogsSection.astro b/src/components/BlogsSection.astro index a5cc05b..954f199 100644 --- a/src/components/BlogsSection.astro +++ b/src/components/BlogsSection.astro @@ -6,18 +6,18 @@ const posts = await getCollection("blog"); const slicedPosts = posts.slice(0, 3); --- -
+
- +
- +

Recent Blogs

-

+

Insights, Updates & Stories

@@ -29,7 +29,6 @@ const slicedPosts = posts.slice(0, 3); > View All Blogs โ†’ -
diff --git a/src/components/ContactSection.astro b/src/components/ContactSection.astro index 04af3aa..a54f856 100644 --- a/src/components/ContactSection.astro +++ b/src/components/ContactSection.astro @@ -3,14 +3,13 @@ import contactUs from "@/assets/images/contact-us.jpeg"; import { Image } from "astro:assets"; --- -
+
-
-

+

Contact Us

@@ -18,14 +17,13 @@ import { Image } from "astro:assets"; Reach Recursive Zero -

- Tech simplified โ€” Harness the power of modern technology with - Recursive Zero. Send us a message and letโ€™s build something - impactful together. +

+ Tech simplified โ€” Harness the power of modern technology with Recursive Zero. Send us a message and letโ€™s + build something impactful together.

-
+

๐Ÿ“ง hello@recursivezero.com

๐Ÿ“ž +91 98765 43210

๐Ÿ“ Bengaluru, India

@@ -33,7 +31,7 @@ import { Image } from "astro:assets";
-
+
-
- -

- Let's Talk -

- -

+

+

Let's Talk

+ +

Fill the form and weโ€™ll get back to you shortly.

- + + + + +
-
\ No newline at end of file diff --git a/src/components/Footer.astro b/src/components/Footer.astro index ed341dd..6a87375 100644 --- a/src/components/Footer.astro +++ b/src/components/Footer.astro @@ -1,18 +1,15 @@ - - - --- import GitHubIcon from "@/assets/icons/github.svg"; import MailIcon from "@/assets/icons/mail.svg"; import TwitterIcon from "@/assets/icons/x.svg"; --- - \ No newline at end of file diff --git a/src/components/Header.astro b/src/components/Header.astro index ba65742..7ddd150 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -1,6 +1,10 @@ --- import { Picture } from "astro:assets"; -import logoImage from "/public/assets/images/RecursiveZero-White.jpg"; +// import "@fontsource/orbitron/700.css"; +import "@fontsource/sora/700.css"; + +/* ๐Ÿ”ฅ LOCAL LOGO */ +import logoImage from "@/assets/images/logo.png"; const currentPath = Astro.url.pathname; @@ -17,36 +21,42 @@ const isActive = (path: string) => { }; --- -
-
+
+
+ + + - - - + RECURSIVE ZERO + - -
\ No newline at end of file + + // THEME TOGGLE + const themeToggle = + document.getElementById("themeToggle"); + + const themeIcon = + document.getElementById("themeIcon"); + + const savedTheme = + localStorage.getItem("theme"); + + if (savedTheme === "dark") { + document.documentElement.classList.add("dark"); + } else { + document.documentElement.classList.remove("dark"); + } + + const updateThemeIcon = () => { + const isDark = + document.documentElement.classList.contains("dark"); + + if (!themeIcon) return; + + themeIcon.innerHTML = isDark + ? ` + + ` + : ` + + `; + }; + + updateThemeIcon(); + + themeToggle?.addEventListener("click", () => { + document.documentElement.classList.toggle("dark"); + + const isDark = + document.documentElement.classList.contains("dark"); + + localStorage.setItem( + "theme", + isDark ? "dark" : "light" + ); + + updateThemeIcon(); + }); + + + \ No newline at end of file diff --git a/src/components/NewsLetterSection.astro b/src/components/NewsLetterSection.astro index b8b2172..d5c9fb4 100644 --- a/src/components/NewsLetterSection.astro +++ b/src/components/NewsLetterSection.astro @@ -1,36 +1,49 @@ -
+
- -
- +
-

+

Stay Updated

-

+

Subscribe to our newsletter

-

+

Receive latest updates, blogs and important announcements directly in your inbox.

- + + + @@ -39,10 +52,9 @@ -

+

No spam. Only quality updates.

-
\ No newline at end of file diff --git a/src/components/blogcard b/src/components/blogcard deleted file mode 100644 index a083d57..0000000 --- a/src/components/blogcard +++ /dev/null @@ -1,64 +0,0 @@ ---- -interface Props { - url: string; - title: string; - description?: string; - image: string; - author?: string; - date?: string; -} - -const { - url, - title, - description, - image, - author, - date -} = Astro.props; - -const imageUrl = image; ---- - - \ No newline at end of file diff --git a/src/content.config.ts b/src/content.config.ts index cf9af3f..213cb79 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -12,14 +12,16 @@ export const collections = { }) }), - blog: defineCollection({ - type: "content", - schema: z.object({ - title: z.string(), - date: z.date(), - image: z.string(), - description: z.string().optional(), - author: z.string().optional() - }) + blog: defineCollection({ + type: "content", + schema: z.object({ + title: z.string(), + date: z.date(), + image: z.string(), + description: z.string().optional(), + author: z.string().optional(), + + tags: z.array(z.string()).default([]) }) +}) }; diff --git a/src/content/article/privacy.md b/src/content/article/privacy.md index 149f37e..e2fb02a 100644 --- a/src/content/article/privacy.md +++ b/src/content/article/privacy.md @@ -1,139 +1,139 @@ ---- -title: "Privacy Policy" -author: "Admin" ---- - -# Privacy Policy - -## Last Updated: Mar 29, 2026 - -Welcome to **recursivezero.com**! Your childโ€™s privacy and safety are our highest priority. -This Privacy Policy outlines how we handle personal data in compliance with the **Digital Personal Data Protection Act, 2023 (India)** and international child privacy standards. - ---- - -## 1. About Us - -**recursivezero.com** ("we", "us", or "our") is an educational website built to support safe and engaging learning experiences for children. Our services are free to use, ad-free, and designed for young learners under parental guidance. - ---- - -## 2. Applicability - -This policy applies to all users, particularly **children under the age of 18**, and explains how we collect, store, use, and protect data. - ---- - -## 3. What Information We Collect - -We collect only the minimum necessary information: - -### a. Automatically Collected (Non-Personal) - -- Browser type, screen size, device type -- General usage patterns (pages visited, time on site) -- IP address (used anonymously for analytics) - -### b. Optional User-Provided - -- Nickname or screen name (no real names required) -- Language or learning preferences (optional) - -> โœ… We **do not** collect or request phone numbers, email addresses, home addresses, or real names from children. - ---- - -## 4. Purpose of Data Use - -We use collected data only for the following: - -- Improving website content and learning tools -- Maintaining platform functionality and accessibility -- Ensuring safety and preventing abuse -- Aggregated analytics for internal insights - ---- - -## 5. Lawful Basis for Processing (As per DPDP Act) - -We process data: - -- With **explicit consent** from a parent or guardian (for children under 18) -- For a **legitimate purpose** as defined under the DPDP Act, i.e., educational service delivery - ---- - -## 6. Storage and Security - -We follow industry best practices to secure your data: - -- End-to-end HTTPS encryption -- No storage of personal data in public databases -- Local-first or in-memory storage where possible - -Data is stored only as long as needed for the intended purpose and securely deleted afterward. - ---- - -## 7. Data Sharing and Disclosure - -We **do not**: - -- Sell or rent data -- Share data with advertising or third-party marketing companies - -We may use privacy-focused tools (like anonymized analytics providers) strictly under Indian and global child data safety regulations. - ---- - -## 8. Cookies and Tracking - -We use **essential cookies** only for: - -- Remembering language or accessibility settings -- Session management (login persistence if used) - -No tracking or profiling cookies are used. You can disable cookies in your browser settings if preferred. - ---- - -## 9. Rights of Parents and Guardians - -As a parent or legal guardian, you have the right to: - -- Request access to your childโ€™s data -- Request correction or deletion of data -- Withdraw consent at any time - -Please contact: **[recursivezero@outlook.com](mailto:recursivezero@outlook.com)** with the subject **"Privacy Request"** - ---- - -## 10. Grievance Redressal - -In case of privacy concerns, you may contact our Grievance Officer: - -**Grievance Officer**: Keshav Mohta -**Email**: [recusrivezero@outlook.com](mailo:recursivezero@outlook.com) -**Address**: Bengaluru, Karnataka (india) - -We will respond within 7 working days, as mandated by the DPDP Act. - ---- - -## 11. Changes to This Policy - -We may update this policy to reflect changes in law or our practices. All updates will be posted here with the updated date. - ---- - -## 12. Contact Us - -For general inquiries or questions: - -**Email**: [recursivezero@outlook.com](mailto:recursivezero@outlook.com) -**Website**: [recursivezero.com](https://recursivezero.com) - ---- - -Thank you for trusting **recursivezero.com** with your learning journey! +--- +title: "Privacy Policy" +author: "Admin" +--- + +# Privacy Policy + +## Last Updated: Mar 29, 2026 + +Welcome to **recursivezero.com**! Your childโ€™s privacy and safety are our highest priority. +This Privacy Policy outlines how we handle personal data in compliance with the **Digital Personal Data Protection Act, 2023 (India)** and international child privacy standards. + +--- + +## 1. About Us + +**recursivezero.com** ("we", "us", or "our") is an educational website built to support safe and engaging learning experiences for children. Our services are free to use, ad-free, and designed for young learners under parental guidance. + +--- + +## 2. Applicability + +This policy applies to all users, particularly **children under the age of 18**, and explains how we collect, store, use, and protect data. + +--- + +## 3. What Information We Collect + +We collect only the minimum necessary information: + +### a. Automatically Collected (Non-Personal) + +- Browser type, screen size, device type +- General usage patterns (pages visited, time on site) +- IP address (used anonymously for analytics) + +### b. Optional User-Provided + +- Nickname or screen name (no real names required) +- Language or learning preferences (optional) + +> โœ… We **do not** collect or request phone numbers, email addresses, home addresses, or real names from children. + +--- + +## 4. Purpose of Data Use + +We use collected data only for the following: + +- Improving website content and learning tools +- Maintaining platform functionality and accessibility +- Ensuring safety and preventing abuse +- Aggregated analytics for internal insights + +--- + +## 5. Lawful Basis for Processing (As per DPDP Act) + +We process data: + +- With **explicit consent** from a parent or guardian (for children under 18) +- For a **legitimate purpose** as defined under the DPDP Act, i.e., educational service delivery + +--- + +## 6. Storage and Security + +We follow industry best practices to secure your data: + +- End-to-end HTTPS encryption +- No storage of personal data in public databases +- Local-first or in-memory storage where possible + +Data is stored only as long as needed for the intended purpose and securely deleted afterward. + +--- + +## 7. Data Sharing and Disclosure + +We **do not**: + +- Sell or rent data +- Share data with advertising or third-party marketing companies + +We may use privacy-focused tools (like anonymized analytics providers) strictly under Indian and global child data safety regulations. + +--- + +## 8. Cookies and Tracking + +We use **essential cookies** only for: + +- Remembering language or accessibility settings +- Session management (login persistence if used) + +No tracking or profiling cookies are used. You can disable cookies in your browser settings if preferred. + +--- + +## 9. Rights of Parents and Guardians + +As a parent or legal guardian, you have the right to: + +- Request access to your childโ€™s data +- Request correction or deletion of data +- Withdraw consent at any time + +Please contact: **[recursivezero@outlook.com](mailto:recursivezero@outlook.com)** with the subject **"Privacy Request"** + +--- + +## 10. Grievance Redressal + +In case of privacy concerns, you may contact our Grievance Officer: + +**Grievance Officer**: Keshav Mohta +**Email**: [recusrivezero@outlook.com](mailo:recursivezero@outlook.com) +**Address**: Bengaluru, Karnataka (india) + +We will respond within 7 working days, as mandated by the DPDP Act. + +--- + +## 11. Changes to This Policy + +We may update this policy to reflect changes in law or our practices. All updates will be posted here with the updated date. + +--- + +## 12. Contact Us + +For general inquiries or questions: + +**Email**: [recursivezero@outlook.com](mailto:recursivezero@outlook.com) +**Website**: [recursivezero.com](https://recursivezero.com) + +--- + +Thank you for trusting **recursivezero.com** with your learning journey! diff --git a/src/content/blog/ayush.md b/src/content/blog/ayush.md index 3cbb3a9..89339ef 100644 --- a/src/content/blog/ayush.md +++ b/src/content/blog/ayush.md @@ -4,6 +4,11 @@ description: "A summary of my learnings and contributions during my recent inter date: 2025-07-20 image: "/assets/images/blog/blog-6.png" author: "Ayush Tyagi" + +tags: + - internship + - frontend + - learning --- ## My Internship Journey diff --git a/src/content/blog/azmat-raza.md b/src/content/blog/azmat-raza.md index 471b46b..61baad3 100644 --- a/src/content/blog/azmat-raza.md +++ b/src/content/blog/azmat-raza.md @@ -4,6 +4,11 @@ description: "A deep dive into my two-month internship experience, working with date: 2025-07-21 author: "Azmat Raza" image: "/assets/images/blog/blog-4.jpg" + +tags: + - internship + - astro + - frontend --- ## Internship Experience at RecursiveZero Pvt. Ltd diff --git a/src/content/blog/chhavi.md b/src/content/blog/chhavi.md index b49b1ca..d993491 100644 --- a/src/content/blog/chhavi.md +++ b/src/content/blog/chhavi.md @@ -4,8 +4,15 @@ description: "Reflections on my journey as a Software Developer Trainee " image: "/assets/images/blog/blog-5.png" author: "Chhavi Sharma" date: 2025-07-19 + + +tags: + - internship + - frontend + - learning --- + ## ๐ŸŒŸ My Internship Journey: What Iโ€™ve Learned So Far From student to developer, my recent internship experience has been nothing short of transformative. diff --git a/src/content/blog/i18n.md b/src/content/blog/i18n.md index 29590f3..c261398 100644 --- a/src/content/blog/i18n.md +++ b/src/content/blog/i18n.md @@ -4,6 +4,11 @@ description: "The full guide on how to implement internationalization (i18n) in image: "/assets/images/blog/blog-3.png" date: 2025-07-11 author: "Rupesh Rathore" + +tags: + - astro + - i18n + - frontend --- ## **Implementing Internationalization (i18n) in Astro Using Built-in Features** diff --git a/src/content/blog/prakash-raj.md b/src/content/blog/prakash-raj.md index 2debe23..dcacce1 100644 --- a/src/content/blog/prakash-raj.md +++ b/src/content/blog/prakash-raj.md @@ -4,8 +4,15 @@ description: "A transformative internship experience that shaped my frontend dev image: "/assets/images/blog/internship.png" author: "Prakash Raj" date: 2025-07-18 + + +tags: + - internship + - frontend + - learning --- + ## **From Student to Developer: My Internship Experience** Over the past few months, I had the incredible opportunity to intern as a Frontend Developer at **RecursiveZero Pvt. Ltd**, where I embarked on a transformative journey of learning and growth. diff --git a/src/content/blog/routing-astro.md b/src/content/blog/routing-astro.md index 16e3690..794b407 100644 --- a/src/content/blog/routing-astro.md +++ b/src/content/blog/routing-astro.md @@ -3,6 +3,10 @@ title: "How routing works in Astro ?" description: "The full guide on routing in astro framework . The easy and simple guide to understand and implement routing " date: 2024-12-12 image: "https://images.unsplash.com/photo-1556075798-4825dfaaf498" + +tags: + - astro + - routing --- ## Adding a New Route in Astro.js diff --git a/src/content/blog/rupesh-rathore.md b/src/content/blog/rupesh-rathore.md index 9afd52e..06e8185 100644 --- a/src/content/blog/rupesh-rathore.md +++ b/src/content/blog/rupesh-rathore.md @@ -1,9 +1,14 @@ --- title: "My Internship Journey from Zero to Something" -description: "A Moth who found his flames to chase! : A transformative internship experience that shaped my frontend development career" +description: "A Moth who found his flames to chase! ..." image: "/assets/images/blog/blog-8.png" author: "Rupesh Rathore" date: 2025-07-23 + +tags: + - internship + - frontend + - learning --- ## **From Zero to A Front-End Developer: My Internship Experience** diff --git a/src/content/blog/state-management.md b/src/content/blog/state-management.md index 2f41ae3..1eb31c9 100644 --- a/src/content/blog/state-management.md +++ b/src/content/blog/state-management.md @@ -3,6 +3,11 @@ title: "The new era of state management with Zustand ?" description: "The simple and easy to understand all about Zustand the new and simple way to manage the state in client side. " date: 2024-12-12 image: "https://images.unsplash.com/photo-1555066931-4365d14bab8c" + +tags: + - react + - zustand + - frontend --- ## Zustand Documentation diff --git a/src/content/blog/style-guide.md b/src/content/blog/style-guide.md index e4ab6af..ba98f33 100644 --- a/src/content/blog/style-guide.md +++ b/src/content/blog/style-guide.md @@ -3,6 +3,11 @@ title: "The style guide the must know to start the code" description: "The full guid on file structure , css naming convention , tailwind usage and , css classes naming convention . " date: 2024-12-26 image: "https://images.unsplash.com/photo-1461749280684-dccba630e2f6" + +tags: + - css + - tailwind + - frontend --- ## Style Guide Documentation diff --git a/src/content/blog/suresh-chelani.md b/src/content/blog/suresh-chelani.md index fab33ec..9dcc9e3 100644 --- a/src/content/blog/suresh-chelani.md +++ b/src/content/blog/suresh-chelani.md @@ -4,6 +4,11 @@ description: "A deep dive into my two-month internship experience, working with date: 2025-07-21 author: "Suresh Chelani" image: "/assets/images/blog/blog-7.png" + +tags: + - internship + - astro + - fullstack --- ## Internship Experience at RecursiveZero Pvt. Ltd diff --git a/src/content/blog/technology-used.md b/src/content/blog/technology-used.md index 4a9be17..01c32c8 100644 --- a/src/content/blog/technology-used.md +++ b/src/content/blog/technology-used.md @@ -3,6 +3,10 @@ title: "The tech stack that we preferred" description: "The tech stack that we work with and why we choose it ? " date: 2024-12-24 image: "https://images.unsplash.com/photo-1517694712202-14dd9538aa97" +tags: + - tech + - frontend + - development --- ## **Project Technology Stack Documentation** diff --git a/src/env.d.ts b/src/env.d.ts index 9340f8a..435c83f 100644 --- a/src/env.d.ts +++ b/src/env.d.ts @@ -1,5 +1,4 @@ /// /// - -declare module '*.css'; \ No newline at end of file +declare module "*.css"; diff --git a/src/env.patch.ts b/src/env.patch.ts index f60a8ae..8088da9 100644 --- a/src/env.patch.ts +++ b/src/env.patch.ts @@ -6,10 +6,7 @@ import { z } from "zod"; // Load .env file expand( config({ - path: path.resolve( - process.cwd(), - process.env.NODE_ENV === "test" ? ".env.test" : ".env" - ) + path: path.resolve(process.cwd(), process.env.NODE_ENV === "test" ? ".env.test" : ".env") }) ); @@ -18,15 +15,7 @@ const EnvSchema = z .object({ NODE_ENV: z.string().default("development"), PORT: z.coerce.number().default(4321), - LOG_LEVEL: z.enum([ - "fatal", - "error", - "warn", - "info", - "debug", - "trace", - "silent" - ]) + LOG_LEVEL: z.enum(["fatal", "error", "warn", "info", "debug", "trace", "silent"]) }) .superRefine((input, ctx) => { if (input.NODE_ENV === "production" && !input.LOG_LEVEL) { @@ -51,4 +40,4 @@ if (!result.success) { const env = result.data; -export default env; \ No newline at end of file +export default env; diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index 7ad1d37..037754a 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -5,7 +5,6 @@ import "@/assets/styles/globals.css"; import BaseHead from "@/layouts/BaseHead"; import Header from "@/components/Header.astro"; import Footer from "@/components/Footer.astro"; -import ThemeProvider from "@/components/ThemeProvider.astro"; const { meta: { title, description = siteConfig.description, ogImage, articleDate } @@ -14,7 +13,18 @@ const { - + + - -
@@ -37,13 +45,18 @@ const {
+ diff --git a/src/pages/404.astro b/src/pages/404.astro index b5ec347..f8f3b32 100644 --- a/src/pages/404.astro +++ b/src/pages/404.astro @@ -3,11 +3,51 @@ import BaseLayout from "@/layouts/BaseLayout"; const meta = { title: "Oops! You found a missing page!", - description: "Oops! It looks like this page is lost in space!" + description: + "Oops! It looks like this page is lost in space!" }; + +const path = Astro.url.pathname; + +const isBlogRoute = + path.startsWith("/blogs"); --- -

404 | Oops something went wrong

-

Please use the navigation to find your way back

-
+ +
+ +

+ 404 +

+ +

+ Oops something went wrong +

+ +

+ The page you are trying to access does not exist. +

+ + + { + isBlogRoute ? ( + + Go to Blog Tags + + ) : ( + + Go Home + + ) + } + +
+ + \ No newline at end of file diff --git a/src/pages/about.astro b/src/pages/about.astro index 0df2ffb..fa84d7a 100644 --- a/src/pages/about.astro +++ b/src/pages/about.astro @@ -3,182 +3,164 @@ import BaseLayout from "@/layouts/BaseLayout"; --- - - - -
- - -
- -
- -

- Recursive Zero -

- -

- Building Digital Products
- That Drive Impact -

- -

- We design and build scalable web applications, internal tools, - and modern digital experiences. -

- - - - -
-
- - - -
-
- -

Our Story

- -

- Founded in 2024, Recursive Zero focuses on crafting efficient, - scalable, and modern applications. We combine engineering excellence - with simplicity to deliver real impact. -

- -
-
- - - -
-
- -

- Why Choose Us -

- -
- -
-

50+

-

Projects

-
- -
-

20+

-

Clients

+ +
+ +
+ +
+

+ Recursive Zero +

+ +

+ Building Digital Products
+ That Drive Impact +

+ +

+ We design and build scalable web applications, internal tools, + and modern digital experiences. +

+ + + - -
-

99%

-

Satisfaction

-
- -
-

4+

-

Years

-
-
- -
-
- - - -
-
- -

- Our Team -

- -
- -
-

Keshav Mohta

-

Founder & CEO

+
+ + +
+
+

Our Story

+ +

+ Founded in 2024, Recursive Zero focuses on crafting efficient, + scalable, and modern applications. We combine engineering + excellence with simplicity to deliver real impact. +

+
+
+ + +
+
+

+ Why Choose Us +

+ +
+
+

50+

+

Projects

+
+ +
+

20+

+

Clients

+
+ +
+

99%

+

Satisfaction

+
+ +
+

4+

+

Years

+
- -
-

Poorna Chandra

-

Python Developer

+
+
+ + +
+
+

+ Our Team +

+ +
+
+

+ Keshav Mohta +

+

Founder & CEO

+
+ +
+

+ Poorna Chandra +

+

Python Developer

+
-
+
+ + +
+
+

+ Our Mission +

+ +

+ Our mission is to deliver exceptional value through innovative + solutions and outstanding service, helping businesses grow + faster. +

+
+
-
-
- - - -
-
- -

Our Mission

- -

- Our mission is to deliver exceptional value through innovative - solutions and outstanding service, helping businesses grow faster. -

- -
-
- - - -
-
- -

- Ready to build something amazing? -

- -

- Letโ€™s turn your ideas into reality. -

- - - Contact Us โ†’ - + +
+
+

+ Ready to build something amazing? +

-
-
+

+ Letโ€™s turn your ideas into reality. +

+ + Contact Us + + + โ†’ + + +
+
\ No newline at end of file diff --git a/src/pages/blogs/[...slug].astro b/src/pages/blogs/[...slug].astro index 2590e6b..150e0af 100644 --- a/src/pages/blogs/[...slug].astro +++ b/src/pages/blogs/[...slug].astro @@ -3,51 +3,148 @@ import CalendarIcon from "@/assets/icons/calendar.svg"; import ProfileIcon from "@/assets/icons/profile.svg"; import MarkdownContent from "@/components/MarkdownContent.astro"; import BaseLayout from "@/layouts/BaseLayout"; -import { type CollectionEntry, getCollection, render } from "astro:content"; + +import { + type CollectionEntry, + getCollection, + render +} from "astro:content"; + export const prerender = true; export async function getStaticPaths() { const posts = await getCollection("blog"); + return posts.map((blog) => ({ params: { slug: blog.slug }, props: blog })); } + type Props = CollectionEntry<"blog">; const blog = Astro.props; + +// BLOG NOT FOUND REDIRECT +if (!Astro.props?.id) { + return Astro.redirect( + "/blogs/tag?error=notfound" + ); +} + const { Content } = await render(blog); -const { title, description, date, author, image } = blog.data; + +const { + title, + description, + date, + author, + image, + tags +} = blog.data; if (!Content) { - throw new Error(`Content could not be rendered for blog: ${blog.id}`); + throw new Error( + `Content could not be rendered for blog: ${blog.id}` + ); } --- - -
-

{title}

- {description &&

{description}

} -
+ +
+ + +
+ + +

+ Blog Article +

+ + +

+ {title} +

+ + { - author && ( - - - {author} - + description && ( +

+ {description} +

) } + + +
+ + { + author && ( + + + + + + {author} + + ) + } + + { + date && ( + + + + + + + + ) + } + +
+ + { - date && ( - - - - + tags?.length > 0 && ( +
+ + { + tags.map((tag) => ( + + #{tag} + + )) + } + +
) } -
- - - -
-
+ +
+ + +
+
+ + + +
+
+ + + \ No newline at end of file diff --git a/src/pages/blogs/index.astro b/src/pages/blogs/index.astro index ff1a17c..22fc578 100644 --- a/src/pages/blogs/index.astro +++ b/src/pages/blogs/index.astro @@ -3,29 +3,88 @@ import BlogCard from "@/components/BlogCard.astro"; import BaseLayout from "@/layouts/BaseLayout"; import { getCollection } from "astro:content"; + const posts = await getCollection("blog"); + +/* ALL UNIQUE TAGS */ +const allTags = [ + ...new Set( + posts.flatMap( + (post) => post.data.tags || [] + ) + ) +]; --- - -
-
-

Blog Articles

-

Discover our latest blog and updates

-
- -
- { - posts.map((post) => ( - - )) - } -
+ +
+ + +
+ +
+ + +

+ Recursive Zero Blogs +

+ + +

+ Blog Articles +

+ + +

+ Discover our latest blogs, development insights, + tutorials, product updates and engineering stories. +

+ + +
+ + { + allTags.slice(0, 3).map((tag) => ( + + #{tag} + + )) + } + + + + More Tags โ†’ + + +
+ +
+ + +
+ + { + posts.map((post) => ( + + )) + } + +
+ +
+
-
+ \ No newline at end of file diff --git a/src/pages/blogs/tag/[tag].astro b/src/pages/blogs/tag/[tag].astro new file mode 100644 index 0000000..f73bcd7 --- /dev/null +++ b/src/pages/blogs/tag/[tag].astro @@ -0,0 +1,84 @@ +--- +import BlogCard from "@/components/BlogCard.astro"; +import BaseLayout from "@/layouts/BaseLayout"; +import { getCollection } from "astro:content"; + +export const prerender = true; + +export async function getStaticPaths() { + const blogs = await getCollection("blog"); + + const allTags = [ + ...new Set( + blogs.flatMap((blog) => blog.data.tags || []) + ) + ]; + + return allTags.map((tag) => ({ + params: { tag } + })); +} + +const { tag } = Astro.params; + +const blogs = await getCollection("blog"); + +const filteredBlogs = blogs.filter((blog) => + blog.data.tags?.includes(tag!) +); +--- + + +
+
+ + +
+

+ Filtered Blogs +

+ +

+ #{tag} +

+ +

+ Showing blogs related to + + #{tag} + +

+
+ + +
+ + { + filteredBlogs.length > 0 ? ( + filteredBlogs.map((blog) => ( + + )) + ) : ( +

+ No blogs found for this tag. +

+ ) + } + +
+ +
+
+
\ No newline at end of file diff --git a/src/pages/blogs/tag/index.astro b/src/pages/blogs/tag/index.astro new file mode 100644 index 0000000..00dc0af --- /dev/null +++ b/src/pages/blogs/tag/index.astro @@ -0,0 +1,72 @@ +--- +import BaseLayout from "@/layouts/BaseLayout"; +import { getCollection } from "astro:content"; + +const posts = await getCollection("blog"); + +// ALL UNIQUE TAGS +const tags = [ + ...new Set( + posts.flatMap( + (post) => post.data.tags || [] + ) + ) +]; + +// ERROR MESSAGE +const showError = + Astro.url.searchParams.get("error") + === "notfound"; +--- + + +
+ +
+ + +
+ +

+ Explore Blogs +

+ +

+ Browse by Tags +

+ +

+ Select a tag to explore related blogs. +

+ +
+ + + { + showError && ( +
+ Blog does not exist +
+ ) + } + + +
+ + { + tags.map((tag) => ( + + #{tag} + + )) + } + +
+ +
+ +
+
\ No newline at end of file diff --git a/src/pages/career.astro b/src/pages/career.astro index 7fcc792..6caa313 100644 --- a/src/pages/career.astro +++ b/src/pages/career.astro @@ -4,75 +4,200 @@ import "../assets/styles/career.css"; --- -
-
-

Join Our Team

-

Build the future with us

-
- -
-
-

Current Openings

- -
-
-

MBA Interns

-

- We're looking for an MBA Interns who can help us to do Field work and Demos of our product and user - onboarding, preferred candidate from Surat, Gujarat. -

-
- Remote - Full-time +
+ + +
+ +
+

+ Careers +

+ +

+ Join Our Team +

+ +

+ Build the future with us and work on modern digital products + with a talented remote-first team. +

+
+ + +
+ + +
+

+ Current Openings +

+ +
+ + +
+

+ MBA Interns +

+ +

+ We're looking for MBA Interns who can help us with + field work, product demos and user onboarding. + Preferred candidates from Surat, Gujarat. +

+ +
+ + Remote + + + + Full-time + +
-
-
-

Frontend Developer

-

We're looking for an experienced frontend developer to join our team.

-
- Remote - Full-time + + +
+

+ Frontend Developer +

+ +

+ We're looking for an experienced frontend developer + to join our team and build modern interfaces. +

+ +
+ + Remote + + + + Full-time + +
-
-
-

Backend Engineer

-

- Join us in building scalable backend solutions, experienced with nodejs based backend technologies. -

-
- Hybrid - Full-time + +
+

+ Backend Engineer +

+ +

+ Join us in building scalable backend solutions using + Node.js and modern backend technologies. +

+ +
+ + Hybrid + + + + Full-time + +
+
-
-
- -
-

Why Join RecursiveZero?

-
-
-

Remote First

-

Work from anywhere in the world

-
-
-

Learning & Growth

-

Continuous learning opportunities

-
-
-

Great Benefits

-

Competitive salary and benefits package

+
+ + +
+

+ Why Join RecursiveZero? +

+ +
+ +
+

+ Remote First +

+ +

+ Work from anywhere in the world. +

+
+ +
+

+ Learning & Growth +

+ +

+ Continuous learning opportunities and mentorship. +

+
+ +
+

+ Great Benefits +

+ +

+ Competitive salary and exciting benefits package. +

+
+
-
-
- -
-

How to Apply

-

- Send your resume and a brief cover letter to - hello@recursivezero.com -

-
-
+
+ + +
+

+ How to Apply +

+ +

+ Send your resume and a brief cover letter to + + hello@recursivezero.com + +

+
+ +
+
+ - + \ No newline at end of file diff --git a/src/pages/contact.astro b/src/pages/contact.astro index 08ecad6..93cd011 100644 --- a/src/pages/contact.astro +++ b/src/pages/contact.astro @@ -4,9 +4,7 @@ import ContactSection from "@/components/ContactSection.astro"; --- - - - - -
- -
- -
\ No newline at end of file + +
+ +
+ diff --git a/src/pages/rss.xml.ts b/src/pages/rss.xml.ts index 366b7cc..484f051 100644 --- a/src/pages/rss.xml.ts +++ b/src/pages/rss.xml.ts @@ -1,19 +1,19 @@ -import { siteConfig } from "@/site-config"; - -import rss from "@astrojs/rss"; -import { getCollection } from "astro:content"; -const posts = await getCollection("blog"); - -export const GET = async () => { - return rss({ - title: siteConfig.title, - description: siteConfig.description, - site: import.meta.env.SITE, - items: posts.map((post) => ({ - title: post.data.title, - description: post.data.description, - pubDate: post.data.date, - link: `posts/${post.slug}` - })) - }); -}; +import { siteConfig } from "@/site-config"; + +import rss from "@astrojs/rss"; +import { getCollection } from "astro:content"; +const posts = await getCollection("blog"); + +export const GET = async () => { + return rss({ + title: siteConfig.title, + description: siteConfig.description, + site: import.meta.env.SITE, + items: posts.map((post) => ({ + title: post.data.title, + description: post.data.description, + pubDate: post.data.date, + link: `posts/${post.slug}` + })) + }); +}; diff --git a/src/pages/work.astro b/src/pages/work.astro index 063f863..f58671e 100644 --- a/src/pages/work.astro +++ b/src/pages/work.astro @@ -1,53 +1,123 @@ --- import BlogCard from "@/components/BlogCard.astro"; -import Card from "@/components/Card.astro"; import BaseLayout from "@/layouts/BaseLayout"; -const pages = import.meta.glob("./work/*.astro", { eager: true }); +const pages = import.meta.glob("./work/*.astro", { + eager: true +}); // Extract frontmatter and routes -const pageList = Object.entries(pages).map(([path, module]) => { - const { frontmatter } = module as any; - const route = path.replace("./work", "/work").replace(".astro", ""); - return { - title: frontmatter.title || "Untitled", - description: frontmatter.description || "No description available.", - image: frontmatter.image || "", - route - }; -}); +const pageList = Object.entries(pages) + .map(([path, module]) => { + const { frontmatter } = module as any; + + const route = path + .replace("./work", "/work") + .replace(".astro", ""); + + return { + title: frontmatter.title || "Untitled", + description: + frontmatter.description || + "No description available.", + image: frontmatter.image || "", + route + }; + }) + + // REMOVE INTERACTIVE LETTER CARD + .filter( + (item) => + item.title.toLowerCase() !== + "interactive letter" + ); --- - -
-
-

Our Work

-

Discover our latest work and Projects

-
- -
- { - pageList.map(({ title, description, image, route }) => ( - - )) - } - - - -
+ +
+ + +
+ +
+ + +

+ Portfolio +

+ + +

+ Our Work +

+ + +

+ Explore our latest projects, products, platforms and + engineering solutions crafted by Recursive Zero. +

+ +
+ + +
+ + + { + pageList.map( + ({ + title, + description, + image, + route + }) => ( + + ) + ) + } + + + + + + + + + + + + + +
+
+
-
+ \ No newline at end of file diff --git a/tailwind.config.mjs b/tailwind.config.mjs index c5f0b56..daf74a5 100644 --- a/tailwind.config.mjs +++ b/tailwind.config.mjs @@ -1,8 +1,12 @@ /** @type {import('tailwindcss').Config} */ export default { - content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}"], + darkMode: "class", // ๐Ÿ‘ˆ MUST + + content: ["./src/**/*.{astro,html,js,jsx,ts,tsx}"], + theme: { - extend: {} + extend: {}, }, - plugins: [] -}; + + plugins: [], +}; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 9adb5d7..1178c69 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,11 +15,7 @@ "isolatedModules": true, "jsx": "react-jsx", "jsxImportSource": "react", - "lib": [ - "es2022", - "dom", - "dom.iterable" - ], + "lib": ["es2022", "dom", "dom.iterable"], "module": "ESNext", "moduleResolution": "bundler", "noEmit": true, @@ -30,53 +26,20 @@ "useDefineForClassFields": false, "target": "ESNext", "paths": { - "@/*": [ - "src/*" - ], - "@/assets/*": [ - "src/assets/*" - ], - "@/components/*": [ - "src/components/*" - ], - "@/layouts/*": [ - "src/layouts/*.astro" - ], - "@/utils/*": [ - "src/utils/*" - ], - "@/libs": [ - "src/libs/index.ts" - ], - "@/types": [ - "src/types.ts" - ], - "@/hooks/*": [ - "src/hooks/*" - ], - "@/models": [ - "src/models/index.ts" - ], - "@/mocks/*": [ - "src/mocks/*" - ], - "@/site-config": [ - "src/site.config.ts" - ] + "@/*": ["src/*"], + "@/assets/*": ["src/assets/*"], + "@/components/*": ["src/components/*"], + "@/layouts/*": ["src/layouts/*.astro"], + "@/utils/*": ["src/utils/*"], + "@/libs": ["src/libs/index.ts"], + "@/types": ["src/types.ts"], + "@/hooks/*": ["src/hooks/*"], + "@/models": ["src/models/index.ts"], + "@/mocks/*": ["src/mocks/*"], + "@/site-config": ["src/site.config.ts"] }, "verbatimModuleSyntax": true }, - "include": [ - "src", - "*.ts", - "*.tsx" - ], - "exclude": [ - "node_modules", - "**/node_modules/*", - ".vscode", - "dist", - ".eslintrc.mjs", - "env.patch.ts" - ] -} \ No newline at end of file + "include": ["src", "*.ts", "*.tsx"], + "exclude": ["node_modules", "**/node_modules/*", ".vscode", "dist", ".eslintrc.mjs", "env.patch.ts"] +}