{
    "private": true,
    "type": "module",
    "scripts": {
        "//build": "FR-138 — client and SSR bundles are ALWAYS built together. Shipping client assets without rebuilding the SSR bundle produces hydration mismatches with visibly flashing content, so there is deliberately no script that builds only one of them.",
        "build": "vite build && vite build --ssr",
        "dev": "vite",
        "//ssr": "FR-135 — two supervised workers. Locally `concurrently` stands in for the supervisor; in Docker each worker is its own container with a restart policy.",
        "ssr": "node bootstrap/ssr/ssr.js",
        "ssr:cluster": "concurrently --names w1,w2 --kill-others \"cross-env INERTIA_SSR_PORT=13714 INERTIA_SSR_HEALTH_PORT=13715 node bootstrap/ssr/ssr.js\" \"cross-env INERTIA_SSR_PORT=13724 INERTIA_SSR_HEALTH_PORT=13725 node bootstrap/ssr/ssr.js\"",
        "lint": "eslint resources/js --max-warnings=0",
        "//test:visual": "FR-78 (M60) — screenshot comparison in both directions. NOT one of the five gates: it needs a built bundle, a running server and a seeded database, and it is sensitive to font rendering, so wiring it into the gate would make the gate flaky. Run it deliberately before a release. Baselines are generated once with test:visual:update on a freshly built tree; there are none committed, because a baseline taken against a stale bundle enshrines the stale rendering as correct.",
        "test:visual": "playwright test",
        "test:visual:update": "playwright test --update-snapshots",
        "//test:a11y": "NFR-38 — axe (WCAG 2.1 A/AA) over the main portal and dashboard screens in both directions, failing on serious or critical violations. Same prerequisites as test:visual: a built bundle, a running server and the demo seed. Not one of the five gates.",
        "test:a11y": "playwright test tests/Visual/a11y.spec.js"
    },
    "devDependencies": {
        "@axe-core/playwright": "^4.13.0",
        "@eslint/js": "^9.39.5",
        "@playwright/test": "^1.63.0",
        "@tailwindcss/vite": "^4.0.0",
        "@vitejs/plugin-react": "^4.7.0",
        "axios": "^1.7.4",
        "concurrently": "^9.0.1",
        "cross-env": "^10.1.0",
        "eslint": "^9.39.5",
        "eslint-plugin-react": "^7.37.5",
        "eslint-plugin-react-hooks": "^7.1.1",
        "globals": "^17.9.0",
        "laravel-vite-plugin": "^1.2.0",
        "tailwindcss": "^4.0.0",
        "vite": "^6.0.11"
    },
    "dependencies": {
        "@fontsource-variable/cairo": "^5.3.0",
        "@fontsource-variable/inter": "^5.3.0",
        "@inertiajs/react": "^3.6.1",
        "@radix-ui/react-checkbox": "^1.3.11",
        "@radix-ui/react-dialog": "^1.1.23",
        "@radix-ui/react-dropdown-menu": "^2.1.24",
        "@radix-ui/react-popover": "^1.1.23",
        "@radix-ui/react-select": "^2.3.7",
        "@radix-ui/react-slot": "^1.3.3",
        "@radix-ui/react-switch": "^1.3.7",
        "@radix-ui/react-tabs": "^1.1.21",
        "@radix-ui/react-toast": "^1.2.23",
        "@radix-ui/react-tooltip": "^1.2.16",
        "@radix-ui/react-visually-hidden": "^1.2.11",
        "@tiptap/core": "^3.31.4",
        "@tiptap/extension-bold": "^3.31.4",
        "@tiptap/extension-document": "^3.31.4",
        "@tiptap/extension-hard-break": "^3.31.4",
        "@tiptap/extension-heading": "^3.31.4",
        "@tiptap/extension-image": "^3.31.4",
        "@tiptap/extension-italic": "^3.31.4",
        "@tiptap/extension-link": "^3.31.4",
        "@tiptap/extension-list": "^3.31.4",
        "@tiptap/extension-paragraph": "^3.31.4",
        "@tiptap/extension-text": "^3.31.4",
        "@tiptap/extensions": "^3.31.4",
        "@tiptap/pm": "^3.31.4",
        "@tiptap/react": "^3.31.4",
        "clsx": "^2.1.1",
        "leaflet": "^1.9.4",
        "react": "^19.2.8",
        "react-dom": "^19.2.8",
        "recharts": "^3.10.1",
        "tailwind-merge": "^3.6.0"
    }
}
