diff --git a/.astro/content.d.ts b/.astro/content.d.ts index 6f3dfe3..a8bcf9c 100644 --- a/.astro/content.d.ts +++ b/.astro/content.d.ts @@ -177,6 +177,6 @@ declare module 'astro:content' { LiveContentConfig['collections'][C]['loader'] >; - export type ContentConfig = typeof import("../src/content.config.js"); + export type ContentConfig = typeof import("./../src/content.config.js"); export type LiveContentConfig = never; } diff --git a/package-lock.json b/package-lock.json index 6236b55..064360d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -201,12 +201,12 @@ } }, "node_modules/@astrojs/node": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@astrojs/node/-/node-10.1.1.tgz", - "integrity": "sha512-kCRbxconkgPpY4vR0GS7exovWEiCbxXLarsp+JeKixyDNf+fKN6v7jXDL8KdQgrzjhy131Kvl+GGGX8jGd8adA==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/@astrojs/node/-/node-10.1.2.tgz", + "integrity": "sha512-6MtNb0iEdZw3m7Dva8V3qo1y9MVoVJKx9dQiNGvy4Ncg5yfaAwGa+9mrDJ3gWCWUtESZi8cvqVshy92sFufg1Q==", "license": "MIT", "dependencies": { - "@astrojs/internal-helpers": "0.9.1", + "@astrojs/internal-helpers": "0.10.0", "send": "^1.2.1", "server-destroy": "^1.0.1" }, @@ -214,6 +214,22 @@ "astro": "^6.3.0" } }, + "node_modules/@astrojs/node/node_modules/@astrojs/internal-helpers": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.0.tgz", + "integrity": "sha512-Ry2R3VPeIN4uPCSA4xQc+e+vsJXkalKpEbDc07hV+a/o5Bs2N/s/uDcPJH/05L19DKh9tAy7e6JM3YZ6Cxfezw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.1.1", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" + } + }, "node_modules/@astrojs/prism": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", @@ -410,18 +426,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -463,15 +467,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1844,19 +1839,10 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/@mdx-js/mdx/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/@nodable/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.1.tgz", + "integrity": "sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg==", "funding": [ { "type": "github", @@ -1967,6 +1953,12 @@ } } }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", @@ -3936,18 +3928,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/ci-info": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", @@ -4417,6 +4397,12 @@ "lodash": "4.17.5" } }, + "node_modules/datasette/node_modules/lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -4761,9 +4747,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.363", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.363.tgz", - "integrity": "sha512-VjUKPyWzGnT1fujlkEGC/BvN70Hh70KXtAqcmniXviYlJC/ivcT+BWGPyxWVbJZLfvtKR6dqg1L7T7pgAMBtWA==", + "version": "1.5.364", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.364.tgz", + "integrity": "sha512-G/dYE3+AYhyHwzTwg8UbnXf7zqMERYh7l2jJ3QujhFsH8agSYwtnGAR2aZ7f0AakIKJXd5En/Hre4igIUrdlYw==", "license": "ISC" }, "node_modules/emmet": { @@ -5174,9 +5160,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.13.0.tgz", + "integrity": "sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5337,6 +5323,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -5420,15 +5419,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/estree-util-build-jsx/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/estree-util-is-identifier-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", @@ -5483,10 +5473,13 @@ } }, "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } }, "node_modules/esutils": { "version": "2.0.3", @@ -5838,18 +5831,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -6171,6 +6152,12 @@ "node": ">=4" } }, + "node_modules/flaschenpost/node_modules/lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "license": "MIT" + }, "node_modules/flaschenpost/node_modules/processenv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/processenv/-/processenv-1.0.0.tgz", @@ -6486,15 +6473,15 @@ } }, "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", "dependencies": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 6" } }, "node_modules/globals": { @@ -6680,9 +6667,9 @@ } }, "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -7790,16 +7777,15 @@ "license": "MIT" }, "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, "bin": { "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/jsonc-parser": { @@ -7997,9 +7983,9 @@ } }, "node_modules/lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "license": "MIT" }, "node_modules/lodash.castarray": { @@ -8087,12 +8073,12 @@ } }, "node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" } }, "node_modules/lucide-react": { @@ -12296,12 +12282,6 @@ "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", "license": "MIT" }, - "node_modules/tailwind/node_modules/lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "license": "MIT" - }, "node_modules/tailwindcss": { "version": "3.4.17", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", @@ -12339,6 +12319,18 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/tailwindcss/node_modules/postcss-import": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", @@ -12481,9 +12473,9 @@ } }, "node_modules/tinyexec": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.2.tgz", - "integrity": "sha512-M/Q0B2cp4K7kynaT/vnED1j8TlLY+Pp7C6Wl2bl/7u/F0mUVwdyOpwomQb8JpYLitHUssAJRmLZdMCGsrx7i+g==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.3.tgz", + "integrity": "sha512-g62dB+w1/OEFnPvmX0yd/HnetYITOL+1nJW7kitOycOeAvmbWC/nu0fwmmQ/kupNojqExzyC/T++pST/jRJ2mQ==", "license": "MIT", "engines": { "node": ">=18" @@ -12591,6 +12583,19 @@ "strip-bom": "^3.0.0" } }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -12731,17 +12736,17 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" }, "engines": { "node": ">= 0.4" @@ -13107,6 +13112,15 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/unstorage/node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/unstorage/node_modules/readdirp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", diff --git a/src/assets/images/about.png b/src/assets/images/about.png new file mode 100644 index 0000000..9d58431 Binary files /dev/null and b/src/assets/images/about.png differ diff --git a/src/components/BlogCard.astro b/src/components/BlogCard.astro index 00cf78f..ffa10eb 100644 --- a/src/components/BlogCard.astro +++ b/src/components/BlogCard.astro @@ -1,9 +1,42 @@ --- const { url, title, description, image, author, date, tags = [] } = Astro.props; + +// Safe Date Formatter +const formatDate = (dateString: string) => { + if (!dateString) return ""; + + // If already in DD/MM/YYYY format + const parts = dateString.split("/"); + + if (parts.length === 3) { + const [day, month, year] = parts; + + const dateObj = new Date(Number(year), Number(month) - 1, Number(day)); + + return dateObj.toLocaleDateString("en-US", { + month: "long", + day: "numeric", + year: "numeric" + }); + } + + // fallback + const parsedDate = new Date(dateString); + + return isNaN(parsedDate.getTime()) + ? dateString + : parsedDate.toLocaleDateString("en-US", { + month: "long", + day: "numeric", + year: "numeric" + }); +}; + +const formattedDate = formatDate(date); ---
- +
@@ -40,29 +73,47 @@ const { url, title, description, image, author, date, tags = [] } = Astro.props; - {description &&

{description}

} + { + description && ( +

+ {description} +

+ ) + }
- - - { - url.startsWith("http") ? ( - - {new URL(url).origin} - - ) : ( - {author ? `By ${author}` : "Recursive Zero"} - ) - } + class="border-foreground/10 text-foreground/70 mt-6 flex items-center justify-between border-t pt-4 text-sm" +> + + { + url.startsWith("http") ? ( + + {new URL(url).origin} + + ) : ( + + By{" "} + + {author || "Recursive Zero"} + + ) + } + - - {date && } -
+ { + formattedDate && ( + + ) + } +
-
+ \ No newline at end of file diff --git a/src/components/Header.astro b/src/components/Header.astro index 3136fd3..03210b3 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -25,175 +25,169 @@ const isCurrentPage = (path: string) => { font-family: Boisu, sans-serif; } -
-
- - - - -
- -
+
+
+ + -
-
+
- + document.addEventListener("astro:page-load", initMobileMenu); + + diff --git a/src/content/blog/azmat-raza.md b/src/content/blog/azmat-raza.md index 471b46b..e19c320 100644 --- a/src/content/blog/azmat-raza.md +++ b/src/content/blog/azmat-raza.md @@ -4,6 +4,10 @@ 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..5be9a6f 100644 --- a/src/content/blog/chhavi.md +++ b/src/content/blog/chhavi.md @@ -4,6 +4,10 @@ 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 + - learning + - software-development --- ## 🌟 My Internship Journey: What I’ve Learned So Far diff --git a/src/content/blog/i18n.md b/src/content/blog/i18n.md index 29590f3..94129db 100644 --- a/src/content/blog/i18n.md +++ b/src/content/blog/i18n.md @@ -4,6 +4,10 @@ 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 + - development + - tech --- ## **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..209c56d 100644 --- a/src/content/blog/prakash-raj.md +++ b/src/content/blog/prakash-raj.md @@ -4,6 +4,10 @@ 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** diff --git a/src/content/blog/rupesh-rathore.md b/src/content/blog/rupesh-rathore.md index 9afd52e..e46fbe9 100644 --- a/src/content/blog/rupesh-rathore.md +++ b/src/content/blog/rupesh-rathore.md @@ -4,6 +4,10 @@ description: "A Moth who found his flames to chase! : A transformative internshi 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/suresh-chelani.md b/src/content/blog/suresh-chelani.md index fab33ec..a3aa932 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 + - software-development + - development --- ## Internship Experience at RecursiveZero Pvt. Ltd diff --git a/src/pages/about.astro b/src/pages/about.astro index bf04304..6860a0d 100644 --- a/src/pages/about.astro +++ b/src/pages/about.astro @@ -1,207 +1,377 @@ --- -import aboutImage from "@/assets/images/about.jpg"; import BaseLayout from "@/layouts/BaseLayout"; +import aboutImage from "@/assets/images/about.png"; +const founders = [ + { + name: "Keshav Mohta", + designation: "Founder & CEO", + location: "India", + initials: "K", + description: + "Building products with simplicity, performance and long-term scalability. Focused on helping startups and businesses grow through modern engineering and practical digital solutions.", + tags: ["Product Engineering", "Web Platforms", "Startup Growth", "Scalable Systems"], + email: "hello@recursivezero.com", + linkedin: "https://www.linkedin.com/in/xkeshav/", + isActive: true, + }, + + { + name: "Parvez Akhtar", + designation: "Hong Kong (BA)", + location: "Hong Kong", + initials: "P", + description: "Driving business expansion and strategic partnerships while helping Recursive Zero scale globally.", + tags: ["Business Advisory", "Global Partnerships", "Growth"], + email: null, + linkedin: null, + isActive: true, + }, + + { + name: "Rajeev Chaturvedi", + designation: "Jaipur (COO)", + location: "Jaipur", + initials: "R", + description: "Focused on operations, execution and building efficient systems that support long-term growth.", + tags: ["Operations", "Execution", "Scalable Systems"], + email: null, + linkedin: null, + isActive: true, + }, + { + name: "Varun Daga", + designation: "CTO", + location: "Bengaluru", + description: + "Leading technology architecture and engineering strategy while building scalable and high-performance digital systems.", + tags: [ + "System Architecture", + "Engineering Leadership", + "Scalable Systems" + ], + email: null, + linkedin: null, + isActive: true, +}, + + +]; --- - -
- -
-
- + +
+ +
+
+

