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) => ( + +
+
+ + {`${o.id} { 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. +
+ + {`${e.id} { 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} +
+ + + + + + + + + + + + {row.detail.measurements.map((m) => ( + + + + + + + + ))} + +
CharacteristicNominalToleranceMeasuredStatus
{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 ============ */} +
+
+ + + NORTHSTAR OPERATIONS + MANUFACTURING EXECUTION + +
+
+ + + + LIVE + +
+
+ + {/* ============ 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: '', } ] })