commit 2b8d1d0f1ddf9036d6f388d97e41c6fc4f2b60b7 Author: Ricocc Date: Thu Nov 6 01:12:02 2025 +0800 init diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ebe51d3 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = false +insert_final_newline = false \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..35d5ae6 Binary files /dev/null and b/.env.example differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..094324d --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# environment variables +.env +.env.local +.env.production +.env.production.local + +# macOS-specific files +.DS_Store + +# IDE +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# OS +Thumbs.db +.DS_Store + +# Temporary files +*.tmp +*.temp +.cache/ diff --git a/.node-version.bak b/.node-version.bak new file mode 100644 index 0000000..9a2a0e2 --- /dev/null +++ b/.node-version.bak @@ -0,0 +1 @@ +v20 diff --git a/README-zh.md b/README-zh.md new file mode 100644 index 0000000..d9eb2fa --- /dev/null +++ b/README-zh.md @@ -0,0 +1,196 @@ +# Rico Portfolio - 设计师个人作品集网站 + +一个基于 Astro 构建的现代化、高性能设计师个人作品集网站模板。采用复古蓝色主题,支持暗色模式,具有精美的动画效果和优秀的用户体验。 + +![Astro](https://img.shields.io/badge/Astro-5.14.1-FF5D01?logo=astro&logoColor=white) +![Tailwind CSS](https://img.shields.io/badge/Tailwind-4.1.14-38B2AC?logo=tailwind-css&logoColor=white) +![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg) + +## ✨ 特性 + +- 🚀 **基于 Astro** - 快速、轻量级的静态站点生成器 +- 🎨 **现代化设计** - 复古蓝色主题,支持暗色/亮色模式切换 +- 📱 **完全响应式** - 适配各种设备尺寸 +- 🎭 **精美动画** - 使用 AOS 和自定义动画效果 +- 📝 **博客系统** - 支持 MDX 格式的博客文章 +- 🎯 **作品展示** - 优雅的作品集展示页面 +- 🔍 **SEO 优化** - 内置 SEO 和社交媒体标签 +- ⚡ **性能优化** - 图片优化、代码分割、懒加载 +- 🌐 **国际化支持** - 易于扩展多语言支持 + +## 🛠️ 技术栈 + +- **框架**: [Astro](https://astro.build) 5.14.1 +- **样式**: [Tailwind CSS](https://tailwindcss.com) 4.1.14 +- **动画**: [AOS](https://michalsnik.github.io/aos/) +- **物理引擎**: [Matter.js](https://brm.io/matter-js/) +- **内容管理**: MDX +- **类型检查**: TypeScript + +## 📦 安装 + +### 使用包管理器 + +```bash +# 使用 npm +npm install + +# 使用 pnpm (推荐) +pnpm install + +# 使用 yarn +yarn install +``` + +### 环境变量配置 + +复制 `.env.example` 文件为 `.env` 并填写相应的配置: + +```bash +cp .env.example .env +``` + +编辑 `.env` 文件,填入你的配置: + +```env +# 站点 URL(可选,但有默认值 https://your-domain.com) +# 首次部署可以不设置,但建议尽快设置正确的域名以优化 SEO +PUBLIC_SITE_URL=https://your-domain.com + +# 分析工具(可选) +PUBLIC_GA4_ID=your-google-analytics-id +PUBLIC_UMAMI_ID=your-umami-id +``` + +> **注意**:`PUBLIC_SITE_URL` 如果没有设置,会使用默认值 `https://your-domain.com`。虽然不会报错,但建议在部署后尽快设置正确的域名,以确保 sitemap、RSS feed 和 SEO 元标签正常工作。 + +## 🚀 开发 + +```bash +# 启动开发服务器 +npm run dev +# 或 +pnpm dev + +# 访问 http://localhost:4321 +``` + +## 📦 构建 + +```bash +# 构建生产版本 +npm run build + +# 预览构建结果 +npm run preview +``` + +## 📁 项目结构 + +``` +├── public/ # 静态资源 +│ ├── assets/ # 图片、视频等资源 +│ └── favicon.png # 网站图标 +├── src/ +│ ├── assets/ # 源代码资源 +│ ├── collections/ # 数据集合(作品、经历等) +│ ├── components/ # Astro 组件 +│ │ ├── cards/ # 卡片组件 +│ │ ├── sections/ # 页面区块组件 +│ │ ├── ui/ # UI 组件 +│ │ └── widgets/ # 小部件 +│ ├── config/ # 配置文件 +│ ├── content/ # MDX 博客内容 +│ ├── layouts/ # 布局组件 +│ ├── pages/ # 页面路由 +│ ├── scripts/ # 脚本文件 +│ └── styles/ # 样式文件 +├── astro.config.mjs # Astro 配置 +├── tailwind.config.mjs # Tailwind 配置 +└── package.json # 项目依赖 +``` + +## 🎨 自定义配置 + +### 修改网站信息 + +编辑 `src/config/site.js` 文件,修改网站的基本信息: + +```javascript +export const siteConfig = { + title: "Your Portfolio", + author: "Your Name", + url: "https://your-domain.com", + // ... 更多配置 +}; +``` + +### 修改主题颜色 + +编辑 `src/styles/global.css` 文件中的 CSS 变量: + +```css +@theme { + --color-primary: #2d6dc3; + --color-primary-dark: #3b7bd9; + /* ... 更多颜色变量 */ +} +``` + +### 添加作品 + +在 `src/collections/works.json` 中添加你的作品信息。 + +### 添加博客文章 + +在 `src/content/post/` 目录下创建新的 MDX 文件。 + + + +## 📧 联系方式 + +- **作者**: Ricoui +- **博客**: [ricoui.com](https://github.com/ricocc) +- **邮箱**: hello@ricoui.com +- **Twitter**: [@ricouii](https://x.com/ricouii) +- **GitHub**: [@ricocc](https://github.com/ricocc) + + +## 💡 其他产品 + +- **Rico Blog** - 开源 : [https://github.com/ricocc/public-portfolio-site](https://github.com/ricocc/public-portfolio-site) + +- **OG Gallery**: [ricoog.com](https://ricoog.com/) + + +## 🙏 致谢 + +- [Astro](https://astro.build) - 优秀的静态站点生成器 +- [Tailwind CSS](https://tailwindcss.com) - 实用优先的 CSS 框架 +- 所有为这个项目做出贡献的开发者 + +## 📝 更新日志d + +查看 [CHANGELOG.md](CHANGELOG.md) 了解版本更新历史。 + + +## 关于作者 + +我是Rico,网页/UI设计师,热衷于做些有趣和创意的作品。拥有 UI/UX 设计工作经验,目前专注于网页设计和视觉落地,以及开发项目探索。我平时在博客Rico's Blog更新内容。也可以关注我的小红书 [@Rico的设计漫想](https://www.xiaohongshu.com/user/profile/5f2b6903000000000101f51f) 和 推特 [@ricouii](https://x.com/ricouii). + +或者添加我的微信,交个朋友 + +ricocc-wechat + + +## 💜 支持作者 + + +如果觉得有所帮助的话,一点点支持就可以大大激励创作者的热情,感谢! + +ricocc-wechat + + +--- + +⭐ 如果这个项目对你有帮助,请给一个 Star! diff --git a/README.md b/README.md new file mode 100644 index 0000000..4e58a5e --- /dev/null +++ b/README.md @@ -0,0 +1,193 @@ +# Rico Portfolio - Designer Portfolio Website + +> [中文文档](README-zh.md) | English + +A modern, high-performance designer portfolio website template built with Astro. Features a retro blue theme, dark mode support, beautiful animations, and excellent user experience. + +![Astro](https://img.shields.io/badge/Astro-5.14.1-FF5D01?logo=astro&logoColor=white) +![Tailwind CSS](https://img.shields.io/badge/Tailwind-4.1.14-38B2AC?logo=tailwind-css&logoColor=white) +![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg) + +## ✨ Features + +- 🚀 **Built with Astro** - Fast and lightweight static site generator +- 🎨 **Modern Design** - Retro blue theme with dark/light mode toggle +- 📱 **Fully Responsive** - Adapts to all device sizes +- 🎭 **Beautiful Animations** - Using AOS and custom animation effects +- 📝 **Blog System** - Supports MDX format blog posts +- 🎯 **Portfolio Showcase** - Elegant portfolio showcase pages +- 🔍 **SEO Optimized** - Built-in SEO and social media tags +- ⚡ **Performance Optimized** - Image optimization, code splitting, lazy loading +- 🌐 **i18n Support** - Easy to extend for multi-language support + +## 🛠️ Tech Stack + +- **Framework**: [Astro](https://astro.build) 5.14.1 +- **Styling**: [Tailwind CSS](https://tailwindcss.com) 4.1.14 +- **Animations**: [AOS](https://michalsnik.github.io/aos/) +- **Physics Engine**: [Matter.js](https://brm.io/matter-js/) +- **Content Management**: MDX +- **Type Checking**: TypeScript + +## 📦 Installation + +### Using Package Manager + +```bash +# Using npm +npm install + +# Using pnpm (recommended) +pnpm install + +# Using yarn +yarn install +``` + +### Environment Variables Configuration + +Copy `.env.example` to `.env` and fill in the corresponding configuration: + +```bash +cp .env.example .env +``` + +Edit the `.env` file and fill in your configuration: + +```env +# Site URL (optional, but has default value https://your-domain.com) +# You can skip this on first deployment, but it's recommended to set the correct domain as soon as possible to optimize SEO +PUBLIC_SITE_URL=https://your-domain.com + +# Analytics (optional) +PUBLIC_GA4_ID=your-google-analytics-id +PUBLIC_UMAMI_ID=your-umami-id +``` + +> **Note**: If `PUBLIC_SITE_URL` is not set, it will use the default value `https://your-domain.com`. While it won't cause errors, it's recommended to set the correct domain after deployment to ensure sitemap, RSS feed, and SEO meta tags work properly. + +## 🚀 Development + +```bash +# Start development server +npm run dev +# or +pnpm dev + +# Visit http://localhost:4321 +``` + +## 📦 Build + +```bash +# Build for production +npm run build + +# Preview build result +npm run preview +``` + +## 📁 Project Structure + +``` +├── public/ # Static assets +│ ├── assets/ # Images, videos, etc. +│ └── favicon.png # Site favicon +├── src/ +│ ├── assets/ # Source assets +│ ├── collections/ # Data collections (works, experiences, etc.) +│ ├── components/ # Astro components +│ │ ├── cards/ # Card components +│ │ ├── sections/ # Section components +│ │ ├── ui/ # UI components +│ │ └── widgets/ # Widgets +│ ├── config/ # Configuration files +│ ├── content/ # MDX blog content +│ ├── layouts/ # Layout components +│ ├── pages/ # Page routes +│ ├── scripts/ # Script files +│ └── styles/ # Style files +├── astro.config.mjs # Astro configuration +├── tailwind.config.mjs # Tailwind configuration +└── package.json # Project dependencies +``` + +## 🎨 Customization + +### Modify Site Information + +Edit the `src/config/site.js` file to modify the site's basic information: + +```javascript +export const siteConfig = { + title: "Your Portfolio", + author: "Your Name", + url: "https://your-domain.com", + // ... more configuration +}; +``` + +### Modify Theme Colors + +Edit the CSS variables in the `src/styles/global.css` file: + +```css +@theme { + --color-primary: #2d6dc3; + --color-primary-dark: #3b7bd9; + /* ... more color variables */ +} +``` + +### Add Works + +Add your work information in `src/collections/works.json`. + +### Add Blog Posts + +Create new MDX files in the `src/content/post/` directory. + + + +## 📧 Contact + +- **Author**: Ricoui +- **Blog**: [ricoui.com](https://github.com/ricocc) +- **Email**: hello@ricoui.com +- **Twitter**: [@ricouii](https://x.com/ricouii) +- **GitHub**: [@ricocc](https://github.com/ricocc) + + +## 💡 Other Products + +- **Rico Blog** - Open Source: [https://github.com/ricocc/public-portfolio-site](https://github.com/ricocc/public-portfolio-site) + +- **OG Gallery**: [ricoog.com](https://ricoog.com/) + + +## 🙏 Acknowledgments + +- [Astro](https://astro.build) - Excellent static site generator +- [Tailwind CSS](https://tailwindcss.com) - Utility-first CSS framework +- All developers who contributed to this project + + +## About the Author + +I'm Rico, a web/UI designer passionate about creating fun and creative work. I have experience in UI/UX design and am currently focused on web design, visual implementation, and exploring development projects. I regularly update my blog on Rico's Blog. You can also follow me on Xiaohongshu [@Rico的设计漫想](https://www.xiaohongshu.com/user/profile/5f2b6903000000000101f51f) 和 X [@ricouii](https://x.com/ricouii). + + +Or add me on WeChat—let’s be friends. + +ricocc-wechat + + +## 💜 Support the Author + +If you’ve found this helpful, even a small contribution can greatly encourage creators. Thank you! + +ricocc-wechat + +Buy Me a Coffee at ko-fi.com + +⭐ If this project helps you, please give it a Star! diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..044f626 --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,37 @@ +import tailwindcss from "@tailwindcss/vite"; +import { defineConfig } from "astro/config"; +import mdx from "@astrojs/mdx"; +import sitemap from "@astrojs/sitemap"; +import { fileURLToPath } from "url"; +import path from "path"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +// 从环境变量获取站点 URL,如果没有设置则使用默认值 +// 注意:首次部署后请务必在 .env 文件中设置正确的 PUBLIC_SITE_URL +const siteUrl = process.env.PUBLIC_SITE_URL || 'https://portfolio.ricoui.com/'; + +// https://astro.build/config +export default defineConfig({ + site: siteUrl, + base: '/', + envPrefix: 'PUBLIC_', + vite: { + plugins: [tailwindcss()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src') + } + } + }, + + legacy: { + collections: true, + }, + + server: { + port: 5200, + }, + + integrations: [mdx(), sitemap()], +}); \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..87d8e70 --- /dev/null +++ b/package.json @@ -0,0 +1,61 @@ +{ + "name": "astro-rico-portfolio", + "type": "module", + "version": "1.0.0", + "description": "A modern, high-performance portfolio website template for designers built with Astro. Features retro blue theme, dark mode, and beautiful animations.", + "keywords": [ + "astro", + "portfolio", + "designer", + "website", + "template", + "tailwindcss", + "blog", + "dark-mode", + "responsive" + ], + "author": { + "name": "Ricoui", + "email": "hello@ricoui.com", + "url": "https://ricoui.com" + }, + "repository": { + "type": "git", + "url": "https://github.com/ricocc/ricoui-portfolio.git" + }, + "bugs": { + "url": "https://github.com/ricocc/ricoui-portfolio/issues" + }, + "homepage": "https://github.com/ricocc/ricoui-portfolio#readme", + "license": "Apache-2.0", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro check && astro build", + "preview": "astro preview", + "astro": "astro", + "check": "biome check --apply-unsafe ." + }, + "devDependencies": { + "@astrojs/check": "^0.9.4", + "@biomejs/biome": "1.7.3", + "@tailwindcss/typography": "^0.5.13", + "@types/matter-js": "^0.20.2", + "astro": "^5.14.1", + "postcss": "^8.4.31", + "tailwindcss": "^4.1.14", + "typescript": "^5.4.5", + "vite": "^5.2.11" + }, + "dependencies": { + "@astrojs/mdx": "^4.3.7", + "@astrojs/rss": "^4.0.13", + "@astrojs/sitemap": "^3.6.0", + "@lucide/astro": "^0.546.0", + "@tailwindcss/vite": "^4.1.14", + "aos": "^2.3.4", + "matter-js": "^0.20.0", + "motion": "^12.23.24", + "sharp": "^0.34.4" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..b6a34de --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5365 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@astrojs/mdx': + specifier: ^4.3.7 + version: 4.3.7(astro@5.14.1(@types/node@24.6.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.52.3)(typescript@5.9.2)(yaml@2.8.1)) + '@astrojs/rss': + specifier: ^4.0.13 + version: 4.0.13 + '@astrojs/sitemap': + specifier: ^3.6.0 + version: 3.6.0 + '@lucide/astro': + specifier: ^0.546.0 + version: 0.546.0(astro@5.14.1(@types/node@24.6.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.52.3)(typescript@5.9.2)(yaml@2.8.1)) + '@tailwindcss/vite': + specifier: ^4.1.14 + version: 4.1.14(vite@5.4.20(@types/node@24.6.0)(lightningcss@1.30.1)) + aos: + specifier: ^2.3.4 + version: 2.3.4 + matter-js: + specifier: ^0.20.0 + version: 0.20.0 + motion: + specifier: ^12.23.24 + version: 12.23.24 + sharp: + specifier: ^0.34.4 + version: 0.34.4 + devDependencies: + '@astrojs/check': + specifier: ^0.9.4 + version: 0.9.4(typescript@5.9.2) + '@biomejs/biome': + specifier: 1.7.3 + version: 1.7.3 + '@tailwindcss/typography': + specifier: ^0.5.13 + version: 0.5.19(tailwindcss@4.1.14) + '@types/matter-js': + specifier: ^0.20.2 + version: 0.20.2 + astro: + specifier: ^5.14.1 + version: 5.14.1(@types/node@24.6.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.52.3)(typescript@5.9.2)(yaml@2.8.1) + postcss: + specifier: ^8.4.31 + version: 8.5.6 + tailwindcss: + specifier: ^4.1.14 + version: 4.1.14 + typescript: + specifier: ^5.4.5 + version: 5.9.2 + vite: + specifier: ^5.2.11 + version: 5.4.20(@types/node@24.6.0)(lightningcss@1.30.1) + +packages: + + '@astrojs/check@0.9.4': + resolution: {integrity: sha512-IOheHwCtpUfvogHHsvu0AbeRZEnjJg3MopdLddkJE70mULItS/Vh37BHcI00mcOJcH1vhD3odbpvWokpxam7xA==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + + '@astrojs/compiler@2.13.0': + resolution: {integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==} + + '@astrojs/internal-helpers@0.7.3': + resolution: {integrity: sha512-6Pl0bQEIChuW5wqN7jdKrzWfCscW2rG/Cz+fzt4PhSQX2ivBpnhXgFUCs0M3DCYvjYHnPVG2W36X5rmFjZ62sw==} + + '@astrojs/internal-helpers@0.7.4': + resolution: {integrity: sha512-lDA9MqE8WGi7T/t2BMi+EAXhs4Vcvr94Gqx3q15cFEz8oFZMO4/SFBqYr/UcmNlvW+35alowkVj+w9VhLvs5Cw==} + + '@astrojs/language-server@2.15.4': + resolution: {integrity: sha512-JivzASqTPR2bao9BWsSc/woPHH7OGSGc9aMxXL4U6egVTqBycB3ZHdBJPuOCVtcGLrzdWTosAqVPz1BVoxE0+A==} + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: '>=0.11.0' + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + + '@astrojs/markdown-remark@6.3.7': + resolution: {integrity: sha512-KXGdq6/BC18doBCYXp08alHlWChH0hdD2B1qv9wIyOHbvwI5K6I7FhSta8dq1hBQNdun8YkKPR013D/Hm8xd0g==} + + '@astrojs/markdown-remark@6.3.8': + resolution: {integrity: sha512-uFNyFWadnULWK2cOw4n0hLKeu+xaVWeuECdP10cQ3K2fkybtTlhb7J7TcScdjmS8Yps7oje9S/ehYMfZrhrgCg==} + + '@astrojs/mdx@4.3.7': + resolution: {integrity: sha512-5SRmvMyT/UMWaU2eoD+htnXtE2mUZZEH2K/nEzhuEy+iCsOSuS/DUry59WuKUJRQETi1mgJFdNR4dZLJHYVuRA==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + peerDependencies: + astro: ^5.0.0 + + '@astrojs/prism@3.3.0': + resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/rss@4.0.13': + resolution: {integrity: sha512-ugW4DmGn8kgfl8/qecU3EcKCAuEBrZqY7eYfa6at0sY7HGEwRdzsOafLE437RwDMP2ZuxfKnCNABs99YVhX0kg==} + + '@astrojs/sitemap@3.6.0': + resolution: {integrity: sha512-4aHkvcOZBWJigRmMIAJwRQXBS+ayoP5z40OklTXYXhUDhwusz+DyDl+nSshY6y9DvkVEavwNcFO8FD81iGhXjg==} + + '@astrojs/telemetry@3.3.0': + resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/yaml2ts@0.2.2': + resolution: {integrity: sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + + '@biomejs/biome@1.7.3': + resolution: {integrity: sha512-ogFQI+fpXftr+tiahA6bIXwZ7CSikygASdqMtH07J2cUzrpjyTMVc9Y97v23c7/tL1xCZhM+W9k4hYIBm7Q6cQ==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.7.3': + resolution: {integrity: sha512-eDvLQWmGRqrPIRY7AIrkPHkQ3visEItJKkPYSHCscSDdGvKzYjmBJwG1Gu8+QC5ed6R7eiU63LEC0APFBobmfQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.7.3': + resolution: {integrity: sha512-JXCaIseKRER7dIURsVlAJacnm8SG5I0RpxZ4ya3dudASYUc68WGl4+FEN03ABY3KMIq7hcK1tzsJiWlmXyosZg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.7.3': + resolution: {integrity: sha512-c8AlO45PNFZ1BYcwaKzdt46kYbuP6xPGuGQ6h4j3XiEDpyseRRUy/h+6gxj07XovmyxKnSX9GSZ6nVbZvcVUAw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.7.3': + resolution: {integrity: sha512-phNTBpo7joDFastnmZsFjYcDYobLTx4qR4oPvc9tJ486Bd1SfEVPHEvJdNJrMwUQK56T+TRClOQd/8X1nnjA9w==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.7.3': + resolution: {integrity: sha512-UdEHKtYGWEX3eDmVWvQeT+z05T9/Sdt2+F/7zmMOFQ7boANeX8pcO6EkJPK3wxMudrApsNEKT26rzqK6sZRTRA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.7.3': + resolution: {integrity: sha512-vnedYcd5p4keT3iD48oSKjOIRPYcjSNNbd8MO1bKo9ajg3GwQXZLAH+0Cvlr+eMsO67/HddWmscSQwTFrC/uPA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.7.3': + resolution: {integrity: sha512-unNCDqUKjujYkkSxs7gFIfdasttbDC4+z0kYmcqzRk6yWVoQBL4dNLcCbdnJS+qvVDNdI9rHp2NwpQ0WAdla4Q==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.7.3': + resolution: {integrity: sha512-ZmByhbrnmz/UUFYB622CECwhKIPjJLLPr5zr3edhu04LzbfcOrz16VYeNq5dpO1ADG70FORhAJkaIGdaVBG00w==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@capsizecss/unpack@2.4.0': + resolution: {integrity: sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==} + + '@emmetio/abbreviation@2.3.3': + resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} + + '@emmetio/css-abbreviation@2.1.8': + resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + + '@emmetio/css-parser@0.4.0': + resolution: {integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==} + + '@emmetio/html-matcher@1.3.0': + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + + '@emmetio/scanner@1.0.4': + resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + + '@emmetio/stream-reader-utils@0.1.0': + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + + '@emmetio/stream-reader@2.2.0': + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.4': + resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.4': + resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.3': + resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.3': + resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.3': + resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.3': + resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.3': + resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.3': + resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.3': + resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.4': + resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.4': + resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.4': + resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.4': + resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.4': + resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.4': + resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.4': + resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.4': + resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.4': + resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.4': + resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.4': + resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@lucide/astro@0.546.0': + resolution: {integrity: sha512-yHAL5eRQh8RBggN0y7ier88K2PpggKqEBjC5RhNvQGNLB+u7VlbzCRRNVfebzo9Q0L2nhylC/PcDAu+ZZt0FNg==} + peerDependencies: + astro: ^4 || ^5 + + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.52.3': + resolution: {integrity: sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.52.3': + resolution: {integrity: sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.52.3': + resolution: {integrity: sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.3': + resolution: {integrity: sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.3': + resolution: {integrity: sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.3': + resolution: {integrity: sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.3': + resolution: {integrity: sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.3': + resolution: {integrity: sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.52.3': + resolution: {integrity: sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.52.3': + resolution: {integrity: sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.52.3': + resolution: {integrity: sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.3': + resolution: {integrity: sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.3': + resolution: {integrity: sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.3': + resolution: {integrity: sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.3': + resolution: {integrity: sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.52.3': + resolution: {integrity: sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.52.3': + resolution: {integrity: sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.52.3': + resolution: {integrity: sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.3': + resolution: {integrity: sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.3': + resolution: {integrity: sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.3': + resolution: {integrity: sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.3': + resolution: {integrity: sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==} + cpu: [x64] + os: [win32] + + '@shikijs/core@3.13.0': + resolution: {integrity: sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==} + + '@shikijs/engine-javascript@3.13.0': + resolution: {integrity: sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg==} + + '@shikijs/engine-oniguruma@3.13.0': + resolution: {integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==} + + '@shikijs/langs@3.13.0': + resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==} + + '@shikijs/themes@3.13.0': + resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==} + + '@shikijs/types@3.13.0': + resolution: {integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@tailwindcss/node@4.1.14': + resolution: {integrity: sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==} + + '@tailwindcss/oxide-android-arm64@4.1.14': + resolution: {integrity: sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.14': + resolution: {integrity: sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.14': + resolution: {integrity: sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.14': + resolution: {integrity: sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': + resolution: {integrity: sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': + resolution: {integrity: sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.14': + resolution: {integrity: sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.14': + resolution: {integrity: sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.14': + resolution: {integrity: sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.14': + resolution: {integrity: sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': + resolution: {integrity: sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.14': + resolution: {integrity: sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.14': + resolution: {integrity: sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==} + engines: {node: '>= 10'} + + '@tailwindcss/typography@0.5.19': + resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + + '@tailwindcss/vite@4.1.14': + resolution: {integrity: sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/fontkit@2.0.8': + resolution: {integrity: sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/matter-js@0.20.2': + resolution: {integrity: sha512-3PPKy3QxvZ89h9+wdBV2488I1JLVs7DEpIkPvgO8JC1mUdiVSO37ZIvVctOTD7hIq8OAL2gJ3ugGSuUip6DhCw==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + + '@types/node@24.6.0': + resolution: {integrity: sha512-F1CBxgqwOMc4GKJ7eY22hWhBVQuMYTtqI8L0FcszYcpYX0fzfDGpez22Xau8Mgm7O9fI+zA/TYIdq3tGWfweBA==} + + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@volar/kit@2.4.23': + resolution: {integrity: sha512-YuUIzo9zwC2IkN7FStIcVl1YS9w5vkSFEZfPvnu0IbIMaR9WHhc9ZxvlT+91vrcSoRY469H2jwbrGqpG7m1KaQ==} + peerDependencies: + typescript: '*' + + '@volar/language-core@2.4.23': + resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==} + + '@volar/language-server@2.4.23': + resolution: {integrity: sha512-k0iO+tybMGMMyrNdWOxgFkP0XJTdbH0w+WZlM54RzJU3WZSjHEupwL30klpM7ep4FO6qyQa03h+VcGHD4Q8gEg==} + + '@volar/language-service@2.4.23': + resolution: {integrity: sha512-h5mU9DZ/6u3LCB9xomJtorNG6awBNnk9VuCioGsp6UtFiM8amvS5FcsaC3dabdL9zO0z+Gq9vIEMb/5u9K6jGQ==} + + '@volar/source-map@2.4.23': + resolution: {integrity: sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==} + + '@volar/typescript@2.4.23': + resolution: {integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==} + + '@vscode/emmet-helper@2.11.0': + resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} + + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + aos@2.3.4: + resolution: {integrity: sha512-zh/ahtR2yME4I51z8IttIt4lC1Nw0ktsFtmeDzID1m9naJnWXhCoARaCgNOGXb5CLy3zm+wqmRAEgMYB5E2HUw==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + astro@5.14.1: + resolution: {integrity: sha512-gPa8NY7/lP8j8g81iy8UwANF3+aukKRWS68IlthZQNgykpg80ne6lbHOp6FErYycxQ1TUhgEfkXVDQZAoJx8Bg==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + base-64@1.0.0: + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + blob-to-buffer@1.2.9: + resolution: {integrity: sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==} + + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brotli@1.3.3: + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} + + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + ci-info@4.3.0: + resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} + engines: {node: '>=8'} + + classlist-polyfill@1.2.0: + resolution: {integrity: sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ==} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@2.1.1: + resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==} + engines: {node: '>=8'} + + deterministic-object-hash@2.0.2: + resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} + engines: {node: '>=18'} + + devalue@5.3.2: + resolution: {integrity: sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dfa@1.2.0: + resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + + emmet@2.4.11: + resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} + + emoji-regex@10.5.0: + resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fast-xml-parser@5.3.0: + resolution: {integrity: sha512-gkWGshjYcQCF+6qtlrqBqELqNqnt4CxruY6UVAWWnqb3DQ6qaNFEIKqzYep1XzHLM/QtrHVCxyPOtTk4LTQ7Aw==} + hasBin: true + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + fontace@0.3.0: + resolution: {integrity: sha512-czoqATrcnxgWb/nAkfyIrRp6Q8biYj7nGnL6zfhTcX+JKKpWHFBnb8uNMw/kZr7u++3Y3wYSYoZgHkCcsuBpBg==} + + fontkit@2.0.4: + resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} + + framer-motion@12.23.24: + resolution: {integrity: sha512-HMi5HRoRCTou+3fb3h9oTLyJGBxHfW+HnNE25tAXOvVx/IvwMHK0cx7IR4a2ZU6sh3IX1Z+4ts32PcYBOqka8w==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + h3@1.15.4: + resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + jsonc-parser@2.3.1: + resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + matter-js@0.20.0: + resolution: {integrity: sha512-iC9fYR7zVT3HppNnsFsp9XOoQdQN2tUyfaKg4CHLH8bN+j6GT4Gw7IH2rP0tflAebrHFw730RR3DkVSZRX8hwA==} + + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + motion-dom@12.23.23: + resolution: {integrity: sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==} + + motion-utils@12.23.6: + resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==} + + motion@12.23.24: + resolution: {integrity: sha512-Rc5E7oe2YZ72N//S3QXGzbnXgqNrTESv8KKxABR20q2FLch9gHLo0JLyYo2hZ238bZ9Gx6cWhj9VO0IgwbMjCw==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-mock-http@1.0.3: + resolution: {integrity: sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.3: + resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} + + p-limit@6.2.0: + resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} + engines: {node: '>=18'} + + p-queue@8.1.1: + resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} + engines: {node: '>=18'} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prettier@2.8.7: + resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} + engines: {node: '>=10.13.0'} + hasBin: true + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + request-light@0.5.8: + resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} + + request-light@0.7.0: + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + restructure@3.0.2: + resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} + + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.52.3: + resolution: {integrity: sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + sharp@0.34.4: + resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shiki@3.13.0: + resolution: {integrity: sha512-aZW4l8Og16CokuCLf8CF8kq+KK2yOygapU5m3+hoGw0Mdosc6fPitjM+ujYarppj5ZIKGyPDPP1vqmQhr+5/0g==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@8.0.1: + resolution: {integrity: sha512-4Y8ynSMFAy/DadeAeio8Kx4zfC8/0VcKi7TH0I1SazvBcrU2fpJaGoeWsX1FMRaHoe3VGMA53DqVoLErZrtG9Q==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + hasBin: true + + smol-toml@1.4.2: + resolution: {integrity: sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==} + engines: {node: '>= 18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + stream-replace-string@2.0.0: + resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + + style-to-js@1.1.18: + resolution: {integrity: sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==} + + style-to-object@1.0.11: + resolution: {integrity: sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==} + + tailwindcss@4.1.14: + resolution: {integrity: sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tar@7.5.1: + resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} + engines: {node: '>=18'} + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typesafe-path@0.2.2: + resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} + + typescript-auto-import-cache@0.3.6: + resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} + + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + ultrahtml@1.6.0: + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@7.13.0: + resolution: {integrity: sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==} + + unicode-properties@1.4.1: + resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} + + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unifont@0.5.2: + resolution: {integrity: sha512-LzR4WUqzH9ILFvjLAUU7dK3Lnou/qd5kD+IakBtBK4S15/+x2y9VX+DcWQv6s551R6W+vzwgVS6tFg3XggGBgg==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + unstorage@1.17.1: + resolution: {integrity: sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6.0.3 || ^7.0.0 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1.0.1 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@5.4.20: + resolution: {integrity: sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@6.3.6: + resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + volar-service-css@0.0.62: + resolution: {integrity: sha512-JwNyKsH3F8PuzZYuqPf+2e+4CTU8YoyUHEHVnoXNlrLe7wy9U3biomZ56llN69Ris7TTy/+DEX41yVxQpM4qvg==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-emmet@0.0.62: + resolution: {integrity: sha512-U4dxWDBWz7Pi4plpbXf4J4Z/ss6kBO3TYrACxWNsE29abu75QzVS0paxDDhI6bhqpbDFXlpsDhZ9aXVFpnfGRQ==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-html@0.0.62: + resolution: {integrity: sha512-Zw01aJsZRh4GTGUjveyfEzEqpULQUdQH79KNEiKVYHZyuGtdBRYCHlrus1sueSNMxwwkuF5WnOHfvBzafs8yyQ==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-prettier@0.0.62: + resolution: {integrity: sha512-h2yk1RqRTE+vkYZaI9KYuwpDfOQRrTEMvoHol0yW4GFKc75wWQRrb5n/5abDrzMPrkQbSip8JH2AXbvrRtYh4w==} + peerDependencies: + '@volar/language-service': ~2.4.0 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + prettier: + optional: true + + volar-service-typescript-twoslash-queries@0.0.62: + resolution: {integrity: sha512-KxFt4zydyJYYI0kFAcWPTh4u0Ha36TASPZkAnNY784GtgajerUqM80nX/W1d0wVhmcOFfAxkVsf/Ed+tiYU7ng==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-typescript@0.0.62: + resolution: {integrity: sha512-p7MPi71q7KOsH0eAbZwPBiKPp9B2+qrdHAd6VY5oTo9BUXatsOAdakTm9Yf0DUj6uWBAaOT01BSeVOPwucMV1g==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-yaml@0.0.62: + resolution: {integrity: sha512-k7gvv7sk3wa+nGll3MaSKyjwQsJjIGCHFjVkl3wjaSP2nouKyn9aokGmqjrl39mi88Oy49giog2GkZH526wjig==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + vscode-css-languageservice@6.3.8: + resolution: {integrity: sha512-dBk/9ullEjIMbfSYAohGpDOisOVU1x2MQHOeU12ohGJQI7+r0PCimBwaa/pWpxl/vH4f7ibrBfxIZY3anGmHKQ==} + + vscode-html-languageservice@5.5.2: + resolution: {integrity: sha512-QpaUhCjvb7U/qThOzo4V6grwsRE62Jk/vf8BRJZoABlMw3oplLB5uovrvcrLO9vYhkeMiSjyqLnCxbfHzzZqmw==} + + vscode-json-languageservice@4.1.8: + resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} + engines: {npm: '>=7.0.0'} + + vscode-jsonrpc@6.0.0: + resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} + engines: {node: '>=8.0.0 || >=10.0.0'} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.16.0: + resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.16.0: + resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@7.0.0: + resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} + hasBin: true + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml-language-server@1.15.0: + resolution: {integrity: sha512-N47AqBDCMQmh6mBLmI6oqxryHRzi33aPFPsJhYy3VTUGCdLHYjGh4FZzpUjRlphaADBBkDmnkM/++KNIOHi5Rw==} + hasBin: true + + yaml@2.2.2: + resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} + engines: {node: '>= 14'} + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + + yocto-spinner@0.2.3: + resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==} + engines: {node: '>=18.19'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zod-to-json-schema@3.24.6: + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} + peerDependencies: + zod: ^3.24.1 + + zod-to-ts@1.2.0: + resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} + peerDependencies: + typescript: ^4.9.4 || ^5.0.2 + zod: ^3 + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@astrojs/check@0.9.4(typescript@5.9.2)': + dependencies: + '@astrojs/language-server': 2.15.4(typescript@5.9.2) + chokidar: 4.0.3 + kleur: 4.1.5 + typescript: 5.9.2 + yargs: 17.7.2 + transitivePeerDependencies: + - prettier + - prettier-plugin-astro + + '@astrojs/compiler@2.13.0': {} + + '@astrojs/internal-helpers@0.7.3': {} + + '@astrojs/internal-helpers@0.7.4': {} + + '@astrojs/language-server@2.15.4(typescript@5.9.2)': + dependencies: + '@astrojs/compiler': 2.13.0 + '@astrojs/yaml2ts': 0.2.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@volar/kit': 2.4.23(typescript@5.9.2) + '@volar/language-core': 2.4.23 + '@volar/language-server': 2.4.23 + '@volar/language-service': 2.4.23 + fast-glob: 3.3.3 + muggle-string: 0.4.1 + volar-service-css: 0.0.62(@volar/language-service@2.4.23) + volar-service-emmet: 0.0.62(@volar/language-service@2.4.23) + volar-service-html: 0.0.62(@volar/language-service@2.4.23) + volar-service-prettier: 0.0.62(@volar/language-service@2.4.23) + volar-service-typescript: 0.0.62(@volar/language-service@2.4.23) + volar-service-typescript-twoslash-queries: 0.0.62(@volar/language-service@2.4.23) + volar-service-yaml: 0.0.62(@volar/language-service@2.4.23) + vscode-html-languageservice: 5.5.2 + vscode-uri: 3.1.0 + transitivePeerDependencies: + - typescript + + '@astrojs/markdown-remark@6.3.7': + dependencies: + '@astrojs/internal-helpers': 0.7.3 + '@astrojs/prism': 3.3.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-smartypants: 3.0.2 + shiki: 3.13.0 + smol-toml: 1.4.2 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/markdown-remark@6.3.8': + dependencies: + '@astrojs/internal-helpers': 0.7.4 + '@astrojs/prism': 3.3.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-smartypants: 3.0.2 + shiki: 3.13.0 + smol-toml: 1.4.2 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/mdx@4.3.7(astro@5.14.1(@types/node@24.6.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.52.3)(typescript@5.9.2)(yaml@2.8.1))': + dependencies: + '@astrojs/markdown-remark': 6.3.8 + '@mdx-js/mdx': 3.1.1 + acorn: 8.15.0 + astro: 5.14.1(@types/node@24.6.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.52.3)(typescript@5.9.2)(yaml@2.8.1) + es-module-lexer: 1.7.0 + estree-util-visit: 2.0.0 + hast-util-to-html: 9.0.5 + kleur: 4.1.5 + rehype-raw: 7.0.0 + remark-gfm: 4.0.1 + remark-smartypants: 3.0.2 + source-map: 0.7.6 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/prism@3.3.0': + dependencies: + prismjs: 1.30.0 + + '@astrojs/rss@4.0.13': + dependencies: + fast-xml-parser: 5.3.0 + picocolors: 1.1.1 + + '@astrojs/sitemap@3.6.0': + dependencies: + sitemap: 8.0.1 + stream-replace-string: 2.0.0 + zod: 3.25.76 + + '@astrojs/telemetry@3.3.0': + dependencies: + ci-info: 4.3.0 + debug: 4.4.3 + dlv: 1.1.3 + dset: 3.1.4 + is-docker: 3.0.0 + is-wsl: 3.1.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + + '@astrojs/yaml2ts@0.2.2': + dependencies: + yaml: 2.8.1 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@biomejs/biome@1.7.3': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.7.3 + '@biomejs/cli-darwin-x64': 1.7.3 + '@biomejs/cli-linux-arm64': 1.7.3 + '@biomejs/cli-linux-arm64-musl': 1.7.3 + '@biomejs/cli-linux-x64': 1.7.3 + '@biomejs/cli-linux-x64-musl': 1.7.3 + '@biomejs/cli-win32-arm64': 1.7.3 + '@biomejs/cli-win32-x64': 1.7.3 + + '@biomejs/cli-darwin-arm64@1.7.3': + optional: true + + '@biomejs/cli-darwin-x64@1.7.3': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.7.3': + optional: true + + '@biomejs/cli-linux-arm64@1.7.3': + optional: true + + '@biomejs/cli-linux-x64-musl@1.7.3': + optional: true + + '@biomejs/cli-linux-x64@1.7.3': + optional: true + + '@biomejs/cli-win32-arm64@1.7.3': + optional: true + + '@biomejs/cli-win32-x64@1.7.3': + optional: true + + '@capsizecss/unpack@2.4.0': + dependencies: + blob-to-buffer: 1.2.9 + cross-fetch: 3.2.0 + fontkit: 2.0.4 + transitivePeerDependencies: + - encoding + + '@emmetio/abbreviation@2.3.3': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-abbreviation@2.1.8': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-parser@0.4.0': + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + + '@emmetio/html-matcher@1.3.0': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/scanner@1.0.4': {} + + '@emmetio/stream-reader-utils@0.1.0': {} + + '@emmetio/stream-reader@2.2.0': {} + + '@emnapi/runtime@1.5.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.25.10': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.25.10': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.10': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.10': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.25.10': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.25.10': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.10': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.25.10': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.25.10': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.25.10': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.25.10': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.10': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.10': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.10': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.10': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.10': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.25.10': + optional: true + + '@esbuild/netbsd-arm64@0.25.10': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.10': + optional: true + + '@esbuild/openbsd-arm64@0.25.10': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.25.10': + optional: true + + '@esbuild/openharmony-arm64@0.25.10': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.10': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.10': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.10': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.25.10': + optional: true + + '@img/colour@1.0.0': {} + + '@img/sharp-darwin-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.3 + optional: true + + '@img/sharp-darwin-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.3 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.3': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.3': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.3': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + optional: true + + '@img/sharp-linux-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.3 + optional: true + + '@img/sharp-linux-arm@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.3 + optional: true + + '@img/sharp-linux-ppc64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.3 + optional: true + + '@img/sharp-linux-s390x@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.3 + optional: true + + '@img/sharp-linux-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.3 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + optional: true + + '@img/sharp-wasm32@0.34.4': + dependencies: + '@emnapi/runtime': 1.5.0 + optional: true + + '@img/sharp-win32-arm64@0.34.4': + optional: true + + '@img/sharp-win32-ia32@0.34.4': + optional: true + + '@img/sharp-win32-x64@0.34.4': + optional: true + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@lucide/astro@0.546.0(astro@5.14.1(@types/node@24.6.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.52.3)(typescript@5.9.2)(yaml@2.8.1))': + dependencies: + astro: 5.14.1(@types/node@24.6.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.52.3)(typescript@5.9.2)(yaml@2.8.1) + + '@mdx-js/mdx@3.1.1': + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + acorn: 8.15.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.1(acorn@8.15.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.6 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@oslojs/encoding@1.1.0': {} + + '@rollup/pluginutils@5.3.0(rollup@4.52.3)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.52.3 + + '@rollup/rollup-android-arm-eabi@4.52.3': + optional: true + + '@rollup/rollup-android-arm64@4.52.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.3': + optional: true + + '@rollup/rollup-darwin-x64@4.52.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.3': + optional: true + + '@shikijs/core@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.3 + + '@shikijs/engine-oniguruma@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/themes@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/types@3.13.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.1.14': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.6.1 + lightningcss: 1.30.1 + magic-string: 0.30.19 + source-map-js: 1.2.1 + tailwindcss: 4.1.14 + + '@tailwindcss/oxide-android-arm64@4.1.14': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.14': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.14': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.14': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.14': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.14': + optional: true + + '@tailwindcss/oxide@4.1.14': + dependencies: + detect-libc: 2.1.1 + tar: 7.5.1 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.14 + '@tailwindcss/oxide-darwin-arm64': 4.1.14 + '@tailwindcss/oxide-darwin-x64': 4.1.14 + '@tailwindcss/oxide-freebsd-x64': 4.1.14 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.14 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.14 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.14 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.14 + '@tailwindcss/oxide-linux-x64-musl': 4.1.14 + '@tailwindcss/oxide-wasm32-wasi': 4.1.14 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.14 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.14 + + '@tailwindcss/typography@0.5.19(tailwindcss@4.1.14)': + dependencies: + postcss-selector-parser: 6.0.10 + tailwindcss: 4.1.14 + + '@tailwindcss/vite@4.1.14(vite@5.4.20(@types/node@24.6.0)(lightningcss@1.30.1))': + dependencies: + '@tailwindcss/node': 4.1.14 + '@tailwindcss/oxide': 4.1.14 + tailwindcss: 4.1.14 + vite: 5.4.20(@types/node@24.6.0)(lightningcss@1.30.1) + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + + '@types/estree@1.0.8': {} + + '@types/fontkit@2.0.8': + dependencies: + '@types/node': 24.6.0 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/matter-js@0.20.2': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + + '@types/node@17.0.45': {} + + '@types/node@24.6.0': + dependencies: + undici-types: 7.13.0 + + '@types/sax@1.2.7': + dependencies: + '@types/node': 24.6.0 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@ungap/structured-clone@1.3.0': {} + + '@volar/kit@2.4.23(typescript@5.9.2)': + dependencies: + '@volar/language-service': 2.4.23 + '@volar/typescript': 2.4.23 + typesafe-path: 0.2.2 + typescript: 5.9.2 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-core@2.4.23': + dependencies: + '@volar/source-map': 2.4.23 + + '@volar/language-server@2.4.23': + dependencies: + '@volar/language-core': 2.4.23 + '@volar/language-service': 2.4.23 + '@volar/typescript': 2.4.23 + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-service@2.4.23': + dependencies: + '@volar/language-core': 2.4.23 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/source-map@2.4.23': {} + + '@volar/typescript@2.4.23': + dependencies: + '@volar/language-core': 2.4.23 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vscode/emmet-helper@2.11.0': + dependencies: + emmet: 2.4.11 + jsonc-parser: 2.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + '@vscode/l10n@0.0.18': {} + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + aos@2.3.4: + dependencies: + classlist-polyfill: 1.2.0 + lodash.debounce: 4.0.8 + lodash.throttle: 4.1.1 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-iterate@2.0.1: {} + + astring@1.9.0: {} + + astro@5.14.1(@types/node@24.6.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.52.3)(typescript@5.9.2)(yaml@2.8.1): + dependencies: + '@astrojs/compiler': 2.13.0 + '@astrojs/internal-helpers': 0.7.3 + '@astrojs/markdown-remark': 6.3.7 + '@astrojs/telemetry': 3.3.0 + '@capsizecss/unpack': 2.4.0 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.3.0(rollup@4.52.3) + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + boxen: 8.0.1 + ci-info: 4.3.0 + clsx: 2.1.1 + common-ancestor-path: 1.0.1 + cookie: 1.0.2 + cssesc: 3.0.0 + debug: 4.4.3 + deterministic-object-hash: 2.0.2 + devalue: 5.3.2 + diff: 5.2.0 + dlv: 1.1.3 + dset: 3.1.4 + es-module-lexer: 1.7.0 + esbuild: 0.25.10 + estree-walker: 3.0.3 + flattie: 1.1.1 + fontace: 0.3.0 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.2.0 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.19 + magicast: 0.3.5 + mrmime: 2.0.1 + neotraverse: 0.6.18 + p-limit: 6.2.0 + p-queue: 8.1.1 + package-manager-detector: 1.3.0 + picomatch: 4.0.3 + prompts: 2.4.2 + rehype: 13.0.2 + semver: 7.7.2 + shiki: 3.13.0 + smol-toml: 1.4.2 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tsconfck: 3.1.6(typescript@5.9.2) + ultrahtml: 1.6.0 + unifont: 0.5.2 + unist-util-visit: 5.0.0 + unstorage: 1.17.1 + vfile: 6.0.3 + vite: 6.3.6(@types/node@24.6.0)(jiti@2.6.1)(lightningcss@1.30.1)(yaml@2.8.1) + vitefu: 1.1.1(vite@6.3.6(@types/node@24.6.0)(jiti@2.6.1)(lightningcss@1.30.1)(yaml@2.8.1)) + xxhash-wasm: 1.1.0 + yargs-parser: 21.1.1 + yocto-spinner: 0.2.3 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + zod-to-ts: 1.2.0(typescript@5.9.2)(zod@3.25.76) + optionalDependencies: + sharp: 0.34.4 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - yaml + + axobject-query@4.1.0: {} + + bail@2.0.2: {} + + base-64@1.0.0: {} + + base64-js@1.5.1: {} + + blob-to-buffer@1.2.9: {} + + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brotli@1.3.3: + dependencies: + base64-js: 1.5.1 + + camelcase@8.0.0: {} + + ccount@2.0.1: {} + + chalk@5.6.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@3.0.0: {} + + ci-info@4.3.0: {} + + classlist-polyfill@1.2.0: {} + + cli-boxes@3.0.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@2.1.2: {} + + clsx@2.1.1: {} + + collapse-white-space@2.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + comma-separated-tokens@2.0.3: {} + + common-ancestor-path@1.0.1: {} + + cookie-es@1.2.2: {} + + cookie@1.0.2: {} + + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + cssesc@3.0.0: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + + defu@6.1.4: {} + + dequal@2.0.3: {} + + destr@2.0.5: {} + + detect-libc@2.1.1: {} + + deterministic-object-hash@2.0.2: + dependencies: + base-64: 1.0.0 + + devalue@5.3.2: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dfa@1.2.0: {} + + diff@5.2.0: {} + + dlv@1.1.3: {} + + dset@3.1.4: {} + + emmet@2.4.11: + dependencies: + '@emmetio/abbreviation': 2.3.3 + '@emmetio/css-abbreviation': 2.1.8 + + emoji-regex@10.5.0: {} + + emoji-regex@8.0.0: {} + + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + entities@6.0.1: {} + + es-module-lexer@1.7.0: {} + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.15.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.3 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.25.10: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 + + escalade@3.2.0: {} + + escape-string-regexp@5.0.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.8 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.6 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + eventemitter3@5.0.1: {} + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-uri@3.1.0: {} + + fast-xml-parser@5.3.0: + dependencies: + strnum: 2.1.1 + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + flattie@1.1.1: {} + + fontace@0.3.0: + dependencies: + '@types/fontkit': 2.0.8 + fontkit: 2.0.4 + + fontkit@2.0.4: + dependencies: + '@swc/helpers': 0.5.17 + brotli: 1.3.3 + clone: 2.1.2 + dfa: 1.2.0 + fast-deep-equal: 3.1.3 + restructure: 3.0.2 + tiny-inflate: 1.0.3 + unicode-properties: 1.4.1 + unicode-trie: 2.0.0 + + framer-motion@12.23.24: + dependencies: + motion-dom: 12.23.23 + motion-utils: 12.23.6 + tslib: 2.8.1 + + fsevents@2.3.3: + optional: true + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.4.0: {} + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + graceful-fs@4.2.11: {} + + h3@1.15.4: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.5 + defu: 6.1.4 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.3 + radix3: 1.1.2 + ufo: 1.6.1 + uncrypto: 0.1.3 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.18 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.18 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + html-escaper@3.0.3: {} + + html-void-elements@3.0.0: {} + + http-cache-semantics@4.2.0: {} + + import-meta-resolve@4.2.0: {} + + inline-style-parser@0.2.4: {} + + iron-webcrypto@1.2.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-decimal@2.0.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + jiti@2.6.1: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-schema-traverse@1.0.0: {} + + jsonc-parser@2.3.1: {} + + jsonc-parser@3.3.1: {} + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.1.1 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + + lodash.debounce@4.0.8: {} + + lodash.throttle@4.1.1: {} + + lodash@4.17.21: {} + + longest-streak@3.1.0: {} + + lru-cache@10.4.3: {} + + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + source-map-js: 1.2.1 + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + matter-js@0.20.0: {} + + mdast-util-definitions@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.12.2: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.8 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + minipass@7.1.2: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + + motion-dom@12.23.23: + dependencies: + motion-utils: 12.23.6 + + motion-utils@12.23.6: {} + + motion@12.23.24: + dependencies: + framer-motion: 12.23.24 + tslib: 2.8.1 + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.11: {} + + neotraverse@0.6.18: {} + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + + node-fetch-native@1.6.7: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-mock-http@1.0.3: {} + + normalize-path@3.0.0: {} + + ofetch@1.4.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.1 + + ohash@2.0.11: {} + + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.3: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.0.1 + regex-recursion: 6.0.2 + + p-limit@6.2.0: + dependencies: + yocto-queue: 1.2.1 + + p-queue@8.1.1: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.4 + + p-timeout@6.1.4: {} + + package-manager-detector@1.3.0: {} + + pako@0.2.9: {} + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + path-browserify@1.0.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@2.8.7: + optional: true + + prismjs@1.30.0: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + property-information@6.5.0: {} + + property-information@7.1.0: {} + + queue-microtask@1.2.3: {} + + radix3@1.1.2: {} + + readdirp@4.1.2: {} + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.8 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + request-light@0.5.8: {} + + request-light@0.7.0: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + restructure@3.0.2: {} + + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.0.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + + reusify@1.1.0: {} + + rollup@4.52.3: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.3 + '@rollup/rollup-android-arm64': 4.52.3 + '@rollup/rollup-darwin-arm64': 4.52.3 + '@rollup/rollup-darwin-x64': 4.52.3 + '@rollup/rollup-freebsd-arm64': 4.52.3 + '@rollup/rollup-freebsd-x64': 4.52.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.3 + '@rollup/rollup-linux-arm-musleabihf': 4.52.3 + '@rollup/rollup-linux-arm64-gnu': 4.52.3 + '@rollup/rollup-linux-arm64-musl': 4.52.3 + '@rollup/rollup-linux-loong64-gnu': 4.52.3 + '@rollup/rollup-linux-ppc64-gnu': 4.52.3 + '@rollup/rollup-linux-riscv64-gnu': 4.52.3 + '@rollup/rollup-linux-riscv64-musl': 4.52.3 + '@rollup/rollup-linux-s390x-gnu': 4.52.3 + '@rollup/rollup-linux-x64-gnu': 4.52.3 + '@rollup/rollup-linux-x64-musl': 4.52.3 + '@rollup/rollup-openharmony-arm64': 4.52.3 + '@rollup/rollup-win32-arm64-msvc': 4.52.3 + '@rollup/rollup-win32-ia32-msvc': 4.52.3 + '@rollup/rollup-win32-x64-gnu': 4.52.3 + '@rollup/rollup-win32-x64-msvc': 4.52.3 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + sax@1.4.1: {} + + semver@7.7.2: {} + + sharp@0.34.4: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.1 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.4 + '@img/sharp-darwin-x64': 0.34.4 + '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-linux-arm': 0.34.4 + '@img/sharp-linux-arm64': 0.34.4 + '@img/sharp-linux-ppc64': 0.34.4 + '@img/sharp-linux-s390x': 0.34.4 + '@img/sharp-linux-x64': 0.34.4 + '@img/sharp-linuxmusl-arm64': 0.34.4 + '@img/sharp-linuxmusl-x64': 0.34.4 + '@img/sharp-wasm32': 0.34.4 + '@img/sharp-win32-arm64': 0.34.4 + '@img/sharp-win32-ia32': 0.34.4 + '@img/sharp-win32-x64': 0.34.4 + + shiki@3.13.0: + dependencies: + '@shikijs/core': 3.13.0 + '@shikijs/engine-javascript': 3.13.0 + '@shikijs/engine-oniguruma': 3.13.0 + '@shikijs/langs': 3.13.0 + '@shikijs/themes': 3.13.0 + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + sisteransi@1.0.5: {} + + sitemap@8.0.1: + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.4.1 + + smol-toml@1.4.2: {} + + source-map-js@1.2.1: {} + + source-map@0.7.6: {} + + space-separated-tokens@2.0.2: {} + + stream-replace-string@2.0.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.5.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strnum@2.1.1: {} + + style-to-js@1.1.18: + dependencies: + style-to-object: 1.0.11 + + style-to-object@1.0.11: + dependencies: + inline-style-parser: 0.2.4 + + tailwindcss@4.1.14: {} + + tapable@2.3.0: {} + + tar@7.5.1: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + + tiny-inflate@1.0.3: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tr46@0.0.3: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + tsconfck@3.1.6(typescript@5.9.2): + optionalDependencies: + typescript: 5.9.2 + + tslib@2.8.1: {} + + type-fest@4.41.0: {} + + typesafe-path@0.2.2: {} + + typescript-auto-import-cache@0.3.6: + dependencies: + semver: 7.7.2 + + typescript@5.9.2: {} + + ufo@1.6.1: {} + + ultrahtml@1.6.0: {} + + uncrypto@0.1.3: {} + + undici-types@7.13.0: {} + + unicode-properties@1.4.1: + dependencies: + base64-js: 1.5.1 + unicode-trie: 2.0.0 + + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unifont@0.5.2: + dependencies: + css-tree: 3.1.0 + ofetch: 1.4.1 + ohash: 2.0.11 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unstorage@1.17.1: + dependencies: + anymatch: 3.1.3 + chokidar: 4.0.3 + destr: 2.0.5 + h3: 1.15.4 + lru-cache: 10.4.3 + node-fetch-native: 1.6.7 + ofetch: 1.4.1 + ufo: 1.6.1 + + util-deprecate@1.0.2: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@5.4.20(@types/node@24.6.0)(lightningcss@1.30.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.52.3 + optionalDependencies: + '@types/node': 24.6.0 + fsevents: 2.3.3 + lightningcss: 1.30.1 + + vite@6.3.6(@types/node@24.6.0)(jiti@2.6.1)(lightningcss@1.30.1)(yaml@2.8.1): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.3 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.6.0 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.1 + yaml: 2.8.1 + + vitefu@1.1.1(vite@6.3.6(@types/node@24.6.0)(jiti@2.6.1)(lightningcss@1.30.1)(yaml@2.8.1)): + optionalDependencies: + vite: 6.3.6(@types/node@24.6.0)(jiti@2.6.1)(lightningcss@1.30.1)(yaml@2.8.1) + + volar-service-css@0.0.62(@volar/language-service@2.4.23): + dependencies: + vscode-css-languageservice: 6.3.8 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.23 + + volar-service-emmet@0.0.62(@volar/language-service@2.4.23): + dependencies: + '@emmetio/css-parser': 0.4.0 + '@emmetio/html-matcher': 1.3.0 + '@vscode/emmet-helper': 2.11.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.23 + + volar-service-html@0.0.62(@volar/language-service@2.4.23): + dependencies: + vscode-html-languageservice: 5.5.2 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.23 + + volar-service-prettier@0.0.62(@volar/language-service@2.4.23): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.23 + + volar-service-typescript-twoslash-queries@0.0.62(@volar/language-service@2.4.23): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.23 + + volar-service-typescript@0.0.62(@volar/language-service@2.4.23): + dependencies: + path-browserify: 1.0.1 + semver: 7.7.2 + typescript-auto-import-cache: 0.3.6 + vscode-languageserver-textdocument: 1.0.12 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.23 + + volar-service-yaml@0.0.62(@volar/language-service@2.4.23): + dependencies: + vscode-uri: 3.1.0 + yaml-language-server: 1.15.0 + optionalDependencies: + '@volar/language-service': 2.4.23 + + vscode-css-languageservice@6.3.8: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-html-languageservice@5.5.2: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-json-languageservice@4.1.8: + dependencies: + jsonc-parser: 3.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + + vscode-jsonrpc@6.0.0: {} + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.16.0: + dependencies: + vscode-jsonrpc: 6.0.0 + vscode-languageserver-types: 3.16.0 + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.16.0: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@7.0.0: + dependencies: + vscode-languageserver-protocol: 3.16.0 + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-nls@5.2.0: {} + + vscode-uri@3.1.0: {} + + web-namespaces@2.0.1: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-pm-runs@1.1.0: {} + + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 + + xxhash-wasm@1.1.0: {} + + y18n@5.0.8: {} + + yallist@5.0.0: {} + + yaml-language-server@1.15.0: + dependencies: + ajv: 8.17.1 + lodash: 4.17.21 + request-light: 0.5.8 + vscode-json-languageservice: 4.1.8 + vscode-languageserver: 7.0.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + yaml: 2.2.2 + optionalDependencies: + prettier: 2.8.7 + + yaml@2.2.2: {} + + yaml@2.8.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@1.2.1: {} + + yocto-spinner@0.2.3: + dependencies: + yoctocolors: 2.1.2 + + yoctocolors@2.1.2: {} + + zod-to-json-schema@3.24.6(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod-to-ts@1.2.0(typescript@5.9.2)(zod@3.25.76): + dependencies: + typescript: 5.9.2 + zod: 3.25.76 + + zod@3.25.76: {} + + zwitch@2.0.4: {} diff --git a/public/assets/about/wx.jpg b/public/assets/about/wx.jpg new file mode 100644 index 0000000..be0a346 Binary files /dev/null and b/public/assets/about/wx.jpg differ diff --git a/public/assets/avatar.png b/public/assets/avatar.png new file mode 100644 index 0000000..84dc3b5 Binary files /dev/null and b/public/assets/avatar.png differ diff --git a/public/assets/blog/cover-brutalism.jpg b/public/assets/blog/cover-brutalism.jpg new file mode 100644 index 0000000..622dc36 Binary files /dev/null and b/public/assets/blog/cover-brutalism.jpg differ diff --git a/public/assets/blog/cover-dreamcore.jpg b/public/assets/blog/cover-dreamcore.jpg new file mode 100644 index 0000000..497a4f2 Binary files /dev/null and b/public/assets/blog/cover-dreamcore.jpg differ diff --git a/public/assets/blog/cover-free-icon-library.jpg b/public/assets/blog/cover-free-icon-library.jpg new file mode 100644 index 0000000..446684a Binary files /dev/null and b/public/assets/blog/cover-free-icon-library.jpg differ diff --git a/public/assets/blog/cover-neobrutalism.jpg b/public/assets/blog/cover-neobrutalism.jpg new file mode 100644 index 0000000..2749c29 Binary files /dev/null and b/public/assets/blog/cover-neobrutalism.jpg differ diff --git a/public/assets/blog/cover-portfolio-site.jpg b/public/assets/blog/cover-portfolio-site.jpg new file mode 100644 index 0000000..86a7d28 Binary files /dev/null and b/public/assets/blog/cover-portfolio-site.jpg differ diff --git a/public/assets/blog/cover-retro.jpg b/public/assets/blog/cover-retro.jpg new file mode 100644 index 0000000..169cb65 Binary files /dev/null and b/public/assets/blog/cover-retro.jpg differ diff --git a/public/assets/blog/cover-retrofuturism.jpg b/public/assets/blog/cover-retrofuturism.jpg new file mode 100644 index 0000000..5aaf7dc Binary files /dev/null and b/public/assets/blog/cover-retrofuturism.jpg differ diff --git a/public/assets/blog/cover-spacepunk.jpg b/public/assets/blog/cover-spacepunk.jpg new file mode 100644 index 0000000..ece13e2 Binary files /dev/null and b/public/assets/blog/cover-spacepunk.jpg differ diff --git a/public/assets/experiences/company.jpg b/public/assets/experiences/company.jpg new file mode 100644 index 0000000..b32a68c Binary files /dev/null and b/public/assets/experiences/company.jpg differ diff --git a/public/assets/home/color-picker.svg b/public/assets/home/color-picker.svg new file mode 100644 index 0000000..b9dfebd --- /dev/null +++ b/public/assets/home/color-picker.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/home/gradientshub.jpg b/public/assets/home/gradientshub.jpg new file mode 100644 index 0000000..7d9b0ae Binary files /dev/null and b/public/assets/home/gradientshub.jpg differ diff --git a/public/assets/logo.png b/public/assets/logo.png new file mode 100644 index 0000000..84dc3b5 Binary files /dev/null and b/public/assets/logo.png differ diff --git a/public/assets/social/social-behance.jpg b/public/assets/social/social-behance.jpg new file mode 100644 index 0000000..d72426b Binary files /dev/null and b/public/assets/social/social-behance.jpg differ diff --git a/public/assets/social/social-dribbble.jpg b/public/assets/social/social-dribbble.jpg new file mode 100644 index 0000000..85bb2d2 Binary files /dev/null and b/public/assets/social/social-dribbble.jpg differ diff --git a/public/assets/social/social-email.jpg b/public/assets/social/social-email.jpg new file mode 100644 index 0000000..234fbce Binary files /dev/null and b/public/assets/social/social-email.jpg differ diff --git a/public/assets/social/social-figma.jpg b/public/assets/social/social-figma.jpg new file mode 100644 index 0000000..1b66b9b Binary files /dev/null and b/public/assets/social/social-figma.jpg differ diff --git a/public/assets/social/social-github.jpg b/public/assets/social/social-github.jpg new file mode 100644 index 0000000..a3f462b Binary files /dev/null and b/public/assets/social/social-github.jpg differ diff --git a/public/assets/social/social-gumroad.jpg b/public/assets/social/social-gumroad.jpg new file mode 100644 index 0000000..15d8ce0 Binary files /dev/null and b/public/assets/social/social-gumroad.jpg differ diff --git a/public/assets/social/social-twitter.jpg b/public/assets/social/social-twitter.jpg new file mode 100644 index 0000000..8ed77de Binary files /dev/null and b/public/assets/social/social-twitter.jpg differ diff --git a/public/assets/social/social-xiaohongshu.jpg b/public/assets/social/social-xiaohongshu.jpg new file mode 100644 index 0000000..819672c Binary files /dev/null and b/public/assets/social/social-xiaohongshu.jpg differ diff --git a/public/assets/stack/astro.png b/public/assets/stack/astro.png new file mode 100644 index 0000000..47d62fa Binary files /dev/null and b/public/assets/stack/astro.png differ diff --git a/public/assets/stack/bootstrap.png b/public/assets/stack/bootstrap.png new file mode 100644 index 0000000..d1b30eb Binary files /dev/null and b/public/assets/stack/bootstrap.png differ diff --git a/public/assets/stack/cloudflare.png b/public/assets/stack/cloudflare.png new file mode 100644 index 0000000..f72cbfd Binary files /dev/null and b/public/assets/stack/cloudflare.png differ diff --git a/public/assets/stack/css.png b/public/assets/stack/css.png new file mode 100644 index 0000000..8b21e80 Binary files /dev/null and b/public/assets/stack/css.png differ diff --git a/public/assets/stack/github.png b/public/assets/stack/github.png new file mode 100644 index 0000000..3a804e3 Binary files /dev/null and b/public/assets/stack/github.png differ diff --git a/public/assets/stack/html.png b/public/assets/stack/html.png new file mode 100644 index 0000000..8bf3bb4 Binary files /dev/null and b/public/assets/stack/html.png differ diff --git a/public/assets/stack/js.png b/public/assets/stack/js.png new file mode 100644 index 0000000..ba19f13 Binary files /dev/null and b/public/assets/stack/js.png differ diff --git a/public/assets/stack/netlify.png b/public/assets/stack/netlify.png new file mode 100644 index 0000000..384485b Binary files /dev/null and b/public/assets/stack/netlify.png differ diff --git a/public/assets/stack/nextjs.png b/public/assets/stack/nextjs.png new file mode 100644 index 0000000..ceccee0 Binary files /dev/null and b/public/assets/stack/nextjs.png differ diff --git a/public/assets/stack/nodejs.png b/public/assets/stack/nodejs.png new file mode 100644 index 0000000..30cce7a Binary files /dev/null and b/public/assets/stack/nodejs.png differ diff --git a/public/assets/stack/npm.png b/public/assets/stack/npm.png new file mode 100644 index 0000000..59de751 Binary files /dev/null and b/public/assets/stack/npm.png differ diff --git a/public/assets/stack/nuxtjs.png b/public/assets/stack/nuxtjs.png new file mode 100644 index 0000000..4130149 Binary files /dev/null and b/public/assets/stack/nuxtjs.png differ diff --git a/public/assets/stack/tailwind.png b/public/assets/stack/tailwind.png new file mode 100644 index 0000000..c1218a9 Binary files /dev/null and b/public/assets/stack/tailwind.png differ diff --git a/public/assets/stack/vercel.png b/public/assets/stack/vercel.png new file mode 100644 index 0000000..6ad0ac5 Binary files /dev/null and b/public/assets/stack/vercel.png differ diff --git a/public/assets/stack/vscode.png b/public/assets/stack/vscode.png new file mode 100644 index 0000000..57c1fd9 Binary files /dev/null and b/public/assets/stack/vscode.png differ diff --git a/public/assets/tools/deck.png b/public/assets/tools/deck.png new file mode 100644 index 0000000..f9284a9 Binary files /dev/null and b/public/assets/tools/deck.png differ diff --git a/public/assets/tools/dreamcore.jpg b/public/assets/tools/dreamcore.jpg new file mode 100644 index 0000000..17f2922 Binary files /dev/null and b/public/assets/tools/dreamcore.jpg differ diff --git a/public/assets/tools/dreamcore.mp4 b/public/assets/tools/dreamcore.mp4 new file mode 100644 index 0000000..7daf93f Binary files /dev/null and b/public/assets/tools/dreamcore.mp4 differ diff --git a/public/assets/tools/game/01-game-cassette.png b/public/assets/tools/game/01-game-cassette.png new file mode 100644 index 0000000..1d7d98d Binary files /dev/null and b/public/assets/tools/game/01-game-cassette.png differ diff --git a/public/assets/tools/game/02-game-cassette.png b/public/assets/tools/game/02-game-cassette.png new file mode 100644 index 0000000..4d239d8 Binary files /dev/null and b/public/assets/tools/game/02-game-cassette.png differ diff --git a/public/assets/tools/game/03-game-cassette.png b/public/assets/tools/game/03-game-cassette.png new file mode 100644 index 0000000..f006f9b Binary files /dev/null and b/public/assets/tools/game/03-game-cassette.png differ diff --git a/public/assets/tools/game/04-game-cassette.png b/public/assets/tools/game/04-game-cassette.png new file mode 100644 index 0000000..e47bf04 Binary files /dev/null and b/public/assets/tools/game/04-game-cassette.png differ diff --git a/public/assets/tools/game/05-game-cassette.png b/public/assets/tools/game/05-game-cassette.png new file mode 100644 index 0000000..418ad16 Binary files /dev/null and b/public/assets/tools/game/05-game-cassette.png differ diff --git a/public/assets/tools/keyboard.png b/public/assets/tools/keyboard.png new file mode 100644 index 0000000..e69661a Binary files /dev/null and b/public/assets/tools/keyboard.png differ diff --git a/public/assets/tools/logo/ricoui.png b/public/assets/tools/logo/ricoui.png new file mode 100644 index 0000000..84dc3b5 Binary files /dev/null and b/public/assets/tools/logo/ricoui.png differ diff --git a/public/assets/tools/logo/tool-gradienthub.svg b/public/assets/tools/logo/tool-gradienthub.svg new file mode 100644 index 0000000..92f0c87 --- /dev/null +++ b/public/assets/tools/logo/tool-gradienthub.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/assets/tools/logo/tool-inspoweb.png b/public/assets/tools/logo/tool-inspoweb.png new file mode 100644 index 0000000..bd5cc0c Binary files /dev/null and b/public/assets/tools/logo/tool-inspoweb.png differ diff --git a/public/assets/tools/logo/tool-ricoog.svg b/public/assets/tools/logo/tool-ricoog.svg new file mode 100644 index 0000000..6c6404b --- /dev/null +++ b/public/assets/tools/logo/tool-ricoog.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/tools/logo/tool-todo.png b/public/assets/tools/logo/tool-todo.png new file mode 100644 index 0000000..6ac76c8 Binary files /dev/null and b/public/assets/tools/logo/tool-todo.png differ diff --git a/public/assets/tools/logo/tool-uiuxdeck.svg b/public/assets/tools/logo/tool-uiuxdeck.svg new file mode 100644 index 0000000..66b742b --- /dev/null +++ b/public/assets/tools/logo/tool-uiuxdeck.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/assets/tools/mac.png b/public/assets/tools/mac.png new file mode 100644 index 0000000..9dacc30 Binary files /dev/null and b/public/assets/tools/mac.png differ diff --git a/public/assets/tools/mini-btn.png b/public/assets/tools/mini-btn.png new file mode 100644 index 0000000..f4b3cf4 Binary files /dev/null and b/public/assets/tools/mini-btn.png differ diff --git a/public/assets/tools/retro-computer.png b/public/assets/tools/retro-computer.png new file mode 100644 index 0000000..56970d4 Binary files /dev/null and b/public/assets/tools/retro-computer.png differ diff --git a/public/assets/tools/retro-computer.svg b/public/assets/tools/retro-computer.svg new file mode 100644 index 0000000..c612db4 --- /dev/null +++ b/public/assets/tools/retro-computer.svg @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/tools/spin-2.png b/public/assets/tools/spin-2.png new file mode 100644 index 0000000..70845a8 Binary files /dev/null and b/public/assets/tools/spin-2.png differ diff --git a/public/assets/tools/spin-bar.png b/public/assets/tools/spin-bar.png new file mode 100644 index 0000000..e1a61ed Binary files /dev/null and b/public/assets/tools/spin-bar.png differ diff --git a/public/assets/tools/spin-bar.svg b/public/assets/tools/spin-bar.svg new file mode 100644 index 0000000..73acaa7 --- /dev/null +++ b/public/assets/tools/spin-bar.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/tools/spin.png b/public/assets/tools/spin.png new file mode 100644 index 0000000..00e5bb7 Binary files /dev/null and b/public/assets/tools/spin.png differ diff --git a/public/assets/tools/spin.svg b/public/assets/tools/spin.svg new file mode 100644 index 0000000..12fd6f8 --- /dev/null +++ b/public/assets/tools/spin.svg @@ -0,0 +1,97 @@ + + +
+ + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/public/assets/tools/tool-icon-bg.png b/public/assets/tools/tool-icon-bg.png new file mode 100644 index 0000000..aa8c3a9 Binary files /dev/null and b/public/assets/tools/tool-icon-bg.png differ diff --git a/public/assets/works/3d-valentines.jpg b/public/assets/works/3d-valentines.jpg new file mode 100644 index 0000000..1b08de4 Binary files /dev/null and b/public/assets/works/3d-valentines.jpg differ diff --git a/public/assets/works/3d-valentines.mp4 b/public/assets/works/3d-valentines.mp4 new file mode 100644 index 0000000..0caefac Binary files /dev/null and b/public/assets/works/3d-valentines.mp4 differ diff --git a/public/assets/works/gradientshub.jpg b/public/assets/works/gradientshub.jpg new file mode 100644 index 0000000..d8f38c4 Binary files /dev/null and b/public/assets/works/gradientshub.jpg differ diff --git a/public/assets/works/gradientshub.mp4 b/public/assets/works/gradientshub.mp4 new file mode 100644 index 0000000..585ecfa Binary files /dev/null and b/public/assets/works/gradientshub.mp4 differ diff --git a/public/assets/works/inspoweb.jpg b/public/assets/works/inspoweb.jpg new file mode 100644 index 0000000..626e756 Binary files /dev/null and b/public/assets/works/inspoweb.jpg differ diff --git a/public/assets/works/luonmodels.jpg b/public/assets/works/luonmodels.jpg new file mode 100644 index 0000000..5b3169c Binary files /dev/null and b/public/assets/works/luonmodels.jpg differ diff --git a/public/assets/works/luonmodels.mp4 b/public/assets/works/luonmodels.mp4 new file mode 100644 index 0000000..70d24f8 Binary files /dev/null and b/public/assets/works/luonmodels.mp4 differ diff --git a/public/assets/works/ricoog.jpg b/public/assets/works/ricoog.jpg new file mode 100644 index 0000000..659ecdb Binary files /dev/null and b/public/assets/works/ricoog.jpg differ diff --git a/public/assets/works/ricoog.mp4 b/public/assets/works/ricoog.mp4 new file mode 100644 index 0000000..26ec1b6 Binary files /dev/null and b/public/assets/works/ricoog.mp4 differ diff --git a/public/assets/works/ricoui.jpg b/public/assets/works/ricoui.jpg new file mode 100644 index 0000000..2290eef Binary files /dev/null and b/public/assets/works/ricoui.jpg differ diff --git a/public/assets/works/ricoui.mp4 b/public/assets/works/ricoui.mp4 new file mode 100644 index 0000000..056d15f Binary files /dev/null and b/public/assets/works/ricoui.mp4 differ diff --git a/public/assets/works/uiuxdeck.jpg b/public/assets/works/uiuxdeck.jpg new file mode 100644 index 0000000..d8d4f47 Binary files /dev/null and b/public/assets/works/uiuxdeck.jpg differ diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000..84dc3b5 Binary files /dev/null and b/public/favicon.png differ diff --git a/public/og.jpg b/public/og.jpg new file mode 100644 index 0000000..bc42b5b Binary files /dev/null and b/public/og.jpg differ diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..14267e9 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Allow: / \ No newline at end of file diff --git a/public/wechat-rico.jpg b/public/wechat-rico.jpg new file mode 100644 index 0000000..ced05a3 Binary files /dev/null and b/public/wechat-rico.jpg differ diff --git a/public/zanshangma.jpg b/public/zanshangma.jpg new file mode 100644 index 0000000..c30024b Binary files /dev/null and b/public/zanshangma.jpg differ diff --git a/src/assets/js/main.js b/src/assets/js/main.js new file mode 100644 index 0000000..137e426 --- /dev/null +++ b/src/assets/js/main.js @@ -0,0 +1,193 @@ +// Add your javascript here +import AOS from 'aos'; + +window.darkMode = false; + +const stickyClasses = []; +const unstickyClasses = []; +const stickyClassesContainer = [ + "shadow-[0px_1px_4px_0_rgba(25,33,61,0.06)]", + "rounded-[20px]", + "bg-[#ffffff]/65", + "border-[#ffffff]/65", + "dark:border-neutral-600/40", + "dark:bg-neutral-900/60", + "backdrop-blur-2xl", + "backdrop-brightness-120", +]; +const unstickyClassesContainer = [ + "shadow-none", + "border-transparent", + "rounded-none", + "bg-transparent", +]; +let headerElement = null; + +document.addEventListener("DOMContentLoaded", () => { + headerElement = document.getElementById("header"); + + if ( + localStorage.getItem("dark_mode") && + localStorage.getItem("dark_mode") === "true" + ) { + window.darkMode = true; + showNight(); + } else { + showDay(); + } + stickyHeaderFuncionality(); + applyMenuItemClasses(); + evaluateHeaderPosition(); + mobileMenuFunctionality(); + + // 初始化 AOS + AOS.init({ + duration: 400, + easing: 'ease-out-cubic', + once: true, + offset: 20, + delay: 0, + }); +}); + +// window.toggleDarkMode = function(){ +// document.documentElement.classList.toggle('dark'); +// if(document.documentElement.classList.contains('dark')){ +// localStorage.setItem('dark_mode', true); +// window.darkMode = true; +// } else { +// window.darkMode = false; +// localStorage.setItem('dark_mode', false); +// } +// } + +window.stickyHeaderFuncionality = () => { + window.addEventListener("scroll", () => { + evaluateHeaderPosition(); + }); +}; + +window.evaluateHeaderPosition = () => { + if (window.scrollY > 48) { + headerElement.firstElementChild.classList.add(...stickyClassesContainer); + headerElement.firstElementChild.classList.remove( + ...unstickyClassesContainer, + ); + headerElement.classList.add(...stickyClasses); + headerElement.classList.remove(...unstickyClasses); + // document.getElementById("menu").classList.add("top-[75px]"); + // document.getElementById("menu").classList.remove("top-[75px]"); + } else { + headerElement.firstElementChild.classList.remove(...stickyClassesContainer); + headerElement.firstElementChild.classList.add(...unstickyClassesContainer); + headerElement.classList.add(...unstickyClasses); + headerElement.classList.remove(...stickyClasses); + // document.getElementById("menu").classList.remove("top-[56px]"); + // document.getElementById("menu").classList.add("top-[75px]"); + } +}; + +document.getElementById("darkToggle").addEventListener("click", () => { + document.documentElement.classList.add("duration-300"); + + if (document.documentElement.classList.contains("dark")) { + localStorage.removeItem("dark_mode"); + showDay(true); + } else { + localStorage.setItem("dark_mode", true); + showNight(true); + } +}); + +function showDay(animate) { + document.getElementById("sun").classList.remove("setting"); + document.getElementById("moon").classList.remove("rising"); + + let timeout = 0; + + if (animate) { + timeout = 500; + + document.getElementById("moon").classList.add("setting"); + } + + setTimeout(() => { + document.getElementById("dayText").classList.remove("hidden"); + document.getElementById("nightText").classList.add("hidden"); + + document.getElementById("moon").classList.add("hidden"); + document.getElementById("sun").classList.remove("hidden"); + + if (animate) { + document.documentElement.classList.remove("dark"); + document.getElementById("sun").classList.add("rising"); + } + }, timeout); +} + +function showNight(animate) { + document.getElementById("moon").classList.remove("setting"); + document.getElementById("sun").classList.remove("rising"); + + let timeout = 0; + + if (animate) { + timeout = 500; + + document.getElementById("sun").classList.add("setting"); + } + + setTimeout(() => { + document.getElementById("nightText").classList.remove("hidden"); + document.getElementById("dayText").classList.add("hidden"); + + document.getElementById("sun").classList.add("hidden"); + document.getElementById("moon").classList.remove("hidden"); + + if (animate) { + document.documentElement.classList.add("dark"); + document.getElementById("moon").classList.add("rising"); + } + }, timeout); +} + +window.applyMenuItemClasses = () => { + const menuItems = document.querySelectorAll("#menu a"); + for (let i = 0; i < menuItems.length; i++) { + if (menuItems[i].pathname === window.location.pathname) { + menuItems[i].classList.add("text-neutral-900", "dark:text-white"); + } + } + //:class="{ 'text-neutral-900 dark:text-white': window.location.pathname == '{menu.url}', 'text-neutral-700 dark:text-neutral-400': window.location.pathname != '{menu.url}' }" +}; + +function mobileMenuFunctionality() { + document.getElementById("openMenu").addEventListener("click", () => { + openMobileMenu(); + }); + + document.getElementById("closeMenu").addEventListener("click", () => { + closeMobileMenu(); + }); +} + +window.openMobileMenu = () => { + document.getElementById("openMenu").classList.add("hidden"); + document.getElementById("closeMenu").classList.remove("hidden"); + document.getElementById("menu").classList.remove("hidden"); + document.getElementById("mobileMenuBackground").classList.add("opacity-0"); + document.getElementById("mobileMenuBackground").classList.remove("hidden"); + + setTimeout(() => { + document + .getElementById("mobileMenuBackground") + .classList.remove("opacity-0"); + }, 1); +}; + +window.closeMobileMenu = () => { + document.getElementById("closeMenu").classList.add("hidden"); + document.getElementById("openMenu").classList.remove("hidden"); + document.getElementById("menu").classList.add("hidden"); + document.getElementById("mobileMenuBackground").classList.add("hidden"); +}; diff --git a/src/assets/work/3dicons/01.jpg b/src/assets/work/3dicons/01.jpg new file mode 100644 index 0000000..c4e482d Binary files /dev/null and b/src/assets/work/3dicons/01.jpg differ diff --git a/src/assets/work/3dicons/02.jpg b/src/assets/work/3dicons/02.jpg new file mode 100644 index 0000000..0a517bc Binary files /dev/null and b/src/assets/work/3dicons/02.jpg differ diff --git a/src/assets/work/3dicons/03.jpg b/src/assets/work/3dicons/03.jpg new file mode 100644 index 0000000..297303a Binary files /dev/null and b/src/assets/work/3dicons/03.jpg differ diff --git a/src/assets/work/3dicons/04.jpg b/src/assets/work/3dicons/04.jpg new file mode 100644 index 0000000..a7d6e9b Binary files /dev/null and b/src/assets/work/3dicons/04.jpg differ diff --git a/src/assets/work/3dicons/05.jpg b/src/assets/work/3dicons/05.jpg new file mode 100644 index 0000000..1b5d399 Binary files /dev/null and b/src/assets/work/3dicons/05.jpg differ diff --git a/src/assets/work/3dicons/06.jpg b/src/assets/work/3dicons/06.jpg new file mode 100644 index 0000000..94af033 Binary files /dev/null and b/src/assets/work/3dicons/06.jpg differ diff --git a/src/assets/work/3dicons/07.jpg b/src/assets/work/3dicons/07.jpg new file mode 100644 index 0000000..60eb947 Binary files /dev/null and b/src/assets/work/3dicons/07.jpg differ diff --git a/src/assets/work/3dicons/08.jpg b/src/assets/work/3dicons/08.jpg new file mode 100644 index 0000000..f53a406 Binary files /dev/null and b/src/assets/work/3dicons/08.jpg differ diff --git a/src/assets/work/3dicons/preview.jpg b/src/assets/work/3dicons/preview.jpg new file mode 100644 index 0000000..e207f44 Binary files /dev/null and b/src/assets/work/3dicons/preview.jpg differ diff --git a/src/assets/work/free-3d-valentines-assets/01.jpg b/src/assets/work/free-3d-valentines-assets/01.jpg new file mode 100644 index 0000000..0fa57f1 Binary files /dev/null and b/src/assets/work/free-3d-valentines-assets/01.jpg differ diff --git a/src/assets/work/free-3d-valentines-assets/02.jpg b/src/assets/work/free-3d-valentines-assets/02.jpg new file mode 100644 index 0000000..e3cc070 Binary files /dev/null and b/src/assets/work/free-3d-valentines-assets/02.jpg differ diff --git a/src/assets/work/free-3d-valentines-assets/03.jpg b/src/assets/work/free-3d-valentines-assets/03.jpg new file mode 100644 index 0000000..2500280 Binary files /dev/null and b/src/assets/work/free-3d-valentines-assets/03.jpg differ diff --git a/src/assets/work/free-3d-valentines-assets/04.jpg b/src/assets/work/free-3d-valentines-assets/04.jpg new file mode 100644 index 0000000..30ac522 Binary files /dev/null and b/src/assets/work/free-3d-valentines-assets/04.jpg differ diff --git a/src/assets/work/free-3d-valentines-assets/05.jpg b/src/assets/work/free-3d-valentines-assets/05.jpg new file mode 100644 index 0000000..6d29e0e Binary files /dev/null and b/src/assets/work/free-3d-valentines-assets/05.jpg differ diff --git a/src/assets/work/free-3d-valentines-assets/logo.png b/src/assets/work/free-3d-valentines-assets/logo.png new file mode 100644 index 0000000..98af311 Binary files /dev/null and b/src/assets/work/free-3d-valentines-assets/logo.png differ diff --git a/src/assets/work/luonmodels/001.jpg b/src/assets/work/luonmodels/001.jpg new file mode 100644 index 0000000..721e270 Binary files /dev/null and b/src/assets/work/luonmodels/001.jpg differ diff --git a/src/assets/work/luonmodels/002.jpg b/src/assets/work/luonmodels/002.jpg new file mode 100644 index 0000000..9aa3a9e Binary files /dev/null and b/src/assets/work/luonmodels/002.jpg differ diff --git a/src/assets/work/luonmodels/003.jpg b/src/assets/work/luonmodels/003.jpg new file mode 100644 index 0000000..67deeb9 Binary files /dev/null and b/src/assets/work/luonmodels/003.jpg differ diff --git a/src/assets/work/luonmodels/004.jpg b/src/assets/work/luonmodels/004.jpg new file mode 100644 index 0000000..00eb689 Binary files /dev/null and b/src/assets/work/luonmodels/004.jpg differ diff --git a/src/assets/work/luonmodels/005.jpg b/src/assets/work/luonmodels/005.jpg new file mode 100644 index 0000000..8c603cb Binary files /dev/null and b/src/assets/work/luonmodels/005.jpg differ diff --git a/src/assets/work/luonmodels/006.jpg b/src/assets/work/luonmodels/006.jpg new file mode 100644 index 0000000..43fdc2b Binary files /dev/null and b/src/assets/work/luonmodels/006.jpg differ diff --git a/src/assets/work/luonmodels/007.jpg b/src/assets/work/luonmodels/007.jpg new file mode 100644 index 0000000..b34848e Binary files /dev/null and b/src/assets/work/luonmodels/007.jpg differ diff --git a/src/assets/work/luonmodels/008.jpg b/src/assets/work/luonmodels/008.jpg new file mode 100644 index 0000000..5789a9e Binary files /dev/null and b/src/assets/work/luonmodels/008.jpg differ diff --git a/src/assets/work/luonmodels/009.jpg b/src/assets/work/luonmodels/009.jpg new file mode 100644 index 0000000..96cb936 Binary files /dev/null and b/src/assets/work/luonmodels/009.jpg differ diff --git a/src/assets/work/luonmodels/010.jpg b/src/assets/work/luonmodels/010.jpg new file mode 100644 index 0000000..3dc5c1c Binary files /dev/null and b/src/assets/work/luonmodels/010.jpg differ diff --git a/src/assets/work/luonmodels/011.jpg b/src/assets/work/luonmodels/011.jpg new file mode 100644 index 0000000..305f11d Binary files /dev/null and b/src/assets/work/luonmodels/011.jpg differ diff --git a/src/assets/work/luonmodels/012.jpg b/src/assets/work/luonmodels/012.jpg new file mode 100644 index 0000000..acd119a Binary files /dev/null and b/src/assets/work/luonmodels/012.jpg differ diff --git a/src/assets/work/luonmodels/013.jpg b/src/assets/work/luonmodels/013.jpg new file mode 100644 index 0000000..59addbb Binary files /dev/null and b/src/assets/work/luonmodels/013.jpg differ diff --git a/src/assets/work/luonmodels/014.jpg b/src/assets/work/luonmodels/014.jpg new file mode 100644 index 0000000..fae5fa2 Binary files /dev/null and b/src/assets/work/luonmodels/014.jpg differ diff --git a/src/assets/work/ricoblog2024/P_01.jpg b/src/assets/work/ricoblog2024/P_01.jpg new file mode 100644 index 0000000..b830dab Binary files /dev/null and b/src/assets/work/ricoblog2024/P_01.jpg differ diff --git a/src/assets/work/ricoblog2024/P_02.jpg b/src/assets/work/ricoblog2024/P_02.jpg new file mode 100644 index 0000000..dd45679 Binary files /dev/null and b/src/assets/work/ricoblog2024/P_02.jpg differ diff --git a/src/assets/work/ricoblog2024/P_03.jpg b/src/assets/work/ricoblog2024/P_03.jpg new file mode 100644 index 0000000..559bed7 Binary files /dev/null and b/src/assets/work/ricoblog2024/P_03.jpg differ diff --git a/src/assets/work/ricoblog2024/P_04.jpg b/src/assets/work/ricoblog2024/P_04.jpg new file mode 100644 index 0000000..f145260 Binary files /dev/null and b/src/assets/work/ricoblog2024/P_04.jpg differ diff --git a/src/assets/work/ricoblog2024/P_05.jpg b/src/assets/work/ricoblog2024/P_05.jpg new file mode 100644 index 0000000..4eb23f5 Binary files /dev/null and b/src/assets/work/ricoblog2024/P_05.jpg differ diff --git a/src/assets/work/ricoblog2024/P_06.jpg b/src/assets/work/ricoblog2024/P_06.jpg new file mode 100644 index 0000000..057bda8 Binary files /dev/null and b/src/assets/work/ricoblog2024/P_06.jpg differ diff --git a/src/assets/work/ricoblog2024/P_07.jpg b/src/assets/work/ricoblog2024/P_07.jpg new file mode 100644 index 0000000..bb8995c Binary files /dev/null and b/src/assets/work/ricoblog2024/P_07.jpg differ diff --git a/src/assets/work/ricoblog2024/logo.png b/src/assets/work/ricoblog2024/logo.png new file mode 100644 index 0000000..84dc3b5 Binary files /dev/null and b/src/assets/work/ricoblog2024/logo.png differ diff --git a/src/assets/work/todo/todo-01.jpg b/src/assets/work/todo/todo-01.jpg new file mode 100644 index 0000000..31e5ee8 Binary files /dev/null and b/src/assets/work/todo/todo-01.jpg differ diff --git a/src/assets/work/todo/todo-02.jpg b/src/assets/work/todo/todo-02.jpg new file mode 100644 index 0000000..18155bd Binary files /dev/null and b/src/assets/work/todo/todo-02.jpg differ diff --git a/src/assets/work/todo/todo-03.jpg b/src/assets/work/todo/todo-03.jpg new file mode 100644 index 0000000..95333ca Binary files /dev/null and b/src/assets/work/todo/todo-03.jpg differ diff --git a/src/assets/work/todo/todo-04.jpg b/src/assets/work/todo/todo-04.jpg new file mode 100644 index 0000000..190ded8 Binary files /dev/null and b/src/assets/work/todo/todo-04.jpg differ diff --git a/src/assets/work/todo/todo-06.jpg b/src/assets/work/todo/todo-06.jpg new file mode 100644 index 0000000..f65eaec Binary files /dev/null and b/src/assets/work/todo/todo-06.jpg differ diff --git a/src/collections/experiences.json b/src/collections/experiences.json new file mode 100644 index 0000000..c8ea945 --- /dev/null +++ b/src/collections/experiences.json @@ -0,0 +1,17 @@ +[ + { + "dates": "June 2018 · Present", + "role": "Web & Product Designer", + "company": "Company Name", + "description": "Leading the design of user-centric web applications and dating platforms.", + "logo": "/assets/experiences/company.jpg" + }, + { + "dates": "July 2016 · June 2017", + "role": "Web & Product Designer", + "company": "Company Name", + "description": "Spearheaded the design and development of e-commerce websites and online marketplaces.", + "logo": "/assets/experiences/company.jpg" + } + +] diff --git a/src/collections/featuredwork.json b/src/collections/featuredwork.json new file mode 100644 index 0000000..59cd977 --- /dev/null +++ b/src/collections/featuredwork.json @@ -0,0 +1,58 @@ +[ + { + "name": "RicoOG", + "description": "OG Inspiration Library", + "tags": ["Open Graph", "Design", "Library"], + "image": "/assets/works/ricoog.jpg", + "video": "/assets/works/ricoog.mp4", + "url": "https://ricoog.com/", + "isShow": true + }, + { + "name": "GradientsHub", + "description": "Gradient Resources & Tools", + "tags": ["Gradient","Resources","Tools"], + "image": "/assets/works/gradientshub.jpg", + "video": "/assets/works/gradientshub.mp4", + "url": "https://gradientshub.com" + }, + { + "name": "Luon Models", + "description": "Company Website", + "tags": ["Company","Website","Branding"], + "image": "/assets/works/luonmodels.jpg", + "video": "/assets/works/luonmodels.mp4", + "url": "https://luonmodels.netlify.app/" + }, + { + "name": "Ricoui", + "description": "Designer Portfolio", + "tags": ["Designer","Portfolio","Open Source"], + "image": "/assets/works/ricoui.jpg", + "video": "/assets/works/ricoui.mp4", + "url": "/work/ricoblog2024" + + }, + { + "name": "3D Valentines Assets", + "description": "Blender Design Resources & Assets", + "tags": ["3D","Resources","Assets"], + "image": "/assets/works/3d-valentines.jpg", + "video": "/assets/works/3d-valentines.mp4", + "url": "/work/3dvalentine" + }, + { + "name": "UIUXDECK", + "description": "Design Resources & Tools", + "tags": ["Design","Resources","Tools"], + "image": "/assets/works/uiuxdeck.jpg", + "url": "http://uiuxdeck.com/" + }, + { + "name": "Inspoweb", + "description": "Web Inspiration Library", + "tags": ["Inspiration","Web Collection"], + "image": "/assets/works/inspoweb.jpg", + "url": "https://inspoweb.com/" + } +] diff --git a/src/collections/menu.json b/src/collections/menu.json new file mode 100644 index 0000000..19af874 --- /dev/null +++ b/src/collections/menu.json @@ -0,0 +1,18 @@ +[ + { + "name": "Home", + "url": "/" + }, + { + "name": "Writing", + "url": "/blog" + }, + { + "name": "Works", + "url": "/works" + }, + { + "name": "About", + "url": "/about" + } +] diff --git a/src/collections/social.json b/src/collections/social.json new file mode 100644 index 0000000..f107313 --- /dev/null +++ b/src/collections/social.json @@ -0,0 +1,68 @@ +[ + { + "id": 1, + "name": "Github", + "username": "ricocc", + "image": "/assets/social/social-github.jpg", + "url": "https://github.com/ricocc/" + }, + + { + "id": 2, + "name": "Xiaohongshu", + "username": "ricouii", + "image": "/assets/social/social-xiaohongshu.jpg", + "url": "https://www.xiaohongshu.com/user/profile/5f2b6903000000000101f51f" + }, + + { + "id": 3, + "name": "Twitter", + "username": "ricouii", + "image": "/assets/social/social-twitter.jpg", + "url": "https://x.com/ricouii" + }, + + { + "id": 4, + "name": "Gumroad", + "username": "ricoui", + "image": "/assets/social/social-gumroad.jpg", + "url": "https://ricoui.gumroad.com/" + }, + + { + "id": 5, + "name": "Behance", + "username": "ricoui", + "image": "/assets/social/social-behance.jpg", + "url": "https://www.behance.net/ricoui" + }, + + { + "id": 6, + "name": "figma", + "username": "ricocc", + "image": "/assets/social/social-figma.jpg", + "url": "https://www.figma.com/@ricocc", + "isShow": false + }, + + { + "id": 7, + "name": "Dribbble", + "username": "ricoui", + "image": "/assets/social/social-dribbble.jpg", + "url": "https://dribbble.com/ricoui" + }, + + { + "id": 8, + "name": "Email", + "username": "ricocc", + "image": "/assets/social/social-email.jpg", + "url": "mailto:ricocc@qq.com" + } + + +] diff --git a/src/collections/works.json b/src/collections/works.json new file mode 100644 index 0000000..59cd977 --- /dev/null +++ b/src/collections/works.json @@ -0,0 +1,58 @@ +[ + { + "name": "RicoOG", + "description": "OG Inspiration Library", + "tags": ["Open Graph", "Design", "Library"], + "image": "/assets/works/ricoog.jpg", + "video": "/assets/works/ricoog.mp4", + "url": "https://ricoog.com/", + "isShow": true + }, + { + "name": "GradientsHub", + "description": "Gradient Resources & Tools", + "tags": ["Gradient","Resources","Tools"], + "image": "/assets/works/gradientshub.jpg", + "video": "/assets/works/gradientshub.mp4", + "url": "https://gradientshub.com" + }, + { + "name": "Luon Models", + "description": "Company Website", + "tags": ["Company","Website","Branding"], + "image": "/assets/works/luonmodels.jpg", + "video": "/assets/works/luonmodels.mp4", + "url": "https://luonmodels.netlify.app/" + }, + { + "name": "Ricoui", + "description": "Designer Portfolio", + "tags": ["Designer","Portfolio","Open Source"], + "image": "/assets/works/ricoui.jpg", + "video": "/assets/works/ricoui.mp4", + "url": "/work/ricoblog2024" + + }, + { + "name": "3D Valentines Assets", + "description": "Blender Design Resources & Assets", + "tags": ["3D","Resources","Assets"], + "image": "/assets/works/3d-valentines.jpg", + "video": "/assets/works/3d-valentines.mp4", + "url": "/work/3dvalentine" + }, + { + "name": "UIUXDECK", + "description": "Design Resources & Tools", + "tags": ["Design","Resources","Tools"], + "image": "/assets/works/uiuxdeck.jpg", + "url": "http://uiuxdeck.com/" + }, + { + "name": "Inspoweb", + "description": "Web Inspiration Library", + "tags": ["Inspiration","Web Collection"], + "image": "/assets/works/inspoweb.jpg", + "url": "https://inspoweb.com/" + } +] diff --git a/src/components/cards/BlogCard.astro b/src/components/cards/BlogCard.astro new file mode 100644 index 0000000..86a4f86 --- /dev/null +++ b/src/components/cards/BlogCard.astro @@ -0,0 +1,156 @@ +--- +const { content, layout = "vertical", "data-aos": dataAos, "data-aos-delay": dataAosDelay } = Astro.props; + +const { + title, + description, + publishDate, + tags = [] as string[], + img, + img_alt, + slug, + link +} = content; + +const formattedDate = new Date(publishDate).toLocaleDateString('en-US', { + year: 'numeric', + month: 'short', + day: 'numeric' +}); + +const postLink = link || `/blog/${slug}`; + +// Check if horizontal layout +const isHorizontal = layout === "horizontal"; +--- + +
+ +
+ + {img ? ( + {img_alt + ) : ( +
+ + + + + +
+ )} + + +
+ + + + + + +
+ + + + Read More About {title} + +
+ + +
+ +
+ + + {tags && tags.length > 0 && ( + <> + · + + {tags[0]} + + + )} +
+ + +

+ {title} +

+
+ + + {description && ( +

+ {description} +

+ )} + + + +
+ +
\ No newline at end of file diff --git a/src/components/cards/SocialCard.astro b/src/components/cards/SocialCard.astro new file mode 100644 index 0000000..409e7e1 --- /dev/null +++ b/src/components/cards/SocialCard.astro @@ -0,0 +1,168 @@ +--- +import social from "@/collections/social.json"; +const { displaySocialIds } = Astro.props; +// 配置要显示的社交媒体 ID(留空则显示所有) +//const displaySocialIds: number[] = [1, 2, 3]; // 只显示 ID 为 1, 2, 3 的社交媒体 +// const displaySocialIds: number[] = []; // 显示所有(当数组为空时) + +const filteredSocial = social.filter(item => { + if (item.isShow === false) return false; + if (displaySocialIds.length > 0) { + return displaySocialIds.includes(item.id); + } + return true; +}); +--- + +
+ +
+ + \ No newline at end of file diff --git a/src/components/cards/WorkCard.astro b/src/components/cards/WorkCard.astro new file mode 100644 index 0000000..295ade5 --- /dev/null +++ b/src/components/cards/WorkCard.astro @@ -0,0 +1,319 @@ +--- +interface Props { + name: string; // Required + image: string; // Required + url: string; // Required + description?: string; // Optional + tags?: string[]; // Optional + video?: string; // Optional + isShow?: boolean; // Optional, default true + layout?: 'featured' | 'grid'; // featured is full width, grid is two columns + index?: number; + target?: string; // Optional, default "_blank" +} + +const { + name, + description = '', + url, + image, + tags = [], + video, + isShow = true, + layout = 'grid', + index = 0, + target = "_blank" +} = Astro.props; + +// Generate stable id for each video for precise playback control +const videoId = `workcard-video-${index}-${name.replace(/[^a-z0-9]+/gi, '-').toLowerCase()}`; +--- + +
+ +
+ {video ? ( + + + ) : ( + + {name} + )} + + +
+ + +
+
+ + + + +
+
+
+ + +
+ +
+

+ {name} +

+ + +
+
+ + + + +
+
+
+ + + {tags && tags.length > 0 && ( +
+ {tags.map((tag) => ( + + {tag} + + ))} +
+ )} + + + {description && ( +

+ {description} +

+ )} +
+ + + + View {name} + +
+ +{video && ( + +)} \ No newline at end of file diff --git a/src/components/elements/AboutExperience.astro b/src/components/elements/AboutExperience.astro new file mode 100644 index 0000000..43dcea4 --- /dev/null +++ b/src/components/elements/AboutExperience.astro @@ -0,0 +1,22 @@ +--- +const { logo, dates, role, company, description } = Astro.props; +--- + +
+
+ {company} +
+ +

+ {dates} +

+

{role}

+

{company}

+

+ {description} +

+
diff --git a/src/components/elements/PageHeader.astro b/src/components/elements/PageHeader.astro new file mode 100644 index 0000000..8e6fabd --- /dev/null +++ b/src/components/elements/PageHeader.astro @@ -0,0 +1,38 @@ +--- +import AnimatedText from "@/components/ui/AnimatedText.astro"; +interface Props { + title?: string ; + description?: string ; + tags?: string[] ; + className?: string ; +} + +const { title, description, tags = [], className = "" } = Astro.props; +--- + +
+

+ {title && } +

+ {description && ( +
+ +
+ )} + + {tags && tags.length > 0 && ( +
+ {tags.map((tag) => ( + + {tag} + + ))} +
+ )} + + +
\ No newline at end of file diff --git a/src/components/elements/SectionHeader.astro b/src/components/elements/SectionHeader.astro new file mode 100644 index 0000000..b70df33 --- /dev/null +++ b/src/components/elements/SectionHeader.astro @@ -0,0 +1,19 @@ +--- +import AnimatedText from "@/components/ui/AnimatedText.astro"; +const { title, description } = Astro.props; +--- + +
+

+ +

+ {description && ( +
+ +
+ )} +
diff --git a/src/components/elements/SeparatorLine.astro b/src/components/elements/SeparatorLine.astro new file mode 100644 index 0000000..5808e1f --- /dev/null +++ b/src/components/elements/SeparatorLine.astro @@ -0,0 +1,43 @@ +--- +interface Props { + className?: string; // Custom CSS classes + color?: string; // Color, defaults to neutral + width?: "full" | "3/4" | "1/2" | "1/4"; // Width options + spacing?: "sm" | "md" | "lg" | "xl"; // Spacing options + thickness?: "thin" | "normal" | "thick"; // Thickness options +} + +// Define default values +const { + className = "", + color = "border-primary/25 dark:border-primary-light/25", + width = "full", + spacing = "md", + thickness = "thin" +} = Astro.props; + +// Width mapping +const widthClasses = { + "full": "w-full", + "3/4": "w-3/4", + "1/2": "w-1/2", + "1/4": "w-1/4" +}; + +// Spacing mapping +const spacingClasses = { + "sm": "my-2", + "md": "my-4", + "lg": "my-8", + "xl": "my-12" +}; + +// Thickness mapping +const thicknessClasses = { + "thin": "border-[0.5px]", + "normal": "border-[1px]", + "thick": "border-[2px]" +}; +--- + + \ No newline at end of file diff --git a/src/components/home/HeroCard.astro b/src/components/home/HeroCard.astro new file mode 100644 index 0000000..d023944 --- /dev/null +++ b/src/components/home/HeroCard.astro @@ -0,0 +1,416 @@ +--- +// Define properties accepted by the component +interface Props { + imageUrl: string; // Required + title?: string; // Optional, default "Home" + link?: string; // Optional, can be empty +} + +// Set default values and receive incoming properties +const { + imageUrl, + title = "Home", + link = "" +} = Astro.props; +--- + +
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {title && ( +
+

+ {title} +

+
+ )} + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/src/components/sections/BlogSection.astro b/src/components/sections/BlogSection.astro new file mode 100644 index 0000000..bb9dfc6 --- /dev/null +++ b/src/components/sections/BlogSection.astro @@ -0,0 +1,127 @@ +--- +import { getCollection } from "astro:content"; +import Pagination from "@/components/widgets/Pagination.astro"; +import BlogCard from "@/components/cards/BlogCard.astro"; +import SectionHeader from "@/components/elements/SectionHeader.astro"; +import Button from "@/components/ui/Button.astro"; +import AnimatedText from "@/components/ui/AnimatedText.astro"; +// 定义组件接收的属性 +const { + title = "Latest Articles", + description = "", + limit = 3, + listPage = false, + showViewAllButton = true, + pagination = { + enable: false, + currentPage: 1 + }, + postsPerPage = 3 +} = Astro.props; + +// 获取博客文章集合 +const allPosts = await getCollection("post"); + +// 按发布日期排序文章 +let posts = allPosts.sort( + (a, b) => b.data.publishDate.valueOf() - a.data.publishDate.valueOf() +); + +// 查找特色文章 +const featuredPost = posts.find((post) => post.data.featured); + +// 如果存在特色文章,从主列表中移除 +if (featuredPost && listPage) { + posts = posts.filter((post) => post.data.featured !== true); +} + +// 计算总页数 +const totalPages = Math.ceil(posts.length / postsPerPage); + +// 如果启用了分页,则只显示当前页的文章 +if (pagination.enable) { + const indexOfLastPost = pagination.currentPage * postsPerPage; + const indexOfFirstPost = indexOfLastPost - postsPerPage; + posts = posts.slice(indexOfFirstPost, indexOfLastPost); +} else if (!listPage) { + // 如果不是列表页,限制显示的文章数量 + posts = posts.slice(0, limit); +} + +// 为每篇文章添加链接属性 - 创建新对象而不是修改原对象 +const postsWithLinks = posts.map(post => ({ + ...post, + data: { + ...post.data, + link: `/blog/${post.slug}` + } +})); + +// 为特色文章创建带链接的版本 +const featuredPostWithLink = featuredPost ? { + ...featuredPost, + data: { + ...featuredPost.data, + link: `/blog/${featuredPost.slug}` + } +} : null; +--- + +{/* 特色文章部分 - 仅在列表页第一页显示 */} +{listPage && featuredPostWithLink && pagination.currentPage === 1 && ( +
+
+

+ +

+
+ +
+
+
+)} + +
+
+ {!listPage && title && ( + + )} + + {/* 列表页标题 */} + {listPage && title && ( +
+

{title}

+
+ )} + +
+ {postsWithLinks && postsWithLinks.map((post, index) => ( + + ))} +
+ + {listPage && totalPages > 1 && ( + + )} +
+ + {/* "View All Articles" 按钮 - 仅在非列表页且启用时显示 */} + {!listPage && showViewAllButton && ( +
+ +
+ )} +
\ No newline at end of file diff --git a/src/components/sections/Explore.astro b/src/components/sections/Explore.astro new file mode 100644 index 0000000..0802639 --- /dev/null +++ b/src/components/sections/Explore.astro @@ -0,0 +1,559 @@ +--- +import SectionHeader from "@/components/elements/SectionHeader.astro"; +import Matter from "@/components/ui/Matter.astro"; +import Button from "@/components/ui/Button.astro"; +import Tools from "../ui/Tools.astro"; +interface Props { + title?: string; + description?: string; +} +const {title, description +} = Astro.props; + +--- + +
+
+ +
+ +
+
+ +
+
+
+

Design & Code

+

Turning ideas into beautiful, functional experiences.

+ +
+
+ Keyboard +
+
+
+
+

Faves

+

Picked things I'm genuinely into.

+
+
+
+ Game Cassette 5 +
+
+ Game Cassette 4 +
+
+ Game Cassette 3 +
+
+ Game Cassette 2 +
+
+ Game Cassette 1 +
+
+
+
+ + +
+
+
+

Writing

+

Style guides, design notes, and quick reads.

+
+ +
+
+
+ Explore 1 +
+ +
+
+
+
+
+

My Tools

+

Design tools I built to speed up my workflow!

+
+
+ +
+
+
+ + +
+
+
+ +
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/src/components/sections/FeaturedWork.astro b/src/components/sections/FeaturedWork.astro new file mode 100644 index 0000000..72483d6 --- /dev/null +++ b/src/components/sections/FeaturedWork.astro @@ -0,0 +1,112 @@ +--- +import projects from "@/collections/featuredwork.json"; +import WorkCard from "@/components/cards/WorkCard.astro"; +import SectionHeader from "@/components/elements/SectionHeader.astro"; +import Button from "@/components/ui/Button.astro"; + +interface Props { + title?: string; + description?: string; + showAll?: boolean; + limit?: number; // 限制显示的项目数量 +} + +interface Project { + name: string; + description?: string; + image: string; + url: string; + tags?: string[]; + video?: string; + isShow?: boolean; +} + +const { + title = "Featured Work", + description = "A selection of projects I've worked on. From web applications to design systems, each project represents a unique challenge and learning experience.", + showAll = false, + limit +} = Astro.props; + +// 获取项目列表 +let allProjects = projects as Project[]; + +// 根据 limit 或 showAll 来控制显示数量 +if (limit !== undefined) { + // 如果指定了 limit,使用 limit + allProjects = projects.slice(0, limit) as Project[]; +} else if (!showAll) { + // 如果没有指定 limit,且 showAll 为 false,默认显示 6 个 + allProjects = projects.slice(0, 6) as Project[]; +} +// 如果 showAll 为 true 且没有 limit,显示所有项目 + +// 前三个为特色项目(全宽) +const featuredProjects = allProjects.slice(0, 3); + +// 其余为网格项目(两栏) +const gridProjects = allProjects.slice(3); + +// 判断是否应该显示 "View All" 按钮 +const shouldShowViewAll = limit !== undefined + ? limit < projects.length + : !showAll && projects.length > 6; +--- + +
+
+ + + + + {featuredProjects.length > 0 && ( +
+ {featuredProjects + .filter(project => project.isShow !== false) + .map((project, index) => ( + + ))} +
+ )} + + + {gridProjects.length > 0 && ( +
+ {gridProjects + .filter(project => project.isShow !== false) + .map((project, index) => ( + + ))} +
+ )} + + + {shouldShowViewAll && ( +
+ +
+ )} +
+
diff --git a/src/components/sections/Footer.astro b/src/components/sections/Footer.astro new file mode 100644 index 0000000..bb82bb7 --- /dev/null +++ b/src/components/sections/Footer.astro @@ -0,0 +1,86 @@ +--- +import Logo from "@/components/ui/Logo.astro"; +import ToTop from "@/components/widgets/ToTop.astro"; +import { siteConfig, socialLinks } from "@/config/site.js"; +--- + +
+
+ +

+ © {new Date().getFullYear()} + + {siteConfig.author || " "} +

+ + {socialLinks.map((social) => ( + + {social.name} + + + ))} + +
+
+ + + + + \ No newline at end of file diff --git a/src/components/sections/Header.astro b/src/components/sections/Header.astro new file mode 100644 index 0000000..2925a2d --- /dev/null +++ b/src/components/sections/Header.astro @@ -0,0 +1,397 @@ +--- +import { Mail, Moon, SunMedium,Download } from "@lucide/astro"; +import menus from "@/collections/menu.json"; +import Button from "@/components/ui/Button.astro"; +import Logo from "@/components/ui/Logo.astro"; +--- + + +
+ + + + + \ No newline at end of file diff --git a/src/components/sections/WorksSection.astro b/src/components/sections/WorksSection.astro new file mode 100644 index 0000000..47b936e --- /dev/null +++ b/src/components/sections/WorksSection.astro @@ -0,0 +1,50 @@ +--- +import works from "@/collections/works.json"; +import WorkCard from "@/components/cards/WorkCard.astro"; + +interface Props { + limit?: number; // 限制显示的项目数量 +} + +interface Work { + name: string; + description?: string; + image: string; + url: string; + tags?: string[]; + video?: string; + isShow?: boolean; +} + +const { limit } = Astro.props; + +// 获取项目列表 +let allWorks = works as Work[]; + +// 如果指定了 limit,使用 limit +if (limit !== undefined) { + allWorks = works.slice(0, limit) as Work[]; +} +--- + +
+
+ + {allWorks + .filter(work => work.isShow !== false) + .map((work, index) => ( + + ))} +
+
+ diff --git a/src/components/ui/AnimatedText.astro b/src/components/ui/AnimatedText.astro new file mode 100644 index 0000000..2a2e5ab --- /dev/null +++ b/src/components/ui/AnimatedText.astro @@ -0,0 +1,91 @@ +--- +interface Props { + class?: string; + content: string | Promise; + duration?: number; + delay?: number; + stagger?: number; +} + +let { + content, + duration = 0.6, + delay = 0, + stagger = 0.1, + ...rest +} = Astro.props; + +let processedContent = ""; +if (content) { + // @ts-expect-error + const words = content.split(" "); // Split text into words + processedContent = words + .map( + (word: string) => + `${word}`, + ) + .join(" "); +} +--- + +
+ + diff --git a/src/components/ui/Button.astro b/src/components/ui/Button.astro new file mode 100644 index 0000000..5cf8527 --- /dev/null +++ b/src/components/ui/Button.astro @@ -0,0 +1,88 @@ +--- +export interface Props { + url: string; // Button link URL + type?: "solid" | "fill" | "disabled"; // Button type, optional, default is "solid" + className?: string; // Custom CSS classes + target?: "_blank" | "_self" | "_parent" | "_top"; // Link target, default is "_self" + size?: "xs" | "sm" | "md" | "lg" | "xl"; // Button size, optional, default is "md" +} + +const { url, type = "solid", className = "", target = "_self", size = "md" } = Astro.props; + +// Define padding and font size for different button sizes +const sizeClasses = { + xs: { + padding: "px-3 py-1.5", + fontSize: "text-xs", + borderRadius: "rounded-lg", + }, + sm: { + padding: "px-4 py-2", + fontSize: "text-sm", + borderRadius: "rounded-lg", + }, + md: { + padding: "px-5 py-[12px]", + fontSize: "text-base", + borderRadius: "rounded-xl", + }, + lg: { + padding: "px-6 py-3.5", + fontSize: "text-lg", + borderRadius: "rounded-xl", + }, + xl: { + padding: "px-8 py-4", + fontSize: "text-xl", + borderRadius: "rounded-2xl", + }, +}; + +// Get classes for current size +const currentSizeClasses = sizeClasses[size]; +--- + + {type === "solid" ? ( +
+ +
+ ) : type === "fill" ? ( + + + + ) : type === "disabled" ? ( +
+ +
+ ) : ( + + )} +
+ + \ No newline at end of file diff --git a/src/components/ui/Logo.astro b/src/components/ui/Logo.astro new file mode 100644 index 0000000..4b311d8 --- /dev/null +++ b/src/components/ui/Logo.astro @@ -0,0 +1,19 @@ + + Logo + + + +{/* + + + aria + */} diff --git a/src/components/ui/Marquee.astro b/src/components/ui/Marquee.astro new file mode 100644 index 0000000..85e6540 --- /dev/null +++ b/src/components/ui/Marquee.astro @@ -0,0 +1,91 @@ +--- +interface Props { + class?: string; // Class of the marquee + marqueeElements: number; // Number of elements + marqueeElementWidth: string; // Width of the marquee + marqueeElementWidthAuto?: boolean; // Is the width auto + marqueeElementWidthResponsive: string; // Width of the marquee + marqueePauseOnHover?: boolean; // Duration of the marquee + marqueeReverse?: "reverse" | "" | undefined; // Duration of the marquee + marqueeDuration?: string; // Duration of the marquee +} + +let { + marqueeElements, + marqueeElementWidth, + marqueeElementWidthAuto = true, + marqueeElementWidthResponsive, + marqueePauseOnHover = false, + marqueeDuration = "50s", + marqueeReverse = "", +} = Astro.props; + +// Remove value of if `marqueeElementWidth`, `marqueeElementWidthResponsive` marqueeElementWidthAuto true +if (marqueeElementWidthAuto) { + marqueeElementWidth = ""; + marqueeElementWidthResponsive = ""; +} +--- + +
+
+ +
+
+ diff --git a/src/components/ui/Matter.astro b/src/components/ui/Matter.astro new file mode 100644 index 0000000..ed1437b --- /dev/null +++ b/src/components/ui/Matter.astro @@ -0,0 +1,322 @@ +--- +--- + +
+
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/src/components/ui/Tools.astro b/src/components/ui/Tools.astro new file mode 100644 index 0000000..018e0a3 --- /dev/null +++ b/src/components/ui/Tools.astro @@ -0,0 +1,72 @@ +
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ + + + +
+
+
+ + \ No newline at end of file diff --git a/src/components/ui/TopBg.astro b/src/components/ui/TopBg.astro new file mode 100644 index 0000000..b7af839 --- /dev/null +++ b/src/components/ui/TopBg.astro @@ -0,0 +1,22 @@ + + + + + + diff --git a/src/components/widgets/ActionBar.astro b/src/components/widgets/ActionBar.astro new file mode 100644 index 0000000..9bae751 --- /dev/null +++ b/src/components/widgets/ActionBar.astro @@ -0,0 +1,81 @@ +--- +// local structural type to avoid version-specific imports +type LogoInput = string | { src: string }; +interface Props { + logo?: LogoInput; // image url or object with src or single letter + tags?: string[]; // multiple labels like ["Blog", "Open Source"] + url?: string; // external site url + github?: string; // optional github url + visitLabel?: string; // primary button text + className?: string; // extra classes for wrapper +} + +const { + logo = '', + tags = ['Website'], + url = '#', + github = '', + visitLabel = 'Visit Site', + className = '' +} = Astro.props as Props; + +// Normalize logo: support URL string or Astro ImageMetadata object +let logoSrc: string | null = null; +if (typeof logo === 'string') { + const isUrlLike = logo.startsWith('/') || logo.startsWith('http') || /\.(png|jpe?g|webp|svg)$/i.test(logo); + if (isUrlLike) logoSrc = logo; +} else if (logo && typeof logo === 'object' && 'src' in (logo as any)) { + logoSrc = (logo as any).src as string; +} +--- + +
+
+ +
+ {logoSrc ? ( + logo + ) : ( + {typeof logo === 'string' && logo ? logo : 'W.'} + )} +
+ + +
+ {tags && tags.map((t) => ( + + ))} + {github && ( + + + + )} +
+ + + +
+
\ No newline at end of file diff --git a/src/components/widgets/Meta.astro b/src/components/widgets/Meta.astro new file mode 100644 index 0000000..caa8249 --- /dev/null +++ b/src/components/widgets/Meta.astro @@ -0,0 +1,59 @@ +--- +import { siteConfig } from "@/config/site.js"; + +interface Props { + title?: string; + description?: string; + keywords?: string; + url?: string; + image?: string; + twitterHandle?: string; +} + +const { + title = siteConfig.meta.title, + description = siteConfig.meta.description, + keywords = siteConfig.meta.keywords, + url = siteConfig.url, + image = siteConfig.meta.image, + twitterHandle = siteConfig.social.twitterName, +} = Astro.props; + +// 构建完整的页面标题 +const metaTitle = title === siteConfig.meta.title ? title : `${title} | ${siteConfig.meta.title}`; +const metaDescription = description || siteConfig.meta.description; +const ogImage = image || siteConfig.meta.image; +const canonicalUrl = url || siteConfig.url; +--- + + +{metaTitle} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/widgets/OptimizedImage.astro b/src/components/widgets/OptimizedImage.astro new file mode 100644 index 0000000..e051d4f --- /dev/null +++ b/src/components/widgets/OptimizedImage.astro @@ -0,0 +1,121 @@ +--- +/** + * OptimizedImage component is a modified version of Astro's built-in Image component. + * It allows to optimize images inside public, src/assets and content folders. + * To optimize remote images, follow: https://docs.astro.build/en/guides/images/#authorizing-remote-images + */ +import { Image } from "astro:assets"; + +interface InlineSvgProps { + src: string; + inlineSvg: true; + alt?: string; + width?: string; + height?: string; + class?: string; + style?: any; + [key: string]: any; +} + +interface ImageProps { + src: string; + alt?: string; + width?: number; + height?: number; + loading?: "eager" | "lazy" | null | undefined; + decoding?: "async" | "auto" | "sync" | null | undefined; + formats?: string[] | "auto" | "avif" | "jpeg" | "png" | "svg" | "webp"; + class?: string; + style?: any; + [key: string]: any; +} + +type Props = InlineSvgProps | ImageProps; + +// Destructuring Astro.props to get the component's props +let { + src, + alt, + inlineSvg, + width, + height, + loading, + decoding, + formats, + style, + ...rest +} = Astro.props; + +const isRemoteImage = src.startsWith("http://") || src.startsWith("https://"); +let image = src as any; +let SVG = "" as any; + +if (!isRemoteImage) { + // Regular Images + const images = import.meta.glob([ + "/src/assets/**/*.{jpeg,jpg,png,avif,tiff,gif,webp,svg,gif}", + "/public/**/*.{jpeg,jpg,png,avif,tiff,gif,webp,svg,gif}", + "/src/content/**/*.{jpeg,jpg,png,avif,tiff,gif,webp,svg,gif}", + ]); + + // Get Raw Image For Inline SVG + const imagesRaw = import.meta.glob( + [ + "/src/assets/**/*.svg", + "/src/content/**/*.svg", + "/public/**/*.svg", + ], + { + query: "raw", + import: "default", + }, + ); + + if (inlineSvg && src.includes(".svg")) { + const key = Object.keys(images).find((k) => k.includes(src)); + SVG = key ? await imagesRaw[key]() : null; + + if (SVG.length > 1) { + SVG = SVG.split(" tag + + if (SVG.length > 1) { + // Convert rest object to a string of attributes + const attributes = Object.entries(rest) + .map(([key, value]) => `${key}="${value}"`) + .join(" "); + + // Add the attributes to the tag + SVG[1] = ` data-icon="true" ${attributes} ${SVG[1]}`; + } + + // Join the array back into a string + SVG = SVG.join(" k.includes(src)); + image = key ? await images[key]() : null; + + image = image && image.default ? image.default : null; +} +--- + +{ + inlineSvg && SVG && src.includes(".svg") ? ( + + ) : image ? ( + // @ts-expect-error + + ) : null +} diff --git a/src/components/widgets/Pagination.astro b/src/components/widgets/Pagination.astro new file mode 100644 index 0000000..b464358 --- /dev/null +++ b/src/components/widgets/Pagination.astro @@ -0,0 +1,186 @@ +--- +const { currentPage, totalPages, collection } = Astro.props; + +// 生成页码数组 +const pageNumbers = Array.from({ length: totalPages }, (_, i) => i + 1); + +// 确定要显示的页码范围 +const maxVisiblePages = 5; +let startPage = Math.max(currentPage - Math.floor(maxVisiblePages / 2), 1); +let endPage = Math.min(startPage + maxVisiblePages - 1, totalPages); + +if (endPage - startPage + 1 < maxVisiblePages) { + startPage = Math.max(endPage - maxVisiblePages + 1, 1); +} + +// 生成页面链接 +const getPageLink = (pageNum: number): string => { + if (pageNum === 1) { + return `/${collection}/`; + } + return `/${collection}/page/${pageNum}`; +}; +--- + +
    + + {currentPage > 1 ? ( +
  • + + 上一页 + + + + +
  • + ) : ( +
  • + + 上一页 + + + + +
  • + )} + + + {startPage > 1 && ( + <> +
  • + + 1 + +
  • + {startPage > 2 && ( +
  • + + ... + +
  • + )} + + )} + + + {pageNumbers.slice(startPage - 1, endPage).map((pageNum) => ( +
  • + + {pageNum} + +
  • + ))} + + + {endPage < totalPages && ( + <> + {endPage < totalPages - 1 && ( +
  • + + ... + +
  • + )} +
  • + + {totalPages} + +
  • + + )} + + + {currentPage < totalPages ? ( +
  • + + 下一页 + + + + +
  • + ) : ( +
  • + + 下一页 + + + + +
  • + )} +
+ \ No newline at end of file diff --git a/src/components/widgets/ToTop.astro b/src/components/widgets/ToTop.astro new file mode 100644 index 0000000..a0f73fa --- /dev/null +++ b/src/components/widgets/ToTop.astro @@ -0,0 +1,116 @@ + + + + + + + diff --git a/src/components/widgets/Toc.astro b/src/components/widgets/Toc.astro new file mode 100644 index 0000000..fc7ffe8 --- /dev/null +++ b/src/components/widgets/Toc.astro @@ -0,0 +1,591 @@ +--- +interface Heading { + depth: number; + slug: string; + text: string; +} + +interface HeadingNode extends Heading { + children: HeadingNode[]; +} + +const { headings = [] } = Astro.props as { headings: Heading[] }; + +function buildTree(list: Heading[]): HeadingNode[] { + const root: HeadingNode[] = []; + const stack: HeadingNode[] = []; + list.forEach(h => { + const node: HeadingNode = { ...h, children: [] }; + while (stack.length && stack[stack.length - 1].depth >= h.depth) { + stack.pop(); + } + if (stack.length === 0) { + root.push(node); + } else { + stack[stack.length - 1].children.push(node); + } + stack.push(node); + }); + return root; +} +const tree = buildTree(headings); +--- + +
+
+ +
+
+ TOC + +
+ +
+ + + + diff --git a/src/components/widgets/TrackGa.astro b/src/components/widgets/TrackGa.astro new file mode 100644 index 0000000..591c3d3 --- /dev/null +++ b/src/components/widgets/TrackGa.astro @@ -0,0 +1,34 @@ +--- +const GAID = import.meta.env.PUBLIC_GA4_ID; +const UMAMIId = import.meta.env.PUBLIC_UMAMI_ID; +// const GAID = ''; + +if (!GAID) { + // console.error("Google Analytics ID (PUBLIC_GA4_ID) is missing!"); +} +--- + + +{GAID && ( + <> + + + +)} + + +{UMAMIId && ( + +)} + diff --git a/src/config/site.js b/src/config/site.js new file mode 100644 index 0000000..fdf5a3d --- /dev/null +++ b/src/config/site.js @@ -0,0 +1,74 @@ +// Get site URL from environment variable, use default value if not set +// Note: Please set the correct PUBLIC_SITE_URL in .env file after first deployment +const SITE_URL = process.env.PUBLIC_SITE_URL || 'https://portfolio.ricoui.com/'; + +export const siteConfig = { + title: "Rico Portfolio", + author: "Ricoui", + url: SITE_URL, + mail: "hello@ricoui.com", + resume: "#", + utm: { + source: `${SITE_URL}`, + medium: "referral", + campaign: "navigation", + }, + meta:{ + title: "Rico Portfolio", + description: "I'm Rico, a web designer passionate about both design and code. Currently developing a personal product for the design community.", + keywords: "web designer, portfolio, design, code, personal website", + image: `${SITE_URL}/og.jpg`, + twitterHandle: "ricouii", + }, + // social links + social:{ + twitter: "https://x.com/ricouii", + twitterName: "ricouii", + github: "https://github.com/ricocc", + blog: "https://ricoui.com", + xiaohongshu:"https://www.xiaohongshu.com/user/profile/5f2b6903000000000101f51f" + }, +}; + +// Footer +export const socialLinks = [ + { + name: 'Twitter', + url: 'https://x.com/ricouii', + icon: `` + }, + { + name: 'Github', + url: 'https://github.com/ricocc/', + icon: `` + }, + { + name: 'ZCool', + url: 'https://www.zcool.com.cn/u/13170647', + icon: `` + }, + + { + name: 'Behance', + url: 'https://www.behance.net/ricoui', + icon: `` + }, + { + name: 'RSS', + url: '/rss.xml', + icon: `` + }, + + +]; + + diff --git a/src/content/config.js b/src/content/config.js new file mode 100644 index 0000000..a3ead7b --- /dev/null +++ b/src/content/config.js @@ -0,0 +1,18 @@ +import { defineCollection, z } from "astro:content"; + +const postCollection = defineCollection({ + schema: z.object({ + title: z.string(), + description: z.string(), + publishDate: z.coerce.date(), + read: z.number().optional(), + tags: z.array(z.string()).optional(), + img: z.string().optional(), + img_alt: z.string().optional(), + featured: z.boolean().optional(), + }), +}); + +export const collections = { + post: postCollection, +}; diff --git a/src/content/post/design-style-guide-neo-brutalism/01.jpg b/src/content/post/design-style-guide-neo-brutalism/01.jpg new file mode 100644 index 0000000..39a3efb Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/01.jpg differ diff --git a/src/content/post/design-style-guide-neo-brutalism/02-neobrutalism.jpg b/src/content/post/design-style-guide-neo-brutalism/02-neobrutalism.jpg new file mode 100644 index 0000000..38436b2 Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/02-neobrutalism.jpg differ diff --git a/src/content/post/design-style-guide-neo-brutalism/03.webp b/src/content/post/design-style-guide-neo-brutalism/03.webp new file mode 100644 index 0000000..ee1b322 Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/03.webp differ diff --git a/src/content/post/design-style-guide-neo-brutalism/04.jpg b/src/content/post/design-style-guide-neo-brutalism/04.jpg new file mode 100644 index 0000000..f7e0a33 Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/04.jpg differ diff --git a/src/content/post/design-style-guide-neo-brutalism/05.jpg b/src/content/post/design-style-guide-neo-brutalism/05.jpg new file mode 100644 index 0000000..cc1315b Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/05.jpg differ diff --git a/src/content/post/design-style-guide-neo-brutalism/06-sui-io-overflow.jpg b/src/content/post/design-style-guide-neo-brutalism/06-sui-io-overflow.jpg new file mode 100644 index 0000000..a2362d8 Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/06-sui-io-overflow.jpg differ diff --git a/src/content/post/design-style-guide-neo-brutalism/07.jpg b/src/content/post/design-style-guide-neo-brutalism/07.jpg new file mode 100644 index 0000000..10c16c5 Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/07.jpg differ diff --git a/src/content/post/design-style-guide-neo-brutalism/08.jpg b/src/content/post/design-style-guide-neo-brutalism/08.jpg new file mode 100644 index 0000000..2e7785e Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/08.jpg differ diff --git a/src/content/post/design-style-guide-neo-brutalism/09-goodeatn.jpg b/src/content/post/design-style-guide-neo-brutalism/09-goodeatn.jpg new file mode 100644 index 0000000..d5c90c8 Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/09-goodeatn.jpg differ diff --git a/src/content/post/design-style-guide-neo-brutalism/10-budapestpark-hu.jpg b/src/content/post/design-style-guide-neo-brutalism/10-budapestpark-hu.jpg new file mode 100644 index 0000000..e414a7a Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/10-budapestpark-hu.jpg differ diff --git a/src/content/post/design-style-guide-neo-brutalism/11-byooooob.jpg b/src/content/post/design-style-guide-neo-brutalism/11-byooooob.jpg new file mode 100644 index 0000000..5770f4c Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/11-byooooob.jpg differ diff --git a/src/content/post/design-style-guide-neo-brutalism/12-brazilfox.jpg b/src/content/post/design-style-guide-neo-brutalism/12-brazilfox.jpg new file mode 100644 index 0000000..977dbdd Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/12-brazilfox.jpg differ diff --git a/src/content/post/design-style-guide-neo-brutalism/14.jpg b/src/content/post/design-style-guide-neo-brutalism/14.jpg new file mode 100644 index 0000000..5d12d9b Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/14.jpg differ diff --git a/src/content/post/design-style-guide-neo-brutalism/14.webp b/src/content/post/design-style-guide-neo-brutalism/14.webp new file mode 100644 index 0000000..93ca643 Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/14.webp differ diff --git a/src/content/post/design-style-guide-neo-brutalism/15-Berlin05-wki-tent.jpg b/src/content/post/design-style-guide-neo-brutalism/15-Berlin05-wki-tent.jpg new file mode 100644 index 0000000..fc96e82 Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/15-Berlin05-wki-tent.jpg differ diff --git a/src/content/post/design-style-guide-neo-brutalism/16.jpg b/src/content/post/design-style-guide-neo-brutalism/16.jpg new file mode 100644 index 0000000..336352e Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/16.jpg differ diff --git a/src/content/post/design-style-guide-neo-brutalism/17.webp b/src/content/post/design-style-guide-neo-brutalism/17.webp new file mode 100644 index 0000000..e43ec52 Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/17.webp differ diff --git a/src/content/post/design-style-guide-neo-brutalism/18.webp b/src/content/post/design-style-guide-neo-brutalism/18.webp new file mode 100644 index 0000000..2c4b08e Binary files /dev/null and b/src/content/post/design-style-guide-neo-brutalism/18.webp differ diff --git a/src/content/post/design-style-guide-neo-brutalism/index.mdx b/src/content/post/design-style-guide-neo-brutalism/index.mdx new file mode 100644 index 0000000..6b202ce --- /dev/null +++ b/src/content/post/design-style-guide-neo-brutalism/index.mdx @@ -0,0 +1,158 @@ +--- +title: Design Style Guide - Neo Brutalism +publishDate: 2025-06-26 +read: 10 +description: Design Style Guide - Neo Brutalism +tags: + - Design Style + - Neo-Brutalism + - Neo Brutalism +img: "/assets/blog/cover-neobrutalism.jpg" +img_alt: "Neo Brutalism" +--- + +In the previous article, we discussed the basics of Brutalism. Now we come to my favorite chapter - the previous article was even a setup for this one. Let's talk about "Neo-Brutalism" and its derived design styles. + +Previous article: Web Design Style Guide: Brutalism + +In fact, popular design works currently classified as Brutalism can mostly be categorized as Neo-Brutalism. Compared to the "no design" philosophy that original Brutalism insisted on, today it still belongs to a relatively niche design culture. Neo-Brutalism, however, is more widely accepted and loved, extensively applied in independent creators' portfolio websites, creative marketing campaigns, brand planning, and experimental digital art projects. + +![Searching for neo-brutalism keywords shows popular visual design works](./01.jpg) + + Searching for neo-brutalism keywords shows popular visual design works + +## Neo-Brutalism + +Neo-Brutalism: Also written as Neu-Brutalism or New Brutalism. + +The rise of the internet era has accelerated everything, driving technological innovation, aesthetic evolution, and cultural change. The characteristics of the digital age need no further elaboration. Simply put, the rise of Neo-Brutalism is related to the rebellious spirit of the digital age. Designers and artists drew inspiration from mid-20th century architectural Brutalism, bringing its rugged, raw aesthetics to the modern digital stage in the form of "Neo-Brutalism," challenging current mainstream design culture and pursuing authentic, unprocessed, even "anti-UX" expression. + +![neobrutalism.dev](./02-neobrutalism.jpg) + + neobrutalism.dev - Open-source component library with Neo-Brutalist style component system + +### Neo-Brutalism Style Characteristics + +Neo-Brutalism is the modern revival of Brutalism in digital design, especially prominent in web design and UI/UX fields. It inherits architectural Brutalism's "exposed structure" and function-first philosophy, combined with modern technology and digital media characteristics, forming a unique visual and interaction style. Characteristics in web and UI design include: + +* Conflicting color schemes: Often uses bright, vivid tones like black-white, red-green-blue color combinations, creating strong visual impact, abandoning soft gradients. +* Thick outlines and heavy shadows: Black outline strokes and shadows seem to inherit the rugged aesthetic of architecture. +* Flat design: Designs often consist of flat elements, illustrations, patterns, and huge text blocks, these elements may bring a sense of chaos. +* Special typography: Typography plays a very important role in Neo-Brutalism, being the element that dominates its visual effect. +* Unique illustrations and animations: Neo-Brutalist illustrations and component design themes are more diverse. Illustration and animation designs are mostly strongly visual styles. +* Function over form: Anti-UX interaction experience, advocating minimalism, inheriting the utilitarian essence of Brutalist architecture. + +![Sepideh Yazdi Neo-Brutalist visual style UI design work](./03.webp) + + Sepideh Yazdi Neo-Brutalist visual style UI design work + +![gumroad](./04.jpg) + + gumroad design style is also a leader in Neo-Brutalist design + +The core of original Brutalism is "no design, no decoration." What makes Neo-Brutalism particularly interesting to me is that it presents a paradox in digital design: + +Although it inherits Brutalism's ruggedness and imperfection, in visual presentation, it often demonstrates a prominent "intentional design sense" through deliberate irregularity and strong contrast. The unconventional visual language manifests in results as intentional design sense and strong visual impact, which actually makes Neo-Brutalism increasingly popular and sought after in the digital age - the contradiction between anti-design attitude and design-heavy outcomes. + +![mux](./05.jpg) + + The Internet's video API - mux.com + +![sui.io](./06-sui-io-overflow.jpg) + sui.io/overflow + +Neo-Brutalism is commonly used by independent designers, creative agencies, brands, events, fashion and other scenarios, highlighting individuality and anti-mainstream style to attract young users, actually becoming part of mainstream design. Of course, design projects are absolutely complex systems. In fact, we rarely completely classify a project or website into a certain design school. We look at the complete content it expresses from design concepts, logic, and visuals. + +![Colorfolio X](./07.jpg) + + Colorfolio X personal portfolio website template + +Neo-Brutalism's visual style and philosophy are particularly good choices for brands. Strong visual style and cultural characteristics make users remember the brand deeply and attract like-minded people. + +![lepuzz](./08.jpg) + + Wonderfully weird world Le Puzz - lepuzz.com + +![goodeatn](./09-goodeatn.jpg) + + Plant snack brand - goodeatn.com + +![budapestpark](./10-budapestpark-hu.jpg) + + Budapest Park - budapestpark.hu + +![byooooob](./11-byooooob.jpg) + + byooooob.com + + + +## The Development History of Brutalism + +As we know, in design history, the cycle of nostalgia and revival is almost an eternal theme. Each era's design trends are re-examined and honored at some point in the future. We talked about Brutalism born in the mid-20th century - its unique philosophy was considered revolutionary at the time because it challenged traditional aesthetics, attempting to respond to social needs in an honest and direct way. + +However, Brutalism was not "popular" from the beginning. It had some influence in the mid-20th century (especially in public buildings like schools, libraries, government buildings), but was also heavily criticized for its "cold," "oppressive" and unadorned appearance. + +![Geisel](./12-brazilfox.jpg) + Geisel Library + +*Geisel Library* is a landmark building designed by William Leonard Pereira in the late 1960s, a striking example of Brutalist architecture. + +Historically, its development has been up and down: + +* Mid-20th century (1950s-1970s): Brutalism emerged in the context of post-war reconstruction, mainly used for public buildings in Europe and North America (such as schools, government buildings), symbolizing modernism's pursuit of functionality and social equality. Its "cold" and unadorned appearance was both revolutionary and controversial. + +* Late 20th century (1980s-early 2000s): With the rise of Postmodernism, Brutalism was criticized for its monotony and lack of humanized design, many buildings were abandoned or renovated, gradually marginalized. + +* 21st century (2010s to present): With nostalgic sentiment and re-examination of modernism, Brutalism has gradually revived, especially in digital design and visual art fields, evolving into "Neo-Brutalism." This revival is not a simple reproduction, but combines modern aesthetics with anti-mainstream cultural demands. + +Therefore, Brutalism's ups and downs reflect changes in design trends and social values. The advent of the digital age provided a broader stage for Neo-Brutalism. Designers reinterpreted its rugged aesthetics through graphic, web and UI design, transforming it from cold, raw architectural language into personality-filled visual expression. + + + +## The Future of Neo-Brutalism + +As digital design continues to evolve, Neo-Brutalism may further integrate into mainstream design language, becoming a more widely applied style. Especially as it merges with other retro styles or emerging trends, creating more diversified design possibilities, such as Cyber Brutalism, Postmodern Brutalism, etc. This is actually easy to understand - the rebellious spirit and rugged aesthetics of Brutalism have their soil in every era. "The more advanced, the more primitive." Highly digitized, fast-paced society instead stimulates desire for imperfection and authenticity. + +### Cyber Brutalism + +The emergence of Cyber Brutalism stems from the digital age's enthusiasm for Cyberpunk culture, and Neo-Brutalism's emphasis on "unfinished feeling" and "exposed structure." Cyberpunk culture's depiction of future technology and social alienation resonates with Neo-Brutalism's rugged aesthetics, especially in design demands for emerging technology fields like virtual reality (VR), augmented reality (AR) and Metaverse. Designers hope to create a visual language that is both futuristic and primitively rugged by combining the two. + +It can be felt in films and games, such as the "Blade Runner" film series and the game "Cyberpunk 2077." + +![Image](./14.webp) + + "Blade Runner 2049" + +![Image](./14.jpg) + + + +### Industrial Brutalism + +Strictly speaking, this is not a widely recognized or formally named design school. Brutalism itself already emphasized "function first" and "material authenticity" in the 1950s-70s, while industrial style further strengthened this utilitarian aesthetic in contemporary interior design and product design. Therefore, "Industrial Brutalism" can be seen as the convergence of Brutalism's original philosophy with modern industrial style popular trends. + +Especially in recent years, industrial style has become popular in interior design (such as loft apartments, cafes) and product design (such as vintage mechanical equipment). + +In visual culture, manifestations of this style can be traced back to last century's science fiction films, such as: "Alien" (1979) series, "The Terminator" (1984) series, etc. The films' depictions of future worlds, and mechanical world visions, combined with cold metallic texture and decaying industrial scenes, also reflect Industrial Brutalism's visual language. Of course, the films' aesthetic style itself is complex and diverse, cannot be simply classified, but from their aesthetics and visual language, corresponding elements and expressions can be found. + +### Final Words + +Looking back at last century's sci-fi films, due to computer effects level limitations, most visual effects were made using real materials. Compared to today's CG images, this highlights a raw, authentic texture. + +While these aren't strictly Brutalist works, they all embody some of Brutalism's core philosophies to some extent. These works' visual language connection with Brutalism is more reflected in design philosophy and aesthetic pursuit rather than direct style imitation. Their influence is more reflected in inspiring designers to explore similar visual language, which is connected to Brutalism's spirit of pursuing authenticity and functionality. + + +### Preview + +In the next chapter, I'm still choosing topics, might want to talk about Retro-futurism or Cyberpunk-related styles, and need to think about how to write them properly. + +Retro-futurism philosophy is very interesting, "looking at the future from the past and looking at the past from the future," whether in philosophy or visual style, it's an interesting and philosophically deep design trend. + +![Berlin05](./15-Berlin05-wki-tent.jpg) + +For example, the upcoming "Fantastic Four: First Steps" has a background story set in a retro-futuristic world inspired by the 1960s. Looking forward to a retro-futuristic visual feast. + +![Retro-futurism](./16.jpg) + +![Berlin05](./17.webp) diff --git a/src/content/post/design-style-guide-retro-and-vintage/01.jpg b/src/content/post/design-style-guide-retro-and-vintage/01.jpg new file mode 100644 index 0000000..6cb6246 Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/01.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/02.jpg b/src/content/post/design-style-guide-retro-and-vintage/02.jpg new file mode 100644 index 0000000..497b8a6 Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/02.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/03.jpg b/src/content/post/design-style-guide-retro-and-vintage/03.jpg new file mode 100644 index 0000000..85d54bb Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/03.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/04.jpg b/src/content/post/design-style-guide-retro-and-vintage/04.jpg new file mode 100644 index 0000000..9308e42 Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/04.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/05.jpg b/src/content/post/design-style-guide-retro-and-vintage/05.jpg new file mode 100644 index 0000000..503604f Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/05.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/06-1.jpg b/src/content/post/design-style-guide-retro-and-vintage/06-1.jpg new file mode 100644 index 0000000..aca41d2 Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/06-1.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/06.jpg b/src/content/post/design-style-guide-retro-and-vintage/06.jpg new file mode 100644 index 0000000..a29e34c Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/06.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/07.jpg b/src/content/post/design-style-guide-retro-and-vintage/07.jpg new file mode 100644 index 0000000..6006dec Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/07.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/08.jpg b/src/content/post/design-style-guide-retro-and-vintage/08.jpg new file mode 100644 index 0000000..12e0646 Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/08.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/09.gif b/src/content/post/design-style-guide-retro-and-vintage/09.gif new file mode 100644 index 0000000..d42c9e3 Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/09.gif differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/10.jpg b/src/content/post/design-style-guide-retro-and-vintage/10.jpg new file mode 100644 index 0000000..6937d3a Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/10.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/11.jpg b/src/content/post/design-style-guide-retro-and-vintage/11.jpg new file mode 100644 index 0000000..8e8678e Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/11.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/12.jpg b/src/content/post/design-style-guide-retro-and-vintage/12.jpg new file mode 100644 index 0000000..bf5f9b2 Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/12.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/13.jpg b/src/content/post/design-style-guide-retro-and-vintage/13.jpg new file mode 100644 index 0000000..3ad173c Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/13.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/14.jpg b/src/content/post/design-style-guide-retro-and-vintage/14.jpg new file mode 100644 index 0000000..655084c Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/14.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/15.jpg b/src/content/post/design-style-guide-retro-and-vintage/15.jpg new file mode 100644 index 0000000..a59ecb0 Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/15.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/16.jpg b/src/content/post/design-style-guide-retro-and-vintage/16.jpg new file mode 100644 index 0000000..047efdf Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/16.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/17.jpg b/src/content/post/design-style-guide-retro-and-vintage/17.jpg new file mode 100644 index 0000000..12df132 Binary files /dev/null and b/src/content/post/design-style-guide-retro-and-vintage/17.jpg differ diff --git a/src/content/post/design-style-guide-retro-and-vintage/index.mdx b/src/content/post/design-style-guide-retro-and-vintage/index.mdx new file mode 100644 index 0000000..0ffad62 --- /dev/null +++ b/src/content/post/design-style-guide-retro-and-vintage/index.mdx @@ -0,0 +1,145 @@ +--- +title: Design Style Guide - Retro Design +publishDate: 2025-07-09 +read: 9 +description: Design Style Guide - Retro +tags: + - Retro & Vintage + - Web Design + - Design Style +img: "/assets/blog/cover-retro.jpg" +img_alt: "" +--- + +Hello everyone, I'm Rico. Before continuing our journey through design styles, we need to first understand Retroism. + +Time moves forward, yet people can't help but reminisce about the past - design trends are no exception. This is a universal phenomenon in human culture and psychology: nostalgia. No matter how society progresses or technology innovates, people often find emotional comfort, identity, or cultural roots by looking back at the past. + +In the design field, this phenomenon is particularly evident, because design is not only an embodiment of function, but also a carrier of culture, emotion, and zeitgeist - progress and nostalgia coexist. In design history, the cycle of nostalgia and revival is almost an eternal theme. Each era's design trends are re-examined and honored at some future moment. + +![01.jpg](01.jpg) + + + "Once Upon a Time in Hollywood" poster + +![seasoned.koto.studio.jpg](02.jpg) + + Seasoned brand design studio - seasoned.koto.studio + + + +**Retro design is a design style that evokes nostalgia by borrowing visual elements, colors, typography, and overall atmosphere from specific past eras. It centers on retrospection and tribute to history, typically creating familiarity and emotional resonance by recreating the aesthetic characteristics of a certain era.** + +When we talk about retro design, it can refer both to a specific style and to an overall concept. Retro design is not a single form, but a broad design category. It can point to different eras, such as the Art Deco style of the 1920s, the Psychedelic Style of the 70s, or the Neon Style of the 80s. It can be said that retro design encompasses all historical content on the past timeline, and in different geographical locations and cultural backgrounds, it presents even more diverse appearances. + +![03.jpg](03.jpg) + RTRFM - The Sound Alternative + + +![malaproject.jpg](04.jpg) + Retro restaurant website - MaLaProject + + +So what does retro design style look like? Let's take a brief look at some representative retro designs: + +### 1. 1920s-30s: Art Deco + +This was an era full of luxury, modernity, and geometric beauty. Art Deco merged the mechanical aesthetics of the late Industrial Revolution with the simple lines of early modernism, emphasizing symmetry, streamlined design, and luxurious decorative details. It features geometric shapes, fan decorations, stepped compositions, and materials like metal, marble, and ivory, with bold color combinations of gold, black, silver, and emerald green. + +This style remains popular in contemporary high-end brand design, such as luxury packaging, wedding invitations, or high-end event invitations. Its refinement and symmetry give designs a solemn and elegant temperament. + +![009.jpg](05.jpg) + +### 2. 1950s: Nostalgic Advertising Style + +(Vintage & Retro Advertising) If the 20s-30s were synonymous with luxury and modernity, then the 50s were symbols of warmth and hope. Post-war economic recovery filled people's lives with vitality and optimism, and design styles reflected this social atmosphere. 50s design features hand-drawn illustrations, soft tones (like pink, light blue, cream yellow), and rounded fonts, commonly seen in food packaging, restaurant menus, and advertising posters. + +Design from this period is full of family atmosphere, with a sense of intimacy and human touch. Retro posters, classic car advertisements, and neon signs all convey a relaxed and pleasant lifestyle. Today, this style is often used by brands hoping to convey "classic" or "traditional" values. + +![Nostalgic advertising.jpg](06.jpg) + + +### 3. 1970s: Hippie and Psychedelic Style + +(Psychedelic Art) + +The 70s were a rebellious and free era, a spirit manifested in design through bold colors, psychedelic patterns, and exaggerated fonts. Psychedelic style design is often full of visual impact, with gradients and lighting effects making images appear dreamlike and unreal. + +This style's design is commonly seen in music album covers, posters, and trendy art works, representing the 70s younger generation's pursuit of freedom and individuality. Today, psychedelic style is widely applied to music festival visual design, trendy apparel, and brand images related to youth culture - its bold, unrestrained character remains an important inspiration source for many designers. + +![3-2.jpg](08.jpg) + +### 4. 1980s: Neon and Futurism + +(Neon Retro Futurism) + +The 80s were the intersection of technology and pop culture. This era's design is marked by bright neon colors, geometric shapes, and digitized futurism. Neon signs, CRT monitor scan line effects, and grid backgrounds became classic 80s design symbols. + +This style was widely used in music videos, video game covers, and movie posters (like "Blade Runner") at the time, becoming a symbol of 80s pop culture. Today, this style has been rediscovered and applied to tech website design, video game UI, trendy apparel brands, and sci-fi film visuals, both evoking the past and inspiring imagination about the future. + + +![lost-in-space.gif](09.gif) + loox.app/lost-in-space + + +![Neon](10.jpg) + sunsetrace.ginrin.com + + +![Fluorescent nights and faded memories](11.jpg) + Fluorescent nights and faded memories + + +### 5. 1990s: Retro Tech + +(Retro Tech / Y2K aesthetic) + +The 90s were the internet's infancy, with design full of early tech symbols like pixel style, low-resolution images, and simple interfaces. The classic Windows 95 interface and early webpage layouts became representative of this period. + +![RadioPapi FM](12.jpg) + RadioPapi FM website's retro design + +This style also spawned the "Y2K" (**Year 2000 Kilo**) design language, combining futuristic tech sense with the rough aesthetics of the internet's early days, commonly seen in graphic design, web design, and game UI. Today, Y2K style has been rediscovered and applied to trendy brands, electronic music album covers, and youthful digital product design, evoking nostalgia for the internet's early days. + +![Y2K.jpg](13.jpg) + +Besides these era-specific retro styles, some regional styles also occupy important positions in retro design. + +For example, Bauhaus style originated in early 20th century Germany and is one of the founders of modern design. Bauhaus emphasizes simplicity and functionality, using geometric shapes, basic colors, and sans-serif fonts extensively in design, becoming an inspiration source for minimalist design. + +![nodcoding](14.jpg) + Bauhaus style - nodcoding.com + + +![Nike x The Bauhaus](15.jpg) + Nike x The Bauhaus + +### Showa Retro (昭和レトロ/Showa Retro) + +Japanese retro style displays unique Eastern charm, such as Showa Retro, which merges Japanese and Western elements with bright colors and nostalgic atmosphere. The design color scheme tends toward strong, deep, rich colors, creating intense visual impact and special Eastern cultural charm. + +![Showa Retro](16.jpg) + + "Showa 40 Year Man" magazine cover + + +### Distinguishing Vintage and Retro + +When describing retroism, we often use Vintage and Retro, which refer to different concepts. + +- **Vintage** + +Refers to items or designs that genuinely come from a past era, usually with certain historical value and collectible significance, emphasizing authenticity, directly from a past era, possibly bearing marks of time. Vintage is typically used to describe actual old items (like antique furniture, old clothes, old records) or design styles. For example, an original 1950s poster. + +![pitokmm-it.jpg](17.jpg) + Pitok Motor Museum + +- **Retro** refers to imitating or borrowing design styles from a past era, but not genuinely from that era - rather modern re-creation. Although inspired by history, the work itself is modern, emphasizing tribute and recreation of past styles, but usually incorporating modern elements, adapting to contemporary aesthetics and functional needs. + +Simply put, Vintage is "genuine old items," while Retro is "modern retro design." + +### **Summary** + +Retro design style is a design method that evokes nostalgia by recreating aesthetic characteristics of specific past eras. It's widely applied in graphic design, UI design, and web design, with different era retro styles each having unique features. Its greatest charm lies in its ability to touch people's nostalgic emotions by recreating past aesthetic symbols, evoking emotional resonance through reminiscing about the past, while giving design more spiritual value. + +Understanding retroism, we know that every coordinate point on the past timeline, due to its specific era culture and historical characteristics, produced specific era styles. And nostalgic sentiment mixes and combines past era styles with the present, deriving more interesting design works - this is what we want to focus on exploring in the future. These products merging different eras, cultures, designs, and other diverse achievements are so magical. Hope to enjoy this journey exploring design styles together with everyone. diff --git a/src/content/post/design-style-guide-spacepunk/001.jpg b/src/content/post/design-style-guide-spacepunk/001.jpg new file mode 100644 index 0000000..64897e3 Binary files /dev/null and b/src/content/post/design-style-guide-spacepunk/001.jpg differ diff --git a/src/content/post/design-style-guide-spacepunk/002-a-collection-of-my-best-starfield.jpg b/src/content/post/design-style-guide-spacepunk/002-a-collection-of-my-best-starfield.jpg new file mode 100644 index 0000000..d1485f6 Binary files /dev/null and b/src/content/post/design-style-guide-spacepunk/002-a-collection-of-my-best-starfield.jpg differ diff --git a/src/content/post/design-style-guide-spacepunk/003.jpg b/src/content/post/design-style-guide-spacepunk/003.jpg new file mode 100644 index 0000000..34a9fd0 Binary files /dev/null and b/src/content/post/design-style-guide-spacepunk/003.jpg differ diff --git a/src/content/post/design-style-guide-spacepunk/004-2001.jpg b/src/content/post/design-style-guide-spacepunk/004-2001.jpg new file mode 100644 index 0000000..e2f4969 Binary files /dev/null and b/src/content/post/design-style-guide-spacepunk/004-2001.jpg differ diff --git a/src/content/post/design-style-guide-spacepunk/005-2001.jpg b/src/content/post/design-style-guide-spacepunk/005-2001.jpg new file mode 100644 index 0000000..a689f5b Binary files /dev/null and b/src/content/post/design-style-guide-spacepunk/005-2001.jpg differ diff --git a/src/content/post/design-style-guide-spacepunk/006-Starship-Troopers.jpg b/src/content/post/design-style-guide-spacepunk/006-Starship-Troopers.jpg new file mode 100644 index 0000000..ac64e7b Binary files /dev/null and b/src/content/post/design-style-guide-spacepunk/006-Starship-Troopers.jpg differ diff --git a/src/content/post/design-style-guide-spacepunk/007-Serenity.jpg b/src/content/post/design-style-guide-spacepunk/007-Serenity.jpg new file mode 100644 index 0000000..21cf7a2 Binary files /dev/null and b/src/content/post/design-style-guide-spacepunk/007-Serenity.jpg differ diff --git a/src/content/post/design-style-guide-spacepunk/008-starfield-game-art.jpg b/src/content/post/design-style-guide-spacepunk/008-starfield-game-art.jpg new file mode 100644 index 0000000..7797e60 Binary files /dev/null and b/src/content/post/design-style-guide-spacepunk/008-starfield-game-art.jpg differ diff --git a/src/content/post/design-style-guide-spacepunk/009-alien-isolation.jpg b/src/content/post/design-style-guide-spacepunk/009-alien-isolation.jpg new file mode 100644 index 0000000..0cec7ee Binary files /dev/null and b/src/content/post/design-style-guide-spacepunk/009-alien-isolation.jpg differ diff --git a/src/content/post/design-style-guide-spacepunk/010-Space-Sweepers.jpg b/src/content/post/design-style-guide-spacepunk/010-Space-Sweepers.jpg new file mode 100644 index 0000000..2f81f2f Binary files /dev/null and b/src/content/post/design-style-guide-spacepunk/010-Space-Sweepers.jpg differ diff --git a/src/content/post/design-style-guide-spacepunk/011-Guardians-of-the-Galaxy.jpg b/src/content/post/design-style-guide-spacepunk/011-Guardians-of-the-Galaxy.jpg new file mode 100644 index 0000000..01dbf45 Binary files /dev/null and b/src/content/post/design-style-guide-spacepunk/011-Guardians-of-the-Galaxy.jpg differ diff --git a/src/content/post/design-style-guide-spacepunk/index.mdx b/src/content/post/design-style-guide-spacepunk/index.mdx new file mode 100644 index 0000000..2e796d9 --- /dev/null +++ b/src/content/post/design-style-guide-spacepunk/index.mdx @@ -0,0 +1,120 @@ +--- +title: Understanding the Niche Style - Spacepunk +publishDate: 2025-08-10 +read: 12 +description: Design Style Guide - Spacepunk +tags: + - Spacepunk + - Spacepunk + - Design Style +img: "/assets/blog/cover-spacepunk.jpg" +img_alt: "" +--- + +I'm Rico, welcome to Punk aesthetics. + +The spiritual core of Punk is **rebellion and deconstruction**. Beyond the familiar Cyberpunk and Steampunk, there's also Spacepunk, Classic Punk, Post-Apocalyptic Punk, Dieselpunk, Atompunk, Biopunk, and more. Almost any word can combine with "Punk" to derive a unique aesthetic style. + +Let's first discuss the relatively niche Spacepunk. + +Definition - Punk, cited from Wikipedia: + +> Punk culture is a subculture that originated in Britain in the 1970s, initially expressed through minimalist rock music, later developing into a comprehensive cultural movement integrating music, fashion, and ideology. Its core spirit includes rebelliousness, subversiveness, and anarchism, often expressing protest against social injustice through raw melodies, straightforward lyrics, and anti-traditional fashion. + +## Spacepunk and NASA-Punk + +"Spacepunk" is a style combining space sci-fi themes with the "Punk" spirit, merging punk's rebellious, anti-establishment themes with the futuristic aesthetics and technology of space exploration. It typically features retro-futuristic style, drawing inspiration from the space race era, exploring themes of technological advancement, cosmic adventure, and social rebellion in space settings. + +![](./001.jpg) + + Raygun Gothic illustration - With exaggerated lines and bold imagination, depicting extremely futuristic space scenes, is the prototype of early Spacepunk visuals. + +Although the term "Space Punk" has no exact proposal time, its prototype can be traced back to the 1979 film "Alien," and gradually became popular and widely recognized as an independent style label after the 2002 TV series "Firefly" aired. The "Guardians of the Galaxy" series also carries some "punk" characteristics. + +Additionally, Bethesda Game Studios explicitly proposed the concept of "NASA-Punk" during the development of "Starfield" (2023 game), defining the game's art style. The art team mentioned that "NASA Punk" inspiration comes from NASA spacecraft design and human space history, aiming to create a retro-futuristic feel based on realistic technology. + +![](./002-a-collection-of-my-best-starfield.jpg) + + "Starfield" game screenshot - Self-positioned as "NASA Punk" aesthetic - by reddit + +But actually, there's a difference between the two. Spacepunk inherits punk culture's rebellious and dystopian spirit, focusing on marginalized groups' struggles; NASA Punk embodies optimistic exploration spirit, a retro-futurism based on existing aerospace technology, with weaker critical intensity than typical Spacepunk. + +## Historical Context + +### I. 1960–1970: Emergence Under the Space Race + +In the 1960s, the space race was in full swing. Humanity was filled with infinite optimism and longing for space. The development of aerospace technology provided possibilities for exploring extraterrestrial worlds. Spacepunk began to emerge in this context, presenting a highly idealized techno-romantic style. + +![](./003.jpg) + + Apollo 11 moon landing + +Works from this period are more like the "spiritual predecessor of Spacepunk" — they cultivated the visual foundation of "space exploration" but hadn't yet integrated "punk's rebellious core." The design style manifested as **highly idealized techno-romanticism**. + +In design style, during this period, spacecraft mostly adopted sleek streamlined designs, abandoning redundant decoration to pursue resistance-free travel between stars, highlighting extreme pursuit of speed and efficiency. Colors were dominated by bright metallic tones, paired with orange, creating a visually hopeful atmosphere. Details emphasized technology's precision, such as bubble helmet's transparent material, neat cable layouts on spacesuits, demonstrating trust in technical perfection while incorporating imagination of commercialization elements. + +![](./004-2001.jpg) + +"2001: A Space Odyssey" 1968 + +This stage, driven by the space race, presented idealized, romanticized characteristics, integrating humanity's infinite longing for space into design - a perfect fusion of technology and dreams. + +![](./005-2001.jpg) + + "2001: A Space Odyssey" 1968 - Its bold innovation and visual approach influenced subsequent sci-fi and space films, widely recognized as a milestone in film history. + +### II. 1980–1990: Development After Cold War Cooling + +As the Cold War cooled, the space race's heat gradually subsided, and humanity's fantasies about space gained more realistic coldness. Spacepunk aesthetics entered a "ruins" phase, with visual elements beginning to show decay and weathering. Works from this period began to have a "dystopian" undertone, with some cases' "roughness" and "questioning of authority" approaching Spacepunk. + +Spacecraft were no longer perfectly streamlined, but bore real traces of wear and tear - damaged, mottled components, rusted, peeling metal shells telling of space environment's harshness and spacecraft's wear. Colors leaned toward gray, faded tones, lacking the 60s' brightness and vitality, adding depression and heaviness, making space no longer distant but full of real-life texture. This reflects society's diminished enthusiasm for space exploration post-reality mindset, and concerns about technical limitations and resource depletion. + +Works from this period had more life atmosphere and loneliness, manifesting as **combination of industrial realism and decay aesthetics**. + +![](006-Starship-Troopers.jpg) + + "Starship Troopers" (1997) - Though not pure Spacepunk, provides system critique perspective through militarism extremism, I believe it also has some Spacepunk visual experience and characteristics. + +![](007-Serenity.jpg) + + "Serenity" + +After Cold War cooling, Spacepunk shed utopian glory, presenting in a more realistic, colder posture. Decayed visual elements and integrated life scenes fully display space exploration's hardship and loneliness - a realistic return to space fantasy. + +### III. To Present: Digital Ruins and Retro Future + +Entering the 21st century to present, digital technology development and technological progress have brought new characteristics to cognition and assumptions about space and the future. Compared to previous styles, digital information, new crafts, and technological humanistic concepts have become new cores. Combined with nostalgic sentiment for last century's aerospace era, from a broad concept, it's easier to associate with **Retro-Futurism** we previously mentioned. + +Works from this period need to simultaneously satisfy "digital and retro mashup" and "questioning current order," avoiding simply equating "space theme + retro elements" with Spacepunk. + +**Design style from this period manifests as collision and fusion of digital technology and retro industry.** + +Modular design and information technology became mainstream. Spacecraft design better fits contemporary technical thought and emphasis on information technology, containing more fantastical future tech sense under nostalgic machine exteriors. In colors, while retaining classic tones like titanium white and aerospace orange, retro filter effects are added, imitating last century's image effects, giving images retro grain and haziness. + +![](008-starfield-game-art.jpg) + +"Starfield" game 2023 - Proposed "NASA Punk" as the game's art style + +Material use is more diverse. Design emphasizes "honest industrial style," combining some Brutalist concepts, clearly presenting spacecraft structure and history to people. Meanwhile, digital ruin elements often appear, such as retro industrial products coexisting with advanced digital technology, creating a unique temporal dislocation atmosphere. From modern works, it's more diversified. + +![](009-alien-isolation.jpg) + +"Alien Isolation" game image + +![](010-Space-Sweepers.jpg) + +"Guardians of the Galaxy" "Space Sweepers" 2021 - Set in 2092, "Victory" is a spaceship specializing in cleaning space debris, crew members are lower-class groups making a living in space. With space as background, focusing on lower-class marginal characters' survival, conforms to Spacepunk's emphasis on lower-class narrative. + +![](011-Guardians-of-the-Galaxy.jpg) + +"Guardians of the Galaxy" screenshot - Although more "retro pop culture collage + lower-class resistance + anti-authority," it also possesses Spacepunk thought core. + +## Summary + +This chapter's case selection made me hesitant. On one hand, it's niche, lacking overly distinct works that can fully express "Spacepunk = visual style + rebellious spirit + space narrative" trinity characteristics. On the other hand, it's hard to show its core spirit from single static visuals alone. + +Though Spacepunk belongs to punk style branches like Cyberpunk and Steampunk, each has unique characteristics. "Space background" is just Spacepunk's carrier. Its core is the combination of punk spirit and space setting, attempting to deconstruct "space exploration's" romantic imagination through rebellious narrative, rough aesthetics, and lower-class perspective. + +Modern Spacepunk is more diversified, not just simply "space theme + retro elements," but through these visual and narrative elements, raising profound questions about contemporary technological development, social structure, and human future, while maintaining nostalgic sentiment for space exploration history. + +I'm Rico, thanks for reading! diff --git a/src/content/post/personal-website-selection-guide-for-designers/cali.jpg b/src/content/post/personal-website-selection-guide-for-designers/cali.jpg new file mode 100644 index 0000000..644b1cd Binary files /dev/null and b/src/content/post/personal-website-selection-guide-for-designers/cali.jpg differ diff --git a/src/content/post/personal-website-selection-guide-for-designers/cover-portfolio-site.jpg b/src/content/post/personal-website-selection-guide-for-designers/cover-portfolio-site.jpg new file mode 100644 index 0000000..86a7d28 Binary files /dev/null and b/src/content/post/personal-website-selection-guide-for-designers/cover-portfolio-site.jpg differ diff --git a/src/content/post/personal-website-selection-guide-for-designers/index.mdx b/src/content/post/personal-website-selection-guide-for-designers/index.mdx new file mode 100644 index 0000000..2cc3c5f --- /dev/null +++ b/src/content/post/personal-website-selection-guide-for-designers/index.mdx @@ -0,0 +1,177 @@ +--- +title: How to Choose a Personal Website for Designers? A Guide + Selected Open Source Templates +publishDate: 2025-05-20 +read: 14 +description: Personal Website Selection Guide for Designers +tags: + - Designer's Site + - Personal Website + - Portfolio +img: "/assets/blog/cover-portfolio-site.jpg" +img_alt: "How to choose a personal website for designers? Check out this guide + selected open source templates" +--- + +## AI Coding and Personal Websites + +With the popularity of AI coding, the development threshold has genuinely lowered. Discussions about personal websites have gained more attention recently, with many articles teaching how to use AI to create personal websites and blogs. However, most final products are too rough, merely setting up a static webpage framework, lacking functionality and performance considerations. + +So what qualities should a complete and quality personal website or blog possess? After all, for designers, a personal website is not just "a place to put work," but also a showcase of their design ability and aesthetic vision. For beginners learning development, building a personal website is the best practical scenario for understanding frontend logic and familiarizing with development workflow. + +Today let's discuss some common questions about personal websites - which type of website to choose? How to match technology stack with requirements? How to weigh no-code versus self-deployment, etc. At the end, I'll share carefully selected open-source personal website and blog templates. + +## Common Personal Website Types + +The core value of personal websites is "matching needs with scenarios" — different identities and goals require completely different website types. Different purposes correspond to different functional and visual needs. Especially for designers, choosing the right type maximizes portfolio display effectiveness. Current mainstream personal websites can be divided into three categories, covering most needs: + +**1. Content Sharing (including blogs, technical notes)** + +Centered on "conveying information, accumulating knowledge," not limited to pure text. Suitable for copywriters, developers, or industry observers, also includes daily records, mainly text creation. It emphasizes "content readability" and "search convenience." + +**Suitable for** + +- Developers (sharing technical tutorials, troubleshooting notes); +- Industry observers (outputting design trends, workplace perspectives); +- Copywriters/Creators (daily reflections, short content accumulation). + +**2. Portfolio Showcase (Designers/Creators' First Choice)** + +Making "work" the absolute protagonist, the goal is "letting visitors intuitively see your professional ability." It's not just "displaying work," but "explaining work value clearly" - the core showcase vehicle for designers, illustrators, and product managers. + +**Suitable for** + +- Visual/UI/UX designers (showcasing interface design, interaction prototypes); +- Illustrators/Motion designers (high-resolution work collections, creative process); +- Independent developers (personal project demos, product prototypes). + +**3. Personal Brand Comprehensive (Integrating all core information)** + +Equivalent to a "personal official website," integrating portfolio, blog, personal bio, contact information and other functions, suitable for professionals with clear personal brand positioning (like independent designers, freelance consultants). Its core is shaping a three-dimensional personal image. Functionally, it needs to combine both advantages, while visually maintaining overall style unity, avoiding fragmentation between different modules. + +**Suitable for** + +- Independent designers/Freelancers (letting clients see work, case experience, service range simultaneously); +- Career advancers (integrating project experience, technical blog, personal honors, for job seeking or cooperation negotiations); +- Multi-field creators (like "designer + photographer," needing to showcase two types of work simultaneously). + +## How to Choose Technology Stack + +Choosing a technology stack is essentially "need matching." You don't need to master all tools, but need to choose "tools that solve problems and have long-term value." Many people fall into "technology anxiety," but actually for personal websites, small scale, low technical difficulty, belongs to lightweight small projects. Technology error tolerance is very high. + +**First clarify your core needs** + +Before choosing a technology stack, ask yourself three questions: + +- What is your website's core function? (Is it displaying static work, or needing dynamic interaction?) +- Do you need subsequent maintenance and feature iteration? (Need frequent content module updates and modifications) +- Do you want to learn new skills through building a website? (Like designers wanting to understand frontend basics) + +For example, if you just want to display a static portfolio, don't need complex interaction, low update frequency, simple HTML+CSS+JS is sufficient. More mature lightweight solutions (like Astro, Hugo) are more suitable. If you want to add complex functions and interactions, you can choose frontend frameworks like React, Vue. Choose according to need, and communicate technology stack solutions with AI. + +### **Recommended Technology Stacks: React, Vue, Astro** + +For designers and beginners, the core advantages of popular technology stacks are "low learning cost, rich community resources and tutorials, high long-term value." + +- **Rich learning resources**: These technology stacks have mature communities. Whether official documentation, Bilibili tutorials, or AI Coding, you can quickly find answers. For example, the most popular UI framework Shadcn/UI has rich templates and theme resources, plus mature AI support. +- **Designer-friendly**: React and Vue's "component-based development" is strongly supported by design tools like Figma. You can use tools to convert design components to code, directly connecting design to code path. Astro focuses on "Static Site Generation (SSG)," achieving both fast static page loading and supporting embedded dynamic components (like interaction modules written in React), balancing "performance" and "flexibility," focusing on implementation. +- **Long-term value**: Designers "understanding basic frontend" helps at work. For example, being able to read HTML/CSS structure, understand interaction implementation logic, master React, Vue and other development basics not only facilitates efficient communication with development teams, but also helps better implement your design ideas. + +Besides the recommended technology stacks above, there are also WordPress, Hugo, Ghost, Hexo and other solutions on the market. Their positioning and characteristics differ greatly. Considering article length, you can explore specific details yourself. For designers, I don't particularly recommend them. If readers are pure content creators, they can still be considered. + +Simply put, if you want to balance design freedom and learning cost, **Astro** is the optimal solution (static pages load fast, supports embedding React/Vue and other frameworks, low entry threshold). If you want to deeply learn frontend, **React/Vue** has more long-term value. If you completely don't want to touch code and can accept payment, you can use no-code platforms (Framer, Webflow, Figma Site, etc.), but long-term, self-deployed static sites are more worry-free. + +## About No-Code Platforms VS Self-Deployment + +Currently two mainstream approaches: no-code platforms (Framer, Figma Site, Webflow) and self-deployment, each with pros and cons. + +### No-Code Platforms - Require payment, convenient but not free enough + +Advantages are obvious: No need to write code, build websites through visual design platforms, and have built-in CMS management systems, convenient for editing content. Especially Figma Site can directly convert Figma design drafts into websites. For designers, low learning cost, suitable for those wanting to quickly build a temporary showcase page. + +But there are also disadvantages: + +- **Too platform-dependent**: For example, using Framer, sites are completely hosted on the platform, cannot be used apart from the platform. The longer the operation, the higher the migration time and cost. +- **Payment cost not low**: Basic free version has limited functionality, like only 3 works allowed, has platform watermark. Want custom domain, remove watermark, add advanced interactions, multi-language, all need paid plans, monthly from tens to hundreds, long-term use is expensive. +- **Poor flexibility**: Many platforms' templates can't change core logic, limited customization functions, content may also be subject to platform review restrictions. + +### Self-Deployment - Free and full control, but high learning cost + +"Self-deployment" sounds complex, but actually means "find templates yourself/write code, put the website on server," like using free platforms like Cloudflare, Vercel, GitHub Pages for deployment. + +Advantages especially suitable for designers: + +- **Maximum freedom**: Can add whatever functions you want, like adding 3D preview for work, adding complex interactions and animations, even embedding self-made interaction prototypes, completely unrestricted by platforms, can 100% implement your design ideas. +- **Low cost**: Most deployment platforms (Vercel, Netlify, Cloudflare) are free, custom domain costs only tens per year, and free function quotas are sufficient for personal use, much cheaper than no-code platforms long-term. +- **Learn development skills**: Even if you only know design, following tutorials to build a self-deployed site once, you can also learn frontend basics, domain resolution, traffic, framework advantages, etc. Many companies recruiting designers now also prioritize those who understand some technology, equivalent to an extra bonus point. + +Disadvantages are also direct: **High learning cost, time and energy consuming**. For example, need to understand HTML/CSS basics, know how to modify template content, how to deploy websites to servers. Now there are many excellent open-source templates, following documentation and AI assistance can also successfully go online, just a bit slower than no-code. + +Of course, not everyone is suitable for self-deployment: If you only temporarily need a showcase page, time-pressed, low requirements, then no-code platforms are sufficient. But if you want to make a personal site a long-term personal brand, then self-deployment is definitely more worth investing in. + +"No money needed," "Website exquisite with full functionality," "No need to learn any code" — this is impossible. Want worry-free? Pay. Payment can solve any difficulties you encounter, including but not limited to purchasing mature templates, paid consulting, paid development, etc. Want the free route? Spend more thought. The essence of paid versus free is weighing "using money for time" or "using time for money." + +## **Selected Open Source Template Recommendations** + +Finally, sharing 5 carefully selected open-source personal site templates I've chosen, all considered from multiple dimensions like "aesthetics, functionality, uniqueness," suitable for designers wanting to self-deploy. Whether design or code, they have high reference and learning value - see what good works are, then learn how to do them. + +A reminder: These templates require basic coding ability (AI assistance can help start), not suitable for complete beginners or those unwilling to learn development. Although there's detailed documentation, it takes time to research and learn. Going online will definitely be rewarding. + +### Cali's Personal Website (⭐1.9K) + +![cali.jpg](cali.jpg) + +- Website: [https://cali.so/](https://cali.so/) +- Open Source: [https://github.com/CaliCastle/cali.so](https://github.com/CaliCastle/cali.so) +- Deployment Docs: [https://cali.so/blog/guide-for-cloning-my-site](https://cali.so/blog/guide-for-cloning-my-site) +- Tutorial Video: [https://www.bilibili.com/video/BV1kH4y157xg/](https://www.bilibili.com/video/BV1kH4y157xg/) +- Tech Stack: Next.js + Tailwind CSS + Sanity + Neon + Resend + Clerk + Upstash +- Highlights: Comprehensive features, maximum design details. Many website interactions and animations are great, worth experiencing carefully. Has very detailed tutorial documentation and teaching videos. Functionality includes comment system, project list, message wall, email, backend management system, etc. +- Difficulty: Relatively complex tech stack, higher deployment difficulty. + +### Onur Dev (⭐2.3K) + +![onur-dev.jpg](onur-dev.jpg) + +![onur-dev-2.jpg](onur-dev-2.jpg) + +- Website: [https://onur.dev/](https://onur.dev/) +- Open Source: [https://github.com/suyalcinkaya/onur.dev](https://github.com/suyalcinkaya/onur.dev) +- Tech Stack: React + Tailwind CSS + Contentful +- Highlights: Comprehensive features, suitable for designer+developer identity, including blog articles, life records, timeline, and simple bookmark navigation. Very minimalist design, but module layout and functionality are practical. + +### Naresh Khatri 3D Personal Website (⭐557) + +![nareshkhatri.jpg](nareshkhatri.jpg) + +- Website: [https://www.nareshkhatri.site/](https://www.nareshkhatri.site/) +- Open Source: [https://github.com/Naresh-Khatri/3d-portfolio](https://github.com/Naresh-Khatri/3d-portfolio) +- Tech Stack: Three.js (3D rendering library) + React + Next.js + Tailwind +- Highlights: Strong 3D interactive visual impact — entire page is 3D space, can drag to rotate viewing angle, works displayed as 3D cards, click to see details; suitable for UI/UX, motion designers + +### Sudip Portfolio Website + +![sudip.jpg](sudip.jpg) + +![sudip2.jpg](sudip2.jpg) + +- Website: [https://portfolio-metaloopa.vercel.app/](https://portfolio-metaloopa.vercel.app/) +- Open Source: [https://github.com/metal-oopa/personal-portfolio](https://github.com/metal-oopa/personal-portfolio) +- Tech Stack: React +- Highlights: Dark style + dynamic interaction, rich interaction and visual effects, work page added "text gradual reveal animation on hover," very thoughtful details. Functionality supports work categorization, personal skill display, projects, and contact form, suitable for designers who like dark style. + +### ThoughtLite + +![thoughtlite-1.jpg](thoughtlite-1.jpg) + +![thoughtlite-2.jpg](thoughtlite-2.jpg) + +- Website: [https://ttio.cc/](https://ttio.cc/) +- Open Source: [https://github.com/tuyuritio/astro-theme-thought-lite](https://github.com/tuyuritio/astro-theme-thought-lite) +- Tech Stack: Astro + Tailwind CSS (static loading fast, responsive adaptation good) +- Highlights: Personal recommendation, minimalist design lightweight blog, simple tech stack, easy to start, focuses on text creation, supports Markdown editing and dark mode switching. Clean modern aesthetics, fast loading speed (SSG optimization), and supports multiple languages. Very good experience for text creation. + + +## Finally + +AI can indeed help us develop quickly, but truly brand-effective and valuable personal sites are never rushed out, but polished out - polishing features, details, polishing out your own style. If you're a designer, might as well spend time trying self-deployment, even just starting from modifying open-source templates. What goes online in the end is not just a website, but your exploration of "design + technology." After all, the feeling of being able to 100% implement your own ideas is really satisfying. + +If you encounter problems during site building, feel free to add me as a friend, let's communicate together. diff --git a/src/content/post/personal-website-selection-guide-for-designers/nareshkhatri.jpg b/src/content/post/personal-website-selection-guide-for-designers/nareshkhatri.jpg new file mode 100644 index 0000000..0c8e250 Binary files /dev/null and b/src/content/post/personal-website-selection-guide-for-designers/nareshkhatri.jpg differ diff --git a/src/content/post/personal-website-selection-guide-for-designers/onur-dev-2.jpg b/src/content/post/personal-website-selection-guide-for-designers/onur-dev-2.jpg new file mode 100644 index 0000000..19b45fc Binary files /dev/null and b/src/content/post/personal-website-selection-guide-for-designers/onur-dev-2.jpg differ diff --git a/src/content/post/personal-website-selection-guide-for-designers/onur-dev.jpg b/src/content/post/personal-website-selection-guide-for-designers/onur-dev.jpg new file mode 100644 index 0000000..bae5d9f Binary files /dev/null and b/src/content/post/personal-website-selection-guide-for-designers/onur-dev.jpg differ diff --git a/src/content/post/personal-website-selection-guide-for-designers/sudip.jpg b/src/content/post/personal-website-selection-guide-for-designers/sudip.jpg new file mode 100644 index 0000000..4f5b9b1 Binary files /dev/null and b/src/content/post/personal-website-selection-guide-for-designers/sudip.jpg differ diff --git a/src/content/post/personal-website-selection-guide-for-designers/sudip2.jpg b/src/content/post/personal-website-selection-guide-for-designers/sudip2.jpg new file mode 100644 index 0000000..6db24ea Binary files /dev/null and b/src/content/post/personal-website-selection-guide-for-designers/sudip2.jpg differ diff --git a/src/content/post/personal-website-selection-guide-for-designers/thoughtlite-1.jpg b/src/content/post/personal-website-selection-guide-for-designers/thoughtlite-1.jpg new file mode 100644 index 0000000..e973c33 Binary files /dev/null and b/src/content/post/personal-website-selection-guide-for-designers/thoughtlite-1.jpg differ diff --git a/src/content/post/personal-website-selection-guide-for-designers/thoughtlite-2.jpg b/src/content/post/personal-website-selection-guide-for-designers/thoughtlite-2.jpg new file mode 100644 index 0000000..63b6d18 Binary files /dev/null and b/src/content/post/personal-website-selection-guide-for-designers/thoughtlite-2.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/001.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/001.jpg new file mode 100644 index 0000000..440cd21 Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/001.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/002.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/002.jpg new file mode 100644 index 0000000..336352e Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/002.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/003.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/003.jpg new file mode 100644 index 0000000..a362098 Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/003.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/004.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/004.jpg new file mode 100644 index 0000000..fb3c8b1 Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/004.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/005.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/005.jpg new file mode 100644 index 0000000..c6f2fbd Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/005.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/006.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/006.jpg new file mode 100644 index 0000000..4c30eec Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/006.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/007.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/007.jpg new file mode 100644 index 0000000..053258a Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/007.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/008.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/008.jpg new file mode 100644 index 0000000..1b601a1 Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/008.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/009.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/009.jpg new file mode 100644 index 0000000..53bc8d6 Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/009.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/010.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/010.jpg new file mode 100644 index 0000000..034efee Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/010.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/011.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/011.jpg new file mode 100644 index 0000000..5665935 Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/011.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/012.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/012.jpg new file mode 100644 index 0000000..7c5d7d1 Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/012.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/013.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/013.jpg new file mode 100644 index 0000000..3a55c02 Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/013.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/014.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/014.jpg new file mode 100644 index 0000000..6a49392 Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/014.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/015.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/015.jpg new file mode 100644 index 0000000..c89dd4b Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/015.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/016.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/016.jpg new file mode 100644 index 0000000..e1ef764 Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/016.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/017.jpg b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/017.jpg new file mode 100644 index 0000000..178a785 Binary files /dev/null and b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/017.jpg differ diff --git a/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/index.mdx b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/index.mdx new file mode 100644 index 0000000..263d412 --- /dev/null +++ b/src/content/post/the-aesthetics-of-time-dislocation-retro-futurism/index.mdx @@ -0,0 +1,187 @@ +--- +title: The Aesthetics of Time Dislocation - Decoding Retro-Futurism from the Fantastic Four +publishDate: 2025-07-26 +read: 8 +description: The Aesthetics of Time Dislocation Retro-Futurism and the Fantastic Four +img: "/assets/blog/cover-retrofuturism.jpg" +tags: + - Retro-Futurism + - Retro Futurism + - Design Style Guide +featured: true +--- + +Hello everyone, this is Rico. Remember the retroism we discussed before? It's rooted in that nostalgic sentiment in human culture and psychology: **"Time moves forward, yet people can't help but reminisce about the past."** In contrast, there's our infinite longing and aspiration for the future. + +When past and future collide, Retro-Futurism is born. Its philosophy is fascinating: **"looking at the future from the past and looking at the past from the future"**. This unique perspective, along with its philosophy and visual style, is both interesting and philosophically deep. + +The currently screening "The Fantastic Four: First Steps" showcases the aesthetic charm of Retro-Futurism. The film sets the background in the golden age of the 1960s space race, cleverly merging retro technological creations and cultural characteristics with infusions of future fantasy. Audiences are immersed in a tactilely real, fully formed retro-futuristic parallel universe. In today's era of aesthetic fatigue, this both nostalgic and avant-garde aesthetic visual undoubtedly brings a refreshing viewing experience (not talking about plot, only aesthetic style). + +![The Fantastic Four: First Step poster](001.jpg) + +![The Fantastic Four: First Step screenshot](002.jpg) + +![The Fantastic Four: First Step screenshot](003.jpg) + + + The Fantastic Four: First Step + +## Definition + +Public records of the term "Retro-futurism" can be traced back to 1983 in a New York Times advertisement for Bloomingdale's jewelry, first using the adjective "retro-futuristic" to describe the "both old and new" texture of silver steel and gray tones. In 1987, Minnesota independent publisher Lloyd John Dunn officially renamed his experimental magazine "photoSTATIC" to "Retro-futurism," bringing the term into cultural view and it has been used ever since. + +Wikipedia's definition of Retro-Futurism is: + +> **Retro-Futurism** refers to the imitation of early Futurist design styles in contemporary art. This design style combines retro style with technologically colored futuristic style, usually reflecting early artists' conceptions of the future, like a parallel reality. + + +From the Chinese translation definition, the context and translation are not easy to understand. Retro-Futurism is essentially "the future in past people's eyes." It has two key elements: + +1. **Past future imagination**: Refers to people's predictions and imaginations of the future world in past eras (mainly mid-20th century) +2. **Contemporary reinterpretation**: We now re-examine and reinterpret these old-era future imaginations with modern eyes + +Simply put, it presents "the future in past people's eyes" — not our current predictions of the future, but looking back at past era people's imagined future world. + +![In 1930, German illustrator Echte Wagner depicted fantasies of year 2000 future technology](004.jpg) + +In 1930, German illustrator Echte Wagner depicted fantasies of year 2000 future technology + +![The Art of Robert McCall](005.jpg) + +The Art of Robert McCall - Artwork imagining future worlds + +## Retro-Futuristic Design Style Characteristics + +Let's focus our perspective on the design field. The characteristic of Retro-Futurism is using current perspectives to recall and rewrite "a certain past era's imagination of the future," reviving "unrealized old futures" in contemporary context, thereby forming a kind of temporal dislocation aesthetic tension and critical nostalgia. The style is not fixed either, but based on a past era fragment plus constantly changing "future" constituting the concept of Retro-Futurism. + +![Loki set design heavily referenced classic mid-20th century modernist architecture](006.jpg) + +Loki set design heavily referenced classic mid-20th century modernist architecture + +![Loki Time Variance Authority control room](007.jpg) + +Loki Time Variance Authority control room + +### Visual Language + +Retro-Futurism's visual language is full of drama and imagination. + +- **Streamlined Design** + +Iconic streamlined design inherits the aesthetic tradition of the 1950s-60s "Space Age," characterized by smooth, rounded curves and dynamic aerodynamic shapes. This design language is not only embodied in architecture and transportation, but also permeates daily product design, giving them a sense of transcending the era's futurism. + +![The Fantastic Four: First Step screenshot](008.jpg) + +The Fantastic Four: First Step screenshot + +- **Bold Color Combinations** + +In color combinations, Retro-Futurism is bolder and more flamboyant. Vivid contrasting tone combinations create strong visual impact. These colors blend nostalgic retro and advanced future characteristics, cleverly expressing contradictory emotional feelings. + +![p2923437891.jpg](009.jpg) + + +- **Geometric Shapes and Metallic Textures** + +Geometric shapes are also common elements - starburst patterns, atomic symbols, concentric circles, and angular geometric shapes constitute Retro-Futurism's visual vocabulary. The widespread use of metallic textures (like chrome alloys, polished metals, and reflective surfaces) further highlights this futuristic sense. Especially for last century's thought trends, such visuals seemed to represent a technologically more advanced future. + +![2001: A Space Odyssey](010.jpg) + +2001: A Space Odyssey + +- **Future Technology Elements** + +Of course, imagination of future technology is indispensable. Flying cars, space stations, robots, aircraft and other sci-fi elements are regulars in Retro-Futurism works. They are past era's beautiful aspirations for the future, now reinterpreted, becoming unique visual symbols. + +![The Art of Robert McCalll, 1970s](011.jpg) + + Robert McCalll, 1970s imagination of future world + +![Tomorrowland](012.jpg) + + Tomorrowland (2015) 1960s optimistic imagination of future cities + + +## Deep Logic of Design Principles + +Let's go further and explore Retro-Futurism's inner design principles. Most core is temporal mashup: deliberately mixing design languages of different eras, such as juxtaposing 1950s home aesthetics with future technology elements, creating a wonderful time-space disorientation effect from color and structure design. This mashup isn't random assembly, but carefully designed dialogue, letting past and future meet in the same space. + +Technological optimism is another important characteristic of this style. Unlike dystopian perspectives common in contemporary tech narratives, Retro-Futurism retains that pure enthusiasm for technological progress and longing for a better future found in early sci-fi works. This optimistic attitude is especially precious in today's tech-anxious era, even nostalgic and longed for. + +In expression methods, Retro-Futurism favors exaggeration and drama, not overly pursuing pragmatism, but emphasizing visual impact and emotional experience. This makes Retro-Futurism works often have a surreal texture - they're not for solving practical problems, but for stimulating imagination and emotional resonance. + + +![AI imagination of retro-futuristic aesthetics](013.jpg) + + AI imagination of retro-futuristic aesthetics + +![The Fantastic Four: First Step city background](014.jpg) + +The Fantastic Four: First Step city background + +We can abstract as: + +1. **Temporal Mashup**: Deliberately mixing design languages of different eras, like 1950s aesthetics with future technology +2. **Technological Optimism**: Expressing optimistic attitudes toward technological progress and aspirations for a better future +3. **Exaggeration and Drama**: Not pursuing pragmatism, but emphasizing visual impact and emotional experience +4. **Nostalgia and Innovation Coexist**: Simultaneously evoking nostalgic emotions and futuristic sense + +## Work Characteristics + +Retro-Futurism works often present rich multi-dimensional qualities. First is that unique "temporal dislocation." When facing a Retro-Futurism work, we often experience a strange temporal paradox, simultaneously feeling past and future existence. This dislocation isn't chaos, but conscious artistic treatment, challenging our traditional cognition of time's linear development. + +Secondly, in Retro-Futurism's world, technology isn't cold tools, but existence closely integrated with human emotional needs. This fusion embodies an idealistic technological view - technology should serve human happiness and creativity, not the reverse. + +![Last century's fantasy illustration of the future](015.jpg) + + Last century's fantasy illustration of the future + +Parallel reality narrative is Retro-Futurism's core charm. These works create "could have happened but didn't happen" historical branches. The concept of parallel realities isn't unfamiliar in today's flourishing film and literary works, but the vitality displayed in the design field is delightful. + +Era traces in details are Retro-Futurism's subtle points. Standing at present imagining future, these works also can't completely escape their creation era's aesthetic preferences and cultural backgrounds. These subtle era imprints precisely become Retro-Futurism's charm - they carry each era's cultural characteristics and unique imagination of the imagined future. + +Simply summarized as: + +1. **Temporal Dislocation Sense**: Works often present a strange temporal paradox, letting viewers simultaneously feel past and future +2. **Integration of Technology and Humanities**: Balance of technological elements and human emotional needs +3. **Parallel Reality Narrative**: Creating "could have happened but didn't happen" historical branches +4. **Era Traces in Details**: Even depicting the future, can see creation era's aesthetic preferences in details + +## Development and Derivative Styles + +Retro-Futurism is not an unchanging style. As times develop, people continuously resample, collage, and tempo-shift "past imaginations of the future." According to different era anchor points, emotional orientations, and technological settings, rich diverse branch styles have derived. Like Cyberpunk, Steampunk, Spacepunk / NASA Punk, and Vaporwave, Synthwave, Chillwave, Future Funk, etc. This "temporal dislocation" creation is fascinating. + +![Cyberpunk 2077](016.jpg) + + Cyberpunk 2077 + +These branches each have their focus. Steampunk, Dieselpunk, Spacepunk are responsible for "returning to the past, rewriting the future." Cyberpunk is responsible for "freezing the old future, letting it continue rotting or shining today." Vaporwave/Synthwave are responsible for "cutting up old future commercials, making today's emotional background." They collectively constitute Retro-Futurism's "family tree." As new "present" continuously becomes "past," tree branches are still growing. + +![Blade Runner 2049](017.jpg) + + Blade Runner 2049 + +Of course, we'll explore these styles in detail later. Looking forward to it. + +## Finally + +In my personal understanding, Retro-Futurism design style is essentially a clever temporal paradox, fusing two completely different elements: certain past and unknown future. + +Past historical elements represent certainty and security. These familiar visual symbols, aesthetic styles, and cultural memories provide a cognitive anchor for viewers. We can subconsciously recognize last century's cultural characteristics and retro elements existing in scenes. They evoke nostalgic emotions, giving us comfort and intimacy. + +Future elements symbolize the unknown, possibilities, and exploration. The future itself is full of uncertainty, potentially exciting or unsettling. It challenges our imagination, pushing us to think about "what might be" questions. + +Retro-Futurism's unique charm precisely comes from this contradictory harmonious unity: it uses familiar past language to describe the unknown future, thereby creating emotional balance. Familiar retro elements reduce anxiety about future uncertainty, while future imagination injects fresh vitality into nostalgic sentiment, preventing it from degenerating into simple imitation or copying. + +This temporal interlacing produces fascinating visual and cognitive experiences, satisfying our psychological needs for security and familiarity while triggering curiosity and exploration desire for unknown worlds. I believe in today's era of increasing uncertainty, Retro-Futurism will become increasingly popular because it provides a way to face the future, not just limited to design style. + + +## Reference Articles + +- 宅在缸中的脑斯基 - [Talking about Retro-Futurism! The Universe Once Lifted Its Skirt for Humanity Last Century](https://zhuanlan.zhihu.com/p/874642642) (Good article! Recommended) + +- 余月鱼鸽 - [Retro-Futurism: Can Applied Science Fulfill Its Early Promises?](https://zhuanlan.zhihu.com/p/699505638) + +- 暴君7200 - [Time Is Circular: Sorting Out "Retro-Futurism"](https://www.gcores.com/articles/116899) + +- Sparkwarrgon - [How Did Loki's TVA Time Management Bureau Make Retro-Futurism So Complete?](https://zhuanlan.zhihu.com/p/388058034) diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/01-freesvgicons.png b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/01-freesvgicons.png new file mode 100644 index 0000000..7fc7cca Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/01-freesvgicons.png differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/02-iconsax.png b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/02-iconsax.png new file mode 100644 index 0000000..9093c4f Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/02-iconsax.png differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/03-mageicons.png b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/03-mageicons.png new file mode 100644 index 0000000..91929c2 Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/03-mageicons.png differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/04-remixicon.jpg b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/04-remixicon.jpg new file mode 100644 index 0000000..1bdcfd0 Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/04-remixicon.jpg differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/05-lucide.png b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/05-lucide.png new file mode 100644 index 0000000..4fbae3a Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/05-lucide.png differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/06-akar.png b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/06-akar.png new file mode 100644 index 0000000..a364c40 Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/06-akar.png differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/07-qingicon.jpg b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/07-qingicon.jpg new file mode 100644 index 0000000..d4a8588 Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/07-qingicon.jpg differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/08-circumicons.jpeg b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/08-circumicons.jpeg new file mode 100644 index 0000000..92536cd Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/08-circumicons.jpeg differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/09-heroicons.jpeg b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/09-heroicons.jpeg new file mode 100644 index 0000000..8264b4a Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/09-heroicons.jpeg differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/10-boxicons.jpg b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/10-boxicons.jpg new file mode 100644 index 0000000..5e6e5b1 Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/10-boxicons.jpg differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/11-grassicons.png b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/11-grassicons.png new file mode 100644 index 0000000..e3355b9 Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/11-grassicons.png differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/12-isocons-app.jpg b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/12-isocons-app.jpg new file mode 100644 index 0000000..5996d46 Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/12-isocons-app.jpg differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/13-iconoir.jpg b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/13-iconoir.jpg new file mode 100644 index 0000000..e8a27d8 Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/13-iconoir.jpg differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/14-doodle-icons.png b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/14-doodle-icons.png new file mode 100644 index 0000000..73664c4 Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/14-doodle-icons.png differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/cover-free-icon-library.jpg b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/cover-free-icon-library.jpg new file mode 100644 index 0000000..446684a Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/cover-free-icon-library.jpg differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/index.mdx b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/index.mdx new file mode 100644 index 0000000..a18c185 --- /dev/null +++ b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/index.mdx @@ -0,0 +1,151 @@ +--- +title: Icon Freedom! 14 Quality Free Icon Libraries Recommended +publishDate: 2025-08-27 +read: 8 +description: Top 14 Free Icon Libraries for Designers & Developers +tags: + - Icon Libraries + - Free Icon + - Free Icon Library Recommendations +img: "/assets/blog/cover-free-icon-library.jpg" +img_alt: "14 free icon library recommendations" +--- + +Although I'm a designer, I've always felt that drawing icons is quite troublesome - they need to be standardized, concise, precisely express meaning, have design sense, and also meet massive quantity demands. Especially for time-pressed projects, icon production is a tedious and energy-consuming task. + +Fortunately, open-source contributors upholding internet open-source culture have contributed many excellent open-source projects, allowing us to directly use these quality results. Below I'll share 14 quality icon libraries from my daily collection, basically covering all icon types, each with different advantages - like supporting React, Vue, Svelte and other common development frameworks, freely adjustable lines, colors, sizes and other details, providing Figma source files and various other needs. + +In my personal experience, they completely meet my commercial and personal project needs. Below are specific icon library introductions: + +### 1. Free Svg Icons + +- URL: [freesvgicons.com](https://freesvgicons.com/) +- Description: Aggregates multiple common open-source icon libraries, integrating over 250K icons, supports SVG, PNG, React, Ts and other format exports, basically covers all scenario needs. +- Advantages: Aggregation platform, preview and compare multi-platform icons at once, convenient for cross-border use, can directly download and edit, no complex authorization process needed. + + ![01-freesvgicons.png](01-freesvgicons.png) + + +### 2. Iconsax + +- URL: [https://app.iconsax.io/](https://app.iconsax.io/) +- Description: Multi-style variant (Outline / Bold / Bulk / Two-tone / Broken etc.) modern icon system. Total 40K+ icons, over 6000 free icons. +- Advantages: Supports React, Vue, Svelte frameworks, customizable size, color and stroke, high style consistency, benefits medium-large design systems, high integration efficiency. + + ![02-iconsax.png](02-iconsax.png) + + +### 3. Mageicons + +- URL: [https://mageicons.com/](https://mageicons.com/) +- Description: Open-source minimalist modern style icon library, includes nearly 1000+ icons, supports Figma, React and Web Fonts. +- Advantages: Clean beautiful design, supports Stroke Icons, Fill Icons, Brand Icons. + +![03-mageicons.png](03-mageicons.png) + +### 4. Remix Icon + +- URL: [https://remixicon.com/](https://remixicon.com/) +- Description: Well-known open-source icon library, has over 3000 icons, covers common product, development, commercial scenarios. Neutral versatile style, provides Figma community file, one-click import usage. +- Advantages: Icon line consistency and standardization, adapts to Web, mobile multi-scenario, high update frequency, supports mainstream development frameworks, active community maintenance. + +![04-remixicon.jpg](04-remixicon.jpg) + +### 5. Lucide + +- URL: [https://lucide.dev/](https://lucide.dev/) +- Description: Lightweight open-source linear icon library, includes over 1600 icons, with minimalist design language adapts to various interfaces, one of my most commonly used icon libraries, recommended. +- Advantages: Small size efficient loading, supports custom stroke width and color, compatible with React, Vue frameworks, suitable for projects pursuing lightweight. + +![05-lucide.png](05-lucide.png) + +### 6. Akar Icons + +- URL: [https://akaricons.com/](https://akaricons.com/) +- Description: Open-source minimalist style icon library, contains over 400 icons, friendly linear icon library with soft rounded end treatment. +- Advantages: No redundant code easy integration, icon design concise and friendly, suitable for minimalist interface design. + +![06-akar.png](06-akar.png) + +### 7. QingIcon + +- URL: [https://qingicon.com/](https://qingicon.com/) +- Description: Domestic designer project, designed and developed by Asorn & 胡蝶, over 2000 icons, single and dual color styles, diverse types, suitable for B-end, middle and back office projects. +- Advantages: Supports SVG, Figma plugin, Wenfont, has detailed guidance documentation, also has an SVG illustration library, meets personalized design needs, recommended! + +![07-qingicon.jpg](07-qingicon.jpg) + +### **8. Circumicons** + +- URL: [https://circumicons.com/](https://circumicons.com/) +- Description: 285 free icons, icon library with circular/rounded outline as overall visual carrier. +- Advantages: Unified style high recognition, excellent design, supports size and color customization. + +![08-circumicons.jpeg](08-circumicons.jpeg) + +### **9. Hero Icons** + +- URL: [https://heroicons.com/](https://heroicons.com/) +- Description: Open-source icon library developed by Tailwind CSS team, contains over 300 icons, divided into outline, solid, Mini, Micro four styles, provides Figma community file. +- Advantages: Seamless adaptation with Tailwind CSS, icon style simple and unified, supports React, Vue framework component calls, high development integration efficiency. + +![09-heroicons.jpeg](09-heroicons.jpeg) + +### 10. Boxicons + +- URL: [https://boxicons.com/](https://boxicons.com/) +- Description: Over 3000 free icons, contains Basic / Duotone / Brands categories. +- Advantages: Supports multiple customization methods, including custom size, color, lines, etc., convenient integration. + +![10-boxicons.jpg](10-boxicons.jpg) + +### 11. Grassicons + +- URL: [https://grassicons.framer.website/](https://grassicons.framer.website/) +- Description: 100+ linear style, clean design, supports SVG and Figma. +- Advantages: Contains static and dynamic icons, icon animations concise and smooth. + +![11-grassicons.png](11-grassicons.png) + +### 12. Isocons + +- URL: [https://www.isocons.app/](https://www.isocons.app/) +- Description: Isometric style 3D perspective light skeuomorphic icons. +- Advantages: Has three-dimensional depth, enhances information entry attraction, suitable for feature promotion / landing pages / empty page illustration. + +![12-isocons-app.jpg](12-isocons-app.jpg) + +### 13. Iconoir.com + +- URL: [https://iconoir.com/](https://iconoir.com/) +- Description: Includes over 1600 icons, semantic coverage very comprehensive. +- Advantages: Framework (React / Vue / Flutter etc.) support, customizable size, stroke and color. + +![13-iconoir.jpg](13-iconoir.jpg) + +### 14. Doodle Icons + +- URL: [https://khushmeen.com/icons.html](https://khushmeen.com/icons.html) +- Description: Hand-drawn style icon library, includes over 400 icons and an illustration library, lines lively and agile, full of creative sense. +- Advantages: Unique style different from regular icons, suitable for personalized, youthful design scenarios, supports PNG, Figma, SVG. + +![14-doodle-icons.png](14-doodle-icons.png) + +### Finally + +Good use of excellent open-source icon libraries can let you invest energy into interface information architecture, visual rhythm and interaction strategy that truly have differentiated value. + +I've also collected all the above icon libraries into my own resource integration website UIUXDECK. If you find it too troublesome to bookmark one by one, you can check out all my resource collections here. + +URL: uiuxdeck.com/search?category=icon-library + + +![uiuxdeck-icon.jpg](uiuxdeck-icons.jpg) + + + + +![uiuxdeck.jpg](uiuxdeck.jpg) + + +I'm Rico, thanks for reading! diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/uiuxdeck-icons.jpg b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/uiuxdeck-icons.jpg new file mode 100644 index 0000000..4a9b46a Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/uiuxdeck-icons.jpg differ diff --git a/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/uiuxdeck.jpg b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/uiuxdeck.jpg new file mode 100644 index 0000000..ab6ed22 Binary files /dev/null and b/src/content/post/top-14-free-icon-libraries-for-designers-and-developers/uiuxdeck.jpg differ diff --git a/src/content/post/web-design-style-guide-brutalism/01.jpg b/src/content/post/web-design-style-guide-brutalism/01.jpg new file mode 100644 index 0000000..d64eb69 Binary files /dev/null and b/src/content/post/web-design-style-guide-brutalism/01.jpg differ diff --git a/src/content/post/web-design-style-guide-brutalism/02.jpg b/src/content/post/web-design-style-guide-brutalism/02.jpg new file mode 100644 index 0000000..044e78d Binary files /dev/null and b/src/content/post/web-design-style-guide-brutalism/02.jpg differ diff --git a/src/content/post/web-design-style-guide-brutalism/alicecph.com.jpg b/src/content/post/web-design-style-guide-brutalism/alicecph.com.jpg new file mode 100644 index 0000000..9beeb9f Binary files /dev/null and b/src/content/post/web-design-style-guide-brutalism/alicecph.com.jpg differ diff --git a/src/content/post/web-design-style-guide-brutalism/alicecph.jpg b/src/content/post/web-design-style-guide-brutalism/alicecph.jpg new file mode 100644 index 0000000..fdb96a5 Binary files /dev/null and b/src/content/post/web-design-style-guide-brutalism/alicecph.jpg differ diff --git a/src/content/post/web-design-style-guide-brutalism/awwwards.jpg b/src/content/post/web-design-style-guide-brutalism/awwwards.jpg new file mode 100644 index 0000000..b445537 Binary files /dev/null and b/src/content/post/web-design-style-guide-brutalism/awwwards.jpg differ diff --git a/src/content/post/web-design-style-guide-brutalism/brutalistwebsites.jpg b/src/content/post/web-design-style-guide-brutalism/brutalistwebsites.jpg new file mode 100644 index 0000000..bd8aab9 Binary files /dev/null and b/src/content/post/web-design-style-guide-brutalism/brutalistwebsites.jpg differ diff --git a/src/content/post/web-design-style-guide-brutalism/index.mdx b/src/content/post/web-design-style-guide-brutalism/index.mdx new file mode 100644 index 0000000..c8be60a --- /dev/null +++ b/src/content/post/web-design-style-guide-brutalism/index.mdx @@ -0,0 +1,114 @@ +--- +title: Web Design Style Guide - Brutalism +publishDate: 2025-06-13 +read: 8 +description: Web Design Style Guide - Brutalism +tags: + - Brutalism + - Web Design + - Design Style +img: "/assets/blog/cover-brutalism.jpg" +img_alt: "Brutalism" +--- + +## What is Brutalism in Web Design? + +> Brutalism US: ['bru:təlɪzəm] UK: ['bru:təlɪzəm] Brutalism; Raw style; Minimalist rugged style +> +> * Brutalism: A design style originating from the architectural field, emphasizing raw, rough, and anti-traditional aesthetics, focusing on functionality rather than decoration, often using bold typography, asymmetric layouts, and strong contrasting colors. + +The term "Brutalism" originates from the French term "béton brut," meaning "raw concrete." Initially, it was used to describe a rugged, exposed architectural style that emerged in the late 1940s and early 1950s. An architectural style that emerged in Britain in the 1950s, characterized by exposed concrete and stark geometric structures, spreading globally between the 1960s and 1970s. + +![](01.jpg "Tribunal de Contas / Aflalo y Gasperini +São Paulo, 1971") +*Tribunal de Contas / Aflalo y Gasperini São Paulo, 1971* + +Brutalism is a raw, minimalist design style that values function over form and aesthetics. It's often characterized by an extremely simple, almost minimalist approach to layout and UI design. It's a bold, counter-intuitive interpretation of raw, striking visual design — and difficult to define with a definition, because it's essentially designed to challenge definition. + +Like most emerging trends, Brutalism is a reaction to previous styles: a desire to discard earlier complex, ineffable ornate designs. + +![](02.jpg "Banco de Londres y Sudamérica / Clorindo Testa +Buenos Aires, 1966") +*Banco de Londres y Sudamérica / Clorindo Testa Buenos Aires, 1966* + +## Why Did Brutalism Rise in Web Design? + +Early web iterations all focused on raw functionality and content: crudely coded HTML websites and bold 90s design themes conceptually naturally resembled architecture's rugged, exposed structure defining characteristics. This itself was a practical issue. As times developed, web pages gradually became what we see today (the vast majority) — reasonably laid out, following user experience, emphasizing aesthetics and color theory, etc. Thought, culture, aesthetics, and needs are diverse, as are pursuits for web pages. Mainstream web pages pursue advanced beauty and perfect experience, which also provided soil for Brutalism's development. + +Some people believe that mainstream web pages' advanced aesthetics and experience create a beautiful illusion, making people subconsciously ignore potentially unethical and malicious real intentions hidden behind web pages. The popularity of Brutalist web design perhaps also reflects people's hope that the internet can be more transparent and direct. People hope that websites' underlying logic and real intentions can be as clear at a glance as Brutalist architecture displays its raw materials and social philosophy. + +## Characteristics of Brutalist Web Design + +### Unconventional Color Schemes + +Brutalism in the architectural field often uses large amounts of gray, black, brown and other cold-toned color schemes. Web Brutalism is different, using more glaring, conflicting color combinations for design, going against mainstream web aesthetics and color theory. + +"We don't need everything that meets our eyes to be perfect." + +![](kaskadproject.jpg "") +*https://kaskadproject.com/* + + + +### Non-Standard Navigation and Information Hierarchy Design + +Typically, UX/UI designers follow user experience principles and reasonable information hierarchy to reduce user cognitive load and improve website navigation convenience. Brutalism is the opposite, preferring to use non-standard navigation and rugged information display methods. + +![](namespace.jpg "") +*https://namespace.studio/* + + + +### Raw and Rough Design Philosophy + +From layout and typography to color matching, Brutalist websites intentionally create a raw and unpolished environment. This can find inspiration and origins from mid-20th century architecture. Due to era background and atmosphere influence, architecture emphasized raw, rough appearance, presenting concrete's real texture without excessive embellishment. + +Reminds people of the early internet's web page state without design layout and beautification, a design philosophy going against current mainstream web culture, abandoning beautification and decoration, displaying real and rough essence. + + ![](wiki.jpg "") +*https://en.wikipedia.org/wiki/Main_Page* + + + +### Repetitive, Unique Shapes and Patterns + +Brutalist style web design typically contains repetitive shapes or patterns, or unique two-dimensional, three-dimensional graphics, maintaining a unique visual experience. It often finds elements and inspiration from last century's Brutalist architecture, continuing and imitating Brutalist architecture's geometric characteristics philosophy. + +![](studio-job.jpg "") +*https://www.studio-job.com/* + +### Visual Impact and Oppression + +Brutalist period architecture's massive unadorned exposed concrete and stark geometric structures bring a raw beast-like sense of oppression. This visual experience also extends to Brutalist web design, and web applications are bolder and more free-spirited. Especially contrasted with mainstream culture pursuing delicate experience and beauty, Brutalist web pages appear more rebellious and alienated. + +![](src-plus.jpg "") +*https://src.plus/* + +### Brutalist Style Website Inspiration + +#### brutalistwebsites.com + +brutalistwebsites.com - this website's content is as direct as its name, collecting Brutalist style web pages. Content is just a brief introduction and cases. "In its ruggedness and disregard for appearing comfortable or easy, Brutalism can be seen as the younger generation's rebellion against today's web design's lightness, optimism and frivolity." + +![](brutalistwebsites.jpg "") +*https://brutalistwebsites.com/* + +#### awwwards-brutalism + +Awwwards is a well-known web design inspiration and award platform. The collection specifically gathers Brutalist style web design works for designers to gain inspiration. This collection is more excellent in design sense and interactive animation aspects. + + +![](awwwards.jpg "") +*https://awwwards.com/awwwards/collections/brutalism/* + + + +## Summary + +Brutalist web design doesn't mean abandoning design, but directly displaying the website's "skeleton" - like using the most basic typography, buttons and links, without excessive decoration. Doing this aims to let users see the website's structure and intent at a glance, reducing misleading and hiding, making everything "out in the open." Pulling attention back to content and functionality, making it easier for users to find information they need. + +Brutalism's "roughness" is actually an attitude, conveying the website's unique temperament and rebellious spirit. It challenges mainstream aesthetics, not afraid to "look imperfect," instead using this "primitive sense" to express authenticity and self. + +Design is a cycle. Brutalism from birth to today, like tides ebbing and flowing. Of course in each era it combines with that era's characteristics and cultural philosophy, blending out new design styles and thoughts. + +For example, Neo-Brutalism, Postmodern Brutalism, Industrial Brutalism, Cyber Brutalism, etc., are all products of era pursuits and retro trends merging. These styles originate from Brutalism's raw power and functional core, but through combination with other aesthetics or functional needs, formed diversified derivative schools. diff --git a/src/content/post/web-design-style-guide-brutalism/inspoweb.jpg b/src/content/post/web-design-style-guide-brutalism/inspoweb.jpg new file mode 100644 index 0000000..4d87097 Binary files /dev/null and b/src/content/post/web-design-style-guide-brutalism/inspoweb.jpg differ diff --git a/src/content/post/web-design-style-guide-brutalism/kaskadproject.jpg b/src/content/post/web-design-style-guide-brutalism/kaskadproject.jpg new file mode 100644 index 0000000..779ae12 Binary files /dev/null and b/src/content/post/web-design-style-guide-brutalism/kaskadproject.jpg differ diff --git a/src/content/post/web-design-style-guide-brutalism/namespace.jpg b/src/content/post/web-design-style-guide-brutalism/namespace.jpg new file mode 100644 index 0000000..cb5d406 Binary files /dev/null and b/src/content/post/web-design-style-guide-brutalism/namespace.jpg differ diff --git a/src/content/post/web-design-style-guide-brutalism/sisitema.jpg b/src/content/post/web-design-style-guide-brutalism/sisitema.jpg new file mode 100644 index 0000000..b8c811d Binary files /dev/null and b/src/content/post/web-design-style-guide-brutalism/sisitema.jpg differ diff --git a/src/content/post/web-design-style-guide-brutalism/src-plus.jpg b/src/content/post/web-design-style-guide-brutalism/src-plus.jpg new file mode 100644 index 0000000..995a33d Binary files /dev/null and b/src/content/post/web-design-style-guide-brutalism/src-plus.jpg differ diff --git a/src/content/post/web-design-style-guide-brutalism/studio-job.jpg b/src/content/post/web-design-style-guide-brutalism/studio-job.jpg new file mode 100644 index 0000000..24ab0cb Binary files /dev/null and b/src/content/post/web-design-style-guide-brutalism/studio-job.jpg differ diff --git a/src/content/post/web-design-style-guide-brutalism/wiki.jpg b/src/content/post/web-design-style-guide-brutalism/wiki.jpg new file mode 100644 index 0000000..361a490 Binary files /dev/null and b/src/content/post/web-design-style-guide-brutalism/wiki.jpg differ diff --git a/src/content/post/what-have-I-developed-as-a-designer/001-ricoog.jpg b/src/content/post/what-have-I-developed-as-a-designer/001-ricoog.jpg new file mode 100644 index 0000000..9a6c2a7 Binary files /dev/null and b/src/content/post/what-have-I-developed-as-a-designer/001-ricoog.jpg differ diff --git a/src/content/post/what-have-I-developed-as-a-designer/002-gradientshub.jpg b/src/content/post/what-have-I-developed-as-a-designer/002-gradientshub.jpg new file mode 100644 index 0000000..d8f38c4 Binary files /dev/null and b/src/content/post/what-have-I-developed-as-a-designer/002-gradientshub.jpg differ diff --git a/src/content/post/what-have-I-developed-as-a-designer/003-freegradient.jpg b/src/content/post/what-have-I-developed-as-a-designer/003-freegradient.jpg new file mode 100644 index 0000000..d0d59c9 Binary files /dev/null and b/src/content/post/what-have-I-developed-as-a-designer/003-freegradient.jpg differ diff --git a/src/content/post/what-have-I-developed-as-a-designer/004-text-generator.jpg b/src/content/post/what-have-I-developed-as-a-designer/004-text-generator.jpg new file mode 100644 index 0000000..0683b12 Binary files /dev/null and b/src/content/post/what-have-I-developed-as-a-designer/004-text-generator.jpg differ diff --git a/src/content/post/what-have-I-developed-as-a-designer/005-multi-color.jpg b/src/content/post/what-have-I-developed-as-a-designer/005-multi-color.jpg new file mode 100644 index 0000000..5aa7849 Binary files /dev/null and b/src/content/post/what-have-I-developed-as-a-designer/005-multi-color.jpg differ diff --git a/src/content/post/what-have-I-developed-as-a-designer/006-color-palette-generator.jpg b/src/content/post/what-have-I-developed-as-a-designer/006-color-palette-generator.jpg new file mode 100644 index 0000000..f4a503b Binary files /dev/null and b/src/content/post/what-have-I-developed-as-a-designer/006-color-palette-generator.jpg differ diff --git a/src/content/post/what-have-I-developed-as-a-designer/007-inspowebcom.jpg b/src/content/post/what-have-I-developed-as-a-designer/007-inspowebcom.jpg new file mode 100644 index 0000000..7c6d810 Binary files /dev/null and b/src/content/post/what-have-I-developed-as-a-designer/007-inspowebcom.jpg differ diff --git a/src/content/post/what-have-I-developed-as-a-designer/008-inspowebcom.jpg b/src/content/post/what-have-I-developed-as-a-designer/008-inspowebcom.jpg new file mode 100644 index 0000000..e3b0f6e Binary files /dev/null and b/src/content/post/what-have-I-developed-as-a-designer/008-inspowebcom.jpg differ diff --git a/src/content/post/what-have-I-developed-as-a-designer/009-uiuxdeck_com.jpg b/src/content/post/what-have-I-developed-as-a-designer/009-uiuxdeck_com.jpg new file mode 100644 index 0000000..0247209 Binary files /dev/null and b/src/content/post/what-have-I-developed-as-a-designer/009-uiuxdeck_com.jpg differ diff --git a/src/content/post/what-have-I-developed-as-a-designer/010-ricoui-com.jpg b/src/content/post/what-have-I-developed-as-a-designer/010-ricoui-com.jpg new file mode 100644 index 0000000..1e62e04 Binary files /dev/null and b/src/content/post/what-have-I-developed-as-a-designer/010-ricoui-com.jpg differ diff --git a/src/content/post/what-have-I-developed-as-a-designer/011-ricoui-com.jpg b/src/content/post/what-have-I-developed-as-a-designer/011-ricoui-com.jpg new file mode 100644 index 0000000..49dc79b Binary files /dev/null and b/src/content/post/what-have-I-developed-as-a-designer/011-ricoui-com.jpg differ diff --git a/src/content/post/what-have-I-developed-as-a-designer/012-todolist.jpg b/src/content/post/what-have-I-developed-as-a-designer/012-todolist.jpg new file mode 100644 index 0000000..f68be97 Binary files /dev/null and b/src/content/post/what-have-I-developed-as-a-designer/012-todolist.jpg differ diff --git a/src/content/post/what-have-I-developed-as-a-designer/013-valentine3d-figma.jpg b/src/content/post/what-have-I-developed-as-a-designer/013-valentine3d-figma.jpg new file mode 100644 index 0000000..533c209 Binary files /dev/null and b/src/content/post/what-have-I-developed-as-a-designer/013-valentine3d-figma.jpg differ diff --git a/src/content/post/what-have-I-developed-as-a-designer/014-valentine-landing.jpg b/src/content/post/what-have-I-developed-as-a-designer/014-valentine-landing.jpg new file mode 100644 index 0000000..6fe386d Binary files /dev/null and b/src/content/post/what-have-I-developed-as-a-designer/014-valentine-landing.jpg differ diff --git a/src/content/post/what-have-I-developed-as-a-designer/index.mdx b/src/content/post/what-have-I-developed-as-a-designer/index.mdx new file mode 100644 index 0000000..e50361d --- /dev/null +++ b/src/content/post/what-have-I-developed-as-a-designer/index.mdx @@ -0,0 +1,180 @@ +--- +title: What Have I Developed as a Designer +publishDate: 2025-08-12 +read: 12 +description: What have I developed as a designer? +tags: + - Front End + - Develop + - Vibe Coding + +img: "/assets/blog/cover-portfolio-site.jpg" +img_alt: "" +--- + +I'm Rico. I've previously posted articles on multiple platforms about designers learning frontend, but quite a few people actually have some confusion or doubts, or suspect intentional anxiety creation. But I've always felt that career choices should vary by person - some delve deep into design purity, some like cross-border exploration possibilities, there's no absolute right or wrong. Current industry trends are indeed moving from "strict division of labor" to "collaborative integration," design boundaries are becoming more flexible and diverse. + +As a relatively niche "cross-border explorer" among designers, having explored development for quite some time now, it's a good time for a stage summary. Sharing and reviewing some of my own non-commercial, non-collaborative personal projects as reference. These are basically built around my daily design needs and ideas. Some involving commercial types and collaborations won't be shown. + + +## 1. OG Inspiration Gallery - Rico OG + +OG Website: [og.ricoui.com](https://og.ricoui.com) + +This was recently developed on a whim when tired of writing, taking less than a week. It's an inspiration website focused on collecting OG (Open Graph) social sharing images. In one week I built a Beta version, half the time spent on visual specifications, basic function construction and technology stack selection. + +Functionally supports favorites, color mode switching and category filtering, also includes detail page display, recommendations, etc. The website also features dark mode, multi-language switching and site submission functions. Due to short development time, current volume isn't large. + +Future expansion features under consideration include search function, OG validation, expanding more types of inspiration libraries, OG editor, etc. + +![001-ricoog](001-ricoog.jpg) + + + +--- + +## 2. GradientsHub + +One-stop gradient solution: [gradientshub.com](https://gradientshub.com/) + +Gradientshub is a long-term project, currently updated irregularly. The goal is to create a one-stop tool site centered on gradient design. Current content includes original gradient backgrounds, AI-generated images, and text gradient, background gradient, gradient color card generation tool sets and teaching content, forming a complete gradient solution. Hope this website can assist designers and developers, solving problems that might be encountered in gradient design. + +![002-gradientshub.jpg](002-gradientshub.jpg) + +My original gradient backgrounds can be downloaded and used for free + +![](003-freegradient.jpg) + +Gradient generation tool - CSS text gradient generator + +![](004-text-generator.jpg) + +Gradient generation tool - CSS multi-color gradient generator + +![005-multi-color.jpg](005-multi-color.jpg) + +Gradient generation tool - Gradient color palette generation + +![006-color-palette-generator.jpg](006-color-palette-generator.jpg) + +Besides what's shown above, there are other gradient tools and resources to explore. A purely sincere work~~ + +--- + +## 3. Web Inspiration InspoWeb + +Website: [inspoweb.com](https://inspoweb.com) + +Inspoweb.com is my web inspiration solution, currently manually collecting over 200 creative web pages. As a web designer, my daily habit is collecting excellent web design cases and visuals. I've tried many solutions, finally using the Mkdirs template to create this website, converting my daily collection needs into website curation, solving cross-device and location bookmark sync problems. Also convenient for focused categorization. More surprisingly, external sharing brought much positive feedback, letting me make more friends. + +If your inspiration runs dry, might as well browse my collection here. + +![inspoweb](007-inspowebcom.jpg) + +When curating, I tagged with categories and labels, along with corresponding interface screenshots for easy viewing. + +![inspoweb2](008-inspowebcom.jpg) + +--- + +## 4. Design Resources UIUXDECK + +Website: [uiuxdeck.com](https://uiuxdeck.com/) + +UIUXDECK is a navigation website meeting my UI/UX design needs. I integrated interface inspiration, design specifications, practical tools and component libraries according to my own design needs and philosophy, even some development and marketing tools, hoping to help improve design professionalism and efficiency. + +Whether you're a design novice or seasoned practitioner, I believe the content here can bring some inspiration and convenience to your work. Content personally reviewed and curated by me, ensuring practicality and timeliness, also using mkdirs. + +![uiuxdeck.jpg](009-uiuxdeck_com.jpg) + +--- + +## 5. Designer Blog Ricoui + +Website: [ricoui.com](https://ricoui.com/) + +Open Source Star⭐ 198: [https://github.com/ricocc/public-portfolio-site](https://github.com/ricocc/public-portfolio-site) + +A designer's personal website/blog is also an essential project. This website uses my preferred technology stack and design style. Design uses Figma + Blender, development framework chose the more designer-friendly Astro.js. Website template open-sourced to Github, Star count about to break 200. + +Features include: homepage work filtering display, project display and inner pages, blog and article pages, personal page, dark mode, RSS, SEO optimization, etc. Supports markdown, also suitable for secondary development, built-in image compression function. + +Disadvantage is no visual backend, requires deployment, manual file changes and content collection updates, not friendly to users without coding foundation. + +![ricoui.com.jpg](010-ricoui-com.jpg) + +![ricoui.com.jpg](011-ricoui-com.jpg) + +--- + + + +## 6. Web-based Todo List + +Open Source Project Star⭐ 222: [GitHub - uiineed-todo-list](https://github.com/ricocc/uiineed-todo-list) + +Website: [https://todo.uiineed.com/](https://todo.uiineed.com/) + +This is a ready-to-use web-based TodoList, developed with Vue, simple and easy to use, can be downloaded for learning or custom development. Currently this simple single-page application is most popular. Since the starting point was not finding a "no-ads minimalist todo tool" meeting my needs, I just developed it myself. So requirements for it are basic, clean and simple, ready-to-use, minimalist visuals. + +Advantage is can be directly downloaded for local offline use; disadvantage is doesn't support automatic data sync across devices and browsers. + +![todolist](012-todolist.jpg) + +--- + +## 7. 3D Valentine's Day Icons and Landing Page + +Figma: [https://www.figma.com/community/file/1363451172790940214/free-3d-icons-valentines-day](https://www.figma.com/community/file/1363451172790940214/free-3d-icons-valentines-day) + +Landing Page: [valentine.uiuxdeck.com](https://valentine.uiuxdeck.com/) + +Landing Page Open Source: [GitHub - free-3d-valentines-assets](https://github.com/ricocc/free-3d-valentines-assets) + +This is an open-source Valentine's Day icon set. High-resolution image versions can be found in Figma community. I also made a landing page where you can download Blender source files. + +- ✨ Two color sets of Blender source files +- ✨ Figma community files +- ✨ PNG high-resolution images 3000x3000 + +![valentine3d-figma](013-valentine3d-figma.jpg) + +![valentine-landing.jpg](014-valentine-landing.jpg) + + + +## Finally + +The cases I've selected for display vary in type and difficulty: there's the complex comprehensive gradient site, application-oriented TodoList, navigation sites based on template secondary development, and single pages serving open source. Their purposes differ, development difficulty varies, but the ultimate starting point and goal are all to solve a specific need in my design work, replacing workflows I was originally unsatisfied with or found too complex. Even replacing originally paid applications. + +So back to the starting point - what can design exploring development do? I think it's an omnipotent plugin. Whether in workflow or personal needs, when you feel you need some solutions, programming knowledge can provide another perspective. Especially in the AI Coding era, we don't need to learn complete programming principles, syntax or computer fundamentals from start to finish. Just first understand development thinking logic and basic tools, then use AI to get projects running - subsequent breakthroughs are just around the corner. + +Essentially, development is like graphic design, 3D, video editing - just a skill. According to specific needs, learn what you need, use what you need, without much mystery. + +For AI Coding, designers also have advantages. Visual and aesthetic leadership goes without saying. Let's mention two abilities designers take for granted: product thinking and componentization thought. + +* Product Thinking + +AI Coding (or Vibe Coding) brings users closer to product manager roles. Before starting a project, we need to first discuss product positioning with AI, formulate complete architecture, have AI output a detailed product document, then code based on documentation. For AI Coding, clear detailed product documentation can double efficiency. Product thinking is already an important part of designers' capability map. When combined, they can form a mutually reinforcing effect. + +* Componentization Thought + +Componentization and Tokens are old friends for designers in work. For development, it can be simply summarized as "everything is a component." One of frontend's core ideas is componentization. Whether React, Vue, Angular frameworks, or native development, all emphasize splitting pages into independent, reusable components (like header components, list item components, popup components, etc.). All complex projects can be split into module components, each component responsible for specific functions. This not only reduces development difficulty, but also precisely locates problems when errors occur. Completing complete projects gradually from components is a very efficient path. Worth mentioning is that componentization thinking isn't possessed by every developer - it's actually an important capability, and designers are already familiar with this logic in daily work. + +Originally thought the previous "Frontend Self-Learning Suggestions" explained clearly enough, but still many designer friends raised questions, not knowing where to start, not knowing what to do, hence this supplement. From cases to supplementary explanations of viewpoints, these two pieces should answer most questions. + +If you don't know where to enter the development world, might as well reference my above cases: cut in from your daily needs, find a specific problem, try using programming thinking to find solutions - interest is the best start. When the first minimum viable project successfully runs, naturally entering acceleration period afterward. + +Currently I've entered the next stage of design and development, exploring more complete, more challenging projects, looking forward to producing better, more interesting works in the future. + + +Reintroducing myself - I'm Rico, web designer and interest-driven developer. Currently besides continuing to explore design and development, I'm also engaged in content creation, mainly focusing on design articles and AI Coding experience summaries. + +If you're interested in these little things I'm doing, welcome to communicate and be friends! diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..acef35f --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro new file mode 100644 index 0000000..2a19812 --- /dev/null +++ b/src/layouts/Layout.astro @@ -0,0 +1,57 @@ +--- +import Meta from './Meta.astro'; +import TopBg from "@/components/ui/TopBg.astro"; +import Footer from "@/components/sections/Footer.astro"; +import Header from "@/components/sections/Header.astro"; +import TrackGa from "@/components/widgets/TrackGa.astro"; +interface Props { + title?: string | undefined; + description?: string | undefined; + keywords?: string | undefined; +} + +const { + title, + description, + keywords +} = Astro.props; + + +import "../styles/global.css"; +import "aos/dist/aos.css"; +import "../styles/aos-custom.css"; +import '../styles/article.css'; +import '../styles/article-enhancements.css'; +--- + + + + + + + + + + + + + +
+ +