About Recursive Zero

-

- We Build Digital Products That - Drive Growth. +

+ Building Technology
+ That Creates
+ Real Impact.

-

- Welcome to Recursive Zero! We’re a passionate software team dedicated to building premium web applications, - scalable systems and digital products that solve real-world business problems. +

+ Recursive Zero is a product engineering company focused on crafting scalable web applications, internal + tools and digital systems that help startups and businesses move faster.

-

- Founded in 2024, we’ve been focused on combining modern technologies, exceptional engineering and product - thinking to help startups and businesses move faster, automate workflows and scale confidently. +

+ Since 2024, we’ve been helping teams simplify workflows, automate operations and transform ideas into + meaningful digital products.

-
- +
- Contact Us → - +

10+

+ +

Projects

+
- - View Our Work - +

2024

+ +

Founded

+
+ +
+

24/7

+ +

Support

+
- -
-
+ +
+
+ About Recursive Zero +
+ +
+
+

Product Engineering

+ +

Building scalable digital products.

+
+
+

Modern Tech

- About Recursive Zero +

Fast, secure and future-ready systems.

+
+
- +
-
-

What We Do

+

What We Do

-

Digital Solutions Built For Modern Businesses

-
+

+ Digital Solutions Built For Modern Businesses +

-
-
+
+

