diff --git a/package.json b/package.json
index ca1c59e5806..bdd9d7a974d 100644
--- a/package.json
+++ b/package.json
@@ -105,7 +105,11 @@
}
],
"dependencies": {
- "esbuild-plugin-raw": "^0.1.8"
+ "@tailwindcss/typography": "^0.5.16",
+ "autoprefixer": "10.4.19",
+ "esbuild-plugin-raw": "^0.1.8",
+ "postcss": "8.4.39",
+ "tailwindcss": "4.0.12"
},
"devDependencies": {
"@builder.io/partytown": "0.10.2",
diff --git a/packages/docs/package.json b/packages/docs/package.json
index 333c5355e1e..5d2a390bf1f 100644
--- a/packages/docs/package.json
+++ b/packages/docs/package.json
@@ -21,7 +21,12 @@
"@mui/system": "5.16.4",
"@mui/x-data-grid": "6.20.4",
"@qwik-ui/headless": "0.5.0",
+ "@shikijs/colorized-brackets": "3.1.0",
+ "@shikijs/rehype": "3.1.0",
+ "@shikijs/transformers": "3.1.0",
+ "@shikijs/types": "3.1.0",
"@supabase/supabase-js": "2.44.4",
+ "@tailwindcss/vite": "4.0.12",
"@types/leaflet": "1.9.12",
"@types/prismjs": "1.26.4",
"@types/react": "18.3.3",
@@ -41,22 +46,17 @@
"qwik-image": "0.0.10",
"react": "18.3.1",
"react-dom": "18.3.1",
+ "shiki": "3.1.0",
"snarkdown": "2.0.0",
"tailwindcss": "4.0.12",
- "@tailwindcss/vite": "4.0.12",
"terser": "5.31.3",
"tsm": "2.3.0",
"typescript": "5.4.5",
"undici": "*",
"valibot": "0.33.3",
"vite": "5.3.5",
- "vite-tsconfig-paths": "4.3.2",
"vite-plugin-inspect": "0.8.5",
- "shiki": "3.1.0",
- "@shikijs/rehype": "3.1.0",
- "@shikijs/transformers": "3.1.0",
- "@shikijs/colorized-brackets": "3.1.0",
- "@shikijs/types": "3.1.0",
+ "vite-tsconfig-paths": "4.3.2",
"wrangler": "3.65.1"
},
"engines": {
diff --git a/packages/docs/src/routes/api/qwik/api.json b/packages/docs/src/routes/api/qwik/api.json
index c913d82b698..4ae3789799a 100644
--- a/packages/docs/src/routes/api/qwik/api.json
+++ b/packages/docs/src/routes/api/qwik/api.json
@@ -1774,7 +1774,7 @@
}
],
"kind": "Function",
- "content": "> This API is provided as an alpha preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.\n> \n\nInstall a service worker which will prefetch the bundles.\n\nThere can only be one service worker per page. Because there can be many separate Qwik Containers on the page each container needs to load its prefetch graph using `PrefetchGraph` component.\n\n\n```typescript\nPrefetchServiceWorker: (opts: {\n base?: string;\n scope?: string;\n path?: string;\n verbose?: boolean;\n fetchBundleGraph?: boolean;\n nonce?: string;\n}) => JSXNode<'script'>\n```\n\n\n
\n\nParameter\n\n\n | \n\nType\n\n\n | \n\nDescription\n\n\n |
\n\n\nopts\n\n\n | \n\n{ base?: string; scope?: string; path?: string; verbose?: boolean; fetchBundleGraph?: boolean; nonce?: string; }\n\n\n | \n\nOptions for the prefetch service worker.\n\n- `base` - Base URL for the service worker `import.meta.env.BASE_URL` or `/`. Default is `import.meta.env.BASE_URL` - `scope` - Base URL for when the service-worker will activate. Default is `/` - `path` - Path to the service worker. Default is `qwik-prefetch-service-worker.js` unless you pass a path that starts with a `/` then the base is ignored. Default is `qwik-prefetch-service-worker.js` - `verbose` - Verbose logging for the service worker installation. Default is `false` - `nonce` - Optional nonce value for security purposes, defaults to `undefined`.\n\n\n |
\n
\n**Returns:**\n\n[JSXNode](#jsxnode)<'script'>",
+ "content": "> This API is provided as an alpha preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.\n> \n\nInstall a service worker which will prefetch the bundles.\n\nThere can only be one service worker per page. Because there can be many separate Qwik Containers on the page each container needs to load its prefetch graph using `PrefetchGraph` component.\n\n\n```typescript\nPrefetchServiceWorker: (opts: {\n base?: string;\n scope?: string;\n path?: string;\n verbose?: boolean;\n fetchBundleGraph?: boolean;\n nonce?: string;\n}) => JSXNode<'script'>\n```\n\n\n\n\nParameter\n\n\n | \n\nType\n\n\n | \n\nDescription\n\n\n |
\n\n\nopts\n\n\n | \n\n{ base?: string; scope?: string; path?: string; verbose?: boolean; fetchBundleGraph?: boolean; nonce?: string; }\n\n\n | \n\nOptions for the prefetch service worker.\n\n- `base` - Base URL for the service worker `import.meta.env.BASE_URL` or `/`. Default is `import.meta.env.BASE_URL` - `scope` - Base URL for when the service-worker will activate. Default is `/` - `path` - Path to the service worker. Default is `qwik-prefetch-service-worker.js` unless you pass a path that starts with a `/` then the base is ignored. Default is `qwik-prefetch-service-worker.js` - `verbose` - Verbose logging for the service worker installation. Default is `false` - `nonce` - Optional nonce value for security purposes, defaults to `undefined`.\n\n\n |
\n
\n**Returns:**\n\nJSXNode<'script'>",
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/core/components/prefetch.ts",
"mdFile": "qwik.prefetchserviceworker.md"
},
diff --git a/packages/docs/src/routes/api/qwik/index.md b/packages/docs/src/routes/api/qwik/index.md
index 88380b14447..7e69070a23a 100644
--- a/packages/docs/src/routes/api/qwik/index.md
+++ b/packages/docs/src/routes/api/qwik/index.md
@@ -3657,7 +3657,7 @@ Options for the prefetch service worker.
**Returns:**
-[JSXNode](#jsxnode)<'script'>
+JSXNode<'script'>
[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/core/components/prefetch.ts)
diff --git a/packages/docs/src/routes/docs/deployments/self-hosting/index.mdx b/packages/docs/src/routes/docs/deployments/self-hosting/index.mdx
new file mode 100644
index 00000000000..623bd6e1492
--- /dev/null
+++ b/packages/docs/src/routes/docs/deployments/self-hosting/index.mdx
@@ -0,0 +1,536 @@
+---
+title: Self-Hosting
+contributors:
+ - adamdbradley
+ - manucorporat
+updated_at: '2024-03-24T19:30:00Z'
+created_at: '2024-03-24T19:30:00Z'
+---
+
+import PackageManagerTabs from '~/components/package-manager-tabs/index.tsx';
+
+# Self-Hosting Qwik Applications
+
+This guide provides comprehensive instructions for self-hosting your Qwik application on your own infrastructure, whether it's a VPS, bare metal server, or container platform.
+
+## Prerequisites
+
+- Node.js >= 16.8.0 (18.x LTS or later recommended)
+- A web server like Nginx, Apache, or similar for production deployments
+- (Optional) Docker for containerized deployments
+- (Optional) PM2 or similar for process management
+
+## Build Options
+
+Qwik provides several adapters suited for self-hosting scenarios. Choose the one that best fits your infrastructure:
+
+### Express (Node.js)
+
+The Express adapter is ideal for self-hosting on VPS or bare metal servers, offering full server-side functionality.
+
+
+
+```shell
+pnpm run qwik add express
+```
+
+
+```shell
+npm run qwik add express
+```
+
+
+```shell
+yarn run qwik add express
+```
+
+
+```shell
+bun run qwik add express
+```
+
+
+
+### Fastify (Node.js)
+
+Fastify offers better performance than Express and is another good option for self-hosting:
+
+
+
+```shell
+pnpm run qwik add fastify
+```
+
+
+```shell
+npm run qwik add fastify
+```
+
+
+```shell
+yarn run qwik add fastify
+```
+
+
+```shell
+bun run qwik add fastify
+```
+
+
+
+### Static Site
+
+For simple applications without dynamic server functionality, the static site adapter generates fully static HTML:
+
+
+
+```shell
+pnpm run qwik add static
+```
+
+
+```shell
+npm run qwik add static
+```
+
+
+```shell
+yarn run qwik add static
+```
+
+
+```shell
+bun run qwik add static
+```
+
+
+
+When using the static adapter, make sure to update your `adapters/static/vite.config.ts` file with your actual domain:
+
+```ts
+staticAdapter({
+ origin: 'https://your-actual-domain.com',
+})
+```
+
+## Building for Production
+
+After adding the appropriate adapter, build your application:
+
+
+
+```shell
+pnpm run build
+```
+
+
+```shell
+npm run build
+```
+
+
+```shell
+yarn run build
+```
+
+
+```shell
+bun run build
+```
+
+
+
+The build process will generate:
+- `dist/` directory containing client-side assets
+- `server/` directory containing server-side code (for Node.js adapters)
+
+## Deployment Methods
+
+### Method 1: Node.js Server Deployment
+
+For Express or Fastify adapters, the build process generates a server entry file at `server/entry.express.js` or `server/entry.fastify.js`.
+
+1. Transfer these files to your production server:
+ - `dist/` (client assets)
+ - `server/` (server code)
+ - `package.json` (for dependencies)
+
+2. Install production dependencies on the server:
+
+
+
+```shell
+pnpm install --prod
+```
+
+
+```shell
+npm install --omit=dev
+```
+
+
+```shell
+yarn install --production
+```
+
+
+```shell
+bun install --production
+```
+
+
+
+3. Set the required environment variables:
+
+```shell
+# Important: This is required for CSRF protection
+export ORIGIN=https://your-domain.com
+
+# Set production mode
+export NODE_ENV=production
+
+# Optional: Define a custom port (default is 3000)
+export PORT=3000
+```
+
+4. Run the server:
+
+```shell
+# For Express
+node server/entry.express.js
+
+# For Fastify
+node server/entry.fastify.js
+```
+
+5. For production use, use a process manager like PM2:
+
+```shell
+npm install -g pm2
+
+# For Express
+pm2 start server/entry.express.js --name qwik-app
+
+# For Fastify
+pm2 start server/entry.fastify.js --name qwik-app
+```
+
+### Method 2: Docker Deployment
+
+Using Docker is recommended for containerized deployments. Create a `Dockerfile` in your project root:
+
+```Dockerfile
+ARG NODE_VERSION=18.18.2
+
+################################################################################
+# Use node image for base image for all stages.
+FROM node:${NODE_VERSION}-alpine as base
+
+# Set working directory for all build stages.
+WORKDIR /usr/src/app
+
+################################################################################
+# Create a stage for installing production dependencies.
+FROM base as deps
+
+# Download dependencies as a separate step to take advantage of Docker's caching.
+# Leverage a cache mount to /root/.yarn to speed up subsequent builds.
+RUN --mount=type=bind,source=package.json,target=package.json \
+ --mount=type=bind,source=yarn.lock,target=yarn.lock \
+ --mount=type=cache,target=/root/.yarn \
+ yarn install --frozen-lockfile
+
+################################################################################
+# Create a stage for building the application.
+FROM deps as build
+
+# Copy the rest of the source files into the image.
+COPY . .
+
+# Run the build script.
+RUN yarn run build
+
+################################################################################
+# Create a new stage to run the application with minimal runtime dependencies
+FROM base as final
+
+# Use production node environment by default.
+ENV NODE_ENV production
+
+# IMPORTANT: Set your actual domain for CSRF protection
+ENV ORIGIN https://your-domain.com
+
+# Run the application as a non-root user.
+USER node
+
+# Copy package.json so that package manager commands can be used.
+COPY package.json .
+
+# Copy the production dependencies from the deps stage and also
+# the built application from the build stage into the image.
+COPY --from=deps /usr/src/app/node_modules ./node_modules
+COPY --from=build /usr/src/app/dist ./dist
+COPY --from=build /usr/src/app/server ./server
+
+# Expose the port that the application listens on.
+EXPOSE 3000
+
+# Run the application.
+CMD yarn serve
+```
+
+Build and run your Docker container:
+
+```shell
+# Build the image
+docker build -t qwik-app .
+
+# Run the container
+docker run -p 3000:3000 -e ORIGIN=https://your-domain.com qwik-app
+```
+
+### Method 3: Static Site Deployment
+
+If using the static adapter, copy the contents of the `dist` directory to your web server's document root:
+
+```shell
+# Example using rsync
+rsync -avz dist/ user@your-server:/path/to/webroot/
+```
+
+## Web Server Configuration
+
+### Nginx Configuration for Node.js Adapters
+
+For Node.js deployments using Express or Fastify, use Nginx as a reverse proxy:
+
+```nginx
+server {
+ listen 80;
+ server_name your-domain.com;
+
+ # Redirect HTTP to HTTPS
+ location / {
+ return 301 https://$host$request_uri;
+ }
+}
+
+server {
+ listen 443 ssl http2;
+ server_name your-domain.com;
+
+ # SSL configuration
+ ssl_certificate /path/to/cert.pem;
+ ssl_certificate_key /path/to/key.pem;
+
+ # SSL settings (recommended)
+ ssl_protocols TLSv1.2 TLSv1.3;
+ ssl_prefer_server_ciphers on;
+ ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
+ ssl_session_timeout 1d;
+ ssl_session_cache shared:SSL:10m;
+
+ # Proxy to Node.js server
+ location / {
+ proxy_pass http://localhost:3000;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection 'upgrade';
+ proxy_set_header Host $host;
+ proxy_cache_bypass $http_upgrade;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ }
+
+ # Serve static assets directly for better performance
+ location /build/ {
+ alias /path/to/your/app/dist/build/;
+ expires 1y;
+ add_header Cache-Control "public, max-age=31536000, immutable";
+ access_log off;
+ }
+
+ # Security headers
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ add_header X-XSS-Protection "1; mode=block" always;
+}
+```
+
+### Nginx Configuration for Static Sites
+
+For static site deployments, use this Nginx configuration:
+
+```nginx
+server {
+ listen 80;
+ server_name your-domain.com;
+
+ # Redirect HTTP to HTTPS
+ location / {
+ return 301 https://$host$request_uri;
+ }
+}
+
+server {
+ listen 443 ssl http2;
+ server_name your-domain.com;
+
+ # SSL configuration
+ ssl_certificate /path/to/cert.pem;
+ ssl_certificate_key /path/to/key.pem;
+
+ # SSL settings (recommended)
+ ssl_protocols TLSv1.2 TLSv1.3;
+ ssl_prefer_server_ciphers on;
+
+ # Root directory for your static files
+ root /path/to/your/app/dist;
+ index index.html;
+
+ # Serve static files
+ location / {
+ try_files $uri $uri/ /index.html;
+ }
+
+ # Cache settings for immutable assets
+ location /build/ {
+ expires 1y;
+ add_header Cache-Control "public, max-age=31536000, immutable";
+ access_log off;
+ }
+
+ # Security headers
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ add_header X-XSS-Protection "1; mode=block" always;
+}
+```
+
+### Apache Configuration
+
+For Apache with mod_proxy enabled:
+
+```apache
+
+ ServerName your-domain.com
+
+ # SSL Configuration
+ SSLEngine on
+ SSLCertificateFile /path/to/cert.pem
+ SSLCertificateKeyFile /path/to/key.pem
+
+ # Proxy to Node.js server (for Express/Fastify adapters)
+ ProxyPreserveHost On
+ ProxyPass / http://localhost:3000/
+ ProxyPassReverse / http://localhost:3000/
+
+ # Serve static assets directly
+
+ Options Indexes FollowSymLinks
+ AllowOverride All
+ Require all granted
+
+ # Cache settings
+
+ ExpiresActive On
+ ExpiresDefault "access plus 1 year"
+ Header append Cache-Control "public, immutable"
+
+
+
+ Alias /build/ /path/to/your/app/dist/build/
+
+ # Security headers
+ Header always set X-Content-Type-Options "nosniff"
+ Header always set X-Frame-Options "SAMEORIGIN"
+ Header always set X-XSS-Protection "1; mode=block"
+
+```
+
+## Important Security Considerations
+
+### CSRF Protection
+
+Qwik City applications are protected against CSRF attacks by default for all POST, PATCH, and DELETE form submissions. The `ORIGIN` environment variable is crucial for this protection.
+
+If you need to disable CSRF protection (not recommended for production), you can set `checkOrigin: false` in the adapter configuration:
+
+```tsx
+// src/entry.express.tsx or src/entry.fastify.tsx
+const { router, notFound } = createQwikCity({
+ render,
+ qwikCityPlan,
+ manifest,
+ checkOrigin: false, // Disable CSRF protection (not recommended)
+});
+```
+
+### Other Security Best Practices
+
+1. Always run your Node.js application as a non-root user
+2. Set up proper firewall rules to only expose necessary ports
+3. Use HTTPS with proper certificates (Let's Encrypt works well)
+4. Implement rate limiting for API endpoints
+5. Keep all dependencies updated regularly
+6. Configure Content-Security-Policy headers appropriate for your application
+7. Consider using a Web Application Firewall (WAF) for additional protection
+
+## Monitoring and Logs
+
+1. If using PM2:
+ - Monitor application: `pm2 monit`
+ - Check logs: `pm2 logs qwik-app`
+ - Set up PM2 dashboard: `pm2 plus`
+
+2. Logging options:
+ - Configure Nginx logs in `/var/log/nginx/`
+ - Use logging services like Winston or Pino for structured logs
+
+3. Consider adding application monitoring with:
+ - Prometheus + Grafana for self-hosted monitoring
+ - New Relic, Datadog, or Sentry for managed monitoring
+
+## Optimizing Performance
+
+Qwik's resumable architecture already provides excellent performance, but you can further optimize:
+
+1. Enable HTTP/2 or HTTP/3 in your web server
+2. Use a CDN for global edge caching
+3. Enable Brotli compression for smaller payload sizes
+4. Configure proper cache headers for Qwik's immutable assets
+5. Use CloudFlare or similar services for additional edge caching
+
+## Scaling Considerations
+
+For high-traffic applications:
+
+1. Set up load balancing with multiple Node.js instances
+2. Use container orchestration (Kubernetes, Docker Swarm)
+3. Consider a microservices architecture for larger applications
+4. Implement Redis or similar for session management across instances
+5. Use a serverless approach for predictable scaling
+
+## Troubleshooting Common Issues
+
+1. **404 Not Found**:
+ - Check your Nginx/Apache configuration paths
+ - Verify that URL rewriting is properly configured
+
+2. **503 Service Unavailable**:
+ - Verify the Node process is running (`pm2 list` or `ps aux | grep node`)
+ - Check server logs for memory issues or crashes
+
+3. **CSRF Errors**:
+ - Ensure the `ORIGIN` environment variable is correctly set
+ - Check that form submissions include the correct CSRF token
+
+4. **Performance Issues**:
+ - Enable compression in your web server
+ - Check for memory leaks using Node.js profiling
+ - Verify that static assets are served with proper cache headers
+
+5. **Missing Assets**:
+ - Ensure your build process is complete
+ - Check that the `/build/` directory is correctly exposed
\ No newline at end of file
diff --git a/packages/docs/src/routes/docs/menu.md b/packages/docs/src/routes/docs/menu.md
index 2a348b970d3..44393929e1a 100644
--- a/packages/docs/src/routes/docs/menu.md
+++ b/packages/docs/src/routes/docs/menu.md
@@ -98,6 +98,7 @@
- [Bun](deployments/bun/index.mdx)
- [Netlify Edge](deployments/netlify-edge/index.mdx)
- [Node](deployments/node/index.mdx)
+- [Self-Hosting](deployments/self-hosting/index.mdx)
- [Vercel Edge](deployments/vercel-edge/index.mdx)
- [Static Site](deployments/static/index.mdx)
diff --git a/packages/insights/package.json b/packages/insights/package.json
index f8361cf6b61..bf2be29bec2 100644
--- a/packages/insights/package.json
+++ b/packages/insights/package.json
@@ -12,13 +12,13 @@
"drizzle-kit": "^0.28.1",
"drizzle-orm": "0.36.4"
},
- "type": "module",
"devDependencies": {
"@builder.io/qwik": "workspace:^",
"@builder.io/qwik-city": "workspace:^",
"@builder.io/qwik-labs": "workspace:^",
"@builder.io/vite-plugin-macro": "0.0.7",
"@netlify/edge-functions": "2.10.0",
+ "@tailwindcss/vite": "4.0.12",
"@types/density-clustering": "1.3.3",
"@types/eslint": "8.56.10",
"@types/node": "20.14.11",
@@ -33,7 +33,6 @@
"prettier": "3.3.3",
"prettier-plugin-tailwindcss": "0.5.14",
"tailwindcss": "4.0.12",
- "@tailwindcss/vite": "4.0.12",
"typescript": "5.4.5",
"undici": "*",
"vite": "5.3.5",
@@ -70,5 +69,6 @@
"test.cluster": "tsx src/cluster.ts",
"test.unit": "vitest",
"test.watch": "vitest --watch"
- }
+ },
+ "type": "module"
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 230eb402278..ec552d8b46e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -18,9 +18,21 @@ importers:
.:
dependencies:
+ '@tailwindcss/typography':
+ specifier: ^0.5.16
+ version: 0.5.16(tailwindcss@4.0.12)
+ autoprefixer:
+ specifier: 10.4.19
+ version: 10.4.19(postcss@8.4.39)
esbuild-plugin-raw:
specifier: ^0.1.8
version: 0.1.8(esbuild@0.20.2)
+ postcss:
+ specifier: 8.4.39
+ version: 8.4.39
+ tailwindcss:
+ specifier: 4.0.12
+ version: 4.0.12
devDependencies:
'@builder.io/partytown':
specifier: 0.10.2
@@ -3422,6 +3434,11 @@ packages:
resolution: {integrity: sha512-DWb+myvJB9xJwelwT9GHaMc1qJj6MDXRDR0CS+T8IdkejAtu8ctJAgV4r1drQJLPeS7mNwq2UHW2GWrudTf63A==}
engines: {node: '>= 10'}
+ '@tailwindcss/typography@0.5.16':
+ resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1'
+
'@tailwindcss/vite@4.0.12':
resolution: {integrity: sha512-JM3gp601UJiryIZ9R2bSqalzcOy15RCybQ1Q+BJqDEwVyo4LkWKeqQAcrpHapWXY31OJFTuOUVBFDWMhzHm2Bg==}
peerDependencies:
@@ -4723,6 +4740,11 @@ packages:
resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
engines: {node: '>= 6'}
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
cssfilter@0.0.10:
resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==}
@@ -6839,6 +6861,7 @@ packages:
libsql@0.4.7:
resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==}
+ cpu: [x64, arm64, wasm32]
os: [darwin, linux, win32]
light-my-request@5.11.1:
@@ -6960,6 +6983,9 @@ packages:
lodash-es@4.17.21:
resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+ lodash.castarray@4.4.0:
+ resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
+
lodash.defaults@4.2.0:
resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
@@ -8057,6 +8083,10 @@ packages:
resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
engines: {node: '>= 0.4'}
+ postcss-selector-parser@6.0.10:
+ resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
+ engines: {node: '>=4'}
+
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
@@ -12478,6 +12508,14 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.0.12
'@tailwindcss/oxide-win32-x64-msvc': 4.0.12
+ '@tailwindcss/typography@0.5.16(tailwindcss@4.0.12)':
+ dependencies:
+ lodash.castarray: 4.4.0
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ postcss-selector-parser: 6.0.10
+ tailwindcss: 4.0.12
+
'@tailwindcss/vite@4.0.12(vite@5.3.5(@types/node@20.14.11)(lightningcss@1.29.1)(terser@5.31.3))':
dependencies:
'@tailwindcss/node': 4.0.12
@@ -14003,6 +14041,8 @@ snapshots:
css-what@6.1.0: {}
+ cssesc@3.0.0: {}
+
cssfilter@0.0.10: {}
csso@5.0.5:
@@ -16568,6 +16608,8 @@ snapshots:
lodash-es@4.17.21: {}
+ lodash.castarray@4.4.0: {}
+
lodash.defaults@4.2.0: {}
lodash.get@4.4.2: {}
@@ -18095,6 +18137,11 @@ snapshots:
possible-typed-array-names@1.0.0: {}
+ postcss-selector-parser@6.0.10:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
postcss-value-parser@4.2.0: {}
postcss-values-parser@6.0.2(postcss@8.4.39):