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.json b/package.json index 21ae18b..1eff609 100644 --- a/package.json +++ b/package.json @@ -102,4 +102,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..c292ebc 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -1,6 +1,8 @@ --- import { Picture } from "astro:assets"; -import logoImage from "/public/assets/images/RecursiveZero-White.jpg"; + +/* ๐Ÿ”ฅ LOCAL LOGO */ +import logoImage from "@/assets/images/logo.png"; const currentPath = Astro.url.pathname; @@ -16,37 +18,43 @@ const isActive = (path: string) => { return currentPath === path; }; --- +
+ +
-
-
+ + - - - + RECURSIVE ZERO + - -
\ 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/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/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/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..164af08 100644 --- a/src/pages/blogs/[...slug].astro +++ b/src/pages/blogs/[...slug].astro @@ -3,51 +3,120 @@ 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; + const { Content } = await render(blog); -const { title, description, date, author, image } = blog.data; + +const { + title, + description, + date, + author, + image +} = 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}

} -
- { - author && ( - - - {author} - - ) - } + +
+ + +
+ + +

+ Blog Article +

+ + +

+ {title} +

+ + { - date && ( - - - - + description && ( +

+ {description} +

) } -
- - - -
-
+ + +
+ + { + author && ( + + + + + + {author} + + ) + } + + { + date && ( + + + + + + + + ) + } + +
+
+ + +
+
+ + + +
+
+ + + \ No newline at end of file diff --git a/src/pages/blogs/index.astro b/src/pages/blogs/index.astro index ff1a17c..a932096 100644 --- a/src/pages/blogs/index.astro +++ b/src/pages/blogs/index.astro @@ -3,29 +3,50 @@ import BlogCard from "@/components/BlogCard.astro"; import BaseLayout from "@/layouts/BaseLayout"; import { getCollection } from "astro:content"; + const posts = await getCollection("blog"); --- - -
-
-

Blog Articles

-

Discover our latest blog and updates

-
+ +
+ + +
+ +
+ +

+ Recursive Zero Blogs +

+ + +

+ Blog Articles +

+ + +

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

+
+ + +
+ { + posts.map((post) => ( + + )) + } +
-
- { - posts.map((post) => ( - - )) - } -
+
-
+ \ 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..aaf3863 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"] +}