Web Applications

-

+

High-performance, scalable web apps designed with modern technologies and premium user experiences.

-
+

Internal Tools

-

+

We simplify operations by building internal tools that improve productivity and automate repetitive work.

-
+

Scalable Systems

-

+

From startups to enterprises, we engineer systems built for long-term growth and performance.

- -
-
-
-

2024

-

Founded

-
- -
-

10+

-

Projects

-
- -
-

100%

-

Client Focused

-
- -
-

24/7

-

Support

-
-
-
+ +
+
+

Meet The Team

- -
-
-

Meet The Team

+

People Behind Recursive Zero

-

People Behind Recursive Zero

+

+ Passionate builders focused on crafting scalable products, solving real business problems and shipping + impactful solutions. +

-
-
founder.isActive) + .map((founder) => ( +
+ {/* glow */} +
+ +
+
+
+ { + founder.name + .split(" ") + .map((word) => word[0]) + .slice(0, 2) + .join("") + } +
+ +
+

+ {founder.name} +

+ + {founder.designation} + + +

+ {founder.location} +

+
+
+ +

{founder.description}

+ { + (founder.email || founder.linkedin) && ( +
+ { + founder.email && ( + - K -
- -

Keshav Mohta

- -

Founder & CEO

-
- - -
-
+

Building meaningful digital products with modern engineering.

+
- -
-
-

Our Mission

+
+

Faster Execution

-

Innovation With Purpose

+

Delivering scalable systems with speed and reliability.

+
-

- Our mission is to deliver exceptional value through innovative solutions, outstanding engineering and modern - digital experiences. We believe in creating long-term partnerships that help businesses grow with confidence. -

+
+

Long-Term Partnerships

+ +

Helping startups and businesses grow through technology.

+
+
+
- - -
-