diff --git a/package-lock.json b/package-lock.json
index 83a667c..d639cf1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,6 +10,7 @@
"dependencies": {
"@floating-ui/react": "^0.27.8",
"@igniteui/material-icons-extended": "^3.0.0",
+ "apexgantt": "^3.17.1",
"element-internals-polyfill": "^1.3.10",
"functions-have-names": "^1.2.3",
"igniteui-react": "^19.2.1",
@@ -2618,6 +2619,14 @@
"node": ">= 8"
}
},
+ "node_modules/apexgantt": {
+ "version": "3.17.1",
+ "resolved": "https://registry.npmjs.org/apexgantt/-/apexgantt-3.17.1.tgz",
+ "integrity": "sha512-it6G+0HKSObbcygvdf3SYoV3l7sMriBxPasuWUuas+JeSMNZRu+XCs1h6II8431gO9Vl1xXSuOZ3lh+XCdCJcQ==",
+ "dependencies": {
+ "dayjs": "^1.11.13"
+ }
+ },
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -2959,6 +2968,12 @@
"node": ">=14"
}
},
+ "node_modules/dayjs": {
+ "version": "1.11.21",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz",
+ "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==",
+ "license": "MIT"
+ },
"node_modules/debug": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
diff --git a/package.json b/package.json
index 7733d00..799df77 100644
--- a/package.json
+++ b/package.json
@@ -14,6 +14,7 @@
"dependencies": {
"@floating-ui/react": "^0.27.8",
"@igniteui/material-icons-extended": "^3.0.0",
+ "apexgantt": "^3.17.1",
"element-internals-polyfill": "^1.3.10",
"functions-have-names": "^1.2.3",
"igniteui-react": "^19.2.1",
diff --git a/projects/manufacturing/.gitignore b/projects/manufacturing/.gitignore
new file mode 100644
index 0000000..f4e2c6d
--- /dev/null
+++ b/projects/manufacturing/.gitignore
@@ -0,0 +1,3 @@
+node_modules/
+dist/
+*.tsbuildinfo
diff --git a/projects/manufacturing/README.md b/projects/manufacturing/README.md
new file mode 100644
index 0000000..02c73a7
--- /dev/null
+++ b/projects/manufacturing/README.md
@@ -0,0 +1,14 @@
+# Manufacturing Sample
+
+Standalone Ignite UI for React sample for production operations.
+
+## Run locally
+
+1. Install dependencies:
+ npm install
+2. Start development server:
+ npm start
+
+## Build
+
+npm run build
diff --git a/projects/manufacturing/eslint.config.js b/projects/manufacturing/eslint.config.js
new file mode 100644
index 0000000..ab2557e
--- /dev/null
+++ b/projects/manufacturing/eslint.config.js
@@ -0,0 +1,29 @@
+import js from "@eslint/js";
+import globals from "globals";
+import reactHooks from "eslint-plugin-react-hooks";
+import reactRefresh from "eslint-plugin-react-refresh";
+import tseslint from "typescript-eslint";
+
+export default tseslint.config(
+ { ignores: ["dist"] },
+ {
+ extends: [js.configs.recommended, ...tseslint.configs.recommended],
+ files: ["**/*.{ts,tsx}"],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ },
+ plugins: {
+ "react-hooks": reactHooks,
+ "react-refresh": reactRefresh,
+ },
+ rules: {
+ ...reactHooks.configs.recommended.rules,
+ "react-refresh/only-export-components": [
+ "warn",
+ { allowConstantExport: true }
+ ],
+ "@typescript-eslint/no-explicit-any": "off"
+ },
+ }
+);
diff --git a/projects/manufacturing/index.html b/projects/manufacturing/index.html
new file mode 100644
index 0000000..f9cbbdf
--- /dev/null
+++ b/projects/manufacturing/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+ Manufacturing Operations
+
+
+
+
+
+
+
diff --git a/projects/manufacturing/package-lock.json b/projects/manufacturing/package-lock.json
new file mode 100644
index 0000000..31d99f3
--- /dev/null
+++ b/projects/manufacturing/package-lock.json
@@ -0,0 +1,3643 @@
+{
+ "name": "manufacturing",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "manufacturing",
+ "version": "0.1.0",
+ "dependencies": {
+ "apexgantt": "^3.15.0",
+ "igniteui-react": "^19.2.1",
+ "igniteui-react-charts": "^19.2.4",
+ "igniteui-react-core": "^19.2.4",
+ "igniteui-react-grids": "^19.2.1",
+ "react": "^19.0.0",
+ "react-app-polyfill": "^3.0.0",
+ "react-dom": "^19.0.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.21.0",
+ "@types/react": "^19.0.10",
+ "@types/react-dom": "^19.0.4",
+ "@vitejs/plugin-react": "^4.3.4",
+ "eslint": "^9.21.0",
+ "eslint-plugin-react-hooks": "^5.1.0",
+ "eslint-plugin-react-refresh": "^0.4.19",
+ "globals": "^15.15.0",
+ "typescript": "~5.7.2",
+ "typescript-eslint": "^8.24.1",
+ "vite": "^6.3.5"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz",
+ "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz",
+ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.7",
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helpers": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/template": "^7.29.7",
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz",
+ "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.8",
+ "@babel/types": "^7.29.8",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz",
+ "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.29.7",
+ "@babel/helper-validator-option": "^7.29.7",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
+ "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
+ "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
+ "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz",
+ "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz",
+ "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz",
+ "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz",
+ "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz",
+ "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz",
+ "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
+ "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz",
+ "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.8",
+ "@babel/helper-globals": "^7.29.7",
+ "@babel/parser": "^7.29.8",
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.8",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
+ "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
+ "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
+ "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
+ "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
+ "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
+ "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
+ "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
+ "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
+ "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
+ "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
+ "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
+ "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
+ "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
+ "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
+ "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
+ "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
+ "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
+ "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
+ "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
+ "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
+ "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz",
+ "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
+ "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.5"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz",
+ "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.14.0",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.3.0",
+ "minimatch": "^3.1.5",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.39.5",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz",
+ "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz",
+ "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.12"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz",
+ "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.8.0",
+ "@floating-ui/utils": "^0.2.12"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz",
+ "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==",
+ "license": "MIT"
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
+ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/types": "^0.15.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
+ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.2",
+ "@humanfs/types": "^0.15.0",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/types": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
+ "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@lit-labs/ssr-dom-shim": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.6.0.tgz",
+ "integrity": "sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@lit-labs/virtualizer": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@lit-labs/virtualizer/-/virtualizer-2.1.1.tgz",
+ "integrity": "sha512-JWxMwnlouLdwpw8spLTuax53WMnSP3xt0dCyxAS7GJr5Otda9MGgR/ghAdfwhSY75TmjbE1T2TqChwoGCw3ggw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "lit": "^3.2.0",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/@lit/context": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@lit/context/-/context-1.1.6.tgz",
+ "integrity": "sha512-M26qDE6UkQbZA2mQ3RjJ3Gzd8TxP+/0obMgE5HfkfLhEEyYE3Bui4A5XHiGPjy0MUGAyxB3QgVuw2ciS0kHn6A==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit/reactive-element": "^1.6.2 || ^2.1.0"
+ }
+ },
+ "node_modules/@lit/react": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@lit/react/-/react-1.0.8.tgz",
+ "integrity": "sha512-p2+YcF+JE67SRX3mMlJ1TKCSTsgyOVdAwd/nxp3NuV1+Cb6MWALbN6nT7Ld4tpmYofcE5kcaSY1YBB9erY+6fw==",
+ "license": "BSD-3-Clause",
+ "peerDependencies": {
+ "@types/react": "17 || 18 || 19"
+ }
+ },
+ "node_modules/@lit/reactive-element": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.2.tgz",
+ "integrity": "sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit-labs/ssr-dom-shim": "^1.5.0"
+ }
+ },
+ "node_modules/@napi-rs/lzma-linux-x64-gnu": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
+ "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^22.20 || ^24.12 || >=25"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
+ "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz",
+ "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz",
+ "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz",
+ "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz",
+ "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz",
+ "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz",
+ "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz",
+ "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz",
+ "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz",
+ "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz",
+ "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz",
+ "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz",
+ "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz",
+ "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz",
+ "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz",
+ "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz",
+ "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz",
+ "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz",
+ "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz",
+ "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz",
+ "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz",
+ "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz",
+ "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz",
+ "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz",
+ "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz",
+ "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.18",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz",
+ "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==",
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz",
+ "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.2.0"
+ }
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.66.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.66.0.tgz",
+ "integrity": "sha512-p088eaGrzYz1s+7cov0aMOCkNGTJlVxF4jgubf28c8L0Cv9Rloj8YBHnv4hXLq6IIEE1AsjNWavO+k+8kP2Y0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.66.0",
+ "@typescript-eslint/type-utils": "8.66.0",
+ "@typescript-eslint/utils": "8.66.0",
+ "@typescript-eslint/visitor-keys": "8.66.0",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.66.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz",
+ "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.66.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.66.0.tgz",
+ "integrity": "sha512-X6ypGChaWYk6PBtUg2BwuTZEFFcHJAtGTVJ9/lCTOufhZ4i9fNolQNnktq+kkMCwMj7V8Svsq7+TxSDslmhE0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.66.0",
+ "@typescript-eslint/types": "8.66.0",
+ "@typescript-eslint/typescript-estree": "8.66.0",
+ "@typescript-eslint/visitor-keys": "8.66.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.66.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.66.0.tgz",
+ "integrity": "sha512-7MthGPTt4BP69lSryqpqq8HQqxuzynssckL/jyDyk3+TNMQ3y2jFWkptCrktWvBrP+EH787Nl5N5Qpw7WZg+5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.66.0",
+ "@typescript-eslint/types": "^8.66.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.66.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.66.0.tgz",
+ "integrity": "sha512-8TGcH25j9zqJ/IULB/ppyhRvxA8QYfFEZ7nfbg6/BN9spDgb8fPWQXlE5l8TWBL50EtUx007uZ1o9VOwrq2/9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.66.0",
+ "@typescript-eslint/visitor-keys": "8.66.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.66.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.66.0.tgz",
+ "integrity": "sha512-9D5gLYZG4rOjcoag8MQ/fWI8WqA9wcPDyOGyWtWFhvM1lHRbliqUSPIY5J3zqCU1tvSwzXxnnjhQhz5Ne7mJ4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.66.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.66.0.tgz",
+ "integrity": "sha512-LG2dWfjZQQp0ADtAu/EWJVayefGL2UEZ3CDeI44D9v3rXB/WYUqE/jpO28KrEKul5AySrmI+Zh1v6v+xW2U9+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.66.0",
+ "@typescript-eslint/typescript-estree": "8.66.0",
+ "@typescript-eslint/utils": "8.66.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.66.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.66.0.tgz",
+ "integrity": "sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.66.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.66.0.tgz",
+ "integrity": "sha512-8/x4INiiQb10jGgXYD7116/zQ+OL84ZIFn0za68wwFHCanT/VLbBEroWht8RV8fn0/ZCAoazHLQgwUC0UQcDfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.66.0",
+ "@typescript-eslint/tsconfig-utils": "8.66.0",
+ "@typescript-eslint/types": "8.66.0",
+ "@typescript-eslint/visitor-keys": "8.66.0",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "5.0.9",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
+ "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "10.2.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
+ "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.8"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.66.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.66.0.tgz",
+ "integrity": "sha512-jasearZPolBw5NJNYGMwxzHMF83niVWmMU1VdHzG1CyfI2VS7f7nZltnKtHcg20hW+7Uo5GfK4MeDPoU3qI8EA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.66.0",
+ "@typescript-eslint/types": "8.66.0",
+ "@typescript-eslint/typescript-estree": "8.66.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.66.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.66.0.tgz",
+ "integrity": "sha512-dkKR8q+lKciskj1Y3vthHktl+3cMLWGyVUP23bRiPZ5O9BRT++4EqDDV+TVeIKBL1VXVEqrJlz8MYbcnvJcAlg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.66.0",
+ "eslint-visitor-keys": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
+ "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.28.0",
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
+ "@rolldown/pluginutils": "1.0.0-beta.27",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.17.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
+ "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/apexgantt": {
+ "version": "3.17.1",
+ "resolved": "https://registry.npmjs.org/apexgantt/-/apexgantt-3.17.1.tgz",
+ "integrity": "sha512-it6G+0HKSObbcygvdf3SYoV3l7sMriBxPasuWUuas+JeSMNZRu+XCs1h6II8431gO9Vl1xXSuOZ3lh+XCdCJcQ==",
+ "dependencies": {
+ "dayjs": "^1.11.13"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "license": "MIT"
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.11.12",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.12.tgz",
+ "integrity": "sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.18",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz",
+ "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.7",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz",
+ "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.10.44",
+ "caniuse-lite": "^1.0.30001806",
+ "electron-to-chromium": "^1.5.393",
+ "node-releases": "^2.0.51",
+ "update-browserslist-db": "^1.2.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001809",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz",
+ "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/core-js": {
+ "version": "3.50.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.50.0.tgz",
+ "integrity": "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.21",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz",
+ "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.402",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.402.tgz",
+ "integrity": "sha512-/oOpMaPT6Yg+6/1XQhyIPlzgj7Ye9zf+nNM2Uh6OcE2G2oNptWazFa+qB2Pdqqbsc9KnIDzgAntoYN0dbwOXwA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
+ "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.12",
+ "@esbuild/android-arm": "0.25.12",
+ "@esbuild/android-arm64": "0.25.12",
+ "@esbuild/android-x64": "0.25.12",
+ "@esbuild/darwin-arm64": "0.25.12",
+ "@esbuild/darwin-x64": "0.25.12",
+ "@esbuild/freebsd-arm64": "0.25.12",
+ "@esbuild/freebsd-x64": "0.25.12",
+ "@esbuild/linux-arm": "0.25.12",
+ "@esbuild/linux-arm64": "0.25.12",
+ "@esbuild/linux-ia32": "0.25.12",
+ "@esbuild/linux-loong64": "0.25.12",
+ "@esbuild/linux-mips64el": "0.25.12",
+ "@esbuild/linux-ppc64": "0.25.12",
+ "@esbuild/linux-riscv64": "0.25.12",
+ "@esbuild/linux-s390x": "0.25.12",
+ "@esbuild/linux-x64": "0.25.12",
+ "@esbuild/netbsd-arm64": "0.25.12",
+ "@esbuild/netbsd-x64": "0.25.12",
+ "@esbuild/openbsd-arm64": "0.25.12",
+ "@esbuild/openbsd-x64": "0.25.12",
+ "@esbuild/openharmony-arm64": "0.25.12",
+ "@esbuild/sunos-x64": "0.25.12",
+ "@esbuild/win32-arm64": "0.25.12",
+ "@esbuild/win32-ia32": "0.25.12",
+ "@esbuild/win32-x64": "0.25.12"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.39.5",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz",
+ "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.2",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.6",
+ "@eslint/js": "9.39.5",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.14.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.5",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
+ "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.26",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz",
+ "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=8.40"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz",
+ "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/igniteui-i18n-core": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/igniteui-i18n-core/-/igniteui-i18n-core-1.0.5.tgz",
+ "integrity": "sha512-CO5Rqo5uqgyAfIHbFVuBEmo+fYXgLQ7zxRShqAu+ng8kDS5uwWjKeSGWVZjKMBgxmc6ZWMMbdcWIpGZUSOkPsw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "igniteui-i18n-resources": "1.0.5"
+ },
+ "peerDependenciesMeta": {
+ "igniteui-i18n-resources": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/igniteui-react": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/igniteui-react/-/igniteui-react-19.8.1.tgz",
+ "integrity": "sha512-7oA0CuO5OZ/DIOB1cTPLWnG1Df6qIsWa5Cf4Cof2N4poIdpSUDgUgZoEiRWqs4pxhz9M1PXmI/VsHrABCUwBBw==",
+ "license": "MIT",
+ "dependencies": {
+ "@lit/react": "^1.0.7",
+ "igniteui-webcomponents": "~7.2.1",
+ "lit": "^3.3.0"
+ },
+ "peerDependencies": {
+ "igniteui-grid-lite": "~0.9.0"
+ },
+ "peerDependenciesMeta": {
+ "igniteui-grid-lite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/igniteui-react-charts": {
+ "version": "19.6.0",
+ "resolved": "https://registry.npmjs.org/igniteui-react-charts/-/igniteui-react-charts-19.6.0.tgz",
+ "integrity": "sha512-AvVTs+VBxn+I2RqDQhbQgii21Yk5SJpkHvyDMSqz0UfDjcOFR5gkRY6SOhFQLnQhNzOQq3S7Bfrb/MlOYDE7cg==",
+ "license": "Infragistics(R) Ultimate license (http://www.infragistics.com/legal/ultimate/license/)",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "peerDependencies": {
+ "igniteui-react-core": "19.6.0"
+ }
+ },
+ "node_modules/igniteui-react-core": {
+ "version": "19.6.0",
+ "resolved": "https://registry.npmjs.org/igniteui-react-core/-/igniteui-react-core-19.6.0.tgz",
+ "integrity": "sha512-RBJj6v1S6qcvKYZW+rZfDR7BEM9Nj8KcE2w7ztNIzSSaFBBLQcj3koVCEOAGjpovM1RwL7szA8TTjmHugySF0w==",
+ "license": "Infragistics(R) Ultimate license (http://www.infragistics.com/legal/ultimate/license/)",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/igniteui-react-grids": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/igniteui-react-grids/-/igniteui-react-grids-19.8.1.tgz",
+ "integrity": "sha512-NreoiLVrbzj1F1jIKHcP0r48K1K2xiz6kQOXDyBGLTPEWNg7avOrCzkutw0O31+6t+W34+iGP+AMOMKmQ15aYQ==",
+ "license": "Infragistics(R) Ultimate license (http://www.infragistics.com/legal/ultimate/license/)",
+ "dependencies": {
+ "@lit/react": "^1.0.7",
+ "igniteui-webcomponents-grids": "~7.2.1",
+ "lit": "^3.3.0"
+ }
+ },
+ "node_modules/igniteui-webcomponents": {
+ "version": "7.2.4",
+ "resolved": "https://registry.npmjs.org/igniteui-webcomponents/-/igniteui-webcomponents-7.2.4.tgz",
+ "integrity": "sha512-h5hrroBn0kSYCYpj5OH4sKXkFZvdOeqpYnNTKMB5PsqsWexhQICkH5xKjDDj3VPbd135OvzWX5XQN0Nclj2qAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/dom": "^1.7.0",
+ "@lit-labs/virtualizer": "^2.1.0",
+ "@lit/context": "^1.1.0",
+ "igniteui-i18n-core": "^1.0.5",
+ "lit": "^3.3.0"
+ },
+ "engines": {
+ "node": ">=22"
+ },
+ "peerDependencies": {
+ "dompurify": "^3.3.0",
+ "igniteui-i18n-resources": "^1.0.5",
+ "marked": "^17.0.0",
+ "marked-shiki": "^1.2.0",
+ "shiki": "^3.20.0"
+ },
+ "peerDependenciesMeta": {
+ "dompurify": {
+ "optional": true
+ },
+ "igniteui-i18n-resources": {
+ "optional": true
+ },
+ "marked": {
+ "optional": true
+ },
+ "marked-shiki": {
+ "optional": true
+ },
+ "shiki": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/igniteui-webcomponents-grids": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/igniteui-webcomponents-grids/-/igniteui-webcomponents-grids-7.2.1.tgz",
+ "integrity": "sha512-G0lm9LiT6GjRcDw6X5n6xcrfiLrhWQ9jD8c+BtlBaSc4kJ2uK1UphNw3roEmlCs18bL/iVokEJT2G68E5x6nMA==",
+ "license": "Infragistics(R) Ultimate license (http://www.infragistics.com/legal/ultimate/license/)",
+ "dependencies": {
+ "igniteui-i18n-core": "^1.0.3",
+ "lit": "^3.3.0",
+ "tslib": "^2.3.1"
+ },
+ "peerDependencies": {
+ "igniteui-i18n-resources": "^1.0.3"
+ },
+ "peerDependenciesMeta": {
+ "igniteui-i18n-resources": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz",
+ "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lit": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.3.tgz",
+ "integrity": "sha512-fycuvZg/hkpozL00lm1pEJH5nN/lr9ZXd6mJI2HSN4+Bzc+LDNdEApJ6HFbPkdFNHLvOplIIuJvxkS4XUxqirw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit/reactive-element": "^2.1.0",
+ "lit-element": "^4.2.0",
+ "lit-html": "^3.3.0"
+ }
+ },
+ "node_modules/lit-element": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.2.tgz",
+ "integrity": "sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit-labs/ssr-dom-shim": "^1.5.0",
+ "@lit/reactive-element": "^2.1.0",
+ "lit-html": "^3.3.0"
+ }
+ },
+ "node_modules/lit-html": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.3.tgz",
+ "integrity": "sha512-el8M6jK2o3RXBnrSHX3ZKrsN8zEV63pSExTO1wYJz7QndGYZ8353e2a5PPX+qHe2aGayfnchQmkAojaWAREOIA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@types/trusted-types": "^2.0.2"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.17",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz",
+ "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.53",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz",
+ "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.26",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
+ "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.17",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/promise": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
+ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+ "license": "MIT",
+ "dependencies": {
+ "asap": "~2.0.6"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/raf": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
+ "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "license": "MIT",
+ "dependencies": {
+ "performance-now": "^2.1.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.2.8",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz",
+ "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-app-polyfill": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz",
+ "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==",
+ "license": "MIT",
+ "dependencies": {
+ "core-js": "^3.19.2",
+ "object-assign": "^4.1.1",
+ "promise": "^8.1.0",
+ "raf": "^3.4.1",
+ "regenerator-runtime": "^0.13.9",
+ "whatwg-fetch": "^3.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.8",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz",
+ "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.8"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
+ "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+ "license": "MIT"
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz",
+ "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.9"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
+ "@rollup/rollup-android-arm-eabi": "4.62.4",
+ "@rollup/rollup-android-arm64": "4.62.4",
+ "@rollup/rollup-darwin-arm64": "4.62.4",
+ "@rollup/rollup-darwin-x64": "4.62.4",
+ "@rollup/rollup-freebsd-arm64": "4.62.4",
+ "@rollup/rollup-freebsd-x64": "4.62.4",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.62.4",
+ "@rollup/rollup-linux-arm-musleabihf": "4.62.4",
+ "@rollup/rollup-linux-arm64-gnu": "4.62.4",
+ "@rollup/rollup-linux-arm64-musl": "4.62.4",
+ "@rollup/rollup-linux-loong64-gnu": "4.62.4",
+ "@rollup/rollup-linux-loong64-musl": "4.62.4",
+ "@rollup/rollup-linux-ppc64-gnu": "4.62.4",
+ "@rollup/rollup-linux-ppc64-musl": "4.62.4",
+ "@rollup/rollup-linux-riscv64-gnu": "4.62.4",
+ "@rollup/rollup-linux-riscv64-musl": "4.62.4",
+ "@rollup/rollup-linux-s390x-gnu": "4.62.4",
+ "@rollup/rollup-linux-x64-gnu": "4.62.4",
+ "@rollup/rollup-linux-x64-musl": "4.62.4",
+ "@rollup/rollup-openbsd-x64": "4.62.4",
+ "@rollup/rollup-openharmony-arm64": "4.62.4",
+ "@rollup/rollup-win32-arm64-msvc": "4.62.4",
+ "@rollup/rollup-win32-ia32-msvc": "4.62.4",
+ "@rollup/rollup-win32-x64-gnu": "4.62.4",
+ "@rollup/rollup-win32-x64-msvc": "4.62.4",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
+ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.66.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.66.0.tgz",
+ "integrity": "sha512-QlEbBPz/RuJ1XUHj29nm3t0F/O/cSlEnntozqPOYHnnTGAXFamnMBu5i9Vn6vhUPHGAjR+Vl+5J8vPN/BMUrJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.66.0",
+ "@typescript-eslint/parser": "8.66.0",
+ "@typescript-eslint/typescript-estree": "8.66.0",
+ "@typescript-eslint/utils": "8.66.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.0.tgz",
+ "integrity": "sha512-x/M6q3w4Ybp91CNaS4S69UnliqR3BzRpOT6LWbksjth0S/+jhfaPJsWjt/TewpT8j9eLIojUf5jr29WextHroA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "6.4.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz",
+ "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2",
+ "postcss": "^8.5.3",
+ "rollup": "^4.34.9",
+ "tinyglobby": "^0.2.13"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/whatwg-fetch": {
+ "version": "3.6.20",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
+ "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==",
+ "license": "MIT"
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/projects/manufacturing/package.json b/projects/manufacturing/package.json
new file mode 100644
index 0000000..6694047
--- /dev/null
+++ b/projects/manufacturing/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "manufacturing",
+ "private": true,
+ "version": "0.1.0",
+ "type": "module",
+ "scripts": {
+ "start": "vite",
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "preview": "vite preview",
+ "lint": "eslint . --report-unused-disable-directives --max-warnings 0"
+ },
+ "dependencies": {
+ "apexgantt": "^3.15.0",
+ "igniteui-react": "^19.2.1",
+ "igniteui-react-charts": "^19.2.4",
+ "igniteui-react-core": "^19.2.4",
+ "igniteui-react-grids": "^19.2.1",
+ "react": "^19.0.0",
+ "react-app-polyfill": "^3.0.0",
+ "react-dom": "^19.0.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.21.0",
+ "@types/react": "^19.0.10",
+ "@types/react-dom": "^19.0.4",
+ "@vitejs/plugin-react": "^4.3.4",
+ "eslint": "^9.21.0",
+ "eslint-plugin-react-hooks": "^5.1.0",
+ "eslint-plugin-react-refresh": "^0.4.19",
+ "globals": "^15.15.0",
+ "typescript": "~5.7.2",
+ "typescript-eslint": "^8.24.1",
+ "vite": "^6.3.5"
+ }
+}
diff --git a/projects/manufacturing/public/equipment/mc-115.jpg b/projects/manufacturing/public/equipment/mc-115.jpg
new file mode 100644
index 0000000..5e5dcc8
Binary files /dev/null and b/projects/manufacturing/public/equipment/mc-115.jpg differ
diff --git a/projects/manufacturing/public/equipment/mc-221.jpg b/projects/manufacturing/public/equipment/mc-221.jpg
new file mode 100644
index 0000000..53d3da1
Binary files /dev/null and b/projects/manufacturing/public/equipment/mc-221.jpg differ
diff --git a/projects/manufacturing/public/equipment/mc-304.jpg b/projects/manufacturing/public/equipment/mc-304.jpg
new file mode 100644
index 0000000..1f7fcad
Binary files /dev/null and b/projects/manufacturing/public/equipment/mc-304.jpg differ
diff --git a/projects/manufacturing/public/equipment/mc-307.jpg b/projects/manufacturing/public/equipment/mc-307.jpg
new file mode 100644
index 0000000..b040ce7
Binary files /dev/null and b/projects/manufacturing/public/equipment/mc-307.jpg differ
diff --git a/projects/manufacturing/public/equipment/mc-409.jpg b/projects/manufacturing/public/equipment/mc-409.jpg
new file mode 100644
index 0000000..2944262
Binary files /dev/null and b/projects/manufacturing/public/equipment/mc-409.jpg differ
diff --git a/projects/manufacturing/public/equipment/mc-503.jpg b/projects/manufacturing/public/equipment/mc-503.jpg
new file mode 100644
index 0000000..3e4595f
Binary files /dev/null and b/projects/manufacturing/public/equipment/mc-503.jpg differ
diff --git a/projects/manufacturing/public/equipment/mc-612.jpg b/projects/manufacturing/public/equipment/mc-612.jpg
new file mode 100644
index 0000000..9f92bf9
Binary files /dev/null and b/projects/manufacturing/public/equipment/mc-612.jpg differ
diff --git a/projects/manufacturing/public/equipment/mc-714.jpg b/projects/manufacturing/public/equipment/mc-714.jpg
new file mode 100644
index 0000000..01bdd6d
Binary files /dev/null and b/projects/manufacturing/public/equipment/mc-714.jpg differ
diff --git a/projects/manufacturing/public/equipment/mc-803.jpg b/projects/manufacturing/public/equipment/mc-803.jpg
new file mode 100644
index 0000000..2853beb
Binary files /dev/null and b/projects/manufacturing/public/equipment/mc-803.jpg differ
diff --git a/projects/manufacturing/src/apex-gantt.tsx b/projects/manufacturing/src/apex-gantt.tsx
new file mode 100644
index 0000000..cd4508b
--- /dev/null
+++ b/projects/manufacturing/src/apex-gantt.tsx
@@ -0,0 +1,45 @@
+import { useEffect, useRef } from "react";
+import ApexGantt from "apexgantt";
+import type { GanttUserOptions, TaskInput } from "apexgantt";
+
+/**
+ * Thin React wrapper around the core `apexgantt` class.
+ * (We bypass the official `react-apexgantt` wrapper because its 1.1.0 build
+ * re-exports a `ViewMode` symbol that isn't present in the current apexgantt ESM
+ * bundle, which breaks the Rolldown/Vite production build.)
+ */
+interface ApexGanttChartProps {
+ tasks: TaskInput[];
+ height?: number | string;
+ options?: Omit;
+ onSelectionChange?: (selectedIds: string[]) => void;
+}
+
+export default function ApexGanttChart({ tasks, height = 340, options, onSelectionChange }: ApexGanttChartProps) {
+ const hostRef = useRef(null);
+ const selRef = useRef(onSelectionChange);
+ selRef.current = onSelectionChange;
+ const optsRef = useRef(options);
+ optsRef.current = options;
+
+ useEffect(() => {
+ const el = hostRef.current;
+ if (!el) return;
+ const gantt = new ApexGantt(el, { ...(optsRef.current as object), height, series: tasks } as GanttUserOptions);
+ gantt.render();
+
+ const handler = (e: Event) => {
+ const ids = (e as CustomEvent<{ selectedIds?: string[] }>).detail?.selectedIds ?? [];
+ selRef.current?.(ids);
+ };
+ el.addEventListener("selectionChange", handler as EventListener);
+
+ return () => {
+ el.removeEventListener("selectionChange", handler as EventListener);
+ gantt.destroy();
+ };
+ // tasks/height are stable for a given mount; options & handler read via refs.
+ }, [tasks, height]);
+
+ return ;
+}
diff --git a/projects/manufacturing/src/app.tsx b/projects/manufacturing/src/app.tsx
new file mode 100644
index 0000000..3f98467
--- /dev/null
+++ b/projects/manufacturing/src/app.tsx
@@ -0,0 +1,5 @@
+import ProductionOperations from "./production-operations";
+
+export default function App() {
+ return ;
+}
diff --git a/projects/manufacturing/src/charts.tsx b/projects/manufacturing/src/charts.tsx
new file mode 100644
index 0000000..6fc6b6a
--- /dev/null
+++ b/projects/manufacturing/src/charts.tsx
@@ -0,0 +1,154 @@
+import {
+ IgrCategoryChart,
+ IgrCategoryChartModule,
+ IgrDataChart,
+ IgrDataChartCoreModule,
+ IgrDataChartCategoryCoreModule,
+ IgrDataChartCategoryModule,
+ IgrDataChartVerticalCategoryModule,
+ IgrDataChartInteractivityModule,
+ IgrCategoryXAxis,
+ IgrNumericYAxis,
+ IgrCategoryYAxis,
+ IgrNumericXAxis,
+ IgrAreaSeries,
+ IgrLineSeries,
+ IgrBarSeries,
+ IgrColumnSeries,
+ IgrDataToolTipLayer,
+} from "igniteui-react-charts";
+import { vibrationSeries, vibrationTarget, type Defect } from "./data";
+
+// DV charts require one-time module registration at module scope.
+[
+ IgrCategoryChartModule,
+ IgrDataChartCoreModule,
+ IgrDataChartCategoryCoreModule,
+ IgrDataChartCategoryModule,
+ IgrDataChartVerticalCategoryModule,
+ IgrDataChartInteractivityModule,
+].forEach((m) => m.register());
+
+const VIOLET = "#6d4aff";
+const VIOLET_FILL = "rgba(109, 74, 255, 0.16)";
+const AMBER = "#c98a12";
+const AXIS_LABEL = "#8a909c";
+
+/* --- Spindle vibration: area series + amber target line (IgrDataChart) --- */
+export function VibrationChart() {
+ const data = vibrationSeries.map((v, i) => ({ t: `${i + 1}`, value: v, target: vibrationTarget }));
+ return (
+
+
+
+
+
+
+ );
+}
+
+/* --- Defect Pareto: horizontal bars (IgrDataChart) --- */
+export function ParetoChart({ defects }: { defects: Defect[] }) {
+ return (
+
+
+
+
+
+
+ );
+}
+
+/* --- Previous-10-lots trend line (IgrCategoryChart) --- */
+export function TrendChart({ points }: { points: number[] }) {
+ const data = points.map((v, i) => ({ label: `${i + 1}`, v }));
+ return (
+
+ );
+}
+
+/* --- Downtime Pareto: columns (minutes) + cumulative % line (IgrDataChart) --- */
+export function ParetoComboChart({ points }: { points: { reason: string; minutes: number; cumulative: number }[] }) {
+ return (
+
+
+
+
+
+
+
+
+ );
+}
+
+/* --- Generic column chart (IgrDataChart) --- */
+export function ColumnChart({ data, labelPath, valuePath, height = "200px" }: { data: object[]; labelPath: string; valuePath: string; height?: string }) {
+ return (
+
+
+
+
+
+
+ );
+}
+
+/* --- Generic area trend (IgrCategoryChart) --- */
+export function AreaTrendChart({ data, valuePath = "minutes", height = "200px" }: { data: object[]; valuePath?: string; height?: string }) {
+ return (
+
+ );
+}
+
+/* Mini sparkline reused by the downtime offender cards. */
+export function MiniTrend({ points }: { points: number[] }) {
+ return ;
+}
diff --git a/projects/manufacturing/src/data.ts b/projects/manufacturing/src/data.ts
new file mode 100644
index 0000000..91bff28
--- /dev/null
+++ b/projects/manufacturing/src/data.ts
@@ -0,0 +1,262 @@
+// Domain types and mock data for the Production Operations dashboard.
+
+/** Visual tone used to color status badges. */
+export type StatusTone = "running" | "hold" | "setup" | "stopped";
+
+/** Status label -> badge tone. `status` is stored as a plain string so the
+ * grid's built-in string filtering works directly on the column. */
+export const STATUS_TONE: Record = {
+ Running: "running",
+ Setup: "setup",
+ "Quality Hold": "hold",
+ "Material Hold": "hold",
+ Stopped: "stopped",
+};
+
+export interface Measurement {
+ characteristic: string;
+ nominal: string;
+ tolerance: string;
+ measured: string;
+ pass: boolean;
+}
+
+export interface Defect {
+ label: string;
+ count: number;
+}
+
+export interface WorkOrderDetail {
+ measurements: Measurement[];
+ defects: Defect[];
+ trend: number[]; // "previous 10 lots" mini trend
+ sampled: number;
+ failed: number;
+}
+
+export interface WorkOrder {
+ workOrder: string;
+ product: string;
+ line: string;
+ machine: string;
+ planned: number;
+ completed: number;
+ scrap: number; // percentage, e.g. 1.4 => 1.4%
+ cycle: number; // seconds
+ status: string;
+ due: string;
+ dueWindow: string; // filter bucket
+ updated: string;
+ detail: WorkOrderDetail;
+}
+
+/* ----------------------- deterministic PRNG (mulberry32) ----------------------- */
+function makeRng(seed: number) {
+ let a = seed >>> 0;
+ return () => {
+ a |= 0;
+ a = (a + 0x6d2b79f5) | 0;
+ let t = Math.imul(a ^ (a >>> 15), 1 | a);
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
+ };
+}
+
+const PRODUCTS = [
+ "Drive Housing", "Pump Rotor", "Valve Body", "Gear Set A", "Compressor Ring",
+ "Shaft Collar", "Seal Plate", "Fan Hub", "Motor Bracket", "Impeller 6in",
+ "Bearing Cap", "Coupling Flange", "Idler Pulley", "Thrust Washer", "Cam Follower",
+];
+const STATUSES = ["Running", "Setup", "Quality Hold", "Material Hold", "Stopped"];
+const STATUS_WEIGHTS = [0.55, 0.12, 0.12, 0.11, 0.1];
+const DUE_WINDOWS = ["This shift", "Next shift", "Overdue"];
+const DEFECT_LABELS = ["Shaft runout", "Surface finish", "Burr / edge", "Diameter"];
+
+const pick = (rng: () => number, arr: T[]) => arr[Math.floor(rng() * arr.length)];
+const weighted = (rng: () => number, arr: string[], weights: number[]) => {
+ let r = rng();
+ for (let i = 0; i < arr.length; i++) {
+ if ((r -= weights[i]) <= 0) return arr[i];
+ }
+ return arr[arr.length - 1];
+};
+
+function buildDetail(rng: () => number, scrap: number, failing: boolean): WorkOrderDetail {
+ const runoutMeasured = failing ? 0.03 + rng() * 0.03 : rng() * 0.028;
+ const finishMeasured = failing ? 1.6 + rng() * 0.7 : 1.2 + rng() * 0.35;
+ const odMeasured = 42 + (rng() - 0.5) * 0.04;
+ const keyMeasured = 6 + (rng() - 0.5) * 0.03;
+
+ const measurements: Measurement[] = [
+ { characteristic: "Outer diameter", nominal: "42.000 mm", tolerance: "±0.025", measured: odMeasured.toFixed(3), pass: Math.abs(odMeasured - 42) <= 0.025 },
+ { characteristic: "Shaft runout", nominal: "0.000 mm", tolerance: "≤0.030", measured: runoutMeasured.toFixed(3), pass: runoutMeasured <= 0.03 },
+ { characteristic: "Keyway width", nominal: "6.000 mm", tolerance: "±0.020", measured: keyMeasured.toFixed(3), pass: Math.abs(keyMeasured - 6) <= 0.02 },
+ { characteristic: "Surface finish", nominal: "1.60 Ra", tolerance: "≤1.60", measured: finishMeasured.toFixed(2), pass: finishMeasured <= 1.6 },
+ ];
+
+ const defects: Defect[] = DEFECT_LABELS
+ .map((label, i) => ({ label, count: Math.max(0, Math.round((4 - i) * (0.6 + scrap / 5) * (0.7 + rng() * 0.6))) }))
+ .sort((a, b) => b.count - a.count);
+
+ const trend: number[] = [];
+ let v = 1.4 + rng() * 0.6;
+ for (let i = 0; i < 11; i++) {
+ v += (rng() - 0.45) * 0.35;
+ trend.push(Math.max(0.6, v));
+ }
+
+ const failed = measurements.filter((m) => !m.pass).length + Math.round(scrap / 1.5);
+ return { measurements, defects, trend, sampled: 20, failed: Math.min(20, Math.max(1, failed)) };
+}
+
+function buildRow(rng: () => number, id: number): WorkOrder {
+ const product = pick(rng, PRODUCTS);
+ const planned = 400 + Math.floor(rng() * 1600);
+ const completed = Math.floor(planned * (0.1 + rng() * 0.85));
+ const status = weighted(rng, STATUSES, STATUS_WEIGHTS);
+ const scrap = Math.round((0.3 + rng() * 4.7) * 10) / 10;
+ const cycle = Math.round((20 + rng() * 40) * 10) / 10;
+ const failing = scrap >= 3 || status === "Quality Hold" || status === "Stopped";
+ const hour = 3 + Math.floor(rng() * 6);
+ const minute = Math.floor(rng() * 12) * 5;
+ const updatedSec = Math.floor(rng() * 59) + 1;
+ const updated = rng() > 0.7 ? `${Math.floor(rng() * 9) + 1} min` : `${updatedSec} sec`;
+
+ return {
+ workOrder: `WO-${45000 + id}`,
+ product,
+ line: `Line 0${1 + Math.floor(rng() * 8)}`,
+ machine: `MC-${100 + Math.floor(rng() * 800)}`,
+ planned,
+ completed,
+ scrap,
+ cycle,
+ status,
+ due: `${hour}:${minute.toString().padStart(2, "0")} PM`,
+ dueWindow: weighted(rng, DUE_WINDOWS, [0.5, 0.35, 0.15]),
+ updated,
+ detail: buildDetail(rng, scrap, failing),
+ };
+}
+
+/* Curated top rows so the header of the grid mirrors the reference design and
+ * the preselected/detail-linked WO-48192 stays consistent. */
+const CURATED: Array & { workOrder: string; product: string; line: string; machine: string; planned: number; completed: number; scrap: number; cycle: number; status: string; due: string; dueWindow: string; updated: string }> = [
+ { workOrder: "WO-48192", product: "Drive Housing", line: "Line 03", machine: "MC-307", planned: 1200, completed: 908, scrap: 1.4, cycle: 41.8, status: "Running", due: "5:20 PM", dueWindow: "This shift", updated: "3 sec" },
+ { workOrder: "WO-48201", product: "Pump Rotor", line: "Line 07", machine: "MC-714", planned: 640, completed: 332, scrap: 4.8, cycle: 36.1, status: "Quality Hold", due: "4:45 PM", dueWindow: "Overdue", updated: "12 sec" },
+ { workOrder: "WO-48176", product: "Valve Body", line: "Line 02", machine: "MC-221", planned: 900, completed: 814, scrap: 1.1, cycle: 32.4, status: "Running", due: "4:10 PM", dueWindow: "This shift", updated: "5 sec" },
+ { workOrder: "WO-48211", product: "Gear Set A", line: "Line 05", machine: "MC-503", planned: 480, completed: 105, scrap: 0.8, cycle: 58.2, status: "Setup", due: "7:30 PM", dueWindow: "Next shift", updated: "1 min" },
+ { workOrder: "WO-48188", product: "Compressor Ring", line: "Line 01", machine: "MC-115", planned: 1800, completed: 1092, scrap: 3.9, cycle: 22.7, status: "Stopped", due: "5:05 PM", dueWindow: "This shift", updated: "23 sec" },
+ { workOrder: "WO-48195", product: "Shaft Collar", line: "Line 06", machine: "MC-612", planned: 725, completed: 510, scrap: 1.7, cycle: 44.9, status: "Running", due: "5:55 PM", dueWindow: "This shift", updated: "7 sec" },
+ { workOrder: "WO-48159", product: "Seal Plate", line: "Line 04", machine: "MC-409", planned: 1100, completed: 1044, scrap: 0.6, cycle: 28.5, status: "Running", due: "3:55 PM", dueWindow: "Overdue", updated: "4 sec" },
+ { workOrder: "WO-48217", product: "Fan Hub", line: "Line 08", machine: "MC-803", planned: 550, completed: 92, scrap: 1.0, cycle: 51.3, status: "Setup", due: "8:15 PM", dueWindow: "Next shift", updated: "2 min" },
+ { workOrder: "WO-48183", product: "Motor Bracket", line: "Line 03", machine: "MC-304", planned: 850, completed: 602, scrap: 3.2, cycle: 39.6, status: "Material Hold", due: "5:40 PM", dueWindow: "This shift", updated: "36 sec" },
+ { workOrder: "WO-48191", product: "Impeller 6in", line: "Line 07", machine: "MC-711", planned: 760, completed: 588, scrap: 1.9, cycle: 34.2, status: "Running", due: "5:15 PM", dueWindow: "This shift", updated: "8 sec" },
+];
+
+function buildAll(): WorkOrder[] {
+ const rng = makeRng(20260720);
+ const rows: WorkOrder[] = CURATED.map((c) => ({
+ ...c,
+ detail: buildDetail(rng, c.scrap, c.scrap >= 3 || c.status === "Quality Hold" || c.status === "Stopped"),
+ }));
+ for (let i = 0; rows.length < 500; i++) {
+ rows.push(buildRow(rng, i));
+ }
+ return rows;
+}
+
+export const workOrders: WorkOrder[] = buildAll();
+
+/* ----------------------- filter option lists ----------------------- */
+export const LINE_OPTIONS = ["All", "Line 01", "Line 02", "Line 03", "Line 04", "Line 05", "Line 06", "Line 07", "Line 08"];
+export const STATUS_OPTIONS = ["All", "Running", "Setup", "Quality Hold", "Material Hold", "Stopped"];
+export const DUE_OPTIONS = ["All", "This shift", "Next shift", "Overdue"];
+
+/* ----------------------- equipment (Equipment tab) ----------------------- */
+export type EquipmentStatus = "Running" | "Idle" | "Maintenance";
+export type MachineArt = "cnc" | "lathe" | "press" | "robot" | "furnace" | "conveyor";
+
+export interface Equipment {
+ id: string;
+ type: string;
+ line: string;
+ operator: string;
+ status: EquipmentStatus;
+ oee: number; // %
+ utilization: number; // %
+ output: number; // units today
+ target: number; // units target
+ temp: number; // °C
+ nextMaintenance: string;
+ art: MachineArt;
+}
+
+export const equipment: Equipment[] = [
+ { id: "MC-307", type: "CNC Mill", line: "Line 03", operator: "A. Reyes", status: "Running", oee: 86, utilization: 92, output: 908, target: 1200, temp: 78, nextMaintenance: "in 3 days", art: "cnc" },
+ { id: "MC-714", type: "Turning Lathe", line: "Line 07", operator: "J. Okafor", status: "Maintenance", oee: 61, utilization: 44, output: 332, target: 640, temp: 69, nextMaintenance: "in progress", art: "lathe" },
+ { id: "MC-221", type: "Stamping Press", line: "Line 02", operator: "M. Chen", status: "Running", oee: 91, utilization: 95, output: 814, target: 900, temp: 74, nextMaintenance: "in 8 days", art: "press" },
+ { id: "MC-503", type: "Robotic Cell", line: "Line 05", operator: "S. Patel", status: "Idle", oee: 72, utilization: 38, output: 105, target: 480, temp: 58, nextMaintenance: "in 5 days", art: "robot" },
+ { id: "MC-115", type: "Heat Furnace", line: "Line 01", operator: "T. Novak", status: "Running", oee: 68, utilization: 81, output: 1092, target: 1800, temp: 214, nextMaintenance: "in 2 days", art: "furnace" },
+ { id: "MC-612", type: "Surface Grinder", line: "Line 06", operator: "L. Braun", status: "Running", oee: 84, utilization: 88, output: 510, target: 725, temp: 71, nextMaintenance: "in 11 days", art: "cnc" },
+ { id: "MC-409", type: "Conveyor Line", line: "Line 04", operator: "R. Silva", status: "Running", oee: 95, utilization: 97, output: 1044, target: 1100, temp: 42, nextMaintenance: "in 14 days", art: "conveyor" },
+ { id: "MC-803", type: "Robotic Welder", line: "Line 08", operator: "K. Ito", status: "Idle", oee: 70, utilization: 33, output: 92, target: 550, temp: 63, nextMaintenance: "in 6 days", art: "robot" },
+ { id: "MC-304", type: "Injection Press", line: "Line 03", operator: "D. Meyer", status: "Maintenance", oee: 64, utilization: 51, output: 602, target: 850, temp: 88, nextMaintenance: "in progress", art: "press" },
+];
+
+/* ----------------------- KPI + detail-panel data ----------------------- */
+export interface Kpi {
+ label: string;
+ value: string;
+ delta: string;
+ tone: "positive" | "warning" | "negative";
+}
+
+export const kpis: Kpi[] = [
+ { label: "Active Work Orders", value: "28", delta: "+4 this shift", tone: "positive" },
+ { label: "At Risk", value: "5", delta: "2 need action", tone: "warning" },
+ { label: "Units Completed", value: "12,846", delta: "94% plan", tone: "positive" },
+ { label: "Scrap Rate", value: "2.1%", delta: "+0.4 pts", tone: "negative" },
+];
+
+export const detailMetrics = [
+ { label: "Progress", value: "75.7%" },
+ { label: "OEE", value: "86.4%" },
+ { label: "Target Cycle", value: "40.0 sec" },
+ { label: "Actual Cycle", value: "41.8 sec" },
+];
+
+export const sensorStats = [
+ { value: "78°C", label: "Temperature" },
+ { value: "4.2", label: "Vibration" },
+ { value: "92%", label: "Load" },
+];
+
+export const vibrationSeries: number[] = [
+ 2.6, 2.7, 2.6, 2.8, 2.7, 2.9, 2.8, 3.0, 3.1, 3.0, 3.2, 3.3, 3.2, 3.4, 3.5,
+ 3.4, 3.6, 3.5, 3.7, 3.6, 3.8, 3.9, 3.8, 4.0, 3.9, 4.05, 4.0, 4.1, 4.15, 4.2,
+];
+export const vibrationTarget = 3.6;
+
+export interface OpsEvent {
+ time: string;
+ text: string;
+ ago: string;
+}
+export const recentEvents: OpsEvent[] = [
+ { time: "3:31 PM", text: "Part feed jam", ago: "4m" },
+ { time: "2:54 PM", text: "Cycle time above target", ago: "11m" },
+ { time: "2:12 PM", text: "Changeover completed", ago: "18m" },
+];
+
+/** Footer summary aggregated across the full 500-row data set. */
+export const gridSummary = {
+ total: workOrders.length,
+ planned: workOrders.reduce((s, w) => s + w.planned, 0),
+ completed: workOrders.reduce((s, w) => s + w.completed, 0),
+ weightedScrap:
+ (
+ workOrders.reduce((s, w) => s + w.scrap * w.planned, 0) /
+ workOrders.reduce((s, w) => s + w.planned, 0)
+ ).toFixed(1) + "%",
+};
diff --git a/projects/manufacturing/src/downtime-view.tsx b/projects/manufacturing/src/downtime-view.tsx
new file mode 100644
index 0000000..6e83267
--- /dev/null
+++ b/projects/manufacturing/src/downtime-view.tsx
@@ -0,0 +1,189 @@
+import {
+ IgrGrid,
+ IgrColumn,
+ type IgrCellTemplateContext,
+ type IgrGridMasterDetailContext,
+} from "igniteui-react-grids";
+import { IgrCard } from "igniteui-react";
+import styles from "./production-operations.module.css";
+import { ParetoComboChart, ColumnChart, AreaTrendChart, MiniTrend } from "./charts";
+import { MachineArtImg } from "./equipment-view";
+import {
+ downtimeKpis,
+ downtimeEvents,
+ downtimePareto,
+ downtimeByLine,
+ downtimeTrend,
+ downtimeSplit,
+ offenders,
+ type DowntimeEvent,
+ type DowntimeCategory,
+} from "./ops-extra-data";
+
+const CATEGORY_TONE: Record = {
+ Mechanical: styles.tone_stopped,
+ Electrical: styles.tone_setup,
+ Material: styles.tone_hold,
+ Changeover: styles.tone_running,
+ Quality: styles.tone_hold,
+};
+
+const categoryCell = (ctx: IgrCellTemplateContext) => {
+ const c = ctx.cell.value as DowntimeCategory;
+ return {c};
+};
+
+const statusCell = (ctx: IgrCellTemplateContext) => {
+ const v = ctx.cell.value as string;
+ const cls = v === "Resolved" ? styles.tone_running : styles.tone_stopped;
+ return {v};
+};
+
+const durationCell = (ctx: IgrCellTemplateContext) => {
+ const m = ctx.cell.value as number;
+ return = 40 ? styles.scrapHigh : styles.scrapNormal}>{m} min;
+};
+
+const detailTemplate = (ctx: IgrGridMasterDetailContext) => {
+ const row = ctx.implicit as DowntimeEvent;
+ return (
+
+
+
Root Cause & Correction · {row.id}
+
+
Root cause{row.detail.rootCause}
+
Corrective action{row.detail.correctiveAction}
+
Parts used{row.detail.parts}
+
Window{row.start} – {row.end} · {row.machine}
+
+
+
+
Classification
+
+
{row.durationMin}mDuration
+
{row.category}Category
+
{row.planned ? "Planned" : "Unplanned"}Type
+
+
+
+ );
+};
+
+export default function DowntimeView() {
+ return (
+
+ {/* KPI cards */}
+
+ {downtimeKpis.map((k) => (
+
+
+
+ {k.label}
+ {k.delta}
+
+
{k.value}
+
+
+ ))}
+
+
+ {/* charts */}
+
+
+
+
Downtime Pareto · by reason
+
+
+
+
+
+
+ Downtime by line
+
+
+
+
+
+
+
Downtime trend · last 12 shifts
+
+
+
+
+
+
+
Planned vs unplanned
+
+
+
+ {downtimeSplit.plannedPct}%
+ planned
+
+
+
+ Planned · {downtimeSplit.planned}m
+ Unplanned · {downtimeSplit.unplanned}m
+
+
+
+
+
+
+ {/* top offenders */}
+
+
Top offenders
+
+ {offenders.map((o) => (
+
+
+
+
+
}.jpg`})
{ ev.currentTarget.style.display = "none"; }} />
+
+
{o.downtimeMin}min
+
+
+
+
+ {o.id} · {o.type}
+ {o.line} · {o.events} stoppages · top: {o.topReason}
+
+
+
+
+ ))}
+
+
+
+ {/* event log grid */}
+
+
+ Downtime Event Log
+ Expand a row for root cause & corrective action
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/projects/manufacturing/src/equipment-view.tsx b/projects/manufacturing/src/equipment-view.tsx
new file mode 100644
index 0000000..ba692d1
--- /dev/null
+++ b/projects/manufacturing/src/equipment-view.tsx
@@ -0,0 +1,246 @@
+import { useState, type ReactNode } from "react";
+import {
+ IgrCard,
+ IgrCardMedia,
+ IgrCardHeader,
+ IgrCardContent,
+ IgrCardActions,
+ IgrButton,
+ IgrDialog,
+} from "igniteui-react";
+import styles from "./production-operations.module.css";
+import { equipment, type Equipment, type MachineArt } from "./data";
+
+/* Themed gradient + line-art glyph used as each equipment card's fallback
+ * "product image" (shown until a real photo exists in /public/equipment). */
+const ART: Record = {
+ cnc: {
+ from: "#6d4aff", to: "#4322b8",
+ glyph: (
+
+
+
+
+
+ ),
+ },
+ lathe: {
+ from: "#0ea5a5", to: "#0b6e73",
+ glyph: (
+
+
+
+
+
+
+ ),
+ },
+ press: {
+ from: "#f0983a", to: "#c76512",
+ glyph: (
+
+
+
+
+ ),
+ },
+ robot: {
+ from: "#2f78d6", to: "#1b4f95",
+ glyph: (
+
+
+
+
+
+
+ ),
+ },
+ furnace: {
+ from: "#e0556b", to: "#a11f3c",
+ glyph: (
+
+
+
+
+ ),
+ },
+ conveyor: {
+ from: "#7c5cff", to: "#3a2a9c",
+ glyph: (
+
+
+
+
+
+
+ ),
+ },
+};
+
+const statusToneClass: Record = {
+ Running: styles.tone_running,
+ Idle: styles.tone_hold,
+ Maintenance: styles.tone_setup,
+};
+
+export function MachineArtImg({ art }: { art: MachineArt }) {
+ const a = ART[art];
+ const gid = `eqg-${art}`;
+ return (
+
+ );
+}
+
+function OeeRing({ value, size = 48 }: { value: number; size?: number }) {
+ const r = size === 48 ? 15 : 26;
+ const c = 2 * Math.PI * r;
+ const dash = (value / 100) * c;
+ const cx = size / 2;
+ return (
+
+
+
+ {value}
+ OEE
+
+
+ );
+}
+
+function EquipmentMedia({ e, tall = false }: { e: Equipment; tall?: boolean }) {
+ return (
+ // Single inner wrapper: IgrCardMedia stretches its one slotted child to fill,
+ // and we position the photo/art/overlays absolutely inside it.
+
+
+
}.jpg`})
{ ev.currentTarget.style.display = "none"; }}
+ />
+
+
+
+ {e.status}
+
+
+
+ );
+}
+
+function EquipmentCard({ e, onView }: { e: Equipment; onView: (e: Equipment) => void }) {
+ const outputPct = Math.min(100, Math.round((e.output / e.target) * 100));
+ return (
+
+
+
+
+
+
+ {e.id} · {e.type}
+ {e.line} · Operator {e.operator}
+
+
+
+
+
+
Utilization{e.utilization}%
+
+
+
+
Output vs target{e.output.toLocaleString()} / {e.target.toLocaleString()}
+
+
+
+
+
{e.temp}°CSpindle temp
+
{e.nextMaintenance}Next service
+
+
+
+
+ onView(e)}>View details
+
+
+ );
+}
+
+export default function EquipmentView() {
+ const [selected, setSelected] = useState(null);
+ const close = () => setSelected(null);
+
+ return (
+ <>
+
+ {equipment.map((e) => (
+
+ ))}
+
+
+
+ {selected ? `${selected.id} · ${selected.type}` : ""}
+ {selected && (
+
+
+
+
+
+
+ {selected.line} · Operator {selected.operator}
+
+
+
+ {[
+ { label: "OEE", value: `${selected.oee}%` },
+ { label: "Utilization", value: `${selected.utilization}%` },
+ { label: "Output today", value: selected.output.toLocaleString() },
+ { label: "Target", value: selected.target.toLocaleString() },
+ { label: "Spindle temp", value: `${selected.temp}°C` },
+ { label: "Next service", value: selected.nextMaintenance },
+ ].map((s) => (
+
+ {s.label}
+ {s.value}
+
+ ))}
+
+
+
+
+ Output vs target
+ {Math.round((selected.output / selected.target) * 100)}%
+
+
+
+
+
+
+ )}
+
+ Close
+ Acknowledge
+
+
+ >
+ );
+}
diff --git a/projects/manufacturing/src/main.tsx b/projects/manufacturing/src/main.tsx
new file mode 100644
index 0000000..f530de5
--- /dev/null
+++ b/projects/manufacturing/src/main.tsx
@@ -0,0 +1,21 @@
+import { StrictMode } from "react";
+import { createRoot } from "react-dom/client";
+import "react-app-polyfill/ie11";
+
+import "igniteui-webcomponents/themes/light/indigo.css";
+import "igniteui-react-grids/grids/themes/light/indigo.css";
+import "./theme.css";
+
+import App from "./app";
+
+Number.isNaN =
+ Number.isNaN ||
+ function (value) {
+ return value !== value;
+ };
+
+createRoot(document.getElementById("root")!).render(
+
+
+
+);
diff --git a/projects/manufacturing/src/ops-extra-data.ts b/projects/manufacturing/src/ops-extra-data.ts
new file mode 100644
index 0000000..cc67487
--- /dev/null
+++ b/projects/manufacturing/src/ops-extra-data.ts
@@ -0,0 +1,311 @@
+// Data models for the Shift Handoff and Downtime tabs.
+import { STATUS_TONE, type StatusTone } from "./data";
+
+const SHIFT_DATE = "2026-07-20"; // matches the app's "today"
+
+/* mulberry32 deterministic PRNG (same approach as data.ts) */
+function makeRng(seed: number) {
+ let a = seed >>> 0;
+ return () => {
+ a |= 0;
+ a = (a + 0x6d2b79f5) | 0;
+ let t = Math.imul(a ^ (a >>> 15), 1 | a);
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
+ };
+}
+
+/* ======================= SHIFT HANDOFF ======================= */
+
+export const STATUS_COLOR: Record = {
+ running: "#1f9d55",
+ setup: "#2f78d6",
+ hold: "#c98a12",
+ stopped: "#d64545",
+};
+
+export type HandoffState = "Acknowledged" | "Ready" | "Pending";
+
+export interface HandoffChecklistItem {
+ label: string;
+ done: boolean;
+}
+
+export interface HandoffTask {
+ id: string; // work order id
+ line: string;
+ machine: string;
+ product: string;
+ status: string; // Running / Setup / ...
+ start: string; // "HH:mm"
+ end: string; // "HH:mm"
+ progress: number; // 0-100
+ remaining: number;
+ handoff: HandoffState;
+ outgoing: string;
+ incoming: string;
+ crossesShift: boolean;
+ detail: {
+ notes: string;
+ checklist: HandoffChecklistItem[];
+ issues: string[];
+ };
+}
+
+const OUTGOING = ["A. Reyes", "J. Okafor", "M. Chen", "S. Patel", "T. Novak", "L. Braun"];
+const INCOMING = ["R. Silva", "K. Ito", "D. Meyer", "P. Hale", "N. Fischer", "G. Adler"];
+const PRODUCTS = ["Drive Housing", "Pump Rotor", "Valve Body", "Gear Set A", "Compressor Ring", "Shaft Collar", "Seal Plate", "Fan Hub"];
+const STATUSES = ["Running", "Running", "Setup", "Quality Hold", "Material Hold", "Stopped"];
+
+function hhmm(h: number, m: number) {
+ return `${h.toString().padStart(2, "0")}:${m.toString().padStart(2, "0")}`;
+}
+
+function buildHandoff(): HandoffTask[] {
+ const rng = makeRng(70720);
+ const rows: HandoffTask[] = [];
+ let woId = 48230;
+ for (let li = 1; li <= 6; li++) {
+ const line = `Line 0${li}`;
+ const count = 1 + Math.floor(rng() * 2); // 1-2 WOs per line
+ let cursor = 14 * 60 + Math.floor(rng() * 40); // minutes from midnight, start ~14:00
+ for (let k = 0; k < count; k++) {
+ const dur = 120 + Math.floor(rng() * 220); // 2h - ~6h
+ const startMin = cursor;
+ const endMin = Math.min(22 * 60, startMin + dur);
+ cursor = endMin + 10 + Math.floor(rng() * 20);
+ const status = STATUSES[Math.floor(rng() * STATUSES.length)];
+ const progress = status === "Setup" ? 5 + Math.floor(rng() * 20) : 30 + Math.floor(rng() * 65);
+ const crosses = endMin >= 22 * 60;
+ const handoff: HandoffState = crosses ? (rng() > 0.5 ? "Pending" : "Ready") : rng() > 0.6 ? "Acknowledged" : "Ready";
+ rows.push({
+ id: `WO-${woId++}`,
+ line,
+ machine: `MC-${100 + Math.floor(rng() * 800)}`,
+ product: PRODUCTS[Math.floor(rng() * PRODUCTS.length)],
+ status,
+ start: hhmm(Math.floor(startMin / 60), startMin % 60),
+ end: hhmm(Math.floor(endMin / 60), endMin % 60),
+ progress,
+ remaining: 40 + Math.floor(rng() * 900),
+ handoff,
+ outgoing: OUTGOING[li - 1],
+ incoming: INCOMING[li - 1],
+ crossesShift: crosses,
+ detail: {
+ notes:
+ status === "Stopped"
+ ? "Line stopped pending maintenance callout. Do not restart until inspection is signed off."
+ : crosses
+ ? "In progress at shift end — continue run, verify first-off part on resume."
+ : "Run completing this shift. Stage next changeover kit for incoming crew.",
+ checklist: [
+ { label: "Quality sign-off on last lot", done: rng() > 0.4 },
+ { label: "Tooling / consumables staged", done: rng() > 0.5 },
+ { label: "Open alarms cleared", done: status !== "Stopped" && rng() > 0.3 },
+ { label: "Handoff notes reviewed with incoming", done: handoff === "Acknowledged" },
+ ],
+ issues:
+ status === "Quality Hold"
+ ? ["Dimensional drift on OD — awaiting QA disposition"]
+ : status === "Material Hold"
+ ? ["Raw stock shortage — replenishment ETA next shift"]
+ : status === "Stopped"
+ ? ["Spindle fault code E-207", "Maintenance ticket #4821 open"]
+ : [],
+ },
+ });
+ }
+ }
+ return rows;
+}
+
+export const handoffTasks: HandoffTask[] = buildHandoff();
+
+/** ApexGantt task input derived from handoff rows (grouped by line). */
+export interface GanttTaskInput {
+ id: string;
+ name: string;
+ startTime: string;
+ endTime: string;
+ progress?: number;
+ parentId?: string;
+ barBackgroundColor?: string;
+ showSummaryBar?: boolean;
+}
+
+export function buildGanttTasks(): GanttTaskInput[] {
+ const lines = Array.from(new Set(handoffTasks.map((t) => t.line)));
+ const groups: GanttTaskInput[] = lines.map((line) => ({
+ id: line,
+ name: line,
+ startTime: `${SHIFT_DATE} 14:00`,
+ endTime: `${SHIFT_DATE} 22:00`,
+ showSummaryBar: true,
+ }));
+ const tasks: GanttTaskInput[] = handoffTasks.map((t) => ({
+ id: t.id,
+ name: `${t.id} · ${t.product}`,
+ startTime: `${SHIFT_DATE} ${t.start}`,
+ endTime: `${SHIFT_DATE} ${t.end}`,
+ progress: t.progress,
+ parentId: t.line,
+ barBackgroundColor: STATUS_COLOR[STATUS_TONE[t.status] ?? "running"],
+ }));
+ return [...groups, ...tasks];
+}
+
+export const shiftSummary = {
+ unitsProduced: 12846,
+ scrap: "2.1%",
+ downtimeMin: 74,
+ toHandoff: handoffTasks.filter((t) => t.crossesShift).length,
+ unresolved: handoffTasks.reduce((s, t) => s + t.detail.issues.length, 0),
+ outgoingSupervisor: "M. Delgado",
+ incomingSupervisor: "H. Vance",
+};
+
+/* ======================= DOWNTIME ======================= */
+
+export type DowntimeCategory = "Mechanical" | "Electrical" | "Material" | "Changeover" | "Quality";
+
+export interface DowntimeEvent {
+ id: string;
+ start: string;
+ end: string;
+ durationMin: number;
+ line: string;
+ machine: string;
+ reason: string;
+ category: DowntimeCategory;
+ operator: string;
+ status: "Open" | "Resolved";
+ planned: boolean;
+ detail: {
+ rootCause: string;
+ correctiveAction: string;
+ parts: string;
+ };
+}
+
+const REASONS: Array<{ reason: string; category: DowntimeCategory; planned: boolean }> = [
+ { reason: "Tool change", category: "Changeover", planned: true },
+ { reason: "Material shortage", category: "Material", planned: false },
+ { reason: "Part feed jam", category: "Mechanical", planned: false },
+ { reason: "Sensor fault", category: "Electrical", planned: false },
+ { reason: "Changeover", category: "Changeover", planned: true },
+ { reason: "Quality check", category: "Quality", planned: true },
+ { reason: "Power dip", category: "Electrical", planned: false },
+ { reason: "Spindle fault", category: "Mechanical", planned: false },
+];
+
+function buildDowntimeEvents(): DowntimeEvent[] {
+ const rng = makeRng(31415);
+ const rows: DowntimeEvent[] = [];
+ for (let i = 0; i < 22; i++) {
+ const r = REASONS[Math.floor(rng() * REASONS.length)];
+ const dur = 6 + Math.floor(rng() * 55);
+ const startMin = 14 * 60 + Math.floor(rng() * 420);
+ const endMin = startMin + dur;
+ rows.push({
+ id: `DT-${5100 + i}`,
+ start: hhmm(Math.floor(startMin / 60) % 24, startMin % 60),
+ end: hhmm(Math.floor(endMin / 60) % 24, endMin % 60),
+ durationMin: dur,
+ line: `Line 0${1 + Math.floor(rng() * 8)}`,
+ machine: `MC-${100 + Math.floor(rng() * 800)}`,
+ reason: r.reason,
+ category: r.category,
+ operator: OUTGOING[Math.floor(rng() * OUTGOING.length)],
+ status: rng() > 0.55 ? "Resolved" : "Open",
+ planned: r.planned,
+ detail: {
+ rootCause:
+ r.category === "Mechanical"
+ ? "Worn component exceeded wear limit; vibration signature confirmed."
+ : r.category === "Material"
+ ? "Upstream buffer depleted; replenishment lagged demand."
+ : r.category === "Electrical"
+ ? "Intermittent sensor signal traced to loose connector."
+ : "Scheduled activity per standard work.",
+ correctiveAction: "Component replaced / reset; verified first-off part within spec.",
+ parts: r.category === "Mechanical" ? "Bearing kit, seal" : r.category === "Electrical" ? "Proximity sensor" : "—",
+ },
+ });
+ }
+ return rows;
+}
+
+export const downtimeEvents: DowntimeEvent[] = buildDowntimeEvents();
+
+/** Pareto of downtime minutes by reason (desc) with cumulative %. */
+export interface ParetoPoint {
+ reason: string;
+ minutes: number;
+ cumulative: number;
+}
+export function buildDowntimePareto(): ParetoPoint[] {
+ const byReason = new Map();
+ downtimeEvents.forEach((e) => byReason.set(e.reason, (byReason.get(e.reason) ?? 0) + e.durationMin));
+ const sorted = [...byReason.entries()].sort((a, b) => b[1] - a[1]);
+ const total = sorted.reduce((s, [, m]) => s + m, 0);
+ let run = 0;
+ return sorted.map(([reason, minutes]) => {
+ run += minutes;
+ return { reason, minutes, cumulative: Math.round((run / total) * 100) };
+ });
+}
+export const downtimePareto = buildDowntimePareto();
+
+/** Downtime minutes by line. */
+export interface LineMinutes {
+ line: string;
+ minutes: number;
+}
+export function buildDowntimeByLine(): LineMinutes[] {
+ const byLine = new Map();
+ downtimeEvents.forEach((e) => byLine.set(e.line, (byLine.get(e.line) ?? 0) + e.durationMin));
+ return [...byLine.entries()].map(([line, minutes]) => ({ line, minutes })).sort((a, b) => a.line.localeCompare(b.line));
+}
+export const downtimeByLine = buildDowntimeByLine();
+
+/** Downtime minutes per shift over the last 12 shifts. */
+export function buildDowntimeTrend(): Array<{ label: string; minutes: number }> {
+ const rng = makeRng(2718);
+ return Array.from({ length: 12 }, (_, i) => ({ label: `S${i + 1}`, minutes: 40 + Math.round(rng() * 90) }));
+}
+export const downtimeTrend = buildDowntimeTrend();
+
+/** Category split for the planned/unplanned donut. */
+export const downtimeSplit = (() => {
+ const planned = downtimeEvents.filter((e) => e.planned).reduce((s, e) => s + e.durationMin, 0);
+ const unplanned = downtimeEvents.filter((e) => !e.planned).reduce((s, e) => s + e.durationMin, 0);
+ const total = planned + unplanned || 1;
+ return { planned, unplanned, plannedPct: Math.round((planned / total) * 100) };
+})();
+
+/** Top-offender machine cards (reuse equipment art keys). */
+export interface Offender {
+ id: string;
+ type: string;
+ line: string;
+ art: "cnc" | "lathe" | "press" | "robot" | "furnace" | "conveyor";
+ downtimeMin: number;
+ events: number;
+ topReason: string;
+ trend: number[];
+}
+export const offenders: Offender[] = [
+ { id: "MC-115", type: "Heat Furnace", line: "Line 01", art: "furnace", downtimeMin: 118, events: 5, topReason: "Sensor fault", trend: [12, 18, 15, 22, 19, 26, 24, 31] },
+ { id: "MC-714", type: "Turning Lathe", line: "Line 07", art: "lathe", downtimeMin: 96, events: 4, topReason: "Material shortage", trend: [20, 16, 22, 18, 24, 21, 25, 23] },
+ { id: "MC-304", type: "Injection Press", line: "Line 03", art: "press", downtimeMin: 84, events: 6, topReason: "Changeover", trend: [10, 14, 12, 16, 15, 18, 17, 20] },
+ { id: "MC-503", type: "Robotic Cell", line: "Line 05", art: "robot", downtimeMin: 61, events: 3, topReason: "Spindle fault", trend: [8, 12, 10, 14, 11, 16, 13, 15] },
+];
+
+const totalDowntime = downtimeEvents.reduce((s, e) => s + e.durationMin, 0);
+export const downtimeKpis = [
+ { label: "Total Downtime", value: `${totalDowntime} min`, delta: "-8% vs last shift", tone: "positive" as const },
+ { label: "Stoppages", value: `${downtimeEvents.length}`, delta: `${downtimeEvents.filter((e) => e.status === "Open").length} open`, tone: "warning" as const },
+ { label: "MTTR", value: `${Math.round(totalDowntime / downtimeEvents.length)} min`, delta: "mean time to repair", tone: "warning" as const },
+ { label: "Availability", value: "91.4%", delta: "+1.2 pts", tone: "positive" as const },
+];
diff --git a/projects/manufacturing/src/production-operations.module.css b/projects/manufacturing/src/production-operations.module.css
new file mode 100644
index 0000000..75b379a
--- /dev/null
+++ b/projects/manufacturing/src/production-operations.module.css
@@ -0,0 +1,1206 @@
+/* ===========================================================================
+ Production Operations dashboard — layout & chrome.
+ Ignite UI components (card, grid, tabs, input, button) supply the surfaces;
+ this file positions them and styles the custom cell/badge/chart content.
+ =========================================================================== */
+
+.page {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ min-height: 100%;
+ background: var(--ops-page-bg);
+ color: var(--ops-text);
+ font-family: var(--ig-font-family, "Inter", system-ui, sans-serif);
+}
+
+/* ---------------- top bar ---------------- */
+.topbar {
+ flex: 0 0 auto;
+ height: 64px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0 24px;
+ background: var(--ops-topbar-bg);
+ color: #fff;
+}
+
+.brand {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+}
+
+.brandMark {
+ width: 34px;
+ height: 34px;
+ border-radius: 9px;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ background: linear-gradient(135deg, #7c5cff, #5a34e6);
+ box-shadow: 0 2px 8px rgba(109, 74, 255, 0.45);
+}
+
+.brandText {
+ display: flex;
+ flex-direction: column;
+ line-height: 1.15;
+}
+
+.brandTitle {
+ font-size: 13px;
+ font-weight: 700;
+ letter-spacing: 0.05em;
+ color: #fff;
+}
+
+.brandSub {
+ font-size: 9px;
+ font-weight: 600;
+ letter-spacing: 0.14em;
+ color: #8b90a2;
+}
+
+.topbarRight {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+}
+
+.selector {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ padding: 7px 12px;
+ font-size: 12.5px;
+ color: #d8dbe4;
+ background: var(--ops-topbar-pill);
+ border: 1px solid var(--ops-topbar-border);
+ border-radius: 8px;
+ cursor: pointer;
+ font-family: inherit;
+}
+.selector svg {
+ color: #9aa0b0;
+}
+
+.live {
+ display: inline-flex;
+ align-items: center;
+ gap: 7px;
+ margin-left: 4px;
+ font-size: 12px;
+ font-weight: 700;
+ letter-spacing: 0.06em;
+ color: #43d17f;
+}
+.liveDot {
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ background: #33d17a;
+ box-shadow: 0 0 0 3px rgba(51, 209, 122, 0.22);
+}
+
+/* ---------------- content shell ---------------- */
+.content {
+ flex: 1 1 auto;
+ width: 100%;
+ max-width: 1520px;
+ margin: 0 auto;
+ box-sizing: border-box;
+ padding: 20px 28px 32px;
+ display: flex;
+ flex-direction: column;
+ gap: 18px;
+}
+
+.pageHead {
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-between;
+ gap: 16px;
+}
+.page .pageTitle {
+ font-size: 26px;
+ font-weight: 700;
+ letter-spacing: -0.01em;
+ color: var(--ops-text-strong);
+ line-height: 1.2;
+}
+.page .pageSubtitle {
+ margin-top: 5px;
+ font-size: 13.5px;
+ color: var(--ops-text-muted);
+}
+.synced {
+ font-size: 12.5px;
+ color: var(--ops-text-faint);
+ white-space: nowrap;
+}
+
+/* ---------------- tabs ---------------- */
+.tabs {
+ border-bottom: 1px solid var(--ops-border);
+ margin-bottom: 2px;
+ /* We render tab content OUTSIDE the tabs, so the tab strip must size to its
+ header only — otherwise the empty body area stretches to fill height. */
+ height: auto;
+ flex: 0 0 auto;
+}
+.tabs::part(inner) {
+ height: auto;
+}
+.tabs::part(selected-indicator) {
+ background: var(--ops-violet);
+}
+.tabs igc-tab::part(tab-header),
+.tabs igc-tab::part(content) {
+ text-transform: none;
+ font-size: 13.5px;
+ letter-spacing: 0;
+}
+.tabs igc-tab::part(tab-body) {
+ display: none;
+}
+
+/* ---------------- card surface ---------------- */
+.card {
+ display: block;
+ background: var(--ops-surface);
+ border: 1px solid var(--ops-border);
+ border-radius: 12px;
+ box-shadow: 0 1px 3px rgba(20, 22, 31, 0.05);
+ overflow: hidden;
+}
+
+/* ---------------- KPI row ---------------- */
+.kpiRow {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 16px;
+}
+.kpiInner {
+ padding: 16px 18px;
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+.kpiTop {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 8px;
+}
+.kpiLabel {
+ font-size: 11px;
+ font-weight: 600;
+ letter-spacing: 0.06em;
+ text-transform: uppercase;
+ color: var(--ops-text-muted);
+}
+.kpiPill {
+ font-size: 11px;
+ font-weight: 600;
+ padding: 3px 8px;
+ border-radius: 999px;
+ white-space: nowrap;
+}
+.pill_positive {
+ color: var(--ops-green);
+ background: var(--ops-green-soft);
+}
+.pill_warning {
+ color: var(--ops-amber);
+ background: var(--ops-amber-soft);
+}
+.pill_negative {
+ color: var(--ops-red);
+ background: var(--ops-red-soft);
+}
+.kpiValue {
+ font-size: 30px;
+ font-weight: 700;
+ letter-spacing: -0.015em;
+ line-height: 1;
+ color: var(--ops-text-strong);
+}
+
+/* ---------------- main area ---------------- */
+.mainArea {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) 360px;
+ gap: 16px;
+ align-items: start;
+}
+
+/* ---- orders panel ---- */
+.ordersToolbar {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 14px 16px;
+ border-bottom: 1px solid var(--ops-border);
+}
+.search {
+ width: 236px;
+ --ig-size: var(--ig-size-small);
+}
+.searchIcon {
+ display: inline-flex;
+ align-items: center;
+ color: var(--ops-text-faint);
+}
+.filterDrop,
+.exportDrop {
+ display: inline-flex;
+}
+.filter {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ padding: 8px 11px;
+ font-size: 12.5px;
+ color: var(--ops-text);
+ background: #fff;
+ border: 1px solid var(--ops-border-strong);
+ border-radius: 8px;
+ cursor: pointer;
+ white-space: nowrap;
+ font-family: inherit;
+}
+.filter svg {
+ color: var(--ops-text-faint);
+}
+.filterLabel {
+ color: var(--ops-text-muted);
+}
+.toolbarSpacer {
+ flex: 1 1 auto;
+}
+.exportBtn {
+ --ig-size: var(--ig-size-small);
+}
+.exportBtn::part(base) {
+ border-radius: 8px;
+ font-weight: 600;
+}
+.exportIcon {
+ display: inline-flex;
+ align-items: center;
+}
+
+.gridWrap {
+ width: 100%;
+}
+.grid {
+ width: 100%;
+ display: block;
+}
+
+/* ---- grid cell content ---- */
+.woLink {
+ color: var(--ops-violet);
+ font-weight: 600;
+}
+.completedCell {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ gap: 5px;
+ height: 100%;
+ padding: 4px 0;
+}
+.completedValue {
+ font-weight: 600;
+ color: var(--ops-text);
+}
+.progressTrack {
+ display: block;
+ width: 100%;
+ max-width: 104px;
+ height: 5px;
+ border-radius: 3px;
+ background: var(--ops-border);
+ overflow: hidden;
+}
+.progressFill {
+ display: block;
+ height: 100%;
+ border-radius: 3px;
+ background: var(--ops-violet);
+}
+.scrapNormal {
+ color: var(--ops-text);
+}
+.scrapHigh {
+ color: var(--ops-red);
+ font-weight: 600;
+}
+.statusBadge {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ padding: 3px 9px 3px 8px;
+ border-radius: 999px;
+ font-size: 11.5px;
+ font-weight: 600;
+ white-space: nowrap;
+}
+.statusDot {
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background: currentColor;
+}
+.tone_running {
+ color: var(--ops-green);
+ background: var(--ops-green-soft);
+}
+.tone_hold {
+ color: var(--ops-amber);
+ background: var(--ops-amber-soft);
+}
+.tone_setup {
+ color: var(--ops-blue);
+ background: var(--ops-blue-soft);
+}
+.tone_stopped {
+ color: var(--ops-red);
+ background: var(--ops-red-soft);
+}
+
+/* ---- orders footer ---- */
+.ordersFooter {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 12px 16px;
+ border-top: 1px solid var(--ops-border);
+ font-size: 12px;
+ color: var(--ops-text-muted);
+}
+.footDivider {
+ display: inline-block;
+ width: 1px;
+ height: 10px;
+ margin: 0 10px;
+ vertical-align: middle;
+ background: var(--ops-border-strong);
+}
+.footRight {
+ white-space: nowrap;
+}
+
+/* ---- detail panel ---- */
+.detailBody {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ padding: 18px;
+}
+.detailHead {
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+}
+.page .detailTitle {
+ font-size: 18px;
+ font-weight: 700;
+ color: var(--ops-text-strong);
+}
+.page .detailSub {
+ font-size: 12.5px;
+ color: var(--ops-text-muted);
+}
+
+.detailMetrics {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 10px;
+}
+.metricBox {
+ border: 1px solid var(--ops-border);
+ border-radius: 10px;
+ padding: 10px 12px;
+ background: #fbfbfd;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+.metricLabel {
+ font-size: 10.5px;
+ font-weight: 600;
+ letter-spacing: 0.05em;
+ text-transform: uppercase;
+ color: var(--ops-text-muted);
+}
+.metricValue {
+ font-size: 17px;
+ font-weight: 700;
+ color: var(--ops-text-strong);
+}
+
+/* ---- vibration chart ---- */
+.chartBlock {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+.chartHead {
+ display: flex;
+ align-items: baseline;
+ justify-content: space-between;
+}
+.chartTitle {
+ font-size: 11.5px;
+ color: var(--ops-text-muted);
+}
+.chartValue {
+ font-size: 15px;
+ font-weight: 700;
+ color: var(--ops-violet);
+}
+.chartSvg {
+ width: 100%;
+ height: 84px;
+ display: block;
+}
+.chartLine {
+ fill: none;
+ stroke: var(--ops-violet);
+ stroke-width: 2;
+ stroke-linejoin: round;
+ stroke-linecap: round;
+ vector-effect: non-scaling-stroke;
+}
+.chartTarget {
+ stroke: var(--ops-amber);
+ stroke-width: 1.5;
+ stroke-dasharray: 4 4;
+ vector-effect: non-scaling-stroke;
+ opacity: 0.85;
+}
+
+/* ---- sensor stats ---- */
+.sensorRow {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 10px;
+}
+.sensorBox {
+ background: #f5f6f9;
+ border-radius: 10px;
+ padding: 12px 8px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 4px;
+}
+.sensorValue {
+ font-size: 16px;
+ font-weight: 700;
+ color: var(--ops-text-strong);
+}
+.sensorLabel {
+ font-size: 10.5px;
+ color: var(--ops-text-muted);
+}
+
+/* ---- events + note ---- */
+.sectionLabel {
+ display: block;
+ margin-bottom: 8px;
+ font-size: 10.5px;
+ font-weight: 600;
+ letter-spacing: 0.06em;
+ text-transform: uppercase;
+ color: var(--ops-text-muted);
+}
+.eventsList {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+.eventItem {
+ display: grid;
+ grid-template-columns: 56px 1fr auto;
+ align-items: center;
+ gap: 8px;
+ padding: 8px 0;
+ border-bottom: 1px solid var(--ops-border);
+ font-size: 12.5px;
+}
+.eventItem:last-child {
+ border-bottom: none;
+}
+.eventTime {
+ font-size: 11.5px;
+ color: var(--ops-text-muted);
+}
+.eventText {
+ color: var(--ops-text);
+}
+.eventAgo {
+ font-size: 11.5px;
+ font-weight: 600;
+ color: var(--ops-text-faint);
+}
+.noteBox {
+ background: #f5f6f9;
+ border-radius: 10px;
+ padding: 12px;
+ font-size: 12.5px;
+ line-height: 1.5;
+ color: var(--ops-text);
+}
+
+/* ---------------- built-in paginator ---------------- */
+.ordersPanel igc-paginator {
+ --ig-size: var(--ig-size-small);
+ border-top: 1px solid var(--ops-border);
+ font-size: 12.5px;
+}
+
+/* ---------------- dropdown menu items ---------------- */
+igc-dropdown-item::part(content) {
+ font-size: 12.5px;
+}
+
+/* ---------------- master-detail row ---------------- */
+.detailRow {
+ display: grid;
+ grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr);
+ gap: 28px;
+ padding: 18px 20px 20px;
+ background: #fbfbfd;
+}
+.mdBlock {
+ min-width: 0;
+}
+.mdTitle {
+ font-size: 13px;
+ font-weight: 700;
+ color: var(--ops-text-strong);
+ margin-bottom: 12px;
+}
+.mdDot {
+ color: var(--ops-text-faint);
+ margin: 0 2px;
+}
+.mdTable {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 12.5px;
+}
+.mdTable thead th {
+ text-align: left;
+ font-size: 10.5px;
+ font-weight: 600;
+ letter-spacing: 0.04em;
+ text-transform: uppercase;
+ color: var(--ops-text-muted);
+ padding: 6px 10px;
+ border-bottom: 1px solid var(--ops-border);
+}
+.mdTable tbody td {
+ padding: 9px 10px;
+ border-bottom: 1px solid var(--ops-border);
+ color: var(--ops-text);
+}
+.mdFailRow {
+ background: var(--ops-red-soft);
+}
+.mdFailText {
+ color: var(--ops-red);
+ font-weight: 600;
+}
+.mdPass,
+.mdFail {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ font-weight: 600;
+}
+.mdPass {
+ color: var(--ops-green);
+}
+.mdFail {
+ color: var(--ops-red);
+}
+.mdNote {
+ margin-top: 10px;
+ font-size: 11.5px;
+ color: var(--ops-text-muted);
+}
+
+/* defect pareto */
+.paretoList {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+.paretoRow {
+ display: grid;
+ grid-template-columns: 92px 1fr 18px;
+ align-items: center;
+ gap: 10px;
+ font-size: 12px;
+}
+.paretoLabel {
+ color: var(--ops-text);
+ white-space: nowrap;
+}
+.paretoTrack {
+ height: 12px;
+ border-radius: 4px;
+ background: #ecebf5;
+ overflow: hidden;
+}
+.paretoFill {
+ display: block;
+ height: 100%;
+ border-radius: 4px;
+ background: linear-gradient(90deg, #7c5cff, #6d4aff);
+}
+.paretoCount {
+ font-weight: 700;
+ color: var(--ops-text-strong);
+ text-align: right;
+}
+.trendBlock {
+ margin-top: 16px;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+.trendSvg {
+ width: 100%;
+ height: 46px;
+ display: block;
+}
+.trendLine {
+ fill: none;
+ stroke: var(--ops-violet);
+ stroke-width: 2;
+ stroke-linejoin: round;
+ stroke-linecap: round;
+ vector-effect: non-scaling-stroke;
+}
+.trendCaption {
+ font-size: 10.5px;
+ color: var(--ops-text-faint);
+}
+
+/* ---------------- tab panes ---------------- */
+.woPane {
+ display: flex;
+ flex-direction: column;
+ gap: 18px;
+}
+.placeholder {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 6px;
+ min-height: 320px;
+ border: 1px dashed var(--ops-border-strong);
+ border-radius: 12px;
+ background: #fff;
+}
+.placeholderTitle {
+ font-size: 18px;
+ font-weight: 700;
+ color: var(--ops-text-strong);
+}
+.placeholderText {
+ font-size: 13px;
+ color: var(--ops-text-muted);
+}
+
+/* ---------------- Equipment card view ---------------- */
+.eqGrid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(310px, 1fr));
+ gap: 18px;
+}
+.eqCard {
+ display: flex;
+ flex-direction: column;
+}
+.eqMedia {
+ position: relative;
+ height: 138px;
+ width: 100%;
+ overflow: hidden;
+}
+/* IgrCardMedia stretches its single slotted child to fill; this wrapper is that
+ child, and it hosts the absolutely-positioned art / photo / overlays. */
+.eqMediaInner {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+}
+.eqMediaTall {
+ height: 180px;
+ border-radius: 12px;
+}
+.eqArt {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ display: block;
+}
+.eqPhoto {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ display: block;
+}
+.eqScrim {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(180deg, rgba(15, 16, 22, 0.28) 0%, rgba(15, 16, 22, 0) 42%);
+ pointer-events: none;
+}
+.eqStatus {
+ position: absolute;
+ top: 10px;
+ left: 10px;
+ background: rgba(255, 255, 255, 0.94) !important;
+ box-shadow: 0 1px 3px rgba(20, 22, 31, 0.18);
+}
+.eqOee {
+ position: absolute;
+ top: 8px;
+ right: 8px;
+ width: 48px;
+ height: 48px;
+ display: grid;
+ place-items: center;
+ border-radius: 50%;
+ background: rgba(255, 255, 255, 0.94);
+ box-shadow: 0 1px 4px rgba(20, 22, 31, 0.2);
+}
+.eqOeeSvg {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 48px;
+ height: 48px;
+}
+.eqOeeTrack {
+ fill: none;
+ stroke: #e6e6ef;
+ stroke-width: 4;
+}
+.eqOeeValue {
+ fill: none;
+ stroke: var(--ops-violet);
+ stroke-width: 4;
+ stroke-linecap: round;
+}
+.eqOeeText {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ line-height: 1;
+}
+.eqOeeText b {
+ font-size: 13px;
+ font-weight: 700;
+ color: var(--ops-text-strong);
+}
+.eqOeeText small {
+ font-size: 6.5px;
+ font-weight: 600;
+ letter-spacing: 0.08em;
+ color: var(--ops-text-muted);
+}
+.eqTitle {
+ font-size: 14.5px;
+ font-weight: 700;
+ color: var(--ops-text-strong);
+}
+.eqSub {
+ font-size: 12px;
+ color: var(--ops-text-muted);
+}
+.eqMeters {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+.eqMeter {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+.eqMeterTop {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ font-size: 12px;
+ color: var(--ops-text-muted);
+}
+.eqMeterTop b {
+ color: var(--ops-text-strong);
+ font-weight: 700;
+}
+.eqBar {
+ display: block;
+ height: 6px;
+ border-radius: 3px;
+ background: #ecebf5;
+ overflow: hidden;
+}
+.eqBarFill {
+ display: block;
+ height: 100%;
+ border-radius: 3px;
+ background: linear-gradient(90deg, #7c5cff, #6d4aff);
+}
+.eqStats {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 10px;
+ margin-top: 14px;
+}
+.eqStat {
+ background: #f5f6f9;
+ border-radius: 10px;
+ padding: 10px 12px;
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+}
+.eqStatValue {
+ font-size: 14px;
+ font-weight: 700;
+ color: var(--ops-text-strong);
+}
+.eqStatLabel {
+ font-size: 10.5px;
+ color: var(--ops-text-muted);
+}
+.eqBtn {
+ width: 100%;
+}
+
+/* large OEE ring (dialog hero) */
+.eqOeeLg {
+ position: absolute;
+ top: 12px;
+ right: 12px;
+ display: grid;
+ place-items: center;
+ border-radius: 50%;
+ background: rgba(255, 255, 255, 0.94);
+ box-shadow: 0 2px 6px rgba(20, 22, 31, 0.25);
+}
+.eqOeeLg .eqOeeText b {
+ font-size: 18px;
+}
+.eqOeeLg .eqOeeText small {
+ font-size: 8px;
+}
+
+/* ---------------- equipment detail dialog ---------------- */
+.eqDialog {
+ --ig-size: var(--ig-size-medium);
+}
+.eqDialog::part(base) {
+ width: min(520px, 92vw);
+ border-radius: 14px;
+}
+.dlgBody {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ padding-top: 4px;
+}
+.dlgHero {
+ border-radius: 12px;
+ overflow: hidden;
+}
+.dlgMeta {
+ font-size: 13px;
+ color: var(--ops-text-muted);
+ margin-top: -4px;
+}
+.dlgStats {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 10px;
+}
+.dlgStat {
+ background: #f5f6f9;
+ border-radius: 10px;
+ padding: 11px 12px;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+.dlgStatLabel {
+ font-size: 10.5px;
+ font-weight: 600;
+ letter-spacing: 0.04em;
+ text-transform: uppercase;
+ color: var(--ops-text-muted);
+}
+.dlgStatValue {
+ font-size: 16px;
+ font-weight: 700;
+ color: var(--ops-text-strong);
+}
+.dlgOutput {
+ display: flex;
+ flex-direction: column;
+ gap: 7px;
+}
+.dlgFooter {
+ display: flex;
+ justify-content: flex-end;
+ gap: 10px;
+}
+
+/* ---------------- section headers (shift/downtime) ---------------- */
+.sectionHead {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ gap: 12px;
+ padding: 14px 16px;
+ border-bottom: 1px solid var(--ops-border);
+}
+.sectionTitle {
+ display: block;
+ font-size: 14px;
+ font-weight: 700;
+ color: var(--ops-text-strong);
+}
+.sectionSub {
+ display: block;
+ margin-top: 3px;
+ font-size: 12px;
+ color: var(--ops-text-muted);
+}
+
+/* ---------------- Shift Handoff: Gantt ---------------- */
+.ganttCard {
+ padding: 0;
+}
+.ganttWrap {
+ padding: 12px 14px 16px;
+ min-height: 0;
+}
+.ganttLegend {
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ flex-wrap: wrap;
+}
+.legendItem {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ font-size: 11.5px;
+ color: var(--ops-text-muted);
+}
+.legendDot {
+ width: 9px;
+ height: 9px;
+ border-radius: 3px;
+}
+.crewCell {
+ color: var(--ops-text);
+}
+.crewArrow {
+ color: var(--ops-text-faint);
+ margin: 0 3px;
+}
+
+/* handoff detail: checklist + issues */
+.checklist {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 9px;
+}
+.checkItem {
+ display: flex;
+ align-items: center;
+ gap: 9px;
+ font-size: 12.5px;
+ color: var(--ops-text);
+}
+.checkDone {
+ color: var(--ops-text-muted);
+ text-decoration: line-through;
+}
+.issueList {
+ list-style: none;
+ margin: 10px 0 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+.issueItem {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 12.5px;
+ color: var(--ops-red);
+}
+.issueDot {
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background: var(--ops-red);
+ flex: 0 0 6px;
+}
+
+/* ---------------- Downtime charts ---------------- */
+.dtCharts {
+ display: grid;
+ grid-template-columns: 1.6fr 1fr;
+ gap: 16px;
+}
+.dtWide {
+ min-width: 0;
+}
+.chartCardBody {
+ padding: 16px 16px 12px;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ min-width: 0;
+}
+
+/* planned/unplanned donut */
+.donutWrap {
+ display: flex;
+ align-items: center;
+ gap: 18px;
+ padding: 8px 0 4px;
+}
+.donut {
+ position: relative;
+ width: 128px;
+ height: 128px;
+ border-radius: 50%;
+ flex: 0 0 128px;
+}
+.donutHole {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ width: 82px;
+ height: 82px;
+ border-radius: 50%;
+ background: #fff;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+.donutHole b {
+ font-size: 20px;
+ font-weight: 700;
+ color: var(--ops-text-strong);
+}
+.donutHole small {
+ font-size: 10.5px;
+ color: var(--ops-text-muted);
+}
+.donutLegend {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ font-size: 12px;
+}
+
+/* downtime detail */
+.dtDetailGrid {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 12px 20px;
+}
+.dtDetailText {
+ margin: 3px 0 0;
+ font-size: 12.5px;
+ color: var(--ops-text);
+ line-height: 1.45;
+}
+
+/* ---------------- Downtime offender cards ---------------- */
+.offMedia {
+ position: relative;
+ height: 116px;
+ width: 100%;
+ overflow: hidden;
+}
+.offMinutes {
+ position: absolute;
+ left: 12px;
+ bottom: 10px;
+ font-size: 26px;
+ font-weight: 800;
+ color: #fff;
+ line-height: 1;
+ text-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
+}
+.offMinutes small {
+ font-size: 11px;
+ font-weight: 600;
+ margin-left: 3px;
+ opacity: 0.9;
+}
+.offBody {
+ padding: 12px 14px 14px;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+.offHead {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+}
+
+/* ---------------- responsive ---------------- */
+@media (max-width: 1120px) {
+ .mainArea {
+ grid-template-columns: 1fr;
+ }
+ .kpiRow {
+ grid-template-columns: repeat(2, 1fr);
+ }
+ .dtCharts {
+ grid-template-columns: 1fr;
+ }
+}
+@media (max-width: 620px) {
+ .kpiRow {
+ grid-template-columns: 1fr;
+ }
+ .topbarRight .selector {
+ display: none;
+ }
+}
diff --git a/projects/manufacturing/src/production-operations.tsx b/projects/manufacturing/src/production-operations.tsx
new file mode 100644
index 0000000..0619096
--- /dev/null
+++ b/projects/manufacturing/src/production-operations.tsx
@@ -0,0 +1,482 @@
+import { useEffect, useRef, useState, lazy, Suspense } from "react";
+import {
+ IgrGrid,
+ IgrColumn,
+ IgrPaginator,
+ IgrStringFilteringOperand,
+ type IgrCellTemplateContext,
+ type IgrGridMasterDetailContext,
+} from "igniteui-react-grids";
+import {
+ IgrCard,
+ IgrButton,
+ IgrInput,
+ IgrTabs,
+ IgrTab,
+ IgrDropdown,
+ IgrDropdownItem,
+} from "igniteui-react";
+import styles from "./production-operations.module.css";
+import EquipmentView from "./equipment-view";
+import { VibrationChart, ParetoChart, TrendChart } from "./charts";
+
+// Heavy tabs (ApexGantt / DV charts) are code-split so they load on demand.
+const ShiftHandoffView = lazy(() => import("./shift-handoff-view"));
+const DowntimeView = lazy(() => import("./downtime-view"));
+import {
+ workOrders,
+ kpis,
+ detailMetrics,
+ sensorStats,
+ recentEvents,
+ gridSummary,
+ STATUS_TONE,
+ LINE_OPTIONS,
+ STATUS_OPTIONS,
+ DUE_OPTIONS,
+ type WorkOrder,
+} from "./data";
+
+/* ----------------------------- inline icons ----------------------------- */
+const SearchIcon = () => (
+
+);
+const ChevronDown = () => (
+
+);
+const ExportIcon = () => (
+
+);
+
+const PAGE_TABS = ["Work Orders", "Equipment", "Downtime", "Shift Handoff"];
+const numberFmt = (v: unknown) => Number(v).toLocaleString("en-US");
+
+const csvCell = (v: unknown) => {
+ const text = String(v ?? "").replace(/"/g, '""');
+ return `"${text}"`;
+};
+
+/* --------------------------- grid cell templates --------------------------- */
+const completedCell = (ctx: IgrCellTemplateContext) => {
+ const row = ctx.cell.row.data as WorkOrder;
+ const pct = Math.min(100, Math.round((row.completed / row.planned) * 100));
+ return (
+
+ {numberFmt(row.completed)}
+
+
+
+
+ );
+};
+
+const scrapCell = (ctx: IgrCellTemplateContext) => {
+ const scrap = ctx.cell.value as number;
+ const high = scrap >= 3;
+ return {scrap.toFixed(1)}%;
+};
+
+const statusCell = (ctx: IgrCellTemplateContext) => {
+ const label = ctx.cell.value as string;
+ const tone = STATUS_TONE[label] ?? "running";
+ return (
+
+
+ {label}
+
+ );
+};
+
+/* --------------------- master-detail: measurement + pareto --------------------- */
+const detailTemplate = (ctx: IgrGridMasterDetailContext) => {
+ const row = ctx.implicit as WorkOrder;
+ return (
+
+ {/* measurement results */}
+
+
+ Measurement Results · {row.product}
+
+
+
+
+ | Characteristic |
+ Nominal |
+ Tolerance |
+ Measured |
+ Status |
+
+
+
+ {row.detail.measurements.map((m) => (
+
+ | {m.characteristic} |
+ {m.nominal} |
+ {m.tolerance} |
+ {m.measured} |
+
+
+
+ {m.pass ? "Pass" : "Fail"}
+
+ |
+
+ ))}
+
+
+
+ {row.detail.failed} of {row.detail.sampled} sampled units exceeded specification. Similar
+ failures occurred in the prior supplier lot.
+
+
+
+ {/* defect pareto */}
+
+
+ Defect Pareto · This Lot
+
+
+
+
+ Previous 10 lots
+
+
+
+ );
+};
+
+/* ----------------------------- filter dropdown ----------------------------- */
+function FilterDropdown({
+ label,
+ value,
+ options,
+ onSelect,
+}: {
+ label: string;
+ value: string;
+ options: string[];
+ onSelect: (v: string) => void;
+}) {
+ return (
+ ) => {
+ const v = e.detail?.value;
+ if (v) onSelect(v);
+ }}
+ >
+
+ {options.map((opt) => (
+
+ {opt}
+
+ ))}
+
+ );
+}
+
+/* --------------------------------- view --------------------------------- */
+export default function ProductionOperations() {
+ const gridRef = useRef(null);
+ const [activeTab, setActiveTab] = useState("Work Orders");
+ const [lineFilter, setLineFilter] = useState("All");
+ const [statusFilter, setStatusFilter] = useState("All");
+ const [dueFilter, setDueFilter] = useState("All");
+
+ useEffect(() => {
+ gridRef.current?.selectRows(["WO-48192"], true);
+ }, []);
+
+ // Full-text search using the grid's built-in find/highlight API.
+ const onSearch = (raw: unknown) => {
+ const grid = gridRef.current;
+ if (!grid) return;
+ const term = typeof raw === "string" ? raw : "";
+ if (term.trim()) {
+ grid.findNext(term.trim());
+ } else {
+ grid.clearSearch();
+ }
+ };
+
+ const applyFilter = (field: string, value: string) => {
+ const grid = gridRef.current;
+ if (!grid) return;
+ if (value === "All") {
+ grid.clearFilter(field);
+ } else {
+ grid.filter(field, value, IgrStringFilteringOperand.instance().condition("equals"));
+ }
+ };
+
+ const onExportCSV = () => {
+ const headers = [
+ "Work Order",
+ "Product",
+ "Line",
+ "Machine",
+ "Planned",
+ "Completed",
+ "Scrap",
+ "Cycle",
+ "Status",
+ "Due",
+ "Updated",
+ ];
+ const lines = workOrders.map((row) =>
+ [
+ row.workOrder,
+ row.product,
+ row.line,
+ row.machine,
+ row.planned,
+ row.completed,
+ `${row.scrap.toFixed(1)}%`,
+ `${row.cycle}s`,
+ row.status,
+ row.due,
+ row.updated,
+ ]
+ .map(csvCell)
+ .join(",")
+ );
+
+ const csv = [headers.map(csvCell).join(","), ...lines].join("\n");
+ const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
+ const link = document.createElement("a");
+ link.href = URL.createObjectURL(blob);
+ link.download = "WorkOrders.csv";
+ link.click();
+ URL.revokeObjectURL(link.href);
+ };
+
+ return (
+
+ {/* ============ top bar ============ */}
+
+
+ {/* ============ content ============ */}
+
+
+
+
Production Operations
+
+ Monitor active work orders, line performance, and production exceptions.
+
+
+
Last synchronized 3 sec ago
+
+
+ ) => setActiveTab(e.detail?.label ?? "Work Orders")}
+ >
+ {PAGE_TABS.map((t) => (
+
+ ))}
+
+
+ {/* ===== Equipment tab ===== */}
+ {activeTab === "Equipment" && }
+
+ {/* ===== Shift Handoff (ApexGantt + Ignite grid) ===== */}
+ {activeTab === "Shift Handoff" && (
+ Loading shift handoff… }>
+
+
+ )}
+
+ {/* ===== Downtime ===== */}
+ {activeTab === "Downtime" && (
+ Loading downtime…}>
+
+
+ )}
+
+ {/* ===== Work Orders tab (kept mounted to preserve grid state) ===== */}
+
+ {/* KPI row */}
+
+ {kpis.map((kpi) => (
+
+
+
+ {kpi.label}
+ {kpi.delta}
+
+
{kpi.value}
+
+
+ ))}
+
+
+ {/* main two-column area */}
+
+ {/* orders panel */}
+
+
+ ) => onSearch(e.detail)}
+ >
+
+
+
+
+ { setLineFilter(v); applyFilter("line", v); }} />
+ { setStatusFilter(v); applyFilter("status", v); }} />
+ { setDueFilter(v); applyFilter("dueWindow", v); }} />
+
+
+
+
+
+
+ Export
+
+ CSV (.csv)
+
+
+
+
+
+
+
+
+
+
+
+
+ `${v}s`} />
+
+
+
+
+
+
+
+
+
+ {numberFmt(gridSummary.total)} work orders
+
+ Planned: {numberFmt(gridSummary.planned)}
+
+ Completed: {numberFmt(gridSummary.completed)}
+
+ Weighted scrap: {gridSummary.weightedScrap}
+
+ Expand a row for measurement & defect analysis
+
+
+
+ {/* detail panel */}
+
+
+
+
WO-48192
+
Drive Housing · Line 03 · MC-307
+
+
+
+ {detailMetrics.map((m) => (
+
+ {m.label}
+ {m.value}
+
+ ))}
+
+
+
+
+ Spindle vibration · last 30 min
+ 4.2
+
+
+
+
+
+ {sensorStats.map((s) => (
+
+ {s.value}
+ {s.label}
+
+ ))}
+
+
+
+
Recent Events
+
+ {recentEvents.map((ev) => (
+ -
+ {ev.time}
+ {ev.text}
+ {ev.ago}
+
+ ))}
+
+
+
+
+
Operator Note
+
+ Vibration trending upward after tool change. Maintenance notified for post-shift
+ inspection.
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/projects/manufacturing/src/shift-handoff-view.tsx b/projects/manufacturing/src/shift-handoff-view.tsx
new file mode 100644
index 0000000..736f0b7
--- /dev/null
+++ b/projects/manufacturing/src/shift-handoff-view.tsx
@@ -0,0 +1,201 @@
+import { useRef } from "react";
+import ApexGanttChart from "./apex-gantt";
+import {
+ IgrGrid,
+ IgrColumn,
+ type IgrCellTemplateContext,
+ type IgrGridMasterDetailContext,
+} from "igniteui-react-grids";
+import { IgrCard } from "igniteui-react";
+import styles from "./production-operations.module.css";
+import { STATUS_TONE } from "./data";
+import {
+ handoffTasks,
+ buildGanttTasks,
+ shiftSummary,
+ STATUS_COLOR,
+ type HandoffTask,
+ type HandoffState,
+} from "./ops-extra-data";
+
+const ganttTasks = buildGanttTasks();
+
+const CheckIcon = ({ on }: { on: boolean }) => (
+
+);
+
+/* ---- grid cell templates ---- */
+const statusCell = (ctx: IgrCellTemplateContext) => {
+ const label = ctx.cell.value as string;
+ const tone = STATUS_TONE[label] ?? "running";
+ return (
+
+
+ {label}
+
+ );
+};
+
+const progressCell = (ctx: IgrCellTemplateContext) => {
+ const pct = ctx.cell.value as number;
+ return (
+
+ {pct}%
+
+
+
+
+ );
+};
+
+const handoffToneClass: Record = {
+ Acknowledged: styles.tone_running,
+ Ready: styles.tone_setup,
+ Pending: styles.tone_hold,
+};
+const handoffCell = (ctx: IgrCellTemplateContext) => {
+ const v = ctx.cell.value as HandoffState;
+ return (
+
+
+ {v}
+
+ );
+};
+
+const crewCell = (ctx: IgrCellTemplateContext) => {
+ const row = ctx.cell.row.data as HandoffTask;
+ return (
+
+ {row.outgoing} → {row.incoming}
+
+ );
+};
+
+const detailTemplate = (ctx: IgrGridMasterDetailContext) => {
+ const row = ctx.implicit as HandoffTask;
+ return (
+
+
+
Handoff Checklist · {row.id}
+
+ {row.detail.checklist.map((c) => (
+ -
+
+ {c.label}
+
+ ))}
+
+
+
+
Notes & Open Issues
+
{row.detail.notes}
+ {row.detail.issues.length > 0 ? (
+
+ {row.detail.issues.map((i) => (
+ -
+ {i}
+
+ ))}
+
+ ) : (
+
No open issues — clean handoff.
+ )}
+
+
+ );
+};
+
+export default function ShiftHandoffView() {
+ const gridRef = useRef(null);
+
+ return (
+
+ {/* summary cards */}
+
+ {[
+ { label: "Units Produced", value: shiftSummary.unitsProduced.toLocaleString(), delta: `Scrap ${shiftSummary.scrap}`, tone: "positive" as const },
+ { label: "Downtime", value: `${shiftSummary.downtimeMin} min`, delta: "this shift", tone: "warning" as const },
+ { label: "To Hand Off", value: `${shiftSummary.toHandoff}`, delta: "crossing shift end", tone: "warning" as const },
+ { label: "Unresolved Issues", value: `${shiftSummary.unresolved}`, delta: "need attention", tone: "negative" as const },
+ ].map((k) => (
+
+
+
+ {k.label}
+ {k.delta}
+
+
{k.value}
+
+
+ ))}
+
+
+ {/* Gantt timeline */}
+
+
+
+ Shift Schedule · 2–10 PM
+
+ {shiftSummary.outgoingSupervisor} → {shiftSummary.incomingSupervisor} · click a bar to inspect the work order
+
+
+
+ {(["running", "setup", "hold", "stopped"] as const).map((t) => (
+
+
+ {t === "running" ? "Running" : t === "setup" ? "Setup" : t === "hold" ? "Hold" : "Stopped"}
+
+ ))}
+
+
+
+
{
+ const id = ids[0];
+ if (id) gridRef.current?.selectRows([id], true);
+ }}
+ />
+
+
+
+ {/* Handoff grid with master-detail */}
+
+
+ Work Order Handoff
+ Expand a row for the handoff checklist & open issues
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/projects/manufacturing/src/theme.css b/projects/manufacturing/src/theme.css
new file mode 100644
index 0000000..b684273
--- /dev/null
+++ b/projects/manufacturing/src/theme.css
@@ -0,0 +1,90 @@
+/*
+ * Production Operations theme layer.
+ * Base component styles come from the stock Indigo light theme imported in main.tsx.
+ * Here we re-seed the primary ramp to the design's violet, re-seed secondary to the
+ * dark toolbar slate, and expose semantic tokens the custom view chrome consumes.
+ * (Ramps generated via the Ignite UI Theming MCP create_theme tool.)
+ */
+:root {
+ /* Primary → violet #6D4AFF */
+ --ig-primary-50: hsl(from var(--ig-primary-500) h calc(s * 1.23) calc(l * 1.78));
+ --ig-primary-50-contrast: hsla(from color(from var(--ig-primary-50) var(--y-contrast)) h 0 l/1);
+ --ig-primary-100: hsl(from var(--ig-primary-500) h calc(s * 0.8) calc(l * 1.66));
+ --ig-primary-100-contrast: hsla(from color(from var(--ig-primary-100) var(--y-contrast)) h 0 l/1);
+ --ig-primary-200: hsl(from var(--ig-primary-500) h calc(s * 0.64) calc(l * 1.43));
+ --ig-primary-200-contrast: hsla(from color(from var(--ig-primary-200) var(--y-contrast)) h 0 l/1);
+ --ig-primary-300: hsl(from var(--ig-primary-500) h calc(s * 0.73) calc(l * 1.19));
+ --ig-primary-300-contrast: hsla(from color(from var(--ig-primary-300) var(--y-contrast)) h 0 l/1);
+ --ig-primary-400: hsl(from var(--ig-primary-500) h calc(s * 0.875) calc(l * 1.08));
+ --ig-primary-400-contrast: hsla(from color(from var(--ig-primary-400) var(--y-contrast)) h 0 l/1);
+ --ig-primary-500: #6d4aff;
+ --ig-primary-500-contrast: hsla(from color(from var(--ig-primary-500) var(--y-contrast)) h 0 l/1);
+ --ig-primary-600: hsl(from var(--ig-primary-500) h calc(s * 1.26) calc(l * 0.89));
+ --ig-primary-600-contrast: hsla(from color(from var(--ig-primary-600) var(--y-contrast)) h 0 l/1);
+ --ig-primary-700: hsl(from var(--ig-primary-500) h calc(s * 1.26) calc(l * 0.81));
+ --ig-primary-700-contrast: hsla(from color(from var(--ig-primary-700) var(--y-contrast)) h 0 l/1);
+ --ig-primary-800: hsl(from var(--ig-primary-500) h calc(s * 1.26) calc(l * 0.73));
+ --ig-primary-800-contrast: hsla(from color(from var(--ig-primary-800) var(--y-contrast)) h 0 l/1);
+ --ig-primary-900: hsl(from var(--ig-primary-500) h calc(s * 1.26) calc(l * 0.64));
+ --ig-primary-900-contrast: hsla(from color(from var(--ig-primary-900) var(--y-contrast)) h 0 l/1);
+ --ig-primary-seed: #6d4aff;
+
+ /* Secondary → dark slate #22242E (toolbar) */
+ --ig-secondary-500: #22242e;
+ --ig-secondary-500-contrast: #ffffff;
+ --ig-secondary-seed: #22242e;
+
+ /* ---- Semantic tokens for the custom view chrome ---- */
+ --ops-page-bg: #f3f4f7;
+ --ops-topbar-bg: #22242e;
+ --ops-topbar-pill: #2c2f3b;
+ --ops-topbar-border: #3a3d4b;
+ --ops-surface: #ffffff;
+ --ops-border: #e7e9ee;
+ --ops-border-strong: #d9dce3;
+ --ops-text: #24262f;
+ --ops-text-strong: #16181f;
+ --ops-text-muted: #8a909c;
+ --ops-text-faint: #a7adb8;
+
+ --ops-violet: #6d4aff;
+ --ops-violet-soft: #f0ecff;
+
+ --ops-green: #1f9d55;
+ --ops-green-soft: #e6f5ec;
+ --ops-amber: #c98a12;
+ --ops-amber-soft: #fbf1de;
+ --ops-red: #d64545;
+ --ops-red-soft: #fbe9e9;
+ --ops-blue: #2f78d6;
+ --ops-blue-soft: #e7f0fb;
+
+ /* Subtle full-row tints in the grid */
+ --ops-row-selected: #f6f3ff;
+ --ops-row-warn: #fdf7ec;
+ --ops-row-error: #fcefef;
+}
+
+/* ---------------------------------------------------------------------------
+ * Scoped Data Grid theme (generated via Theming MCP create_component_theme:
+ * background #FFFFFF, foreground #2B2F3A, accent #6D4AFF). Trimmed to the tokens
+ * that shape this view; the rest are auto-derived by the framework.
+ * ------------------------------------------------------------------------- */
+igc-grid {
+ --ig-grid-background: #ffffff;
+ --ig-grid-foreground: #2b2f3a;
+ --ig-grid-accent-color: #6d4aff;
+ --ig-grid-header-background: #ffffff;
+ --ig-grid-header-text-color: #8a909c;
+ --ig-grid-header-border-color: var(--ops-border);
+ --ig-grid-row-border-color: var(--ops-border);
+ --ig-grid-grid-border-color: transparent;
+ --ig-grid-content-background: #ffffff;
+ --ig-grid-row-hover-background: #faf9ff;
+ --ig-grid-row-selected-background: var(--ops-row-selected);
+ --ig-grid-row-selected-hover-background: var(--ops-row-selected);
+ --ig-grid-row-selected-text-color: var(--ops-text);
+ --ig-grid-cell-selected-background: transparent;
+ --ig-grid-cell-active-border-color: transparent;
+ --ig-size: var(--ig-size-medium);
+}
diff --git a/projects/manufacturing/src/vite-env.d.ts b/projects/manufacturing/src/vite-env.d.ts
new file mode 100644
index 0000000..cb4800b
--- /dev/null
+++ b/projects/manufacturing/src/vite-env.d.ts
@@ -0,0 +1,6 @@
+///
+
+declare module "*.module.css" {
+ const classes: Record;
+ export default classes;
+}
diff --git a/projects/manufacturing/styles.scss b/projects/manufacturing/styles.scss
new file mode 100644
index 0000000..85f6898
--- /dev/null
+++ b/projects/manufacturing/styles.scss
@@ -0,0 +1,10 @@
+body {
+ font-family: var(--ig-font-family);
+ margin: 0;
+}
+
+html,
+body,
+#root {
+ height: 100%;
+}
diff --git a/projects/manufacturing/tsconfig.app.json b/projects/manufacturing/tsconfig.app.json
new file mode 100644
index 0000000..109f0ac
--- /dev/null
+++ b/projects/manufacturing/tsconfig.app.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src"]
+}
diff --git a/projects/manufacturing/tsconfig.json b/projects/manufacturing/tsconfig.json
new file mode 100644
index 0000000..1ffef60
--- /dev/null
+++ b/projects/manufacturing/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "files": [],
+ "references": [
+ { "path": "./tsconfig.app.json" },
+ { "path": "./tsconfig.node.json" }
+ ]
+}
diff --git a/projects/manufacturing/tsconfig.node.json b/projects/manufacturing/tsconfig.node.json
new file mode 100644
index 0000000..8e5b203
--- /dev/null
+++ b/projects/manufacturing/tsconfig.node.json
@@ -0,0 +1,18 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "lib": ["ES2023"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/projects/manufacturing/vite.config.ts b/projects/manufacturing/vite.config.ts
new file mode 100644
index 0000000..081c8d9
--- /dev/null
+++ b/projects/manufacturing/vite.config.ts
@@ -0,0 +1,6 @@
+import { defineConfig } from "vite";
+import react from "@vitejs/plugin-react";
+
+export default defineConfig({
+ plugins: [react()],
+});
diff --git a/src/app/app-routes.tsx b/src/app/app-routes.tsx
index 06d2934..34ea9ad 100644
--- a/src/app/app-routes.tsx
+++ b/src/app/app-routes.tsx
@@ -4,6 +4,7 @@ import HRPortalView from "./views/hr-portal/hr-portal-view";
import FinanceView from "./views/finance/finance-view";
import SalesView from "./views/sales/sales-view";
import FleetManagementView from "./views/fleet-management/fleet-management-view";
+import ManufacturingView from "./views/manufacturing/manufacturing-view";
import HomeView from "./views/home/home-view";
import ColumnChartView from "./views/charts/column-chart/column-chart-view";
import BarChartView from "./views/charts/bar-chart/bar-chart-view";
@@ -43,6 +44,7 @@ export const routes: RouteObject[] = [
{ path: "finance", element: },
{ path: "sales", element: },
{ path: "fleet", element: },
+ { path: "manufacturing", element: },
{
path: "charts",
children: [
diff --git a/src/app/views/home/home-view.tsx b/src/app/views/home/home-view.tsx
index ff5a4ed..cd53517 100644
--- a/src/app/views/home/home-view.tsx
+++ b/src/app/views/home/home-view.tsx
@@ -148,6 +148,20 @@ const tabInfoGrids = new Map([
"https://www.infragistics.com/resources/sample-applications/erp-inventory-sample-app-react",
},
],
+ [
+ "manufacturing",
+ {
+ title: "Manufacturing Operations",
+ theme: "Indigo",
+ themeMode: "Light",
+ content:
+ "Monitor active work orders, equipment performance, downtime, and shift handoff in a production dashboard.",
+ moreLink:
+ "https://www.infragistics.com/products/ignite-ui-react/react/components/grids/grid/overview",
+ downloadLink:
+ "https://www.infragistics.com/resources/sample-applications",
+ },
+ ],
[
"hr-portal",
{
diff --git a/src/app/views/manufacturing/manufacturing-view.tsx b/src/app/views/manufacturing/manufacturing-view.tsx
new file mode 100644
index 0000000..fcc14bd
--- /dev/null
+++ b/src/app/views/manufacturing/manufacturing-view.tsx
@@ -0,0 +1,18 @@
+import ProductionOperations from "../../../../projects/manufacturing/src/production-operations";
+
+import lightIndigoGrid from "igniteui-react-grids/grids/themes/light/indigo.css?inline";
+import lightIndigoWc from "igniteui-webcomponents/themes/light/indigo.css?inline";
+import sampleTheme from "../../../../projects/manufacturing/src/theme.css?inline";
+
+export default function ManufacturingView() {
+ return (
+ <>
+
+
+ >
+ );
+}
diff --git a/vite.config.ts b/vite.config.ts
index 7ac5b43..64e3b62 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -31,6 +31,10 @@ export default defineConfig({
{
src: './projects/fleet-management-grid/public/**',
dest: '',
+ },
+ {
+ src: './projects/manufacturing/public/**',
+ dest: '',
}
]
})