Merge pull request 'app/landing' (#6) from app/landing into main

Reviewed-on: eigen/fe-monorepo-template#6
This commit is contained in:
2026-04-06 05:29:49 +00:00
23 changed files with 361 additions and 61 deletions
+46 -21
View File
@@ -1,39 +1,64 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the // For format details, see https://aka.ms/devcontainer.json
// README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node // This container standardizes the local development environment for the Monorepo.
{ {
"name": "Node.js & TypeScript", "name": "FE Monorepo Template",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
// Base image providing Node.js v24, TypeScript, and a Debian Bookworm environment.
"image": "mcr.microsoft.com/devcontainers/typescript-node:24-bookworm", "image": "mcr.microsoft.com/devcontainers/typescript-node:24-bookworm",
// Features to add to the dev container. More info: https://containers.dev/features.
// DevContainer Features: Pre-installed tools needed for our workflow.
"features": { "features": {
"ghcr.io/devcontainers/features/git:1": {}, "ghcr.io/devcontainers/features/git:1": {},
"ghcr.io/devcontainers-extra/features/pnpm:2": {}, "ghcr.io/devcontainers-extra/features/pnpm:2": {},
"ghcr.io/devcontainers/features/sshd:1": {} "ghcr.io/devcontainers/features/sshd:1": {}
}, },
// Use 'forwardPorts' to make a list of ports inside the container available locally.
"forwardPorts": [6006, 5173, 5174, 5175], // ─── Port Topology ──────────────────────────────────────────────────────────
// 6006: Storybook (Docs)
// 5173: Web App (Must be strictly 5173 for Electron IPC compatibility)
// 3000: Landing App (Isolated from Vite's default 517x blast radius)
"forwardPorts": [6006, 5173, 3000],
"portsAttributes": { "portsAttributes": {
"6006": { "6006": {
"label": "Storybook", "label": "Storybook",
"onAutoForward": "notify" "onAutoForward": "notify"
}, },
"5173": { "5173": {
"label": "Vites Application 1", "label": "Web App (Electron Target)",
"onAutoForward": "notify" "onAutoForward": "notify"
}, },
"5174": { "3000": {
"label": "Vites Application 2", "label": "Landing App (Public)",
"onAutoForward": "notify"
},
"5175": {
"label": "Vites Application 3",
"onAutoForward": "notify" "onAutoForward": "notify"
} }
} },
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "yarn install", // ─── Lifecycle Hooks ────────────────────────────────────────────────────────
// Configure tool-specific properties. // Automatically install all workspace dependencies once the container is built.
// "customizations": {}, "postCreateCommand": "pnpm install",
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root" // ─── Editor Standardization ─────────────────────────────────────────────────
// Enforces code style and tooling across all developers' machines.
"customizations": {
"vscode": {
"settings": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"extensions": [
"dbaeumer.vscode-eslint", // Linting
"esbenp.prettier-vscode", // Formatting
"bradlc.vscode-tailwindcss", // Tailwind v4 IntelliSense
"yoavbls.pretty-ts-errors", // Human-readable TypeScript errors
"editorconfig.editorconfig" // Standardized indentation
]
}
},
// ─── Security & Permissions ─────────────────────────────────────────────────
// CRITICAL: Run the container as 'node' instead of 'root'.
// This prevents 'Permission Denied' errors on the host OS when trying to
// delete or modify the 'node_modules' folder created inside the container.
"remoteUser": "node"
} }
+28 -5
View File
@@ -1,20 +1,43 @@
# OS & Editor
.DS_Store .DS_Store
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
# Dependencies
node_modules node_modules
.pnpm-store
# Turborepo & Cache
.turbo .turbo
.cache
# Environment Variables (Security)
.env
.env.local
.env.*.local
*.local
# Logs
*.log *.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Standard Web Build Outputs
dist dist
dist-ssr dist-ssr
*.local
.env
.cache
server/dist server/dist
public/dist public/dist
# storybook # Storybook Build Outputs
*storybook.log *storybook.log
storybook-static storybook-static
# Electron # Electron Build Outputs
out/ out/
release/ release/
web-dist/ web-dist/
+33 -10
View File
@@ -28,6 +28,7 @@ The monorepo is organized into **Apps** (deployable applications) and **Packages
. .
├── apps/ ├── apps/
│ ├── web/ # Main React Application (Vite + TypeScript) │ ├── web/ # Main React Application (Vite + TypeScript)
│ ├── landing/ # Public Promotional SPA (Vite + TypeScript)
│ ├── desktop/ # Electron Desktop Wrapper (electron-vite) │ ├── desktop/ # Electron Desktop Wrapper (electron-vite)
│ └── docs-dev/ # Component Documentation & Playground (Storybook) │ └── docs-dev/ # Component Documentation & Playground (Storybook)
@@ -71,12 +72,16 @@ This repository uses **Turborepo** to orchestrate tasks efficiently. All command
### Development ### Development
| Command | Description | | Command | Description |
| -------------------- | --------------------------------------------------------------------------- | | -------------------- | ---------------------------------------------------------------------------------- |
| `pnpm dev` | Start **all applications** (`web` and `docs-dev`) in parallel | | `pnpm dev` | Start **all applications** (`web` and `docs-dev`) in parallel |
| `pnpm dev:web` | Start only the **Main Web App** (usually at `http://localhost:5173`) | | `pnpm dev:web` | Start only the **Main Web App** (strictly at `http://localhost:5173`) |
| `pnpm dev:docs-dev` | Start **Storybook** for UI development (usually at `http://localhost:6006`) | | `pnpm dev:landing` | Start the **Public Landing App** (strictly at `http://localhost:3000`) |
| `pnpm dev:desktop` | Start the **Web App + Electron** in parallel for desktop development | | `pnpm dev:docs-dev` | Start **Storybook** for UI development (strictly at `http://localhost:6006`) |
| `pnpm dev:desktop` | Start the **Web App + Electron** in parallel for desktop development |
> [!NOTE]
> **Port Topology**: `electron-vite` dynamically allocates a background port (usually `5174`) for its internal renderer shell during `pnpm dev:desktop`. We strictly isolate `web` (`5173`) and `landing` (`3000`) onto separate port ranges to prevent race conditions during parallel execution.
### Building & Quality ### Building & Quality
@@ -84,6 +89,7 @@ This repository uses **Turborepo** to orchestrate tasks efficiently. All command
| --------------------- | ------------------------------------------------------- | | --------------------- | ------------------------------------------------------- |
| `pnpm build` | Build all apps and packages using Turbo cache | | `pnpm build` | Build all apps and packages using Turbo cache |
| `pnpm build:web` | Build only the web application | | `pnpm build:web` | Build only the web application |
| `pnpm build:landing` | Build only the landing page |
| `pnpm build:docs-dev` | Build only the docs-dev application | | `pnpm build:docs-dev` | Build only the docs-dev application |
| `pnpm build:desktop` | Build the web app, then compile the Electron app | | `pnpm build:desktop` | Build the web app, then compile the Electron app |
| `pnpm test` | Run unit tests (Vitest) across all packages | | `pnpm test` | Run unit tests (Vitest) across all packages |
@@ -172,7 +178,24 @@ The **Electron desktop wrapper** that embeds `apps/web` for native desktop exper
--- ---
### 3. `apps/docs-dev` (Storybook) ### 3. `apps/landing`
The **public promotional website** — a standalone SPA for the company profile and marketing pages.
* Deployed independently to the web (e.g., Vercel) — no interaction with Electron
* Consumes shared UI components from `@repo/ui` and utilities from `@repo/utils`
* Locked to port **3000** (`strictPort: true`) — evacuated from the `517x` range to avoid `electron-vite` port collisions
**Tech Stack**:
* React
* Vite
* TypeScript
* Tailwind CSS v4
---
### 4. `apps/docs-dev` (Storybook)
An isolated environment for developing and documenting UI components. An isolated environment for developing and documenting UI components.
@@ -181,7 +204,7 @@ An isolated environment for developing and documenting UI components.
--- ---
### 4. `packages/utils` ### 5. `packages/utils`
Shared business logic and reusable utility modules that can be consumed across multiple applications. Fully tested using Vitest. Shared business logic and reusable utility modules that can be consumed across multiple applications. Fully tested using Vitest.
@@ -189,7 +212,7 @@ This package is intended to hold non-UI, cross-cutting logic such as date/time h
--- ---
### 5. `packages/ui` ### 6. `packages/ui`
Shared UI component library (Buttons, Inputs, Cards, Layouts). Shared UI component library (Buttons, Inputs, Cards, Layouts).
@@ -198,7 +221,7 @@ Shared UI component library (Buttons, Inputs, Cards, Layouts).
--- ---
### 6. `packages/configs` ### 7. `packages/configs`
Single source of truth for tooling configuration. Single source of truth for tooling configuration.
+2 -1
View File
@@ -11,7 +11,8 @@
"package": "pnpm run build && electron-builder --config electron-builder.yml", "package": "pnpm run build && electron-builder --config electron-builder.yml",
"package:win": "pnpm run build && electron-builder --win --config electron-builder.yml", "package:win": "pnpm run build && electron-builder --win --config electron-builder.yml",
"package:mac": "pnpm run build && electron-builder --mac --config electron-builder.yml", "package:mac": "pnpm run build && electron-builder --mac --config electron-builder.yml",
"package:linux": "pnpm run build && electron-builder --linux --config electron-builder.yml" "package:linux": "pnpm run build && electron-builder --linux --config electron-builder.yml",
"typecheck": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"electron-updater": "^6.3.9" "electron-updater": "^6.3.9"
+1
View File
@@ -0,0 +1 @@
{"program":{"fileNames":[],"fileInfos":[],"root":[],"options":{"composite":true}},"version":"5.5.4"}
+5
View File
@@ -0,0 +1,5 @@
/** @type {import("eslint").Linter.Config} */
module.exports = {
root: true,
extends: ['@repo/eslint-config/react.js'],
};
+14
View File
@@ -0,0 +1,14 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Eigen — Company Profile</title>
<meta name="description" content="Eigen — Enterprise-grade solutions for modern businesses. Discover our products, services, and vision." />
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
+31
View File
@@ -0,0 +1,31 @@
{
"name": "landing",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite --clearScreen false",
"build": "tsc && vite build",
"preview": "vite preview",
"lint": "eslint \"src/**/*.ts\"",
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@repo/ui": "workspace:*",
"@repo/utils": "workspace:*",
"@tailwindcss/vite": "^4.1.18",
"react": "^19.2.3",
"react-dom": "^19.2.3",
"tailwindcss": "^4.1.18"
},
"devDependencies": {
"@repo/eslint-config": "workspace:*",
"@repo/typescript-config": "workspace:*",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^5.1.2",
"eslint": "^8.57.1",
"typescript": "5.5.4",
"vite": "^5.1.4"
}
}
+37
View File
@@ -0,0 +1,37 @@
import { ThemeProvider } from '@repo/ui/provider';
import { Button } from '@repo/ui/components';
export default function App() {
return (
<ThemeProvider>
<div className="flex min-h-screen flex-col items-center justify-center bg-gradient-to-br from-gray-950 via-gray-900 to-gray-800 text-white">
<div className="mx-auto max-w-3xl px-6 text-center">
<h1 className="text-5xl font-bold tracking-tight sm:text-6xl">
Hello from{' '}
<span className="bg-gradient-to-r from-blue-400 to-violet-400 bg-clip-text text-transparent">
Landing Page
</span>
</h1>
<p className="mt-6 text-lg leading-8 text-gray-300">
Enterprise-grade solutions for modern businesses.
This page is served from{' '}
<code className="rounded bg-gray-700/50 px-2 py-0.5 text-sm font-mono text-blue-300">
apps/landing
</code>{' '}
on port <strong>5174</strong>.
</p>
<div className="mt-10 flex items-center justify-center gap-4">
<Button>Get Started</Button>
<Button variant="outline">Learn More</Button>
</div>
<p className="mt-12 text-xs text-gray-500">
@repo/ui workspace link verified Button component rendered successfully.
</p>
</div>
</div>
</ThemeProvider>
);
}
+3
View File
@@ -0,0 +1,3 @@
@import 'tailwindcss';
@import '@repo/ui/theme.css';
@source "../../../packages/ui/src";
+10
View File
@@ -0,0 +1,10 @@
import './main.css';
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import App from './app';
createRoot(document.getElementById('app')!).render(
<StrictMode>
<App />
</StrictMode>,
);
+7
View File
@@ -0,0 +1,7 @@
{
"extends": "@repo/typescript-config/react-app.json",
"include": ["src"],
"compilerOptions": {
"jsx": "react-jsx"
}
}
+11
View File
@@ -0,0 +1,11 @@
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import tailwindcss from '@tailwindcss/vite';
export default defineConfig({
plugins: [react(), tailwindcss()],
server: {
port: 3000,
strictPort: true, // Evacuated from 517x range to avoid electron-vite port collision.
},
});
+2 -1
View File
@@ -9,7 +9,8 @@
"preview": "vite preview", "preview": "vite preview",
"lint": "eslint \"src/**/*.ts\"", "lint": "eslint \"src/**/*.ts\"",
"test": "vitest run", "test": "vitest run",
"test:watch": "vitest --watch" "test:watch": "vitest --watch",
"typecheck": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"@repo/ui": "workspace:*", "@repo/ui": "workspace:*",
+2 -1
View File
@@ -1,4 +1,5 @@
import { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { useIsElectron } from './use-is-electron';
// ─── Types ────────────────────────────────────────────────────── // ─── Types ──────────────────────────────────────────────────────
@@ -50,7 +51,7 @@ export function useElectronPrinter(): UseElectronPrinterReturn {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null); const [error, setError] = useState<string | null>(null);
const isElectron = typeof window !== 'undefined' && !!window.electronAPI; const isElectron = useIsElectron();
const refreshPrinters = useCallback(async (): Promise<ElectronPrinterInfo[]> => { const refreshPrinters = useCallback(async (): Promise<ElectronPrinterInfo[]> => {
if (!window.electronAPI) { if (!window.electronAPI) {
+2 -1
View File
@@ -1,4 +1,5 @@
import { useState, useEffect, useCallback } from 'react'; import { useState, useEffect, useCallback } from 'react';
import { useIsElectron } from './use-is-electron';
// ─── Types ────────────────────────────────────────────────────── // ─── Types ──────────────────────────────────────────────────────
@@ -64,7 +65,7 @@ export function useElectronUpdater(): UseElectronUpdaterReturn {
const [updateInfo, setUpdateInfo] = useState<ElectronUpdateInfo | null>(null); const [updateInfo, setUpdateInfo] = useState<ElectronUpdateInfo | null>(null);
const [errorMessage, setErrorMessage] = useState<string | null>(null); const [errorMessage, setErrorMessage] = useState<string | null>(null);
const isElectron = typeof window !== 'undefined' && !!window.electronAPI; const isElectron = useIsElectron();
useEffect(() => { useEffect(() => {
if (!window.electronAPI) return; if (!window.electronAPI) return;
+7
View File
@@ -0,0 +1,7 @@
/**
* A utility hook to determine if the React application is running
* inside the Electron desktop wrapper or a standard web browser.
*/
export function useIsElectron(): boolean {
return typeof window !== 'undefined' && !!window.electronAPI;
}
+4
View File
@@ -4,4 +4,8 @@ import tailwindcss from '@tailwindcss/vite';
export default defineConfig({ export default defineConfig({
plugins: [react(), tailwindcss()], plugins: [react(), tailwindcss()],
server: {
port: 5173,
strictPort: true, // Fail if 5173 is in use. Electron NEEDS this exact port.
},
}); });
+15 -6
View File
@@ -5,19 +5,28 @@
"scripts": { "scripts": {
"build": "turbo run build", "build": "turbo run build",
"build:web": "turbo run build --filter=web", "build:web": "turbo run build --filter=web",
"build:landing": "turbo run build --filter=landing",
"build:docs-dev": "turbo run build --filter=docs-dev", "build:docs-dev": "turbo run build --filter=docs-dev",
"build:desktop": "turbo run build --filter=web && turbo run build --filter=desktop", "build:desktop": "turbo run build --filter=desktop",
"dev": "turbo run dev", "dev": "turbo run dev",
"dev:web": "turbo run dev --filter=web", "dev:web": "turbo run dev --filter=web",
"dev:landing": "turbo run dev --filter=landing",
"dev:docs-dev": "turbo run dev --filter=docs-dev", "dev:docs-dev": "turbo run dev --filter=docs-dev",
"dev:desktop": "turbo run dev --filter=web --filter=desktop --parallel", "dev:desktop": "turbo run dev --filter=web --filter=desktop --parallel",
"package:desktop": "pnpm run build:desktop && cd apps/desktop && pnpm run package", "package:desktop": "pnpm run build:desktop && pnpm --filter desktop run package",
"package:mac": "pnpm run build:desktop && cd apps/desktop && pnpm run package:mac", "package:mac": "pnpm run build:desktop && pnpm --filter desktop run package:mac",
"package:win": "pnpm run build:desktop && cd apps/desktop && pnpm run package:win", "package:win": "pnpm run build:desktop && pnpm --filter desktop run package:win",
"package:linux": "pnpm run build:desktop && cd apps/desktop && pnpm run package:linux", "package:linux": "pnpm run build:desktop && pnpm --filter desktop run package:linux",
"lint": "turbo run lint", "lint": "turbo run lint",
"format": "prettier --write \"**/*.{ts,tsx,md}\"", "format": "prettier --write \"**/*.{ts,tsx,md}\"",
"test": "turbo run test" "test": "turbo run test",
"typecheck": "turbo run typecheck",
"typecheck:web": "turbo run typecheck --filter=web",
"typecheck:landing": "turbo run typecheck --filter=landing",
"typecheck:desktop": "turbo run typecheck --filter=desktop",
"check:all": "turbo run lint typecheck test",
"clean:workspaces": "rm -rf node_modules **/*/node_modules .turbo **/*/.turbo dist **/*/dist out **/*/out web-dist **/*/web-dist release **/*/release",
"nuke": "pnpm run clean:workspaces && pnpm install && pnpm build"
}, },
"devDependencies": { "devDependencies": {
"prettier": "^3.2.5", "prettier": "^3.2.5",
+2 -1
View File
@@ -8,7 +8,8 @@
"scripts": { "scripts": {
"lint": "eslint \"**/*.ts\"", "lint": "eslint \"**/*.ts\"",
"test": "vitest run", "test": "vitest run",
"test:watch": "vitest --watch" "test:watch": "vitest --watch",
"typecheck": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"crypto-js": "^4.2.0", "crypto-js": "^4.2.0",
@@ -84,7 +84,8 @@ describe('EncryptionUtils', () => {
it('should return an empty string if input is malformed (Graceful Fail)', () => { it('should return an empty string if input is malformed (Graceful Fail)', () => {
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); // const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
vi.spyOn(console, 'error').mockImplementation(() => {});
const malformedData = 'invalid-base64-string-@@@'; const malformedData = 'invalid-base64-string-@@@';
const result = service.decrypt(malformedData); const result = service.decrypt(malformedData);
+94 -10
View File
@@ -96,7 +96,53 @@ importers:
version: 5.5.4 version: 5.5.4
vite: vite:
specifier: ^5.1.4 specifier: ^5.1.4
version: 5.4.17(@types/node@22.19.3) version: 5.4.17
apps/landing:
dependencies:
'@repo/ui':
specifier: workspace:*
version: link:../../packages/ui
'@repo/utils':
specifier: workspace:*
version: link:../../packages/utils
'@tailwindcss/vite':
specifier: ^4.1.18
version: 4.1.18(vite@5.4.17)
react:
specifier: ^19.2.3
version: 19.2.3
react-dom:
specifier: ^19.2.3
version: 19.2.3(react@19.2.3)
tailwindcss:
specifier: ^4.1.18
version: 4.1.18
devDependencies:
'@repo/eslint-config':
specifier: workspace:*
version: link:../../packages/configs/eslint
'@repo/typescript-config':
specifier: workspace:*
version: link:../../packages/configs/typescript
'@types/react':
specifier: ^19.2.7
version: 19.2.7
'@types/react-dom':
specifier: ^19.2.3
version: 19.2.3(@types/react@19.2.7)
'@vitejs/plugin-react':
specifier: ^5.1.2
version: 5.1.2(vite@5.4.17)
eslint:
specifier: ^8.57.1
version: 8.57.1
typescript:
specifier: 5.5.4
version: 5.5.4
vite:
specifier: ^5.1.4
version: 5.4.17
apps/web: apps/web:
dependencies: dependencies:
@@ -148,7 +194,7 @@ importers:
version: 5.5.4 version: 5.5.4
vite: vite:
specifier: ^5.1.4 specifier: ^5.1.4
version: 5.4.17(@types/node@22.19.3) version: 5.4.17
vitest: vitest:
specifier: ^4.0.17 specifier: ^4.0.17
version: 4.0.17 version: 4.0.17
@@ -246,7 +292,7 @@ importers:
version: 5.5.4 version: 5.5.4
vite: vite:
specifier: ^5.1.4 specifier: ^5.1.4
version: 5.4.17(@types/node@22.19.3) version: 5.4.17
vitest: vitest:
specifier: ^4.0.17 specifier: ^4.0.17
version: 4.0.17 version: 4.0.17
@@ -1151,7 +1197,7 @@ packages:
magic-string: 0.27.0 magic-string: 0.27.0
react-docgen-typescript: 2.4.0(typescript@5.5.4) react-docgen-typescript: 2.4.0(typescript@5.5.4)
typescript: 5.5.4 typescript: 5.5.4
vite: 5.4.17(@types/node@22.19.3) vite: 5.4.17
dev: true dev: true
/@jridgewell/gen-mapping@0.3.13: /@jridgewell/gen-mapping@0.3.13:
@@ -1958,7 +2004,7 @@ packages:
browser-assert: 1.2.1 browser-assert: 1.2.1
storybook: 8.6.15(prettier@3.5.3) storybook: 8.6.15(prettier@3.5.3)
ts-dedent: 2.2.0 ts-dedent: 2.2.0
vite: 5.4.17(@types/node@22.19.3) vite: 5.4.17
dev: true dev: true
/@storybook/components@8.6.15(storybook@8.6.15): /@storybook/components@8.6.15(storybook@8.6.15):
@@ -2100,7 +2146,7 @@ packages:
resolve: 1.22.11 resolve: 1.22.11
storybook: 8.6.15(prettier@3.5.3) storybook: 8.6.15(prettier@3.5.3)
tsconfig-paths: 4.2.0 tsconfig-paths: 4.2.0
vite: 5.4.17(@types/node@22.19.3) vite: 5.4.17
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
- supports-color - supports-color
@@ -2287,7 +2333,7 @@ packages:
'@tailwindcss/node': 4.1.18 '@tailwindcss/node': 4.1.18
'@tailwindcss/oxide': 4.1.18 '@tailwindcss/oxide': 4.1.18
tailwindcss: 4.1.18 tailwindcss: 4.1.18
vite: 5.4.17(@types/node@22.19.3) vite: 5.4.17
/@tootallnate/once@2.0.0: /@tootallnate/once@2.0.0:
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
@@ -3048,7 +3094,7 @@ packages:
'@rolldown/pluginutils': 1.0.0-beta.53 '@rolldown/pluginutils': 1.0.0-beta.53
'@types/babel__core': 7.20.5 '@types/babel__core': 7.20.5
react-refresh: 0.18.0 react-refresh: 0.18.0
vite: 5.4.17(@types/node@22.19.3) vite: 5.4.17
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true dev: true
@@ -9411,6 +9457,43 @@ packages:
vfile-message: 4.0.3 vfile-message: 4.0.3
dev: false dev: false
/vite@5.4.17:
resolution: {integrity: sha512-5+VqZryDj4wgCs55o9Lp+p8GE78TLVg0lasCH5xFZ4jacZjtqZa6JUw9/p0WeAojaOfncSM6v77InkFPGnvPvg==}
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
dependencies:
esbuild: 0.21.5
postcss: 8.5.3
rollup: 4.39.0
optionalDependencies:
fsevents: 2.3.3
/vite@5.4.17(@types/node@22.19.3): /vite@5.4.17(@types/node@22.19.3):
resolution: {integrity: sha512-5+VqZryDj4wgCs55o9Lp+p8GE78TLVg0lasCH5xFZ4jacZjtqZa6JUw9/p0WeAojaOfncSM6v77InkFPGnvPvg==} resolution: {integrity: sha512-5+VqZryDj4wgCs55o9Lp+p8GE78TLVg0lasCH5xFZ4jacZjtqZa6JUw9/p0WeAojaOfncSM6v77InkFPGnvPvg==}
engines: {node: ^18.0.0 || >=20.0.0} engines: {node: ^18.0.0 || >=20.0.0}
@@ -9444,10 +9527,11 @@ packages:
dependencies: dependencies:
'@types/node': 22.19.3 '@types/node': 22.19.3
esbuild: 0.21.5 esbuild: 0.21.5
postcss: 8.5.3 postcss: 8.5.6
rollup: 4.39.0 rollup: 4.55.1
optionalDependencies: optionalDependencies:
fsevents: 2.3.3 fsevents: 2.3.3
dev: true
/vite@7.3.1: /vite@7.3.1:
resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==}
+2 -2
View File
@@ -24,9 +24,9 @@
"^lint" "^lint"
] ]
}, },
"check-types": { "typecheck": {
"dependsOn": [ "dependsOn": [
"^check-types" "^typecheck"
] ]
}, },
"dev": { "dev": {